第一次发版v0.1.0
This commit is contained in:
153
Healthbar.lua
Normal file
153
Healthbar.lua
Normal file
@@ -0,0 +1,153 @@
|
||||
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
|
||||
Reference in New Issue
Block a user