diff --git a/Modules/Healthbar.lua b/Modules/Healthbar.lua index 4d88014..1bc2e5a 100644 --- a/Modules/Healthbar.lua +++ b/Modules/Healthbar.lua @@ -1,5 +1,6 @@ -local pairs = pairs +local pairs, ipairs = pairs, ipairs local floor = math.floor +local str_find, str_gsub, str_sub, tinsert = string.find, string.gsub, string.sub, table.insert local UnitHealth, UnitHealthMax, UnitName, UnitExists, UnitIsDeadOrGhost = UnitHealth, UnitHealthMax, UnitName, UnitExists, UnitIsDeadOrGhost local CreateFrame = CreateFrame @@ -26,12 +27,23 @@ local Healthbar = Gladdy:NewModule("Health Bar", 100, { healthPercentage = true, healthFrameStrata = "MEDIUM", healthFrameLevel = 1, + healthCustomTagsEnabled = false, + healthTextRight = "[percent|status]", + healthTextLeft = "[name]", + healthTextRight = "[percent|status]", + healthTextLeftOutline = false, + healthTextRightOutline = false, + healthTextLeftVOffset = 0, + healthTextLeftHOffset = 5, + healthTextRightVOffset = 0, + healthTextRightHOffset = -5, }) function Healthbar:Initialize() self.frames = {} self:RegisterMessage("JOINED_ARENA") self:RegisterMessage("ENEMY_SPOTTED") + self:RegisterMessage("UNIT_SPEC") self:RegisterMessage("UNIT_DESTROYED") self:RegisterMessage("UNIT_DEATH") end @@ -65,28 +77,28 @@ function Healthbar:CreateFrame(unit) healthBar.nameText:SetFont(Gladdy:SMFetch("font", "healthBarNameFont"), 1) healthBar.nameText:Hide() else - healthBar.nameText:SetFont(Gladdy:SMFetch("font", "healthBarFont"), Gladdy.db.healthBarNameFontSize) + healthBar.nameText:SetFont(Gladdy:SMFetch("font", "healthBarFont"), Gladdy.db.healthBarNameFontSize, Gladdy.db.healthTextLeftOutline and "OUTLINE") healthBar.nameText:Show() end healthBar.nameText:SetTextColor(Gladdy:SetColor(Gladdy.db.healthBarFontColor)) healthBar.nameText:SetShadowOffset(1, -1) healthBar.nameText:SetShadowColor(0, 0, 0, 1) healthBar.nameText:SetJustifyH("CENTER") - healthBar.nameText:SetPoint("LEFT", 5, 0) + healthBar.nameText:SetPoint("LEFT", Gladdy.db.healthTextLeftHOffset, Gladdy.db.healthTextLeftVOffset) healthBar.healthText = healthBar:CreateFontString(nil, "LOW") if (Gladdy.db.healthBarHealthFontSize < 1) then healthBar.healthText:SetFont(Gladdy:SMFetch("font", "healthBarFont"), 1) healthBar.healthText:Hide() else - healthBar.healthText:SetFont(Gladdy:SMFetch("font", "healthBarFont"), Gladdy.db.healthBarHealthFontSize) + healthBar.healthText:SetFont(Gladdy:SMFetch("font", "healthBarFont"), Gladdy.db.healthBarHealthFontSize, Gladdy.db.healthTextRightOutline and "OUTLINE") healthBar.healthText:Hide() end healthBar.healthText:SetTextColor(Gladdy:SetColor(Gladdy.db.healthBarFontColor)) healthBar.healthText:SetShadowOffset(1, -1) healthBar.healthText:SetShadowColor(0, 0, 0, 1) healthBar.healthText:SetJustifyH("CENTER") - healthBar.healthText:SetPoint("RIGHT", -5, 0) + healthBar.healthText:SetPoint("RIGHT", Gladdy.db.healthTextRightHOffset, Gladdy.db.healthTextRightVOffset) healthBar.unit = unit self.frames[unit] = healthBar @@ -100,17 +112,7 @@ end function Healthbar.OnEvent(self, event, unit) local isDead = UnitExists(unit) and UnitIsDeadOrGhost(unit) - if event == "UNIT_HEALTH" then - if isDead then - Gladdy:SendMessage("UNIT_DEATH", unit) - return - end - local health = UnitHealth(unit) - local healthMax = UnitHealthMax(unit) - self.hp:SetMinMaxValues(0, healthMax) - self.hp:SetValue(UnitHealth(unit)) - Healthbar:SetHealthText(self, health, healthMax) - elseif event == "UNIT_MAXHEALTH" then + if event == "UNIT_HEALTH" or event == "UNIT_MAXHEALTH" then if isDead then Gladdy:SendMessage("UNIT_DEATH", unit) return @@ -119,13 +121,13 @@ function Healthbar.OnEvent(self, event, unit) local healthMax = UnitHealthMax(unit) self.hp:SetMinMaxValues(0, healthMax) self.hp:SetValue(health) - Healthbar:SetHealthText(self, health, healthMax) + self.hp.current = health + Healthbar:SetText(unit, health, healthMax) + --Healthbar:SetHealthText(self, health, healthMax) elseif event == "UNIT_NAME_UPDATE" then local name = UnitName(unit) Gladdy.buttons[unit].name = name - if Gladdy.db.healthName and not Gladdy.db.healthNameToArenaId then - self.nameText:SetText(name) - end + Healthbar:SetText(unit, self.hp.current, 100) end if not Gladdy.buttons[unit].class then Gladdy:SpotEnemy(unit, true) @@ -134,20 +136,42 @@ end function Healthbar:SetHealthText(healthBar, health, healthMax) local healthText = "" - local healthPercentage = floor(health * 100 / healthMax) + local healthPercentage = health and healthMax and floor(health * 100 / healthMax) if health == 0 and UnitExists(healthBar.unit) and UnitIsDeadOrGhost(healthBar.unit) then self:UNIT_DEATH(healthBar.unit) return end - - if (Gladdy.db.healthPercentage) then + if (Gladdy.db.healthPercentage and healthPercentage) then healthText = ("%d%%"):format(healthPercentage) end - healthBar.healthText:SetText(healthText) end +function Healthbar:SetText(unit, health, healthMax, status) + local button = Gladdy.buttons[unit] + if not Gladdy.buttons[unit] then + return + end + if Gladdy.db.healthCustomTagsEnabled then + button.healthBar.nameText:SetText(Gladdy:SetTag(unit, Gladdy.db.healthTextLeft, health, healthMax, status)) + button.healthBar.healthText:SetText(Gladdy:SetTag(unit, Gladdy.db.healthTextRight, health, healthMax, status)) + else + if Gladdy.db.healthName then + if Gladdy.db.healthNameToArenaId then + button.healthBar.nameText:SetText(str_gsub(unit, "arena", "")) + else + button.healthBar.nameText:SetText(Gladdy.buttons[unit].name) + end + end + if status then + button.healthBar.healthText:SetText(status) + else + Healthbar:SetHealthText(button.healthBar, health, healthMax) + end + end +end + function Healthbar:UpdateFrame(unit) local healthBar = self.frames[unit] if (not healthBar) then @@ -178,14 +202,14 @@ function Healthbar:UpdateFrame(unit) healthBar.healthText:SetFont(Gladdy:SMFetch("font", "healthBarFont"), 1) healthBar.healthText:Hide() else - healthBar.healthText:SetFont(Gladdy:SMFetch("font", "healthBarFont"), Gladdy.db.healthBarHealthFontSize) + healthBar.healthText:SetFont(Gladdy:SMFetch("font", "healthBarFont"), Gladdy.db.healthBarHealthFontSize, Gladdy.db.healthTextRightOutline and "OUTLINE") healthBar.healthText:Show() end if (Gladdy.db.healthBarNameFontSize < 1) then healthBar.nameText:SetFont(Gladdy:SMFetch("font", "healthBarNameFont"), 1) healthBar.nameText:Hide() else - healthBar.nameText:SetFont(Gladdy:SMFetch("font", "healthBarFont"), Gladdy.db.healthBarNameFontSize) + healthBar.nameText:SetFont(Gladdy:SMFetch("font", "healthBarFont"), Gladdy.db.healthBarNameFontSize, Gladdy.db.healthTextLeftOutline and "OUTLINE") if Gladdy.db.healthName then healthBar.nameText:Show() else @@ -194,6 +218,8 @@ function Healthbar:UpdateFrame(unit) end healthBar.nameText:SetTextColor(Gladdy:SetColor(Gladdy.db.healthBarFontColor)) healthBar.healthText:SetTextColor(Gladdy:SetColor(Gladdy.db.healthBarFontColor)) + healthBar.nameText:SetPoint("LEFT", Gladdy.db.healthTextLeftHOffset, Gladdy.db.healthTextLeftVOffset) + healthBar.healthText:SetPoint("RIGHT", Gladdy.db.healthTextRightHOffset, Gladdy.db.healthTextRightVOffset) end function Healthbar:ResetUnit(unit) @@ -206,6 +232,7 @@ function Healthbar:ResetUnit(unit) healthBar.nameText:SetText("") healthBar.healthText:SetText("") healthBar.hp:SetValue(0) + healthBar.hp.current = 0 end function Healthbar:Test(unit) @@ -215,17 +242,30 @@ function Healthbar:Test(unit) return end - self:JOINED_ARENA() + --self:JOINED_ARENA() + Gladdy:SendMessage("UNIT_HEALTH", unit, button.health, button.healthMax) + healthBar.hp.current = button.health self:ENEMY_SPOTTED(unit) - self:UNIT_HEALTH(unit, button.health, button.healthMax) + self:SetText(unit, button.health, button.healthMax) + healthBar.hp:SetValue(button.health) + if unit == "arena1" then + self:UNIT_DEATH(unit) + --self:SetText(unit, button.health, button.healthMax, L["DEAD"]) + end +end + +function Healthbar:UNIT_SPEC(unit) + local button = Gladdy.buttons[unit] + if not button then + return + end + self:SetText(unit, button.healthBar.hp.current, 100) + --button.healthBar.nameText:SetText(Gladdy:SetTag(unit, Gladdy.db.healthTextLeft, button.health, button.healthMax)) end function Healthbar:JOINED_ARENA() - if Gladdy.db.healthNameToArenaId and Gladdy.db.healthName then - for i=1,Gladdy.curBracket do - local healthBar = self.frames["arena" .. i] - healthBar.nameText:SetText(i) - end + for i=1,Gladdy.curBracket do + self:SetText("arena" .. i, nil, nil) end end @@ -241,10 +281,9 @@ function Healthbar:ENEMY_SPOTTED(unit) local healthMax = UnitHealthMax(unit) healthBar.hp:SetMinMaxValues(0, healthMax) healthBar.hp:SetValue(health) - Healthbar:SetHealthText(healthBar, health, healthMax) - end - if button.name and Gladdy.db.healthName and not Gladdy.db.healthNameToArenaId then - healthBar.nameText:SetText(button.name) + healthBar.hp.current = health + Healthbar:SetText(unit, health, healthMax) + --Healthbar:SetHealthText(healthBar, health, healthMax) end if button.class then @@ -252,27 +291,6 @@ function Healthbar:ENEMY_SPOTTED(unit) end end -function Healthbar:UNIT_HEALTH(unit, health, healthMax) - local healthBar = self.frames[unit] - if (not healthBar) then - return - end - if not Gladdy.buttons[unit].class then - Gladdy:SpotEnemy(unit, true) - end - Gladdy:SendMessage("UNIT_HEALTH", unit, health, healthMax) - - local healthPercentage = floor(health * 100 / healthMax) - local healthText = "" - - if (Gladdy.db.healthPercentage) then - healthText = ("%d%%"):format(healthPercentage) - end - - healthBar.healthText:SetText(healthText) - healthBar.hp:SetValue(healthPercentage) -end - function Healthbar:UNIT_DEATH(unit) local healthBar = self.frames[unit] if (not healthBar) then @@ -280,7 +298,8 @@ function Healthbar:UNIT_DEATH(unit) end healthBar.hp:SetValue(0) - healthBar.healthText:SetText(L["DEAD"]) + healthBar.hp.current = 0 + Healthbar:SetText(unit, 0, 100, L["DEAD"]) end function Healthbar:UNIT_DESTROYED(unit) @@ -290,6 +309,7 @@ function Healthbar:UNIT_DESTROYED(unit) end healthBar.hp:SetValue(0) + healthBar.hp.current = 0 healthBar.healthText:SetText(L["LEAVE"]) healthBar.nameText:SetText("") end @@ -307,8 +327,10 @@ local function option(params) if Gladdy.db.healthBarBorderSize > Gladdy.db.healthBarHeight/2 then Gladdy.db.healthBarBorderSize = Gladdy.db.healthBarHeight/2 end - for i=1,Gladdy.curBracket do - Healthbar:Test("arena" .. i) + if Gladdy.frame.testing then + for i=1,Gladdy.curBracket do + Healthbar:Test("arena" .. i) + end end Gladdy:UpdateFrame() end, @@ -396,11 +418,28 @@ function Healthbar:GetOptions() order = 12, hasAlpha = true, }), + healthTextLeftOutline = option({ + type = "toggle", + name = L["Left Font Outline"], + order = 13, + width = "full", + }), + healthTextRightOutline = option({ + type = "toggle", + name = L["Right Font Outline"], + order = 14, + width = "full", + }), + headerSize = { + type = "header", + name = L["Size"], + order = 20, + }, healthBarNameFontSize = option({ type = "range", name = L["Name font size"], desc = L["Size of the name text"], - order = 13, + order = 21, step = 0.1, min = 0, max = 20, @@ -410,12 +449,53 @@ function Healthbar:GetOptions() type = "range", name = L["Health font size"], desc = L["Size of the health text"], - order = 14, + order = 22, step = 0.1, min = 0, max = 20, width = "full", }), + headerLeftText = { + type = "header", + name = L["Offsets"], + order = 30, + }, + healthTextLeftVOffset = option({ + type = "range", + name = L["Left Text Vertical Offset"], + order = 31, + step = 0.1, + min = -200, + max = 200, + width = "full", + }), + healthTextLeftHOffset = option({ + type = "range", + name = L["Left Text Horizontal Offset"], + order = 32, + step = 0.1, + min = -200, + max = 200, + width = "full", + }), + healthTextRightVOffset = option({ + type = "range", + name = L["Right Text Vertical Offset"], + order = 33, + step = 0.1, + min = -200, + max = 200, + width = "full", + }), + healthTextRightHOffset = option({ + type = "range", + name = L["Right Text Horizontal Offset"], + order = 34, + step = 0.1, + min = -200, + max = 200, + width = "full", + }), }, }, border = { @@ -499,6 +579,7 @@ function Healthbar:GetOptions() desc = L["Show the units name"], order = 2, width = "full", + disabled = function() return Gladdy.db.healthCustomTagsEnabled end, }), healthNameToArenaId = option({ type = "toggle", @@ -506,7 +587,7 @@ function Healthbar:GetOptions() desc = L["Show 1-5 as name instead"], order = 3, width = "full", - disabled = function() return not Gladdy.db.healthName end + disabled = function() return not Gladdy.db.healthName or Gladdy.db.healthCustomTagsEnabled end, }), healthPercentage = option({ type = "toggle", @@ -514,7 +595,16 @@ function Healthbar:GetOptions() desc = L["Show health percentage on the health bar"], order = 6, width = "full", + disabled = function() return Gladdy.db.healthCustomTagsEnabled end, }), + header = { + type = "header", + name = L["Custom Tags"], + order = 10, + }, + healthCustomTagsEnabled = Gladdy:GetTagOption(L["Custom Tags Enabled"], 11, nil, option, true), + healthTextLeft = Gladdy:GetTagOption(L["Left Text"], 12, "healthCustomTagsEnabled", option), + healthTextRight = Gladdy:GetTagOption(L["Right Text"], 13, "healthCustomTagsEnabled", option), }, }, },