Rework spotter to be a little more betterer

This commit is contained in:
2024-12-12 13:18:32 +01:00
parent 9be889d2d2
commit 834c8a9a03
2 changed files with 95 additions and 29 deletions

View File

@@ -1,5 +1,7 @@
---@type HeimdallData
local _, data = ...
---@cast data HeimdallData
if not data.config.spotter.enabled then return end
local function FormatHP(hp)
if hp > 1e9 then
@@ -13,47 +15,71 @@ local function FormatHP(hp)
end
end
---@type table<string, number>
local throttleTable = {}
---@param unit string
---@return string?
local function NotifySpotted(unit)
print(unit)
local name = UnitName(unit)
local race = UnitRace(unit)
local hp = UnitHealth(unit)
local maxHp = UnitHealthMax(unit)
if not unit then return string.format("Could not find unit %s", tostring(unit)) end
if not UnitIsPlayer(unit) then return nil end
local name = UnitName(unit)
if not name then return string.format("Could not find name for unit %s", tostring(unit)) end
local time = GetTime()
if throttleTable[name] and time - throttleTable[name] < data.config.spotter.throttleTime then
return string.format("Throttled %s", tostring(name))
end
throttleTable[name] = time
local race = UnitRace(unit)
if not race then return string.format("Could not find race for unit %s", tostring(unit)) end
local faction = data.raceMap[race]
if not faction then return string.format("Could not find faction for race %s", tostring(race)) end
local doNotify = true
if data.config.spotter.allyOnly then
doNotify = false
if faction == "Alliance" then doNotify = true end
end
if data.config.spotter.stinkyOnly then
doNotify = false
if data.stinkies[name] then doNotify = true end
end
if not doNotify then return string.format("Not notifying %s", tostring(name)) end
local hp = UnitHealth(unit)
if not hp then return string.format("Could not find hp for unit %s", tostring(unit)) end
local maxHp = UnitHealthMax(unit)
if not maxHp then return string.format("Could not find maxHp for unit %s", tostring(unit)) end
local msg = string.format("%s (%s) - %s/%s", name, race, FormatHP(hp), FormatHP(maxHp))
print(msg)
local location = data.config.spotter.zoneOverride
if not location then
local zone = GetZoneText()
if not zone then return string.format("Could not find zone for unit %s", tostring(unit)) end
local subzone = GetSubZoneText()
if not subzone then subzone = "" end
location = string.format("%s (%s)", zone, subzone)
end
local text = string.format("I see %s of race (%s) with health %s/%s at %s", name, race, FormatHP(hp), FormatHP(maxHp), location)
---@type Message
local msg = {
channel = "CHANNEL",
data = data.config.spotter.notifyChannel,
message = text
}
table.insert(data.messenger.queue, msg)
end
local frame = CreateFrame("Frame")
frame:RegisterEvent("NAME_PLATE_UNIT_ADDED")
frame:RegisterEvent("TARGET_UNIT_CHANGED")
frame:SetScript("OnEvent", function(self, event, unit)
local name = UnitName(unit)
if name and UnitIsPlayer(unit) then
local race = UnitRace(unit)
local doNotify = true
if data.config.spotter.allyOnly then
doNotify = false
if data.raceMap[race] == "Alliance" then
doNotify = true
end
end
-- Stinkies overwrite allyOnly
if data.config.spotter.stinkyOnly then
doNotify = false
if data.stinkies[name] then
doNotify = true
end
end
if doNotify then
NotifySpotted(unit)
end
local err = NotifySpotted(unit)
if err then
print(string.format("Error notifying %s: %s", tostring(unit), tostring(err)))
end
end)