154 lines
5.3 KiB
Lua
154 lines
5.3 KiB
Lua
NanamiPlates_Healthbar = {}
|
|
|
|
local NP = NanamiPlates
|
|
local NEUTRAL_COLOR = {0.9, 0.7, 0.0, 1}
|
|
local HOSTILE_THRESHOLD = {r_min = 0.9, g_max = 0.2, b_max = 0.2}
|
|
local NEUTRAL_THRESHOLD = {r_min = 0.9, g_min = 0.9, b_max = 0.2}
|
|
|
|
function NanamiPlates_Healthbar.ResetCache(nameplate)
|
|
if not nameplate then return end
|
|
nameplate.cachedIsFriendly = nil
|
|
nameplate.cachedIsHostile = nil
|
|
nameplate.cachedIsNeutral = nil
|
|
nameplate.wasNeutral = nil
|
|
nameplate.lastPlateName = nil
|
|
nameplate.lastColorR = nil
|
|
nameplate.lastColorG = nil
|
|
nameplate.lastColorB = nil
|
|
end
|
|
|
|
function NanamiPlates_Healthbar.DetectUnitType(nameplate, original)
|
|
if not nameplate or not original or not original.healthbar then
|
|
return false, false, true, 0, 1, 0
|
|
end
|
|
|
|
local r, g, b = original.healthbar:GetStatusBarColor()
|
|
|
|
-- Guard: if color is (0,0,0) the engine hasn't set it yet, use previous cache or default hostile
|
|
if r == 0 and g == 0 and b == 0 then
|
|
if nameplate.cachedIsHostile ~= nil then
|
|
return nameplate.cachedIsHostile, nameplate.cachedIsNeutral, nameplate.cachedIsFriendly, r, g, b
|
|
end
|
|
return true, false, false, 1, 0, 0
|
|
end
|
|
|
|
local isHostile, isNeutral, isFriendly
|
|
|
|
local lastR, lastG, lastB = nameplate.lastColorR, nameplate.lastColorG, nameplate.lastColorB
|
|
|
|
if r == lastR and g == lastG and b == lastB then
|
|
isHostile = nameplate.cachedIsHostile
|
|
isNeutral = nameplate.cachedIsNeutral
|
|
isFriendly = nameplate.cachedIsFriendly
|
|
else
|
|
isHostile = r > HOSTILE_THRESHOLD.r_min and g < HOSTILE_THRESHOLD.g_max and b < HOSTILE_THRESHOLD.b_max
|
|
isNeutral = r > NEUTRAL_THRESHOLD.r_min and g > NEUTRAL_THRESHOLD.g_min and b < NEUTRAL_THRESHOLD.b_max
|
|
isFriendly = not isHostile and not isNeutral
|
|
|
|
nameplate.lastColorR = r
|
|
nameplate.lastColorG = g
|
|
nameplate.lastColorB = b
|
|
nameplate.cachedIsHostile = isHostile
|
|
nameplate.cachedIsNeutral = isNeutral
|
|
nameplate.cachedIsFriendly = isFriendly
|
|
|
|
if nameplate.wasNeutral == nil then
|
|
nameplate.wasNeutral = isNeutral
|
|
end
|
|
end
|
|
|
|
return isHostile, isNeutral, isFriendly, r, g, b
|
|
end
|
|
|
|
function NanamiPlates_Healthbar.CheckUnitChange(nameplate, plateName, isNeutral)
|
|
if not nameplate then return end
|
|
if plateName and plateName ~= nameplate.lastPlateName then
|
|
nameplate.lastPlateName = plateName
|
|
nameplate.wasNeutral = isNeutral
|
|
end
|
|
end
|
|
|
|
function NanamiPlates_Healthbar.IsNeutral(nameplate)
|
|
if not nameplate then return false end
|
|
return nameplate.cachedIsNeutral or nameplate.wasNeutral or false
|
|
end
|
|
|
|
function NanamiPlates_Healthbar.WasNeutral(nameplate)
|
|
if not nameplate then return false end
|
|
return nameplate.wasNeutral or false
|
|
end
|
|
|
|
function NanamiPlates_Healthbar.IsFriendly(nameplate)
|
|
if not nameplate then return false end
|
|
return nameplate.cachedIsFriendly or false
|
|
end
|
|
|
|
function NanamiPlates_Healthbar.IsHostile(nameplate)
|
|
if not nameplate then return false end
|
|
return nameplate.cachedIsHostile or false
|
|
end
|
|
|
|
function NanamiPlates_Healthbar.GetNeutralColor()
|
|
return NEUTRAL_COLOR[1], NEUTRAL_COLOR[2], NEUTRAL_COLOR[3], NEUTRAL_COLOR[4]
|
|
end
|
|
|
|
function NanamiPlates_Healthbar.ApplyNeutralColor(nameplate)
|
|
if not nameplate or not nameplate.health then return end
|
|
nameplate.health:SetStatusBarColor(NEUTRAL_COLOR[1], NEUTRAL_COLOR[2], NEUTRAL_COLOR[3], NEUTRAL_COLOR[4])
|
|
end
|
|
|
|
function NanamiPlates_Healthbar.ShouldShowNeutral(nameplate, isNeutral, isAttackingPlayer)
|
|
if not nameplate then return false end
|
|
return (isNeutral or nameplate.wasNeutral) and not isAttackingPlayer
|
|
end
|
|
|
|
function NanamiPlates_Healthbar.IsCritter(frame, nameplate, original, unitstr)
|
|
if unitstr and UnitCreatureType then
|
|
local creatureType = UnitCreatureType(unitstr)
|
|
if creatureType == "Critter" then return true end
|
|
end
|
|
|
|
if NP and NP.Critters then
|
|
local plateName = nil
|
|
if original and original.name and original.name.GetText then
|
|
plateName = original.name:GetText()
|
|
end
|
|
if not plateName and nameplate and nameplate.name and nameplate.name.GetText then
|
|
plateName = nameplate.name:GetText()
|
|
end
|
|
if plateName and NP.Critters[string.lower(plateName)] then
|
|
return true
|
|
end
|
|
end
|
|
|
|
if not unitstr and original and original.healthbar then
|
|
local r, g, b = original.healthbar:GetStatusBarColor()
|
|
local isNeutralColor = r > 0.9 and g > 0.9 and b < 0.2
|
|
if isNeutralColor then
|
|
local levelText = nil
|
|
if original.level and original.level.GetText then
|
|
levelText = original.level:GetText()
|
|
end
|
|
local _, hpmax = original.healthbar:GetMinMaxValues()
|
|
if levelText == "1" and hpmax and hpmax > 0 and hpmax < 100 then
|
|
return true
|
|
end
|
|
end
|
|
end
|
|
|
|
return false
|
|
end
|
|
|
|
function NanamiPlates_Healthbar.ShouldSkipNameplate(frame, nameplate, original, Settings)
|
|
if not Settings or Settings.showCritterNameplates then
|
|
return false
|
|
end
|
|
local unitstr = nil
|
|
if NP and NP.superwow_active and frame and frame.GetName then
|
|
unitstr = frame:GetName(1)
|
|
end
|
|
return NanamiPlates_Healthbar.IsCritter(frame, nameplate, original, unitstr)
|
|
end
|
|
|
|
NanamiPlates.Healthbar = NanamiPlates_Healthbar
|