You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
268 lines
7.4 KiB
268 lines
7.4 KiB
|
5 years ago
|
--========================================================--
|
||
|
|
-- Scorpio Secure Action Item Handler --
|
||
|
|
-- --
|
||
|
|
-- Author : kurapica125@outlook.com --
|
||
|
|
-- Create Date : 2020/11/25 --
|
||
|
|
--========================================================--
|
||
|
|
|
||
|
|
--========================================================--
|
||
|
|
Scorpio "Scorpio.Secure.ItemHandler" "1.0.0"
|
||
|
|
--========================================================--
|
||
|
|
|
||
|
|
import(SecureActionButton)
|
||
|
|
|
||
|
|
_ToyFilter = {}
|
||
|
|
_ToyFilterTemplate = "_ToyFilter[%d] = true"
|
||
|
|
|
||
|
|
------------------------------------------------------
|
||
|
|
-- Action Handler
|
||
|
|
------------------------------------------------------
|
||
|
|
handler = ActionTypeHandler {
|
||
|
|
Name = "item",
|
||
|
|
|
||
|
|
InitSnippet = [[
|
||
|
|
_ToyFilter = newtable()
|
||
|
|
]],
|
||
|
|
|
||
|
|
UpdateSnippet = [[
|
||
|
|
local target = ...
|
||
|
|
|
||
|
|
if tonumber(target) then
|
||
|
|
if _ToyFilter[target] then
|
||
|
|
self:SetAttribute("*item*", nil)
|
||
|
|
self:SetAttribute("*type*", "toy")
|
||
|
|
self:SetAttribute("*toy*", target)
|
||
|
|
else
|
||
|
|
self:SetAttribute("*type*", nil)
|
||
|
|
self:SetAttribute("*toy*", nil)
|
||
|
|
self:SetAttribute("*item*", "item:"..target)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
]],
|
||
|
|
|
||
|
|
ClearSnippet = [[
|
||
|
|
self:SetAttribute("*item*", nil)
|
||
|
|
self:SetAttribute("*type*", nil)
|
||
|
|
self:SetAttribute("*toy*", nil)
|
||
|
|
]],
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
------------------------------------------------------
|
||
|
|
-- Module Event Handler
|
||
|
|
------------------------------------------------------
|
||
|
|
function OnLoad(self)
|
||
|
|
-- Need save the toy data to avoid the in-game scan
|
||
|
|
_SVData:SetDefault{ ToyItems= {} }
|
||
|
|
ToyData = _SVData.ToyItems
|
||
|
|
end
|
||
|
|
|
||
|
|
function OnEnable(self)
|
||
|
|
OnEnable = nil
|
||
|
|
|
||
|
|
-- Load toy informations
|
||
|
|
if Scorpio.IsRetail then
|
||
|
|
C_ToyBox.ForceToyRefilter()
|
||
|
|
|
||
|
|
UpdateToys()
|
||
|
|
end
|
||
|
|
|
||
|
|
return handler:RefreshActionButtons()
|
||
|
|
end
|
||
|
|
|
||
|
|
------------------------------------------------------
|
||
|
|
-- System Event Handler
|
||
|
|
------------------------------------------------------
|
||
|
|
if Scorpio.IsRetail then
|
||
|
|
__SystemEvent__()
|
||
|
|
function SPELLS_CHANGED()
|
||
|
|
for _, btn in handler:GetIterator() do
|
||
|
|
if _ToyFilter[btn.ActionTarget] then
|
||
|
|
handler:RefreshActionButtons(btn)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
__SystemEvent__()
|
||
|
|
function UPDATE_SHAPESHIFT_FORM()
|
||
|
|
for _, btn in handler:GetIterator() do
|
||
|
|
if _ToyFilter[btn.ActionTarget] then
|
||
|
|
handler:RefreshActionButtons(btn)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
__SystemEvent__()
|
||
|
|
function TOYS_UPDATED(itemID, new)
|
||
|
|
return UpdateToys()
|
||
|
|
end
|
||
|
|
|
||
|
|
__SystemEvent__()
|
||
|
|
function SPELL_UPDATE_COOLDOWN()
|
||
|
|
for _, btn in handler:GetIterator() do
|
||
|
|
if _ToyFilter[btn.ActionTarget] then
|
||
|
|
handler:RefreshCooldown(btn)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
__Async__()
|
||
|
|
function UpdateToys()
|
||
|
|
local cache = {}
|
||
|
|
|
||
|
|
if not next(_ToyFilter) then
|
||
|
|
for _, item in ipairs(ToyData) do
|
||
|
|
if not _ToyFilter[item] then
|
||
|
|
_ToyFilter[item]= true
|
||
|
|
tinsert(cache, _ToyFilterTemplate:format(item))
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
for i = 1, C_ToyBox.GetNumToys() do
|
||
|
|
if i % 20 == 0 then Continue() end
|
||
|
|
|
||
|
|
local index = C_ToyBox.GetToyFromIndex(i)
|
||
|
|
|
||
|
|
if index > 0 then
|
||
|
|
local item = C_ToyBox.GetToyInfo(index)
|
||
|
|
if item and item > 0 and not _ToyFilter[item] then
|
||
|
|
tinsert(ToyData, item)
|
||
|
|
_ToyFilter[item]= true
|
||
|
|
tinsert(cache, _ToyFilterTemplate:format(item))
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
if next(cache) then
|
||
|
|
NoCombat(function ()
|
||
|
|
handler:RunSnippet( tblconcat(cache, ";") )
|
||
|
|
|
||
|
|
for _, btn in handler:GetIterator() do
|
||
|
|
local target = btn.ActionTarget
|
||
|
|
if _ToyFilter[target] then
|
||
|
|
btn:SetAttribute("*item*", nil)
|
||
|
|
btn:SetAttribute("*type*", "toy")
|
||
|
|
btn:SetAttribute("*toy*", target)
|
||
|
|
|
||
|
|
handler:RefreshActionButtons(btn)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
__SystemEvent__()
|
||
|
|
function BAG_UPDATE_DELAYED()
|
||
|
|
handler:RefreshCount()
|
||
|
|
handler:RefreshUsable()
|
||
|
|
end
|
||
|
|
|
||
|
|
__SystemEvent__()
|
||
|
|
function BAG_UPDATE_COOLDOWN()
|
||
|
|
handler:RefreshCooldown()
|
||
|
|
end
|
||
|
|
|
||
|
|
__SystemEvent__()
|
||
|
|
function PLAYER_EQUIPMENT_CHANGED()
|
||
|
|
return handler:RefreshActionButtons()
|
||
|
|
end
|
||
|
|
|
||
|
|
__SystemEvent__()
|
||
|
|
function PLAYER_REGEN_ENABLED()
|
||
|
|
handler:RefreshCount()
|
||
|
|
handler:RefreshUsable()
|
||
|
|
end
|
||
|
|
|
||
|
|
__SystemEvent__()
|
||
|
|
function PLAYER_REGEN_DISABLED()
|
||
|
|
handler:RefreshUsable()
|
||
|
|
end
|
||
|
|
|
||
|
|
------------------------------------------------------
|
||
|
|
-- Overwrite methods
|
||
|
|
------------------------------------------------------
|
||
|
|
function handler:PickupAction(target)
|
||
|
|
if _ToyFilter[target] then
|
||
|
|
return C_ToyBox.PickupToyBoxItem(target)
|
||
|
|
else
|
||
|
|
return PickupItem(target)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function handler:GetActionTexture()
|
||
|
|
local target = self.ActionTarget
|
||
|
|
if _ToyFilter[target] then
|
||
|
|
return (select(3, C_ToyBox.GetToyInfo(target)))
|
||
|
|
else
|
||
|
|
return GetItemIcon(target)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function handler:GetActionCount()
|
||
|
|
local target = self.ActionTarget
|
||
|
|
return _ToyFilter[target] and 0 or GetItemCount(target)
|
||
|
|
end
|
||
|
|
|
||
|
|
function handler:GetActionCooldown()
|
||
|
|
return GetItemCooldown(self.ActionTarget)
|
||
|
|
end
|
||
|
|
|
||
|
|
function handler:IsEquippedItem()
|
||
|
|
local target = self.ActionTarget
|
||
|
|
return not _ToyFilter[target] and IsEquippedItem(target)
|
||
|
|
end
|
||
|
|
|
||
|
|
function handler:IsActivedAction()
|
||
|
|
-- Block now, no event to deactivate
|
||
|
|
return false and IsCurrentItem(self.ActionTarget)
|
||
|
|
end
|
||
|
|
|
||
|
|
function handler:IsUsableAction()
|
||
|
|
local target = self.ActionTarget
|
||
|
|
return _ToyFilter[target] or IsUsableItem(target)
|
||
|
|
end
|
||
|
|
|
||
|
|
function handler:IsConsumableAction()
|
||
|
|
local target = self.ActionTarget
|
||
|
|
if _ToyFilter[target] then return false end
|
||
|
|
-- return IsConsumableItem(target) blz sucks, wait until IsConsumableItem is fixed
|
||
|
|
local maxStack = select(8, GetItemInfo(target))
|
||
|
|
|
||
|
|
if IsUsableItem(target) and maxStack and maxStack > 1 then
|
||
|
|
return true
|
||
|
|
else
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function handler:IsInRange()
|
||
|
|
return IsItemInRange(self.ActionTarget, self:GetAttribute("unit"))
|
||
|
|
end
|
||
|
|
|
||
|
|
function handler:SetTooltip(tip)
|
||
|
|
local target = self.ActionTarget
|
||
|
|
if _ToyFilter[target] then
|
||
|
|
tip:SetToyByItemID(target)
|
||
|
|
else
|
||
|
|
local link = select(2, GetItemInfo(self.ActionTarget))
|
||
|
|
return link and tip:SetHyperlink(link)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function handler:IsRangeSpell()
|
||
|
|
return true
|
||
|
|
end
|
||
|
|
|
||
|
|
function handler:Map(target, detail)
|
||
|
|
if tonumber(target) then
|
||
|
|
-- pass
|
||
|
|
elseif target and select(2, GetItemInfo(target)) then
|
||
|
|
target = select(2, GetItemInfo(target)):match("item:(%d+)")
|
||
|
|
end
|
||
|
|
target = tonumber(target)
|
||
|
|
|
||
|
|
return target, detail
|
||
|
|
end
|