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.

177 lines
5.4 KiB

--========================================================--
-- Scorpio Secure Mount Handler --
-- --
-- Author : kurapica125@outlook.com --
-- Create Date : 2021/03/29 --
--========================================================--
if not Scorpio.IsRetail then return end
--========================================================--
Scorpio "Scorpio.Secure.MountHandler" "1.0.0"
--========================================================--
export { GetProxyUI = UI.GetProxyUI }
------------------------------------------------------
-- Action Handler
------------------------------------------------------
handler = ActionTypeHandler {
Name = "mount",
PickupSnippet = "Custom",
UpdateSnippet = [[
local target = ...
if target then
self:SetAttribute("*type*", "macro")
self:SetAttribute("*macrotext*", "/CANCELFORM")
else
self:SetAttribute("*type*", nil)
self:SetAttribute("*macrotext*", nil)
end
]],
ClearSnippet = [[
self:SetAttribute("*type*", nil)
self:SetAttribute("*macrotext*", nil)
]],
PreClickSnippet = [=[
self:GetFrameRef("_Manager"):RunFor(self, [[ Manager:CallMethod("SummonMount", self:GetName()) ]])
]=],
}
------------------------------------------------------
-- Module Event Handler
------------------------------------------------------
GetMountInfoByID = C_MountJournal.GetMountInfoByID
GetDisplayedMountInfo = C_MountJournal.GetDisplayedMountInfo
SUMMON_RANDOM_FAVORITE_MOUNT_SPELL = 150544
SUMMON_RANDOM_ID = 0
function OnEnable()
OnEnable = nil
C_MountJournal.Pickup(0)
local ty, pick = GetCursorInfo()
ClearCursor()
SUMMON_RANDOM_ID = pick
Wow.FromEvent("UNIT_AURA"):MatchUnit("player"):Next():Subscribe(function()
return handler:RefreshButtonState()
end)
end
------------------------------------------------------
-- System Event Handler
------------------------------------------------------
local firstUpdate = true
__SystemEvent__()
function COMPANION_UPDATE(companionType)
if not companionType or companionType == "MOUNT" then
if firstUpdate then
firstUpdate = true
return handler:RefreshActionButtons()
else
return handler:RefreshUsable()
end
end
end
__SystemEvent__()
function SPELL_UPDATE_USABLE(self)
return handler:RefreshUsable()
end
------------------------------------------------------
-- Secure Enviornment Init
------------------------------------------------------
__SecureMethod__()
function handler.Manager:SummonMount(btnName)
local mountID = GetProxyUI(_G[btnName]).ActionTarget
if mountID then
if select(4, C_MountJournal.GetMountInfoByID(mountID)) then
C_MountJournal.Dismiss()
else
Next(C_MountJournal.SummonByID, mountID)
end
end
end
------------------------------------------------------
-- Overwrite methods
------------------------------------------------------
function DelayRefreshIcon(self)
if self.ActionType == "mount" then
local target, icon = self.ActionTarget
if target == SUMMON_RANDOM_ID then
icon = GetSpellTexture(SUMMON_RANDOM_FAVORITE_MOUNT_SPELL)
else
icon = (select(3, GetMountInfoByID(target)))
end
self.Icon = icon
end
end
function handler:PickupAction(target)
-- Try pickup
if target == SUMMON_RANDOM_ID then
return C_MountJournal.Pickup(0)
else
local i = 1
while GetDisplayedMountInfo(i) do
if target == select(12, GetDisplayedMountInfo(i)) then
return C_MountJournal.Pickup(i)
end
i = i + 1
end
end
end
function handler:GetActionTexture()
local target, icon = self.ActionTarget
if target == SUMMON_RANDOM_ID then
icon = GetSpellTexture(SUMMON_RANDOM_FAVORITE_MOUNT_SPELL)
else
icon = (select(3, GetMountInfoByID(target)))
end
if not icon then Delay(1, DelayRefreshIcon, self) end
return icon
end
function handler:IsActivedAction()
local target = self.ActionTarget
if target == SUMMON_RANDOM_ID then
return IsMounted()
else
return (select(4, GetMountInfoByID(target)))
end
end
function handler:IsUsableAction()
local target = self.ActionTarget
local canSummon = not InCombatLockdown() and IsUsableSpell(SUMMON_RANDOM_FAVORITE_MOUNT_SPELL)
if target == SUMMON_RANDOM_ID then
return canSummon
else
return canSummon and (select(5, GetMountInfoByID(target)))
end
end
function handler:SetTooltip(tip)
local target = self.ActionTarget
if target == SUMMON_RANDOM_ID then
return tip:SetSpellByID(SUMMON_RANDOM_FAVORITE_MOUNT_SPELL)
else
local _, spell = C_MountJournal.GetMountInfoByID(target)
return tip:SetMountBySpellID(spell)
end
end