mirror of
https://github.com/brues-code/pfUI.git
synced 2026-09-22 15:46:56 +00:00
109 lines
3.8 KiB
Lua
109 lines
3.8 KiB
Lua
-- load pfUI environment
|
|
setfenv(1, pfUI:GetEnvironment())
|
|
|
|
if pfUI.libhealth then return end
|
|
|
|
local mobdb = {}
|
|
local target, dmg, perc, diff = nil, 0, 0, 0, 0
|
|
local UnitHealth, UnitHealthMax
|
|
local libhealth = CreateFrame("Frame")
|
|
libhealth.enabled = true
|
|
libhealth.reqhit = 4
|
|
libhealth.reqdmg = 5
|
|
libhealth:RegisterEvent("UNIT_HEALTH")
|
|
libhealth:RegisterEvent("UNIT_COMBAT")
|
|
libhealth:RegisterEvent("PLAYER_TARGET_CHANGED")
|
|
libhealth:RegisterEvent("PLAYER_ENTERING_WORLD")
|
|
libhealth:SetScript("OnEvent", function()
|
|
if event == "PLAYER_ENTERING_WORLD" then
|
|
-- create initial health cache tables
|
|
pfUI_cache["libhealth"] = pfUI_cache["libhealth"] or {}
|
|
mobdb = pfUI_cache["libhealth"]
|
|
|
|
-- load enable state and set functions
|
|
libhealth.enabled = pfUI_config["global"]["libhealth"] == "1" and true or nil
|
|
libhealth.reqhit = (tonumber(pfUI_config["global"]["libhealth_hit"]) or 4)
|
|
libhealth.reqdmg = (tonumber(pfUI_config["global"]["libhealth_dmg"]) or 0.5) * 100
|
|
end
|
|
|
|
-- return as we're not supposed to be here
|
|
if not libhealth.enabled then this:UnregisterAllEvents() return end
|
|
|
|
-- try to estimate mob health based on combat and health events
|
|
if event == "PLAYER_TARGET_CHANGED" then
|
|
dmg, perc = 0, _G.UnitHealth("target")
|
|
if UnitName("target") and UnitLevel("target") and _G.UnitHealthMax("target") == 100 then
|
|
target = string.format("%s:%d",UnitName("target"), UnitLevel("target"))
|
|
else
|
|
target = nil
|
|
end
|
|
elseif target and event == "UNIT_COMBAT" and arg1 == "target" then
|
|
if arg2 and arg2 == "HEAL" then return end
|
|
dmg = dmg + arg4
|
|
elseif target and event == "UNIT_HEALTH" and arg1 == "target" then
|
|
diff = perc-_G.UnitHealth("target")
|
|
if dmg > 0 and diff > 0 then
|
|
mobdb[target] = mobdb[target] or {}
|
|
if not mobdb[target][2] or diff > mobdb[target][2] then
|
|
mobdb[target][1] = ceil(dmg / diff * 100)
|
|
mobdb[target][2] = diff
|
|
mobdb[target][3] = mobdb[target][3] and mobdb[target][3] + 1 or 1
|
|
end
|
|
end
|
|
end
|
|
end)
|
|
|
|
-- core function to query the generated database
|
|
local unit, level, cur, max, dbstring
|
|
local function GetUnitHealth(self, unitstr)
|
|
unit = UnitName(unitstr)
|
|
level = UnitLevel(unitstr)
|
|
cur = _G.UnitHealth(unitstr)
|
|
max = _G.UnitHealthMax(unitstr)
|
|
|
|
-- return raw values if another addon is replacing global API calls
|
|
if cur > 100 or max > 100 or max < 100 then
|
|
return cur, max, true
|
|
end
|
|
|
|
-- return raw values if no unit data could be found (unlikely but happened...)
|
|
if not unit or not level then
|
|
return cur, max
|
|
end
|
|
|
|
-- query the database for known values
|
|
dbstring = string.format("%s:%s", unit, level)
|
|
if mobdb[dbstring] and mobdb[dbstring][1] and mobdb[dbstring][2] > libhealth.reqdmg and (not mobdb[dbstring][3] or mobdb[dbstring][3] > libhealth.reqhit) then
|
|
return ceil(mobdb[dbstring][1]/100*cur), mobdb[dbstring][1], true
|
|
end
|
|
|
|
-- return raw values as fallback
|
|
return cur, max
|
|
end
|
|
|
|
local function GetUnitHealthByName(self, unit, level, cur, max)
|
|
-- return raw values if another addon is replacing global API calls
|
|
if cur > 100 or max > 100 or max < 100 then
|
|
return cur, max, true
|
|
end
|
|
|
|
-- return raw values if no unit data could be found (unlikely but happened...)
|
|
if not unit or not level then
|
|
return cur, max
|
|
end
|
|
|
|
-- query the database for known values
|
|
dbstring = string.format("%s:%s", unit, level)
|
|
if mobdb[dbstring] and mobdb[dbstring][1] and mobdb[dbstring][2] > libhealth.reqdmg and (not mobdb[dbstring][3] or mobdb[dbstring][3] > libhealth.reqhit) then
|
|
return ceil(mobdb[dbstring][1]/100*cur), mobdb[dbstring][1], true
|
|
end
|
|
|
|
-- return raw values as fallback
|
|
return cur, max
|
|
end
|
|
|
|
-- add api calls to global tree
|
|
pfUI.libhealth = libhealth
|
|
pfUI.libhealth.GetUnitHealth = GetUnitHealth
|
|
pfUI.libhealth.GetUnitHealthByName = GetUnitHealthByName
|