Rework addon loading to properly load on ADDON_LOADED
insteaad of immediately
This commit is contained in:
205
Spotter.lua
205
Spotter.lua
@@ -1,105 +1,108 @@
|
||||
local _, data = ...
|
||||
local addonname, data = ...
|
||||
---@cast data HeimdallData
|
||||
---@cast addonname string
|
||||
|
||||
if not data.config.spotter.enabled then return end
|
||||
|
||||
local function FormatHP(hp)
|
||||
if hp > 1e9 then
|
||||
return string.format("%.1fB", hp / 1e9)
|
||||
elseif hp > 1e6 then
|
||||
return string.format("%.1fM", hp / 1e6)
|
||||
elseif hp > 1e3 then
|
||||
return string.format("%.1fK", hp / 1e3)
|
||||
else
|
||||
return hp
|
||||
data.Spotter = {}
|
||||
function data.Spotter.Init()
|
||||
if not data.config.spotter.enabled then return end
|
||||
local function FormatHP(hp)
|
||||
if hp > 1e9 then
|
||||
return string.format("%.1fB", hp / 1e9)
|
||||
elseif hp > 1e6 then
|
||||
return string.format("%.1fM", hp / 1e6)
|
||||
elseif hp > 1e3 then
|
||||
return string.format("%.1fK", hp / 1e3)
|
||||
else
|
||||
return hp
|
||||
end
|
||||
end
|
||||
|
||||
---@type table<string, number>
|
||||
local throttleTable = {}
|
||||
|
||||
---@param unit string
|
||||
---@param name string
|
||||
---@param faction string
|
||||
---@param hostile boolean
|
||||
---@return boolean
|
||||
---@return string? error
|
||||
local function ShouldNotify(unit, name, faction, hostile)
|
||||
if data.config.spotter.stinky then
|
||||
if data.stinkies[name] then return true end
|
||||
end
|
||||
if data.config.spotter.alliance then
|
||||
if faction == "Alliance" then return true end
|
||||
end
|
||||
if data.config.spotter.hostile then
|
||||
if hostile then return true end
|
||||
end
|
||||
return data.config.spotter.everyone
|
||||
end
|
||||
|
||||
---@param unit string
|
||||
---@return string?
|
||||
local function NotifySpotted(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 hostile = UnitCanAttack("player", unit)
|
||||
local doNotify = ShouldNotify(unit, name, faction, hostile)
|
||||
if not doNotify then return string.format("Not notifying for %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 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) %s of race (%s) with health %s/%s at %s",
|
||||
hostile and "Hostile" or "Friendly",
|
||||
name,
|
||||
race,
|
||||
FormatHP(hp),
|
||||
FormatHP(maxHp),
|
||||
location)
|
||||
|
||||
---@type Message
|
||||
local msg = {
|
||||
channel = "CHANNEL",
|
||||
data = data.config.spotter.notifyChannel,
|
||||
message = text
|
||||
}
|
||||
data.dumpTable(msg)
|
||||
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 err = NotifySpotted(unit)
|
||||
if err then
|
||||
print(string.format("Error notifying %s: %s", tostring(unit), tostring(err)))
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
---@type table<string, number>
|
||||
local throttleTable = {}
|
||||
|
||||
---@param unit string
|
||||
---@param name string
|
||||
---@param faction string
|
||||
---@param hostile boolean
|
||||
---@return boolean
|
||||
---@return string? error
|
||||
local function ShouldNotify(unit, name, faction, hostile)
|
||||
if data.config.spotter.stinky then
|
||||
if data.stinkies[name] then return true end
|
||||
end
|
||||
if data.config.spotter.alliance then
|
||||
if faction == "Alliance" then return true end
|
||||
end
|
||||
if data.config.spotter.hostile then
|
||||
if hostile then return true end
|
||||
end
|
||||
return data.config.spotter.everyone
|
||||
end
|
||||
|
||||
---@param unit string
|
||||
---@return string?
|
||||
local function NotifySpotted(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 hostile = UnitCanAttack("player", unit)
|
||||
local doNotify = ShouldNotify(unit, name, faction, hostile)
|
||||
if not doNotify then return string.format("Not notifying for %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 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) %s of race (%s) with health %s/%s at %s",
|
||||
hostile and "Hostile" or "Friendly",
|
||||
name,
|
||||
race,
|
||||
FormatHP(hp),
|
||||
FormatHP(maxHp),
|
||||
location)
|
||||
|
||||
---@type Message
|
||||
local msg = {
|
||||
channel = "CHANNEL",
|
||||
data = data.config.spotter.notifyChannel,
|
||||
message = text
|
||||
}
|
||||
data.dumpTable(msg)
|
||||
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 err = NotifySpotted(unit)
|
||||
if err then
|
||||
print(string.format("Error notifying %s: %s", tostring(unit), tostring(err)))
|
||||
end
|
||||
end)
|
||||
|
||||
Reference in New Issue
Block a user