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
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
|
|
|