Compare commits

...

13 Commits

Author SHA1 Message Date
f74233dcfa Tweaked and updated the FAQ a bit 2016-09-05 23:23:12 -05:00
0c729d77e9 Amended 29dc1b89 to be controlled by its own option
Instead of changing a behavior that's years old out from under people, let's make it opt-in.
2016-09-05 21:50:43 -05:00
7ec918ecb6 Added user-submitted Roll the Bones module (ticket #220, thanks Zahariel!) 2016-09-04 16:14:03 -05:00
29dc1b8955 Allow "scale mana color" to work with class-specific mana types 2016-09-04 08:05:00 -05:00
e36b87a407 Fixed TargetInfo debuffs not having the same frame as buffs 2016-08-31 23:07:54 -05:00
880e2e3278 Added support for the Pain mana type 2016-08-18 23:00:06 -05:00
a5de40f087 Added colors for Maelstrom mana
Fixed TargetMana to use Insanity, Fury, and Maelstrom colors correctly
2016-08-15 23:16:57 -05:00
6090814d4e Fixed error on startup in 7.0 for users with old MaelstromCount, SunderCount, or LacerateCount modules in their settings. 2016-08-15 23:10:58 -05:00
c78f618149 Fixed speed and reliability of absorb bars reacting to changes 2016-08-07 17:16:57 -05:00
6133a59ef3 Added Maelstrom to the list of powers to treat 0 as full for opacity purposes 2016-08-07 16:44:13 -05:00
a201aa5149 Fixed incorrect texture drawing behind power counters
Looks like at some point I modified how "darkened" inactive powers worked and ended up drawing two copies of the darkened power counter for each inactive power. "runebg" is superfluous since we're just setting the color of the actual counter to black and partially transparent instead. For some power counters, such as Paladins, the runebg texture was actually wrong and drawing the entire atlas rather than just the texture we wanted.
2016-07-26 21:37:45 -05:00
34d3060df3 Fixed castbar interruption on 7.0 clients
Looks like some things changed in spellcast events on 7.0 which necessitate using the spellcast GUID to identify when a specific cast starts or stops. Now we use those GUIDs which restores the castbar to its appropriate behavior. (ticket #215)
2016-07-25 13:02:14 -05:00
9e7b34d43c Disabled Resolved for 7.0 clients 2016-07-25 12:33:20 -05:00
13 changed files with 1540 additions and 1134 deletions

View File

@ -413,30 +413,30 @@ end
-- NORMAL SPELLS -- -- NORMAL SPELLS --
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
function IceCastBar.prototype:SpellCastSent(event, unit, spell, rank, target) function IceCastBar.prototype:SpellCastSent(event, unit, spell, rank, target, lineId)
if (unit ~= self.unit) then return end if (unit ~= self.unit) then return end
IceHUD:Debug("SpellCastSent", unit, spell, rank, target) IceHUD:Debug("SpellCastSent", unit, spell, rank, target, lineId)
end end
function IceCastBar.prototype:SpellCastChanged(event, arg1) function IceCastBar.prototype:SpellCastChanged(event, arg1)
IceHUD:Debug("SpellCastChanged", arg1) IceHUD:Debug("SpellCastChanged", arg1)
end end
function IceCastBar.prototype:SpellCastStart(event, unit, spell, rank) function IceCastBar.prototype:SpellCastStart(event, unit, spell, rank, lineId, spellId)
if (unit ~= self.unit) then return end if (unit ~= self.unit) then return end
IceHUD:Debug("SpellCastStart", unit, spell, rank) IceHUD:Debug("SpellCastStart", unit, spell, rank, lineId, spellId)
--UnitCastingInfo(unit) --UnitCastingInfo(unit)
self:StartBar(IceCastBar.Actions.Cast) self:StartBar(IceCastBar.Actions.Cast)
self.current = spell self.current = lineId
end end
function IceCastBar.prototype:SpellCastStop(event, unit, spell, rank) function IceCastBar.prototype:SpellCastStop(event, unit, spell, rank, lineId, spellId)
if (unit ~= self.unit) then return end if (unit ~= self.unit) then return end
IceHUD:Debug("SpellCastStop", unit, spell, self.current) IceHUD:Debug("SpellCastStop", unit, spell, self.current, rank, lineId, spellId)
-- ignore if not coming from current spell -- ignore if not coming from current spell
if (self.current and spell and self.current ~= spell) then if (self.current and lineId and self.current ~= lineId) then
return return
end end
@ -450,12 +450,12 @@ function IceCastBar.prototype:SpellCastStop(event, unit, spell, rank)
end end
function IceCastBar.prototype:SpellCastFailed(event, unit, spell, rank) function IceCastBar.prototype:SpellCastFailed(event, unit, spell, rank, lineId, spellId)
if (unit ~= self.unit) then return end if (unit ~= self.unit) then return end
IceHUD:Debug("SpellCastFailed", unit, self.current) IceHUD:Debug("SpellCastFailed", unit, self.current, lineId, spellId)
-- ignore if not coming from current spell -- ignore if not coming from current spell
if (self.current and spell and self.current ~= spell) then if (self.current and lineId and self.current ~= lineId) then
return return
end end
@ -478,12 +478,12 @@ function IceCastBar.prototype:SpellCastFailed(event, unit, spell, rank)
self:StartBar(IceCastBar.Actions.Failure, "Failed") self:StartBar(IceCastBar.Actions.Failure, "Failed")
end end
function IceCastBar.prototype:SpellCastInterrupted(event, unit, spell, rank) function IceCastBar.prototype:SpellCastInterrupted(event, unit, spell, rank, lineId, spellId)
if (unit ~= self.unit) then return end if (unit ~= self.unit) then return end
IceHUD:Debug("SpellCastInterrupted", unit, self.current) IceHUD:Debug("SpellCastInterrupted", unit, self.current, lineId, spellId)
-- ignore if not coming from current spell -- ignore if not coming from current spell
if (self.current and spell and self.current ~= spell) then if (self.current and lineId and self.current ~= lineId) then
return return
end end
@ -505,7 +505,7 @@ function IceCastBar.prototype:SpellCastDelayed(event, unit, delay)
end end
function IceCastBar.prototype:SpellCastSucceeded(event, unit, spell, rank) function IceCastBar.prototype:SpellCastSucceeded(event, unit, spell, rank, lineId, spellId)
if (unit ~= self.unit) then return end if (unit ~= self.unit) then return end
--IceHUD:Debug("SpellCastSucceeded", unit, spell, rank) --IceHUD:Debug("SpellCastSucceeded", unit, spell, rank)
@ -515,7 +515,7 @@ function IceCastBar.prototype:SpellCastSucceeded(event, unit, spell, rank)
end end
-- ignore if not coming from current spell -- ignore if not coming from current spell
if (self.current and self.current ~= spell) then if (self.current and self.current ~= lineId) then
return return
end end

View File

@ -272,7 +272,7 @@ end
function IceCore.prototype:RedirectRemovedModules() function IceCore.prototype:RedirectRemovedModules()
local _, class = UnitClass("player") local _, class = UnitClass("player")
if class == "WARRIOR" and self.settings.modules["SunderCount"] and IceHUD.WowVer < 60000 then if class == "WARRIOR" and self.settings.modules["SunderCount"] and GetSpellInfo(SUNDER_SPELL_ID) and IceHUD.WowVer < 60000 then
if self.settings.modules["SunderCount"].enabled or self.settings.modules["SunderCount"].enabled == nil then if self.settings.modules["SunderCount"].enabled or self.settings.modules["SunderCount"].enabled == nil then
local bFound = false local bFound = false
@ -309,7 +309,7 @@ function IceCore.prototype:RedirectRemovedModules()
self.settings.modules["SunderCount"] = nil self.settings.modules["SunderCount"] = nil
end end
if class == "DRUID" and self.settings.modules["LacerateCount"] then if class == "DRUID" and self.settings.modules["LacerateCount"] and GetSpellInfo(LACERATE_SPELL_ID) then
if self.settings.modules["LacerateCount"].enabled or self.settings.modules["LacerateCount"].enabled == nil then if self.settings.modules["LacerateCount"].enabled or self.settings.modules["LacerateCount"].enabled == nil then
local bFound = false local bFound = false
for k,v in pairs(self.elements) do for k,v in pairs(self.elements) do
@ -346,7 +346,7 @@ function IceCore.prototype:RedirectRemovedModules()
self.settings.modules["LacerateCount"] = nil self.settings.modules["LacerateCount"] = nil
end end
if class == "SHAMAN" and self.settings.modules["MaelstromCount"] then if class == "SHAMAN" and self.settings.modules["MaelstromCount"] and GetSpellInfo(MAELSTROM_SPELL_ID) then
if self.settings.modules["MaelstromCount"].enabled or self.settings.modules["MaelstromCount"].enabled == nil then if self.settings.modules["MaelstromCount"].enabled or self.settings.modules["MaelstromCount"].enabled == nil then
local bFound = false local bFound = false
for k,v in pairs(self.elements) do for k,v in pairs(self.elements) do

View File

@ -89,6 +89,7 @@ modules\FocusAbsorb.lua
modules\Stagger.lua modules\Stagger.lua
modules\PlayerAltMana.lua modules\PlayerAltMana.lua
modules\ArcaneCharges.lua modules\ArcaneCharges.lua
modules\RollTheBones.lua
#@do-not-package@ #@do-not-package@
IceHUD_Options\Options.lua IceHUD_Options\Options.lua

View File

@ -65,22 +65,22 @@ Expand "|cffffdc42Module Settings|r", expand PlayerHealth (or TargetHealth for t
Expand "|cffffdc42Module Settings|r", expand PlayerInfo (or TargetInfo for targets), select Buff Settings or Debuff Settings, and un-check "show buffs" (or "show debuffs"). Expand "|cffffdc42Module Settings|r", expand PlayerInfo (or TargetInfo for targets), select Buff Settings or Debuff Settings, and un-check "show buffs" (or "show debuffs").
|cff9999ff12. How do I turn off these big huge bars that pulse whenever one of my abilities procs?|r |cff9999ff12. How do I turn off these big huge bars that pulse whenever one of my abilities procs?|r
This isn't |cff9999ffIceHUD|r - it's Blizzard's new Spell Alerts they added in 4.0.1. Interface options => Combat => "Show Spell Alerts" to turn them off or search for a mod to tweak their positioning/size/etc. This isn't |cff9999ffIceHUD|r - it's Blizzard's Spell Alerts they added in 4.0.1. Interface options => Combat => "Spell Alert Opacity" to turn them off or search for a mod to tweak their positioning/size/etc.
|cff9999ff13. I don't like where some of the bars are placed. How do I put the health/mana on the left/right?|r |cff9999ff13. I don't like where some of the bars are placed. How do I put the health/mana on the left/right?|r
Expand "|cffffdc42Module Settings|r", expand whatever module you want to move (e.g. PlayerHealth, PlayerMana), and adjust the "Side" and "Offset" settings. "Side" controls whether it's on the left or the right and "Offset" controls how far from center it is. Expand "|cffffdc42Module Settings|r", expand whatever module you want to move (e.g. PlayerHealth, PlayerMana), and adjust the "Side" and "Offset" settings. "Side" controls whether it's on the left or the right and "Offset" controls how far from center it is.
|cff9999ff14. Which module displays Monk Chi power?|r |cff9999ff14. Which module displays Monk Chi power?|r
This module is called HarmonyPower. Harmony was the original name for Chi back when 5.0 was in beta, so I used Blizzard's name for it while I was developing for Cataclysm. I feel like it's too late to change now that many people are familiar with the Harmony name. This module is called |cffdcff42HarmonyPower|r. Harmony was the original name for Chi back when 5.0 was in beta, so I used Blizzard's name for it while I was developing for Cataclysm. I feel like it's too late to change now that many people are familiar with the Harmony name.
|cff9999ff15. How do I add commas/periods into big numbers like health?|r |cff9999ff15. How do I add commas/periods into big numbers like health?|r
If you have DogTags enabled, you can open the Text Settings for the module in question and add SeparateDigits() around the tag you're trying to split up. To display Health/MaxHealth with commas, use: [(SeparateDigits(HP):HPColor "/" SeparateDigits(MaxHP):HPColor):Bracket]. To use periods instead of commas, use: [(SeparateDigits(HP, "."):HPColor "/" SeparateDigits(MaxHP, "."):HPColor):Bracket]. Use the /dog help menu to build your own similar tags for Mana, etc. If you have |cff42ffffDogTags|r enabled, you can open the Text Settings for the module in question and add SeparateDigits() around the tag you're trying to split up. To display Health/MaxHealth with commas, use: [(SeparateDigits(HP):HPColor "/" SeparateDigits(MaxHP):HPColor):Bracket]. To use periods instead of commas, use: [(SeparateDigits(HP, "."):HPColor "/" SeparateDigits(MaxHP, "."):HPColor):Bracket]. Use the /dog help menu to build your own similar tags for Mana, etc.
|cff9999ff16. The countdown timers on buffs and debuffs completely obscure the icon. How do I disable the timer text?|r |cff9999ff16. The countdown timers on buffs and debuffs completely obscure the icon. How do I disable the timer text?|r
IceHUD is not responsible for this countdown text and cannot control it. The 6.0 patch added an option in the game client to display counts on top of cooldowns. Look at the Action Bars menu under the game's Interface options. You can turn the text on or off there. Mods like OmniCC or CooldownCount will generally give you the same feature but allow you to control when, where, and how the text shows up. |cff9999ffIceHUD|r is not responsible for this countdown text and cannot control it. The 6.0 patch added an option in the game client to display counts on top of cooldowns. Look at the Action Bars menu under the game's Interface options. You can turn the text on or off there. Mods like |cff42ffffOmniCC|r or |cff42ffffCooldownCount|r will generally give you the same feature but allow you to control when, where, and how the text shows up.
|cff9999ff17. When I rotate some modules 90 degrees, such as the castbar, the bar appears to wiggle up and down as it fills or empties. How do I fix this?|r |cff9999ff17. When I rotate some modules 90 degrees, such as the castbar, the bar appears to wiggle up and down as it fills or empties. How do I fix this?|r
This is a side effect of the animation API that I'm co-opting to force a rotation without having to provide duplicates of every bar texture in the mod. Any bar moving sufficiently quickly and updating rapidly will cause this. IceHUD is intended to be a vertically-oriented mod, so the rotation feature is there for people who are willing to accept the side effects that come with it. My suggestion is to use one of the many horizontally-oriented bar mods out there if you're wanting horizontal bars. Quartz is a good castbar replacement that you can use and disable IceHUD's built-in castbar, for example. This is a side effect of the animation API that I'm co-opting to force a rotation without having to provide duplicates of every bar texture in the mod. Any bar moving sufficiently quickly and updating rapidly will cause this. |cff9999ffIceHUD|r is intended to be a vertically-oriented mod, so the rotation feature is there for people who are willing to accept the side effects that come with it. My suggestion is to use one of the many horizontally-oriented bar mods out there if you're wanting horizontal bars. |cff42ffffQuartz|r is a good castbar replacement that you can use and disable |cff9999ffIceHUD|r's built-in castbar, for example.
|cff9999ff18. How do I get rid of the bars that showed up beneath the player in the 7.0 patch?|r |cff9999ff18. How do I get rid of the bars that showed up beneath the player in the 7.0 patch?|r
Blizzard added a "Personal Resource Display" feature in the 7.0 game client. You can disable it in the Game options -> Interface -> Names -> Personal Resource Display.]] Blizzard added a "Personal Resource Display" feature in the 7.0 game client. You can disable it in the Game options -> Interface -> Names -> Personal Resource Display.]]

View File

@ -404,14 +404,14 @@ end
-- OVERRIDE -- OVERRIDE
function CastBar.prototype:SpellCastSent(event, unit, spell, rank, target) function CastBar.prototype:SpellCastSent(event, unit, spell, rank, target, lineId)
CastBar.super.prototype.SpellCastSent(self, event, unit, spell, rank, target) CastBar.super.prototype.SpellCastSent(self, event, unit, spell, rank, target, lineId)
if (unit ~= self.unit) then return end if (unit ~= self.unit) then return end
if IceHUD.WowVer < 70000 then if IceHUD.WowVer < 70000 then
self.spellCastSent = GetTime() self.spellCastSent = GetTime()
end end
self.sentSpell = spell self.sentSpell = lineId
end end
-- OVERRIDE -- OVERRIDE
@ -423,15 +423,15 @@ function CastBar.prototype:SpellCastChanged(event, arg1)
end end
-- OVERRIDE -- OVERRIDE
function CastBar.prototype:SpellCastStart(event, unit, spell, rank) function CastBar.prototype:SpellCastStart(event, unit, spell, rank, lineId, spellId)
CastBar.super.prototype.SpellCastStart(self, event, unit, spell, rank) CastBar.super.prototype.SpellCastStart(self, event, unit, spell, rank, lineId, spellId)
if (unit ~= self.unit) then return end if (unit ~= self.unit) then return end
if not self:IsVisible() or not self.actionDuration then if not self:IsVisible() or not self.actionDuration then
return return
end end
if self.sentSpell ~= spell then if self.sentSpell ~= lineId then
self.spellCastSent = nil self.spellCastSent = nil
end end

View File

@ -684,11 +684,6 @@ function IceClassPowerCounter.prototype:SetDisplayMode()
for i=1, self.numRunes do for i=1, self.numRunes do
self:SetupRuneTexture(i) self:SetupRuneTexture(i)
self.frame.graphical[i]:Show() self.frame.graphical[i]:Show()
if self.moduleSettings.inactiveDisplayMode == "Darkened" then
self.frame.graphical[i].runebg:Show()
else
self.frame.graphical[i].runebg:Hide()
end
end end
end end
end end
@ -723,8 +718,6 @@ function IceClassPowerCounter.prototype:CreateRune(i)
self.frame.graphical[i].rune = self.frame.graphical[i]:CreateTexture(nil, "ARTWORK") self.frame.graphical[i].rune = self.frame.graphical[i]:CreateTexture(nil, "ARTWORK")
self.frame.graphical[i].rune:SetVertexColor(0, 0, 0) self.frame.graphical[i].rune:SetVertexColor(0, 0, 0)
self.frame.graphical[i].runebg = self.frame.graphical[i]:CreateTexture(nil, "BACKGROUND")
self.frame.graphical[i].runebg:SetVertexColor(0, 0, 0)
self:SetupRuneTexture(i) self:SetupRuneTexture(i)
self.frame.graphical[i].shine = self.frame.graphical[i]:CreateTexture(nil, "OVERLAY") self.frame.graphical[i].shine = self.frame.graphical[i]:CreateTexture(nil, "OVERLAY")
@ -749,14 +742,10 @@ function IceClassPowerCounter.prototype:CreateRune(i)
self.frame.graphical[i]:SetHeight(self.runeHeight) self.frame.graphical[i]:SetHeight(self.runeHeight)
self.frame.graphical[i].rune:SetWidth(self.runeWidth) self.frame.graphical[i].rune:SetWidth(self.runeWidth)
self.frame.graphical[i].rune:SetHeight(self.runeHeight) self.frame.graphical[i].rune:SetHeight(self.runeHeight)
self.frame.graphical[i].runebg:SetWidth(self.runeWidth)
self.frame.graphical[i].runebg:SetHeight(self.runeHeight)
if self.currentGrowMode == self.growModes["width"] then if self.currentGrowMode == self.growModes["width"] then
self.frame.graphical[i].rune:SetPoint("LEFT", self.frame.graphical[i], "LEFT") self.frame.graphical[i].rune:SetPoint("LEFT", self.frame.graphical[i], "LEFT")
self.frame.graphical[i].runebg:SetPoint("LEFT", self.frame.graphical[i], "LEFT")
else else
self.frame.graphical[i].rune:SetPoint("BOTTOM", self.frame.graphical[i], "BOTTOM") self.frame.graphical[i].rune:SetPoint("BOTTOM", self.frame.graphical[i], "BOTTOM")
self.frame.graphical[i].runebg:SetPoint("BOTTOM", self.frame.graphical[i], "BOTTOM")
end end
end end
@ -774,7 +763,6 @@ function IceClassPowerCounter.prototype:SetupRuneTexture(rune)
-- make sure any texture aside from the special one is square and has the proper coordinates -- make sure any texture aside from the special one is square and has the proper coordinates
self.frame.graphical[rune].rune:SetTexCoord(a, b, c, d) self.frame.graphical[rune].rune:SetTexCoord(a, b, c, d)
self.frame.graphical[rune].runebg:SetTexCoord(a, b, c, d)
self.frame.graphical[rune]:SetWidth(width) self.frame.graphical[rune]:SetWidth(width)
self.frame:SetWidth(width*self.numRunes) self.frame:SetWidth(width*self.numRunes)
local runeAdjust = rune - (self.numRunes / 2) - 0.5 local runeAdjust = rune - (self.numRunes / 2) - 0.5
@ -784,8 +772,8 @@ function IceClassPowerCounter.prototype:SetupRuneTexture(rune)
self.frame.graphical[rune]:SetPoint("CENTER", 0, -1 * (runeAdjust * (self.runeHeight-5) + runeAdjust + (runeAdjust * self.moduleSettings.runeGap))) self.frame.graphical[rune]:SetPoint("CENTER", 0, -1 * (runeAdjust * (self.runeHeight-5) + runeAdjust + (runeAdjust * self.moduleSettings.runeGap)))
end end
local tex = self:GetRuneTexture(rune)
if self:GetRuneMode() == "Graphical" then if self:GetRuneMode() == "Graphical" then
local tex = self:GetRuneTexture(rune)
if tex then if tex then
self.frame.graphical[rune].rune:SetTexture(tex) self.frame.graphical[rune].rune:SetTexture(tex)
else else
@ -800,11 +788,6 @@ function IceClassPowerCounter.prototype:SetupRuneTexture(rune)
elseif self:GetRuneMode() == "Graphical Clean Circle" then elseif self:GetRuneMode() == "Graphical Clean Circle" then
self.frame.graphical[rune].rune:SetTexture(IceElement.TexturePath .. "ComboCleanCurves") self.frame.graphical[rune].rune:SetTexture(IceElement.TexturePath .. "ComboCleanCurves")
end end
if tex then
self.frame.graphical[rune].runebg:SetTexture(tex)
else
self.frame.graphical[rune].runebg:SetAtlas(self.frame.graphical[rune].rune:GetAtlas())
end
end end
function IceClassPowerCounter.prototype:GetAlphaAdd() function IceClassPowerCounter.prototype:GetAlphaAdd()

View File

@ -17,11 +17,5 @@ function PlayerAbsorb.prototype:GetDefaultSettings()
return settings return settings
end end
function PlayerAbsorb.prototype:MyRegisterCustomEvents()
end
function PlayerAbsorb.prototype:MyUnregisterCustomEvents()
end
-- Load us up -- Load us up
IceHUD.PlayerAbsorb = PlayerAbsorb:new() IceHUD.PlayerAbsorb = PlayerAbsorb:new()

View File

@ -19,6 +19,8 @@ function PlayerMana.prototype:init()
if IceHUD.WowVer >= 70000 then if IceHUD.WowVer >= 70000 then
self:SetDefaultColor("PlayerInsanity", 150, 50, 255) self:SetDefaultColor("PlayerInsanity", 150, 50, 255)
self:SetDefaultColor("PlayerFury", 255, 50, 255) self:SetDefaultColor("PlayerFury", 255, 50, 255)
self:SetDefaultColor("PlayerMaelstrom", 62, 54, 152)
self:SetDefaultColor("PlayerPain", 255, 50, 255)
end end
end end
@ -98,6 +100,27 @@ end
order = 53 order = 53
} }
opts["scaleManaColorForAll"] = {
type = "toggle",
name = L["Scale for non-mana users"],
desc = L["Uses the 'color bar by mana %' setting/colors even for classes that don't use Mana"],
width = 'double',
get = function()
return self.moduleSettings.scaleManaColorForAll
end,
set = function(info, value)
self.moduleSettings.scaleManaColorForAll = value
self:Redraw()
end,
disabled = function()
return not self.moduleSettings.enabled
end,
hidden = function()
return not self.moduleSettings.scaleManaColor
end,
order = 53.1
}
return opts return opts
end end
@ -245,7 +268,7 @@ end
function PlayerMana.prototype:TreatEmptyAsFull() function PlayerMana.prototype:TreatEmptyAsFull()
return self.manaType == SPELL_POWER_RAGE or self.manaType == SPELL_POWER_RUNIC_POWER return self.manaType == SPELL_POWER_RAGE or self.manaType == SPELL_POWER_RUNIC_POWER
or (IceHUD.WowVer >= 70000 and (self.manaType == SPELL_POWER_LUNAR_POWER or self.manaType == SPELL_POWER_INSANITY or (IceHUD.WowVer >= 70000 and (self.manaType == SPELL_POWER_LUNAR_POWER or self.manaType == SPELL_POWER_INSANITY
or self.manaType == SPELL_POWER_FURY)) or self.manaType == SPELL_POWER_FURY or self.manaType == SPELL_POWER_PAIN or self.manaType == SPELL_POWER_MAELSTROM))
end end
function PlayerMana.prototype:UpdateEvent(event, unit, powertype) function PlayerMana.prototype:UpdateEvent(event, unit, powertype)
@ -280,11 +303,10 @@ function PlayerMana.prototype:Update(unit, powertype)
end end
local color = "PlayerMana" local color = "PlayerMana"
if (self.moduleSettings.scaleManaColor) then
color = "ScaledManaColor"
end
if not (self.alive) then if not (self.alive) then
color = "Dead" color = "Dead"
elseif (self.moduleSettings.scaleManaColor and (UnitPowerType(self.unit) == SPELL_POWER_MANA or self.moduleSettings.scaleManaColorForAll)) then
color = "ScaledManaColor"
else else
if (self.manaType == SPELL_POWER_RAGE) then if (self.manaType == SPELL_POWER_RAGE) then
color = "PlayerRage" color = "PlayerRage"
@ -298,6 +320,10 @@ function PlayerMana.prototype:Update(unit, powertype)
color = "PlayerInsanity" color = "PlayerInsanity"
elseif (IceHUD.WowVer >= 70000 and self.manaType == SPELL_POWER_FURY) then elseif (IceHUD.WowVer >= 70000 and self.manaType == SPELL_POWER_FURY) then
color = "PlayerFury" color = "PlayerFury"
elseif (IceHUD.WowVer >= 70000 and self.manaType == SPELL_POWER_MAELSTROM) then
color = "PlayerMaelstrom"
elseif (IceHUD.WowVer >= 70000 and self.manaType == SPELL_POWER_PAIN) then
color = "PlayerPain"
end end
end end

View File

@ -80,6 +80,6 @@ end
-- Load for tanks only -- Load for tanks only
local _, unitClass = UnitClass("player") local _, unitClass = UnitClass("player")
if ((unitClass == "DEATHKNIGHT" or unitClass == "DRUID" or unitClass == "PALADIN" or unitClass == "WARRIOR" or unitClass == "MONK") if ((unitClass == "DEATHKNIGHT" or unitClass == "DRUID" or unitClass == "PALADIN" or unitClass == "WARRIOR" or unitClass == "MONK")
and IceHUD.WowVer >= 60000) then and IceHUD.WowVer >= 60000 and IceHUD.WowVer < 70000) then
IceHUD.Resolve = Resolve:new() IceHUD.Resolve = Resolve:new()
end end

397
modules/RollTheBones.lua Normal file
View File

@ -0,0 +1,397 @@
local L = LibStub("AceLocale-3.0"):GetLocale("IceHUD", false)
local RollTheBones = IceCore_CreateClass(IceUnitBar)
local IceHUD = _G.IceHUD
local baseTime = 12
local gapPerComboPoint = 6
local maxComboPoints = 5
local rtbEndTime = 0
local rtbDuration = 0
local CurrMaxRtBDuration = 0
local PotentialRtBDuration = 0
local RtBBuffs = {199603, 193358, 193357, 193359, 199600, 193356}
local RtBSet = {}
for _, v in ipairs(RtBBuffs) do
RtBSet[v] = true
end
-- Constructor --
function RollTheBones.prototype:init()
RollTheBones.super.prototype.init(self, "RollTheBones", "player")
self.moduleSettings = {}
self.moduleSettings.desiredLerpTime = 0
self.moduleSettings.shouldAnimate = false
self:SetDefaultColor("RollTheBones", 0.75, 1, 0.2)
self:SetDefaultColor("RollTheBonesPotential", 1, 1, 1)
self.bTreatEmptyAsFull = true
end
-- 'Public' methods -----------------------------------------------------------
-- OVERRIDE
function RollTheBones.prototype:Enable(core)
RollTheBones.super.prototype.Enable(self, core)
self:RegisterEvent("UNIT_AURA", "UpdateRollTheBones")
self:RegisterEvent("UNIT_POWER", "ComboPointsChanged")
if not self.moduleSettings.alwaysFullAlpha then
self:Show(false)
else
self:UpdateRollTheBones()
end
self:SetBottomText1("")
end
function RollTheBones.prototype:Disable(core)
RollTheBones.super.prototype.Disable(self, core)
end
function RollTheBones.prototype:ComboPointsChanged(...)
if select('#', ...) >= 3 and select(1, ...) == "UNIT_POWER" and select(3, ...) ~= "COMBO_POINTS" then
return
end
self:TargetChanged()
self:UpdateDurationBar()
end
-- OVERRIDE
function RollTheBones.prototype:GetDefaultSettings()
local settings = RollTheBones.super.prototype.GetDefaultSettings(self)
settings["enabled"] = false
settings["shouldAnimate"] = false
settings["desiredLerpTime"] = nil
settings["lowThreshold"] = 0
settings["side"] = IceCore.Side.Right
settings["offset"] = 6
settings["upperText"]="RtB:"
settings["showAsPercentOfMax"] = true
settings["durationAlpha"] = 0.6
settings["usesDogTagStrings"] = false
settings["lockLowerFontAlpha"] = false
settings["lowerTextString"] = ""
settings["lowerTextVisible"] = false
settings["hideAnimationSettings"] = true
settings["bAllowExpand"] = true
settings["bShowWithNoTarget"] = true
return settings
end
-- OVERRIDE
function RollTheBones.prototype:GetOptions()
local opts = RollTheBones.super.prototype.GetOptions(self)
opts["textSettings"].args["upperTextString"]["desc"] = "The text to display under this bar. # will be replaced with the number of Roll the Bones seconds remaining."
opts["textSettings"].args["upperTextString"].hidden = false
opts["showAsPercentOfMax"] =
{
type = 'toggle',
name = L["Show bar as % of maximum"],
desc = L["If this is checked, then the RtB buff time shows as a percent of the maximum attainable (taking set bonuses and talents into account). Otherwise, the bar always goes from full to empty when applying RtB no matter the duration."],
get = function()
return self.moduleSettings.showAsPercentOfMax
end,
set = function(info, v)
self.moduleSettings.showAsPercentOfMax = v
end,
disabled = function()
return not self.moduleSettings.enabled
end
}
opts["durationAlpha"] =
{
type = "range",
name = L["Potential RtB time bar alpha"],
desc = L["What alpha value to use for the bar that displays how long your RtB will last if you activate it. (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.durationAlpha * 100
end,
set = function(info, v)
self.moduleSettings.durationAlpha = v / 100.0
self:Redraw()
end,
disabled = function()
return not self.moduleSettings.enabled
end
}
opts["bShowWithNoTarget"] =
{
type = 'toggle',
name = L["Show with no target"],
desc = L["Whether or not to display when you have no target selected but have combo points available"],
get = function()
return self.moduleSettings.bShowWithNoTarget
end,
set = function(info, v)
self.moduleSettings.bShowWithNoTarget = v
self:ComboPointsChanged()
end,
disabled = function()
return not self.moduleSettings.enabled
end,
}
return opts
end
function RollTheBones.prototype:CreateFrame()
RollTheBones.super.prototype.CreateFrame(self)
self:CreateDurationBar()
end
function RollTheBones.prototype:CreateDurationBar()
self.durationFrame = self:BarFactory(self.durationFrame, "BACKGROUND","ARTWORK")
-- Rokiyo: Do we need to call this here?
self.CurrScale = 0
self.durationFrame.bar:SetVertexColor(self:GetColor("RollTheBonesPotential", self.moduleSettings.durationAlpha))
self.durationFrame.bar:SetHeight(0)
self:UpdateBar(1, "undef")
-- force update the bar...if we're in here, then either the UI was just loaded or the player is jacking with the options.
-- either way, make sure the duration bar matches accordingly
self:UpdateDurationBar()
end
function RollTheBones.prototype:RotateHorizontal()
RollTheBones.super.prototype.RotateHorizontal(self)
self:RotateFrame(self.durationFrame)
end
function RollTheBones.prototype:ResetRotation()
RollTheBones.super.prototype.ResetRotation(self)
if self.durationFrame and self.durationFrame.anim then
self.durationFrame.anim:Stop()
end
end
-- 'Protected' methods --------------------------------------------------------
function RollTheBones.prototype:GetBuffDuration(unitName, ids)
local i = 1
local buff, rank, texture, count, type, duration, endTime, remaining, spellId
buff, _, _, count, type, duration, endTime, _, _, _, spellId = UnitBuff(unitName, i)
while buff do
if (spellId and ids[spellId]) then
if endTime and not remaining then
remaining = endTime - GetTime()
end
return duration, remaining
end
i = i + 1;
buff, _, _, count, type, duration, endTime, _, _, _, spellId = UnitBuff(unitName, i)
end
return nil, nil
end
function RollTheBones.prototype:MyOnUpdate()
RollTheBones.super.prototype.MyOnUpdate(self)
if self.bUpdateRtb then
self:UpdateRollTheBones(nil, self.unit, true)
end
if self.target or self.moduleSettings.bShowWithNoTarget then
self:UpdateDurationBar()
end
end
local function RTBGetComboPoints(unit)
return UnitPower(unit, SPELL_POWER_COMBO_POINTS)
end
-- use this to figure out if Roll the Bones is available or not. neither IsSpellKnown nor IsPlayerSpell are correct for it
-- when SnD is known, but this is.
local function HasSpell(id)
local spell = GetSpellInfo(id)
return spell == GetSpellInfo(spell)
end
local function ShouldHide()
return not HasSpell(193316)
end
function RollTheBones.prototype:UpdateRollTheBones(event, unit, fromUpdate)
if unit and unit ~= self.unit then
return
end
local now = GetTime()
local remaining = nil
if not fromUpdate then
rtbDuration, remaining = self:GetBuffDuration(self.unit, RtBSet)
if not remaining then
rtbEndTime = 0
else
rtbEndTime = remaining + now
end
end
if rtbEndTime and rtbEndTime >= now then
if not fromUpdate then
self.bUpdateRtb = true
end
self:Show(true)
if not remaining then
remaining = rtbEndTime - now
end
local denominator = (self.moduleSettings.showAsPercentOfMax and CurrMaxRtBDuration or rtbDuration)
self:UpdateBar(denominator ~= 0 and remaining / denominator or 0, "RollTheBones")
else
self:UpdateBar(0, "RollTheBones")
if RTBGetComboPoints(self.unit) == 0 or (not UnitExists("target") and not self.moduleSettings.bShowWithNoTarget) or ShouldHide() then
if self.bIsVisible then
self.bUpdateRtb = nil
end
if not self.moduleSettings.alwaysFullAlpha or ShouldHide() then
self:Show(false)
end
end
end
-- somewhat redundant, but we also need to check potential remaining time
if (remaining ~= nil) or PotentialRtBDuration > 0 then
local potText = " (" .. PotentialRtBDuration .. ")"
self:SetBottomText1(self.moduleSettings.upperText .. tostring(floor(remaining or 0)) .. (self.moduleSettings.durationAlpha ~= 0 and potText or ""))
end
end
function RollTheBones.prototype:TargetChanged()
if self.moduleSettings.bShowWithNoTarget and RTBGetComboPoints(self.unit) > 0 then
self.target = true
else
self.target = UnitExists("target")
end
self:Update(self.unit)
self:UpdateDurationBar()
self:UpdateRollTheBones()
end
function RollTheBones.prototype:UpdateDurationBar(event, unit)
if unit and unit ~= self.unit then
return
end
local points = RTBGetComboPoints(self.unit)
-- check for Deeper Stratagem
local _, _, _, DeeperStratagem = GetTalentInfo(3, 1, 1)
if DeeperStratagem then
-- first, set the cached upper limit of RtB duration
CurrMaxRtBDuration = self:GetMaxBuffTime(maxComboPoints + 1)
else
CurrMaxRtBDuration = self:GetMaxBuffTime(maxComboPoints)
end
if event then
self:UpdateRollTheBones()
end
-- player doesn't want to show the percent of max or the alpha is zeroed out, so don't bother with the duration bar
if not self.moduleSettings.showAsPercentOfMax or self.moduleSettings.durationAlpha == 0 or (points == 0 and not self:IsVisible())
or ShouldHide() then
self.durationFrame:Hide()
return
end
self.durationFrame:Show()
-- if we have combo points and a target selected, go ahead and show the bar so the duration bar can be seen
if points > 0 and (UnitExists("target") or self.moduleSettings.bShowWithNoTarget) then
self:Show(true)
end
if self.moduleSettings.durationAlpha > 0 then
PotentialRtBDuration = self:GetMaxBuffTime(points)
-- compute the scale from the current number of combo points
local scale = IceHUD:Clamp(PotentialRtBDuration / CurrMaxRtBDuration, 0, 1)
-- sadly, animation uses bar-local variables so we can't use the animation for 2 bar textures on the same bar element
if (self.moduleSettings.reverse) then
scale = 1 - scale
end
self.durationFrame.bar:SetVertexColor(self:GetColor("RollTheBonesPotential", self.moduleSettings.durationAlpha))
self:SetBarCoord(self.durationFrame, scale)
end
if rtbEndTime < GetTime() then
local potText = " (" .. PotentialRtBDuration .. ")"
self:SetBottomText1(self.moduleSettings.upperText .. "0" .. (self.moduleSettings.durationAlpha > 0 and potText or ""))
end
end
function RollTheBones.prototype:GetMaxBuffTime(numComboPoints)
local maxduration
if numComboPoints == 0 then
return 0
end
maxduration = baseTime + ((numComboPoints - 1) * gapPerComboPoint)
return maxduration
end
function RollTheBones.prototype:GetItemIdFromItemLink(linkStr)
local itemId
local _
if linkStr then
_, itemId, _, _, _, _, _, _, _ = strsplit(":", linkStr)
end
return itemId or 0
end
function RollTheBones.prototype:IsItemIdInList(itemId, list)
for i=1,#list do
if string.match(itemId, list[i]) then
return true
end
end
return false
end
function RollTheBones.prototype:OutCombat()
RollTheBones.super.prototype.OutCombat(self)
self:UpdateRollTheBones()
end
local _, unitClass = UnitClass("player")
-- Load us up
if unitClass == "ROGUE" and IceHUD.WowVer >= 70000 then
IceHUD.RollTheBones = RollTheBones:new()
end

View File

@ -4,13 +4,8 @@ IceTargetAbsorb.prototype.highestAbsorbSinceLastZero = 0
IceTargetAbsorb.prototype.ColorName = "TargetAbsorb" IceTargetAbsorb.prototype.ColorName = "TargetAbsorb"
local UnitGetTotalAbsorbs = UnitGetTotalAbsorbs local UnitGetTotalAbsorbs = UnitGetTotalAbsorbs
if IceHUD.WowVer < 50200 then
UnitGetTotalAbsorbs = nil
end
-- Constructor --
function IceTargetAbsorb.prototype:init(moduleName, unit, colorName) function IceTargetAbsorb.prototype:init(moduleName, unit, colorName)
-- not sure if this is necessary...i think it is...this way, we can instantiate this bar on its own or as a parent class
if moduleName == nil or unit == nil then if moduleName == nil or unit == nil then
IceTargetAbsorb.super.prototype.init(self, "TargetAbsorb", "target") IceTargetAbsorb.super.prototype.init(self, "TargetAbsorb", "target")
else else
@ -29,45 +24,46 @@ function IceTargetAbsorb.prototype:GetDefaultSettings()
settings["side"] = IceCore.Side.Right settings["side"] = IceCore.Side.Right
settings["offset"] = 3 settings["offset"] = 3
settings["upperText"] = "[TotalAbsorb]" settings["upperText"] = "[TotalAbsorb:VeryShort]"
return settings return settings
end end
-- OVERRIDE
function IceTargetAbsorb.prototype:Enable(core) function IceTargetAbsorb.prototype:Enable(core)
IceTargetAbsorb.super.prototype.Enable(self, core) IceTargetAbsorb.super.prototype.Enable(self, core)
self:RegisterEvent("UNIT_ABSORB_AMOUNT_CHANGED", "UpdateAbsorbAmount") self:RegisterEvent("UNIT_ABSORB_AMOUNT_CHANGED", "UpdateAbsorbAmount")
self:MyRegisterCustomEvents() self:MyRegisterCustomEvents()
self:UpdateAbsorbAmount("UNIT_ABSORB_AMOUNT_CHANGED", self.unit) self:UpdateAbsorbAmount()
self:Show(false) self:Show(false)
end end
function IceTargetAbsorb.prototype:MyRegisterCustomEvents() function IceTargetAbsorb.prototype:MyRegisterCustomEvents()
self:RegisterEvent("PLAYER_TARGET_CHANGED", "UpdateAbsorbAmount")
end end
function IceTargetAbsorb.prototype:MyUnregisterCustomEvents() function IceTargetAbsorb.prototype:MyUnregisterCustomEvents()
self:UnregisterEvent("PLAYER_TARGET_CHANGED") end
function IceTargetAbsorb.prototype:Update()
self:UpdateAbsorbAmount()
end end
function IceTargetAbsorb.prototype:UpdateAbsorbAmount(event, unit) function IceTargetAbsorb.prototype:UpdateAbsorbAmount(event, unit)
if UnitGetTotalAbsorbs == nil or (event == "UNIT_ABSORB_AMOUNT_CHANGED" and unit ~= self.unit) then if event == "UNIT_ABSORB_AMOUNT_CHANGED" and unit ~= self.unit then
return return
end end
local absorbAmount = UnitGetTotalAbsorbs(self.unit) local absorbAmount = UnitGetTotalAbsorbs(self.unit) or 0
if absorbAmount == nil or absorbAmount <= 0 then if absorbAmount <= 0 then
self.highestAbsorbSinceLastZero = 0 self.highestAbsorbSinceLastZero = 0
elseif absorbAmount > self.highestAbsorbSinceLastZero then elseif absorbAmount > self.highestAbsorbSinceLastZero then
self.highestAbsorbSinceLastZero = absorbAmount self.highestAbsorbSinceLastZero = absorbAmount
end end
if absorbAmount == nil or absorbAmount <= 0 or self.highestAbsorbSinceLastZero <= 0 then if absorbAmount <= 0 or self.highestAbsorbSinceLastZero <= 0 then
self:Show(false) self:Show(false)
else else
self:Show(true) self:Show(true)
@ -82,4 +78,6 @@ function IceTargetAbsorb.prototype:Disable(core)
self:MyUnregisterCustomEvents() self:MyUnregisterCustomEvents()
end end
IceHUD.TargetAbsorb = IceTargetAbsorb:new() if UnitGetTotalAbsorbs ~= nil then
IceHUD.TargetAbsorb = IceTargetAbsorb:new()
end

View File

@ -1325,6 +1325,7 @@ do
icon:SetHeight(size-2) icon:SetHeight(size-2)
end end
else else
frame.texture:SetTexture(0, 0, 0, 0.5)
icon:SetWidth(size-2) icon:SetWidth(size-2)
icon:SetHeight(size-2) icon:SetHeight(size-2)
end end

View File

@ -21,6 +21,8 @@ function IceTargetMana.prototype:init(moduleName, unit)
if IceHUD.WowVer >= 70000 then if IceHUD.WowVer >= 70000 then
self:SetDefaultColor("TargetInsanity", 150, 50, 255) self:SetDefaultColor("TargetInsanity", 150, 50, 255)
self:SetDefaultColor("TargetFury", 255, 50, 255) self:SetDefaultColor("TargetFury", 255, 50, 255)
self:SetDefaultColor("TargetMaelstrom", 52, 64, 221)
self:SetDefaultColor("TargetPain", 255, 50, 255)
end end
end end
@ -109,10 +111,14 @@ function IceTargetMana.prototype:Update(unit)
self.color = "TargetEnergy" self.color = "TargetEnergy"
elseif (manaType == SPELL_POWER_RUNIC_POWER) then elseif (manaType == SPELL_POWER_RUNIC_POWER) then
self.color = "TargetRunicPower" self.color = "TargetRunicPower"
elseif (IceHUD.WowVer >= 70000 and self.manaType == SPELL_POWER_INSANITY) then elseif (IceHUD.WowVer >= 70000 and manaType == SPELL_POWER_INSANITY) then
self.color = "TargetInsanity" self.color = "TargetInsanity"
elseif (IceHUD.WowVer >= 70000 and self.manaType == SPELL_POWER_FURY) then elseif (IceHUD.WowVer >= 70000 and manaType == SPELL_POWER_FURY) then
self.color = "TargetFury" self.color = "TargetFury"
elseif (IceHUD.WowVer >= 70000 and manaType == SPELL_POWER_MAELSTROM) then
self.color = "TargetMaelstrom"
elseif (IceHUD.WowVer >= 70000 and manaType == SPELL_POWER_PAIN) then
self.color = "TargetPain"
end end
if (self.tapped) then if (self.tapped) then
@ -133,7 +139,7 @@ end
function IceTargetMana.prototype:TreatEmptyAsFull(manaType) function IceTargetMana.prototype:TreatEmptyAsFull(manaType)
return manaType == SPELL_POWER_RAGE or manaType == SPELL_POWER_RUNIC_POWER return manaType == SPELL_POWER_RAGE or manaType == SPELL_POWER_RUNIC_POWER
or (IceHUD.WowVer >= 70000 and (manaType == SPELL_POWER_LUNAR_POWER or manaType == SPELL_POWER_INSANITY or (IceHUD.WowVer >= 70000 and (manaType == SPELL_POWER_LUNAR_POWER or manaType == SPELL_POWER_INSANITY
or manaType == SPELL_POWER_FURY)) or manaType == SPELL_POWER_FURY or manaType == SPELL_POWER_PAIN or manaType == SPELL_POWER_MAELSTROM))
end end
-- OVERRIDE -- OVERRIDE