Compare commits

...

10 Commits

Author SHA1 Message Date
55a376b959 Updated changelog 2016-10-25 14:43:59 -05:00
5b201ffee1 Updated TOC for 7.1 2016-10-25 14:40:10 -05:00
103e8b4eee Turn PlayerAbsorb back on by default
Changing this default has confused too many people, so let's put it back. Now this information is technically duplicated, but avoiding confusion is more important.
2016-10-15 20:27:03 -05:00
bda8da8b9a Updated changelog 2016-10-13 00:06:50 -05:00
60a3293095 Added absorb display to the player health bar
The player health bar will now show a (by default) faded white bar above the health for the amount of absorption the player currently has. The incoming heal bar starts above both the player health and the absorb, if any is present.
Also disabled the PlayerAbsorb bar by default since it's redundant. It can still be enabled separately if desired.
2016-10-12 23:18:27 -05:00
e26ccdfba1 First pass at showing Runes like combo points
With runes being homogenized in 7.0, it makes a little less sense to adhere to the structure of specific runes being available/used. This adds an option to display the runes more like combo points where simple textures are shown to indicate how many runes are available. No cooldown or "soon-to-be-ready" type indicators are setup just yet since that problem is more difficult and my personal usage doesn't really need them right now.
Also added an option to show the Runes module any time the player has some runes that are recharging.
2016-10-12 22:35:24 -05:00
ed0dee1e08 Fixed memory leak in Runes modules
We were creating font factories every time the runes module was asked to redraw. Oops...
Also fixed the numeric frame's parent while I was in there so that it (in a future commit) will show and hide with the module properly.
2016-10-12 21:06:03 -05:00
152a3898a7 Added support for the Scale setting on mirror bars (ticket #228) 2016-10-09 23:50:54 -05:00
2c5ea0c96b Extended scale range to 0.2-2.0 by request 2016-10-09 23:34:55 -05:00
858436e052 Ignore readme when packaging
Setup manual changelog instead of auto-generated one
2016-10-08 10:07:46 -05:00
8 changed files with 1358 additions and 15 deletions

View File

@ -61,3 +61,8 @@ move-folders:
tools-used: tools-used:
- libdatabroker-1-1 - libdatabroker-1-1
ignore:
- readme.md
manual-changelog: changelog.txt

View File

@ -1,4 +1,4 @@
## Interface: 70000 ## Interface: 70100
## Author: Parnic, originally created by Iceroth ## Author: Parnic, originally created by Iceroth
## Name: IceHUD ## Name: IceHUD
## Title: IceHUD |cff7fff7f-Ace3-|r ## Title: IceHUD |cff7fff7f-Ace3-|r

View File

@ -152,8 +152,8 @@ Blizzard added a "Personal Resource Display" feature in the 7.0 game client. You
set = function(info, v) set = function(info, v)
IceHUD.IceCore:SetScale(v) IceHUD.IceCore:SetScale(v)
end, end,
min = 0.5, min = 0.2,
max = 1.5, max = 2.0,
step = 0.05, step = 0.05,
isPercent = true, isPercent = true,
order = 14, order = 14,

1117
changelog.txt Normal file

File diff suppressed because it is too large Load Diff

View File

@ -165,6 +165,8 @@ function MirrorBarHandler.prototype:init()
self:SetDefaultColor("BREATH", 0, 0.5, 1) self:SetDefaultColor("BREATH", 0, 0.5, 1)
self:SetDefaultColor("DEATH", 1, 0.7, 0) self:SetDefaultColor("DEATH", 1, 0.7, 0)
self:SetDefaultColor("FEIGNDEATH", 1, 0.9, 0) self:SetDefaultColor("FEIGNDEATH", 1, 0.9, 0)
self.scalingEnabled = true
end end
@ -540,6 +542,7 @@ function MirrorBarHandler.prototype:SetSettings(bar)
bar.moduleSettings.barVerticalOffset = self.moduleSettings.barVerticalOffset bar.moduleSettings.barVerticalOffset = self.moduleSettings.barVerticalOffset
bar.moduleSettings.alwaysFullAlpha = self.moduleSettings.alwaysFullAlpha bar.moduleSettings.alwaysFullAlpha = self.moduleSettings.alwaysFullAlpha
bar.moduleSettings.rotateBar = self.moduleSettings.rotateBar bar.moduleSettings.rotateBar = self.moduleSettings.rotateBar
bar.moduleSettings.scale = self.moduleSettings.scale
end end

View File

@ -13,6 +13,7 @@ function PlayerAbsorb.prototype:GetDefaultSettings()
settings["side"] = IceCore.Side.Left settings["side"] = IceCore.Side.Left
settings["offset"] = 3 settings["offset"] = 3
settings["enabled"] = true
return settings return settings
end end

View File

@ -5,6 +5,7 @@ local IceHUD = _G.IceHUD
PlayerHealth.prototype.resting = nil PlayerHealth.prototype.resting = nil
PlayerHealth.prototype.pendingBlizzardPartyHide = false PlayerHealth.prototype.pendingBlizzardPartyHide = false
PlayerHealth.prototype.absorbAmount = 0
local configMode = false local configMode = false
local HealComm local HealComm
@ -16,6 +17,7 @@ function PlayerHealth.prototype:init()
self:SetDefaultColor("PlayerHealth", 37, 164, 30) self:SetDefaultColor("PlayerHealth", 37, 164, 30)
self:SetDefaultColor("PlayerHealthHealAmount", 37, 164, 30) self:SetDefaultColor("PlayerHealthHealAmount", 37, 164, 30)
self:SetDefaultColor("PlayerHealthAbsorbAmount", 220, 220, 220)
end end
@ -31,8 +33,10 @@ function PlayerHealth.prototype:GetDefaultSettings()
settings["allowMouseInteraction"] = false settings["allowMouseInteraction"] = false
settings["allowMouseInteractionCombat"] = false settings["allowMouseInteractionCombat"] = false
settings["healAlpha"] = 0.6 settings["healAlpha"] = 0.6
settings["absorbAlpha"] = 0.6
settings["lockIconAlpha"] = false settings["lockIconAlpha"] = false
settings["showIncomingHeals"] = true settings["showIncomingHeals"] = true
settings["showAbsorbs"] = true
settings["showStatusIcon"] = true settings["showStatusIcon"] = true
settings["statusIconOffset"] = {x=110, y=0} settings["statusIconOffset"] = {x=110, y=0}
@ -107,6 +111,8 @@ function PlayerHealth.prototype:Enable(core)
self:RegisterEvent("UNIT_HEAL_PREDICTION", "IncomingHealPrediction") self:RegisterEvent("UNIT_HEAL_PREDICTION", "IncomingHealPrediction")
end end
self:RegisterEvent("UNIT_ABSORB_AMOUNT_CHANGED", "UpdateAbsorbAmount")
if (self.moduleSettings.hideBlizz) then if (self.moduleSettings.hideBlizz) then
self:HideBlizz() self:HideBlizz()
end end
@ -164,6 +170,11 @@ function PlayerHealth.prototype:IncomingHealPrediction(event, unit)
end end
end end
function PlayerHealth.prototype:UpdateAbsorbAmount()
self.absorbAmount = UnitGetTotalAbsorbs(self.unit) or 0
self:Update()
end
-- OVERRIDE -- OVERRIDE
function PlayerHealth.prototype:GetOptions() function PlayerHealth.prototype:GetOptions()
@ -327,6 +338,52 @@ function PlayerHealth.prototype:GetOptions()
order = 43.7 order = 43.7
} }
opts["showAbsorbs"] =
{
type = 'toggle',
name = L["Show absorbs"],
desc = L["Whether or not to show absorb amounts as a lighter-colored bar on top of your current health."],
get = function()
return self.moduleSettings.showAbsorbs
end,
set = function(info, v)
if not v then
self.absorbFrame.bar:Hide()
else
self.absorbFrame.bar:Show()
end
self.moduleSettings.showAbsorbs = v
self:Update()
end,
disabled = function()
return not (self.moduleSettings.enabled and IceHUD.WowVer >= 70000)
end,
order = 43.8
}
opts["absorbAlpha"] =
{
type = "range",
name = L["Absorb bar alpha"],
desc = L["What alpha value to use for the bar that displays how much effective health you have including absorbs (This gets multiplied by the bar's current alpha to stay in line with the bar on top of it)"],
min = 0,
max = 100,
step = 5,
get = function()
return self.moduleSettings.absorbAlpha * 100
end,
set = function(info, v)
self.moduleSettings.absorbAlpha = v / 100.0
self:Redraw()
end,
disabled = function()
return not self.moduleSettings.enabled or not self.moduleSettings.showAbsorbs
end,
order = 43.9
}
opts["iconSettings"] = opts["iconSettings"] =
{ {
type = 'group', type = 'group',
@ -824,6 +881,7 @@ function PlayerHealth.prototype:CreateFrame()
PlayerHealth.super.prototype.CreateFrame(self) PlayerHealth.super.prototype.CreateFrame(self)
self:CreateHealBar() self:CreateHealBar()
self:CreateAbsorbBar()
end end
@ -880,6 +938,18 @@ function PlayerHealth.prototype:CreateHealBar()
end end
end end
function PlayerHealth.prototype:CreateAbsorbBar()
self.absorbFrame = self:BarFactory(self.absorbFrame, "LOW","BACKGROUND")
self.absorbFrame.bar:SetVertexColor(self:GetColor("PlayerHealthAbsorbAmount", self.alpha * self.moduleSettings.absorbAlpha))
self:UpdateBar(1, "undef")
if not self.moduleSettings.showAbsorbs or UnitGetTotalAbsorbs == nil then
self.absorbFrame.bar:Hide()
end
end
function PlayerHealth.prototype:EnableClickTargeting(bEnable) function PlayerHealth.prototype:EnableClickTargeting(bEnable)
if bEnable then if bEnable then
@ -1151,7 +1221,7 @@ function PlayerHealth.prototype:CheckPvP()
minx, maxx, miny, maxy = 0.05, 0.605, 0.015, 0.57 minx, maxx, miny, maxy = 0.05, 0.605, 0.015, 0.57
elseif UnitIsPVP(self.unit) then elseif UnitIsPVP(self.unit) then
pvpMode = UnitFactionGroup(self.unit) pvpMode = UnitFactionGroup(self.unit)
if pvpMode == "Neutral" then if pvpMode == "Neutral" then
pvpMode = "FFA" pvpMode = "FFA"
end end
@ -1216,7 +1286,7 @@ function PlayerHealth.prototype:Update(unit)
local percent local percent
if incomingHealAmt > 0 then if incomingHealAmt > 0 then
percent = self.maxHealth ~= 0 and ((self.health + incomingHealAmt) / self.maxHealth) or 0 percent = self.maxHealth ~= 0 and ((self.health + (self.absorbAmount or 0) + incomingHealAmt) / self.maxHealth) or 0
if self.moduleSettings.reverse then if self.moduleSettings.reverse then
percent = 1 - percent percent = 1 - percent
-- Rokiyo: I'm thinking the frama strata should also to be set to medium if we're in reverse. -- Rokiyo: I'm thinking the frama strata should also to be set to medium if we're in reverse.
@ -1230,6 +1300,23 @@ function PlayerHealth.prototype:Update(unit)
self:SetBarCoord(self.healFrame, percent) self:SetBarCoord(self.healFrame, percent)
end end
if self.moduleSettings.showAbsorbs and self.absorbFrame and self.absorbFrame.bar and self.absorbAmount then
local percent
if self.absorbAmount > 0 then
percent = self.maxHealth ~= 0 and ((self.health + self.absorbAmount) / self.maxHealth) or 0
if self.moduleSettings.reverse then
percent = 1 - percent
end
else
percent = 0
end
percent = IceHUD:Clamp(percent, 0, 1)
self:SetBarCoord(self.absorbFrame, percent)
end
if not IceHUD.IceCore:ShouldUseDogTags() then if not IceHUD.IceCore:ShouldUseDogTags() then
self:SetBottomText1(math.floor(self.healthPercentage * 100)) self:SetBottomText1(math.floor(self.healthPercentage * 100))
self:SetBottomText2(self:GetFormattedText(self.health, self.maxHealth), textColor) self:SetBottomText2(self:GetFormattedText(self.health, self.maxHealth), textColor)
@ -1399,6 +1486,9 @@ function PlayerHealth.prototype:UpdateBar(scale, color, alpha)
if self.healFrame and self.healFrame.bar then if self.healFrame and self.healFrame.bar then
self.healFrame.bar:SetVertexColor(self:GetColor("PlayerHealthHealAmount", self.alpha * self.moduleSettings.healAlpha)) self.healFrame.bar:SetVertexColor(self:GetColor("PlayerHealthHealAmount", self.alpha * self.moduleSettings.healAlpha))
end end
if self.absorbFrame and self.absorbFrame.bar then
self.absorbFrame.bar:SetVertexColor(self:GetColor("PlayerHealthAbsorbAmount", self.alpha * self.moduleSettings.absorbAlpha))
end
--[[ seems to be causing taint. oh well --[[ seems to be causing taint. oh well
if self.frame.button then if self.frame.button then
if self.alpha == 0 then if self.alpha == 0 then

View File

@ -21,6 +21,13 @@ if IceHUD.WowVer >= 70000 then
GetRuneType = function() return RUNETYPE_LEGION end GetRuneType = function() return RUNETYPE_LEGION end
end end
local RUNEMODE_DEFAULT = "Blizzard"
local RUNEMODE_NUMERIC = "Numeric"
local RUNEMODE_BAR = "Graphical Bar"
local RUNEMODE_CIRCLE = "Graphical Circle"
local RUNEMODE_GLOW = "Graphical Glow"
local RUNEMODE_CLEANCIRCLE = "Graphical Clean Circle"
-- setup the names to be more easily readable -- setup the names to be more easily readable
Runes.prototype.runeNames = { Runes.prototype.runeNames = {
[RUNETYPE_BLOOD] = "Blood", [RUNETYPE_BLOOD] = "Blood",
@ -34,6 +41,8 @@ Runes.prototype.runeSize = 25
-- blizzard has hardcoded 6 runes right now, so i'll do the same...see RuneFrame.xml -- blizzard has hardcoded 6 runes right now, so i'll do the same...see RuneFrame.xml
Runes.prototype.numRunes = 6 Runes.prototype.numRunes = 6
Runes.prototype.lastRuneState = {}
-- Constructor -- -- Constructor --
function Runes.prototype:init() function Runes.prototype:init()
Runes.super.prototype.init(self, "Runes") Runes.super.prototype.init(self, "Runes")
@ -152,6 +161,9 @@ function Runes.prototype:GetOptions()
disabled = function() disabled = function()
return not self.moduleSettings.enabled return not self.moduleSettings.enabled
end, end,
hidden = function()
return self.moduleSettings.runeMode ~= RUNEMODE_DEFAULT
end,
order = 36 order = 36
} }
@ -175,6 +187,42 @@ function Runes.prototype:GetOptions()
order = 34.1 order = 34.1
} }
opts["runeMode"] = {
type = 'select',
name = L["Rune display mode"],
desc = L["What graphical representation each rune should have. When setting to anything other than 'graphical', the module will behave more like combo points and simply show how many are active."],
get = function(info)
return IceHUD:GetSelectValue(info, self.moduleSettings.runeMode)
end,
set = function(info, v)
self.moduleSettings.runeMode = info.option.values[v]
self:ResetRuneAvailability()
self:Redraw()
end,
values = { RUNEMODE_DEFAULT, RUNEMODE_NUMERIC, RUNEMODE_BAR, RUNEMODE_CIRCLE, RUNEMODE_GLOW, RUNEMODE_CLEANCIRCLE },
disabled = function()
return not self.moduleSettings.enabled
end,
order = 35.5,
}
opts["showWhenNotFull"] = {
type = 'toggle',
name = L["Show when not full"],
desc = L["Whether to show the Runes module any time the player has fewer than max runes available (regardless of combat/target status)."],
get = function()
return self.moduleSettings.showWhenNotFull
end,
set = function(info, v)
self.moduleSettings.showWhenNotFull = v
self:Redraw()
end,
disabled = function()
return not self.moduleSettings.enabled
end,
order = 38,
}
return opts return opts
end end
@ -192,7 +240,9 @@ function Runes.prototype:GetDefaultSettings()
defaults["alwaysFullAlpha"] = false defaults["alwaysFullAlpha"] = false
defaults["displayMode"] = "Horizontal" defaults["displayMode"] = "Horizontal"
defaults["cooldownMode"] = "Cooldown" defaults["cooldownMode"] = "Cooldown"
defaults["runeMode"] = RUNEMODE_DEFAULT
defaults["runeGap"] = 0 defaults["runeGap"] = 0
defaults["showWhenNotFull"] = false
return defaults return defaults
end end
@ -212,6 +262,10 @@ function Runes.prototype:Enable(core)
self.numRunes = UnitPowerMax("player", SPELL_POWER_RUNES) self.numRunes = UnitPowerMax("player", SPELL_POWER_RUNES)
end end
for i=1,self.numRunes do
self.lastRuneState[i] = select(3, GetRuneCooldown(i))
end
Runes.super.prototype.Enable(self, core) Runes.super.prototype.Enable(self, core)
self:RegisterEvent("RUNE_POWER_UPDATE", "UpdateRunePower") self:RegisterEvent("RUNE_POWER_UPDATE", "UpdateRunePower")
@ -259,15 +313,45 @@ function Runes.prototype:UpdateRunePower(event, rune, dontFlash)
return return
end end
if self.moduleSettings.runeMode == RUNEMODE_NUMERIC then
self.frame.numeric:SetText(tostring(self:GetNumRunesAvailable()))
return
end
local start, duration, usable = GetRuneCooldown(rune) local start, duration, usable = GetRuneCooldown(rune)
local lastState = self.lastRuneState[rune]
self.lastRuneState[rune] = usable
if self.moduleSettings.runeMode ~= RUNEMODE_DEFAULT then
if lastState == usable then
return
end
if usable then
for i=1,self.numRunes do
if self.frame.graphical[i]:GetAlpha() == 0 then
rune = i
break
end
end
else
for i=1,self.numRunes do
if self.frame.graphical[i]:GetAlpha() == 0 then
break
end
rune = i
end
end
end
-- print("Runes.prototype:UpdateRunePower: rune="..rune.." usable="..(usable and "yes" or "no").." GetRuneType(rune)="..GetRuneType(rune)); -- print("Runes.prototype:UpdateRunePower: rune="..rune.." usable="..(usable and "yes" or "no").." GetRuneType(rune)="..GetRuneType(rune));
if usable then if usable then
if self.moduleSettings.cooldownMode == "Cooldown" then if self.moduleSettings.cooldownMode == "Alpha" or self.moduleSettings.runeMode ~= RUNEMODE_DEFAULT then
self.frame.graphical[rune].cd:Hide()
elseif self.moduleSettings.cooldownMode == "Alpha" then
self.frame.graphical[rune]:SetAlpha(1) self.frame.graphical[rune]:SetAlpha(1)
elseif self.moduleSettings.cooldownMode == "Cooldown" then
self.frame.graphical[rune].cd:Hide()
elseif self.moduleSettings.cooldownMode == "Both" then elseif self.moduleSettings.cooldownMode == "Both" then
self.frame.graphical[rune].cd:Hide() self.frame.graphical[rune].cd:Hide()
self.frame.graphical[rune]:SetAlpha(1) self.frame.graphical[rune]:SetAlpha(1)
@ -283,7 +367,9 @@ function Runes.prototype:UpdateRunePower(event, rune, dontFlash)
UIFrameFade(self.frame.graphical[rune].shine, fadeInfo); UIFrameFade(self.frame.graphical[rune].shine, fadeInfo);
end end
elseif start ~= nil and duration ~= nil then elseif start ~= nil and duration ~= nil then
if self.moduleSettings.cooldownMode == "Cooldown" then if self.moduleSettings.runeMode ~= RUNEMODE_DEFAULT then
self.frame.graphical[rune]:SetAlpha(0)
elseif self.moduleSettings.cooldownMode == "Cooldown" then
CooldownFrame_SetTimer(self.frame.graphical[rune].cd, start, duration, true) CooldownFrame_SetTimer(self.frame.graphical[rune].cd, start, duration, true)
self.frame.graphical[rune].cd:Show() self.frame.graphical[rune].cd:Show()
elseif self.moduleSettings.cooldownMode == "Alpha" then elseif self.moduleSettings.cooldownMode == "Alpha" then
@ -294,6 +380,20 @@ function Runes.prototype:UpdateRunePower(event, rune, dontFlash)
self.frame.graphical[rune]:SetAlpha(0.2) self.frame.graphical[rune]:SetAlpha(0.2)
end end
end end
self:Redraw()
end
function Runes.prototype:GetNumRunesAvailable()
local available = 0
for i=1,self.numRunes do
if select(3, GetRuneCooldown(i)) then
available = available + 1
end
end
return available
end end
function Runes.prototype:ShineFinished(rune) function Runes.prototype:ShineFinished(rune)
@ -319,10 +419,19 @@ function Runes.prototype:UpdateRuneType(event, rune)
end end
function Runes.prototype:GetRuneTexture(runeName) function Runes.prototype:GetRuneTexture(runeName)
if not runeName then if self.moduleSettings.runeMode == RUNEMODE_DEFAULT and runeName then
return "" return "Interface\\PlayerFrame\\UI-PlayerFrame-DeathKnight-"..runeName
elseif self.moduleSettings.runeMode == RUNEMODE_BAR then
return IceElement.TexturePath .. "Combo"
elseif self.moduleSettings.runeMode == RUNEMODE_CIRCLE then
return IceElement.TexturePath .. "ComboRound"
elseif self.moduleSettings.runeMode == RUNEMODE_GLOW then
return IceElement.TexturePath .. "ComboGlow"
elseif self.moduleSettings.runeMode == RUNEMODE_CLEANCIRCLE then
return IceElement.TexturePath .. "ComboCleanCurves"
end end
return "Interface\\PlayerFrame\\UI-PlayerFrame-DeathKnight-"..runeName
return ""
end end
-- 'Protected' methods -------------------------------------------------------- -- 'Protected' methods --------------------------------------------------------
@ -344,13 +453,19 @@ end
function Runes.prototype:CreateRuneFrame() function Runes.prototype:CreateRuneFrame()
-- create numeric runes -- create numeric runes
self.frame.numeric = self:FontFactory(self.moduleSettings.runeFontSize, nil, self.frame.numeric) if not self.frame.numeric then
self.frame.numeric = self:FontFactory(self.moduleSettings.runeFontSize, self.frame)
end
self.frame.numeric:SetWidth(50) self.frame.numeric:SetWidth(50)
self.frame.numeric:SetJustifyH("CENTER") self.frame.numeric:SetJustifyH("CENTER")
self.frame.numeric:SetPoint("TOP", self.frame, "TOP", 0, 0) self.frame.numeric:SetPoint("TOP", self.frame, "TOP", 0, 0)
self.frame.numeric:Hide() if self.moduleSettings.runeMode == RUNEMODE_NUMERIC then
self.frame.numeric:Show()
else
self.frame.numeric:Hide()
end
if (not self.frame.graphical) then if (not self.frame.graphical) then
self.frame.graphical = {} self.frame.graphical = {}
@ -409,7 +524,11 @@ function Runes.prototype:CreateRune(i, type, name)
local runeTex = self:GetRuneTexture(name) local runeTex = self:GetRuneTexture(name)
self.frame.graphical[i].rune:SetTexture(runeTex) self.frame.graphical[i].rune:SetTexture(runeTex)
self.frame.graphical[i].rune:SetVertexColor(self:GetColor("Runes"..name)) self.frame.graphical[i].rune:SetVertexColor(self:GetColor("Runes"..name))
self.frame.graphical[i]:Show() if self.moduleSettings.runeMode ~= RUNEMODE_NUMERIC then
self.frame.graphical[i]:Show()
else
self.frame.graphical[i]:Hide()
end
self.frame.graphical[i].cd:SetFrameStrata("BACKGROUND") self.frame.graphical[i].cd:SetFrameStrata("BACKGROUND")
self.frame.graphical[i].cd:SetFrameLevel(self.frame.graphical[i]:GetFrameLevel()+1) self.frame.graphical[i].cd:SetFrameLevel(self.frame.graphical[i]:GetFrameLevel()+1)
@ -485,6 +604,14 @@ function Runes.prototype:CheckCombat()
self:Redraw() self:Redraw()
end end
function Runes.prototype:UseTargetAlpha(scale)
if not self.moduleSettings.showWhenNotFull then
return Runes.super.prototype.UseTargetAlpha(scale)
else
return self:GetNumRunesAvailable() ~= self.numRunes
end
end
-- Load us up -- Load us up
local _, unitClass = UnitClass("player") local _, unitClass = UnitClass("player")
if (unitClass == "DEATHKNIGHT") then if (unitClass == "DEATHKNIGHT") then