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.

122 lines
3.4 KiB

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