Files
ice-hud/modules/TargetOfTargetHealth.lua
Parnic 7496475ff4 Fix potential nil access
I can't reproduce a problem here, but based on some user feedback, this could potentially be an issue. Most other modules are calling the super's Update() first thing, but these modules call them later, so healthPercentage may not be defined at this point.
2022-12-19 12:19:10 -06:00

166 lines
4.9 KiB
Lua

local L = LibStub("AceLocale-3.0"):GetLocale("IceHUD", false)
local TargetTargetHealth = IceCore_CreateClass(IceTargetHealth)
TargetTargetHealth.prototype.scheduledEvent = nil
local SelfDisplayModeOptions = {"Color as SelfColor", "Hide", "Normal"}
-- Constructor --
function TargetTargetHealth.prototype:init()
TargetTargetHealth.super.prototype.init(self, "TargetTargetHealth", "targettarget")
self:SetDefaultColor("TargetTargetHealthHostile", 231, 31, 36)
self:SetDefaultColor("TargetTargetHealthFriendly", 46, 223, 37)
self:SetDefaultColor("TargetTargetHealthNeutral", 210, 219, 87)
self:SetDefaultColor("SelfColor", 255, 255, 255)
end
function TargetTargetHealth.prototype:GetDefaultSettings()
local settings = TargetTargetHealth.super.prototype.GetDefaultSettings(self)
settings["side"] = IceCore.Side.Right
settings["offset"] = 12
settings["classColor"] = false
settings["selfColor"] = { r = 0, g = 0, b = 1 }
settings["selfDisplayMode"] = "Color as SelfColor"
settings["upperText"] = "[PercentHP:Round]"
settings["lowerText"] = "[FractionalHP:Short:HPColor:Bracket]"
settings["barVerticalOffset"] = 35
settings["scale"] = 0.7
settings["enabled"] = false
settings["hideBlizz"] = false
return settings
end
-- OVERRIDE
function TargetTargetHealth.prototype:GetOptions()
local opts = TargetTargetHealth.super.prototype.GetOptions(self)
opts["hideBlizz"] = nil
opts["selfDisplayMode"] = {
type = 'select',
name = L["Self Display Mode"],
desc = L["What this bar should do whenever the player is the TargetOfTarget\n\nNOTE: When this is set to 'hide', then click-targeting is not available due to Blizzard's restrictions"],
get = function(info)
return IceHUD:GetSelectValue(info, self.moduleSettings.selfDisplayMode)
end,
set = function(info, value)
self.moduleSettings.selfDisplayMode = info.option.values[value]
if info.option.values[value] == "Hide" then
self.moduleSettings.allowMouseInteraction = false
self.DisplayClickTargetOption = false
UnregisterUnitWatch(self.frame)
else
RegisterUnitWatch(self.frame)
self.DisplayClickTargetOption = true
end
IceHUD:NotifyOptionsChange()
self:Redraw()
end,
disabled = function()
return not self.moduleSettings.enabled
end,
values = SelfDisplayModeOptions,
order = 44,
}
opts["selfColor"] = {
type = "color",
name = L["Self Color"],
desc = L["Set the color of the TargetTarget bar if you are your target's target."],
get = function()
return self.moduleSettings.selfColor.r, self.moduleSettings.selfColor.g, self.moduleSettings.selfColor.b
end,
set = function(info, r, g, b)
self.moduleSettings.selfColor = { r = r, g = g, b = b }
IceHUD.IceCore:SetColor("SelfColor", r, g, b)
end,
disabled = function()
return not self.moduleSettings.enabled
end,
hasAlpha = false,
order = 45,
}
return opts
end
function TargetTargetHealth.prototype:Enable(core)
self.registerEvents = false
TargetTargetHealth.super.prototype.Enable(self, core)
if self.moduleSettings.selfDisplayMode == "Hide" then
UnregisterUnitWatch(self.frame)
self.DisplayClickTargetOption = false
self.moduleSettings.allowMouseInteraction = false
self:EnableClickTargeting(false)
end
if self.moduleSettings.useSelfColor ~= nil then
if self.moduleSettings.useSelfColor == true then
self.moduleSettings.selfDisplayMode = "Color as SelfColor"
else
self.moduleSettings.selfDisplayMode = "Normal"
end
self.moduleSettings.useSelfColor = nil
end
self.scheduledEvent = self:ScheduleRepeatingTimer("Update", 0.1, "targettarget")
end
function TargetTargetHealth.prototype:Disable(core)
TargetTargetHealth.super.prototype.Disable(self, core)
self:CancelTimer(self.scheduledEvent, true)
end
function TargetTargetHealth.prototype:Update(unit)
self.color = "TargetTargetHealthFriendly" -- friendly > 4
local reaction = UnitReaction(self.unit, "player")
if (reaction and (reaction == 4)) then
self.color = "TargetTargetHealthNeutral"
elseif (reaction and (reaction < 4)) then
self.color = "TargetTargetHealthHostile"
end
if (self.moduleSettings.classColor) then
self.color = self.unitClass
end
if (self.moduleSettings.scaleHealthColor) then
self.color = "ScaledHealthColor"
elseif self.moduleSettings.lowThresholdColor and self.healthPercentage and self.healthPercentage <= self.moduleSettings.lowThreshold then
self.color = "ScaledHealthColor"
end
if (self.tapped) then
self.color = "Tapped"
end
if UnitIsUnit("player", self.unit) then
if self.moduleSettings.selfDisplayMode == "Color as SelfColor" then
self.color = "SelfColor"
elseif self.moduleSettings.selfDisplayMode == "Hide" then
self:Show(false)
return
end
end
if self.moduleSettings.selfDisplayMode == "Hide" then
self:Show(UnitExists(self.unit))
end
self.determineColor = false
TargetTargetHealth.super.prototype.Update(self, unit)
end
-- Load us up
IceHUD.TargetTargetHealth = TargetTargetHealth:new()