|
|
|
|
--[[-------------------------------------------------------------------------
|
|
|
|
|
-- Simple module for TomTom that creates a waypoint for your corse
|
|
|
|
|
-- if you happen to die. No humor, no frills, just straightforward
|
|
|
|
|
-- corpse arrow. Based on code written and adapted by Yssarill.
|
|
|
|
|
-------------------------------------------------------------------------]]--
|
|
|
|
|
|
|
|
|
|
local L = TomTomLocals
|
|
|
|
|
local eventFrame = CreateFrame("Frame")
|
|
|
|
|
eventFrame:RegisterEvent("ADDON_LOADED")
|
|
|
|
|
eventFrame:RegisterEvent("PLAYER_ALIVE")
|
|
|
|
|
eventFrame:RegisterEvent("PLAYER_DEAD")
|
|
|
|
|
eventFrame:RegisterEvent("PLAYER_UNGHOST")
|
|
|
|
|
eventFrame:Hide()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-- Local variables to store map, x, y and uid or corpse waypoint
|
|
|
|
|
local m,x,y,uid
|
|
|
|
|
|
|
|
|
|
local function StartCorpseSearch()
|
|
|
|
|
if not IsInInstance() then
|
|
|
|
|
eventFrame:Show()
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function ClearCorpseArrow()
|
|
|
|
|
if uid then
|
|
|
|
|
TomTom:RemoveWaypoint(uid)
|
|
|
|
|
m,x,y,uid = nil, nil, nil, nil, nil
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function GetCorpseLocation()
|
|
|
|
|
-- If the player isn't dead or a ghost, drop out
|
|
|
|
|
if not UnitIsDeadOrGhost("player") then
|
|
|
|
|
if m or x or y then
|
|
|
|
|
ClearCorpseArrow()
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- Cache the result so we don't scan the maps multiple times
|
|
|
|
|
if m and x and y then
|
|
|
|
|
return m, x, y
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- See if the player corpse is on the current map
|
|
|
|
|
local om = C_Map.GetBestMapForUnit("player")
|
|
|
|
|
if not om then return nil; end
|
|
|
|
|
local corpse = C_DeathInfo.GetCorpseMapPosition(om)
|
|
|
|
|
if not corpse then return nil; end
|
|
|
|
|
local cx, cy = corpse:GetXY()
|
|
|
|
|
if cx ~= 0 and cy ~= 0 then
|
|
|
|
|
m = om
|
|
|
|
|
x = cx
|
|
|
|
|
y = cy
|
|
|
|
|
end
|
|
|
|
|
return m, x, y
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function SetCorpseArrow()
|
|
|
|
|
if m and x and y then
|
|
|
|
|
uid = TomTom:AddWaypoint(m, x, y, {
|
|
|
|
|
title = L["My Corpse"],
|
|
|
|
|
persistent = false,
|
|
|
|
|
corpse = true,
|
|
|
|
|
})
|
|
|
|
|
return uid
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local counter, throttle = 0, 0.5
|
|
|
|
|
eventFrame:SetScript("OnUpdate", function(self, elapsed)
|
|
|
|
|
counter = counter + elapsed
|
|
|
|
|
if counter < throttle then
|
|
|
|
|
return
|
|
|
|
|
else
|
|
|
|
|
counter = 0
|
|
|
|
|
if TomTom and TomTom.profile and TomTom.profile.general and TomTom.profile.general.corpse_arrow then
|
|
|
|
|
if GetCorpseLocation() then
|
|
|
|
|
if SetCorpseArrow() then
|
|
|
|
|
self:Hide()
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
self:Hide()
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end)
|
|
|
|
|
|
|
|
|
|
eventFrame:SetScript("OnEvent", function(self, event, arg1, ...)
|
|
|
|
|
if event == "ADDON_LOADED" and arg1 == "TomTom" then
|
|
|
|
|
self:UnregisterEvent("ADDON_LOADED")
|
|
|
|
|
if UnitIsDeadOrGhost("player") then
|
|
|
|
|
StartCorpseSearch()
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if event == "PLAYER_ALIVE" then
|
|
|
|
|
if UnitIsDeadOrGhost("player") then
|
|
|
|
|
StartCorpseSearch()
|
|
|
|
|
else
|
|
|
|
|
ClearCorpseArrow()
|
|
|
|
|
end
|
|
|
|
|
elseif event == "PLAYER_DEAD" then
|
|
|
|
|
m = C_Map.GetBestMapForUnit("player")
|
|
|
|
|
if not IsInInstance() then
|
|
|
|
|
x = nil
|
|
|
|
|
y = nil
|
|
|
|
|
local player = C_Map.GetPlayerMapPosition(m, "player")
|
|
|
|
|
if player then
|
|
|
|
|
x,y = player:GetXY()
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
StartCorpseSearch()
|
|
|
|
|
elseif event == "PLAYER_UNGHOST" then
|
|
|
|
|
ClearCorpseArrow()
|
|
|
|
|
end
|
|
|
|
|
end)
|
|
|
|
|
|
|
|
|
|
if IsLoggedIn() then
|
|
|
|
|
eventFrame:GetScript("OnEvent")(eventFrame, "ADDON_LOADED", "TomTom")
|
|
|
|
|
end
|