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

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