Rework spotter to be a little more betterer
This commit is contained in:
42
Heimdall.lua
42
Heimdall.lua
@@ -6,6 +6,7 @@ if not Heimdall_Data then Heimdall_Data = {} end
|
|||||||
---@class HeimdallData
|
---@class HeimdallData
|
||||||
---@field config HeimdallConfig
|
---@field config HeimdallConfig
|
||||||
---@field raceMap table<string, string>
|
---@field raceMap table<string, string>
|
||||||
|
---@field stinkies table<string, boolean>
|
||||||
---@field dumpTable fun(table: any, depth?: number): nil
|
---@field dumpTable fun(table: any, depth?: number): nil
|
||||||
---@field messenger {queue: table<string, Message>, ticker: number}
|
---@field messenger {queue: table<string, Message>, ticker: number}
|
||||||
|
|
||||||
@@ -13,7 +14,46 @@ if not Heimdall_Data then Heimdall_Data = {} end
|
|||||||
---@field spotter HeimdallSpotterConfig
|
---@field spotter HeimdallSpotterConfig
|
||||||
|
|
||||||
---@class HeimdallSpotterConfig
|
---@class HeimdallSpotterConfig
|
||||||
|
---@field enabled boolean
|
||||||
---@field allyOnly boolean
|
---@field allyOnly boolean
|
||||||
---@field stinkyOnly boolean
|
---@field stinkyOnly boolean
|
||||||
|
---@field notifyChannel string
|
||||||
|
---@field zoneOverride string?
|
||||||
|
---@field throttleTime number
|
||||||
|
|
||||||
data.raceMap
|
data.config = {
|
||||||
|
spotter = {
|
||||||
|
enabled = true,
|
||||||
|
allyOnly = false,
|
||||||
|
stinkyOnly = false,
|
||||||
|
notifyChannel = "Foobar",
|
||||||
|
zoneOverride = nil,
|
||||||
|
throttleTime = 10
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
data.raceMap = {
|
||||||
|
["Orc"] = "Horde",
|
||||||
|
["Undead"] = "Horde",
|
||||||
|
["Tauren"] = "Horde",
|
||||||
|
["Troll"] = "Horde",
|
||||||
|
["Blood Elf"] = "Horde",
|
||||||
|
["Goblin"] = "Horde",
|
||||||
|
["Human"] = "Alliance",
|
||||||
|
["Dwarf"] = "Alliance",
|
||||||
|
["Night Elf"] = "Alliance",
|
||||||
|
["Gnome"] = "Alliance",
|
||||||
|
["Draenei"] = "Alliance",
|
||||||
|
["Worgen"] = "Alliance",
|
||||||
|
["Vulpera"] = "Horde",
|
||||||
|
["Nightborne"] = "Horde",
|
||||||
|
["Zandalari Troll"] = "Horde",
|
||||||
|
["Kul Tiran"] = "Alliance",
|
||||||
|
["Dark Iron Dwarf"] = "Alliance",
|
||||||
|
["Void Elf"] = "Alliance",
|
||||||
|
["Lightforged Draenei"] = "Alliance",
|
||||||
|
["Mechagnome"] = "Alliance",
|
||||||
|
["Mag'har Orc"] = "Horde"
|
||||||
|
}
|
||||||
|
|
||||||
|
data.stinkies = {}
|
||||||
|
|||||||
82
Spotter.lua
82
Spotter.lua
@@ -1,5 +1,7 @@
|
|||||||
---@type HeimdallData
|
|
||||||
local _, data = ...
|
local _, data = ...
|
||||||
|
---@cast data HeimdallData
|
||||||
|
|
||||||
|
if not data.config.spotter.enabled then return end
|
||||||
|
|
||||||
local function FormatHP(hp)
|
local function FormatHP(hp)
|
||||||
if hp > 1e9 then
|
if hp > 1e9 then
|
||||||
@@ -13,47 +15,71 @@ local function FormatHP(hp)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
---@type table<string, number>
|
||||||
|
local throttleTable = {}
|
||||||
|
|
||||||
---@param unit string
|
---@param unit string
|
||||||
---@return string?
|
---@return string?
|
||||||
local function NotifySpotted(unit)
|
local function NotifySpotted(unit)
|
||||||
print(unit)
|
if not unit then return string.format("Could not find unit %s", tostring(unit)) end
|
||||||
local name = UnitName(unit)
|
if not UnitIsPlayer(unit) then return nil end
|
||||||
local race = UnitRace(unit)
|
|
||||||
local hp = UnitHealth(unit)
|
|
||||||
local maxHp = UnitHealthMax(unit)
|
|
||||||
|
|
||||||
|
local name = UnitName(unit)
|
||||||
if not name then return string.format("Could not find name for unit %s", tostring(unit)) end
|
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
|
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
|
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
|
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))
|
local location = data.config.spotter.zoneOverride
|
||||||
print(msg)
|
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
|
end
|
||||||
|
|
||||||
local frame = CreateFrame("Frame")
|
local frame = CreateFrame("Frame")
|
||||||
frame:RegisterEvent("NAME_PLATE_UNIT_ADDED")
|
frame:RegisterEvent("NAME_PLATE_UNIT_ADDED")
|
||||||
frame:RegisterEvent("TARGET_UNIT_CHANGED")
|
frame:RegisterEvent("TARGET_UNIT_CHANGED")
|
||||||
frame:SetScript("OnEvent", function(self, event, unit)
|
frame:SetScript("OnEvent", function(self, event, unit)
|
||||||
local name = UnitName(unit)
|
local err = NotifySpotted(unit)
|
||||||
if name and UnitIsPlayer(unit) then
|
if err then
|
||||||
local race = UnitRace(unit)
|
print(string.format("Error notifying %s: %s", tostring(unit), tostring(err)))
|
||||||
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
|
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
|||||||
Reference in New Issue
Block a user