Compare commits

..

19 Commits

Author SHA1 Message Date
59f2792ce8 Update changelog 2022-11-25 17:02:25 -06:00
a80daface7 Unify low flash and low color thresholds
Low Flash was using >= while Low Color was using >, so they would activate at ever-so-slightly different values (0.4 vs 0.39999, for example).
2022-11-25 15:31:26 -06:00
f6db2f3b7c Fix Low Threshold and Color By Health % to work together
If Low Threshold was checked, then scaling by health/mana % was getting overridden and forced to the Max Health/Mana Color after being set to the scaled value.
2022-11-25 15:30:05 -06:00
5d09cad6cb Update changelog
v1.14.0 got posted again as if it were the newest version, so this small update remedies that.
2022-11-23 22:37:41 -06:00
8fc2e326aa Add option to scale absorb bar by health
By user request.
2022-11-23 18:50:52 -06:00
d775603ec0 Add module showing Energy for Druids
This shows the player's current Energy amount when they're in a form that doesn't use Energy. For example, this could show the user how much energy they currently have while they're in Bear form so that they can shift away and wait on their energy to refill.

Note: requires a new version of LibDogTag-Unit for the bar text tags to function if DogTags are enabled.
2022-11-18 17:08:26 -06:00
70bba2f186 Add ability to set module description
This is the text that shows up when hovering over the module in the Module Options list.
2022-11-18 16:58:16 -06:00
8ac9bee610 Fix instant casts for non-player spells
I was out questing and kept seeing "Near Training Gem" pop as an instant-cast. This filter seems to have stopped it.
2022-11-18 11:44:52 -06:00
07bda8e84d Add more Custom Bar display controls
Add ability for buff/debuff watchers to only display when the specified buff/debuff is missing. This also adds the ability to require that the given unit exists. So if you had Unit set to Target, Display mode set to Missing, and Only if unit exists checked, you'd show the bar if you have a target and they don't have the given buff/debuff.
2022-11-17 17:14:49 -06:00
5712114eb8 Fix Charged point support in ComboPointsBar 2022-11-16 21:14:51 -06:00
2a0db2eb01 Show charged combo point in Numeric mode 2022-11-16 21:09:44 -06:00
7d32b6d8c6 Fix player castbar flashes
There are controls on the player castbar module for flashing when a spell succeeds or fails, and separate controls for flashing when an instant cast completes. Those were broken (flashing never happened), but now work again.

UpdateBar() was necessary in MyOnUpdate() in the event that no other spell has been cast (in order to set the alpha so that the bottom text displays). The spellId is being passed along so that spells that aren't currently being cast can have their name and icon displayed appropriately, and so the early-out for "no known spell" doesn't trigger (which allows the Flash to actually work). The self.current reset fixes instant casts after a normal cast (we were only clearing the "current" spell conditionally when we only meant to filter StopBar, so if it wasn't cleared, future successful casts thought they were for a different spell than was currently being cast.
2022-11-16 13:09:58 -06:00
60d44601d1 Update changelog 2022-11-15 00:30:29 -06:00
b3cf33a945 Increase TOC for 10.0.2 2022-11-15 00:27:26 -06:00
3ddc2f9d2f Add more color 2022-11-13 11:33:05 -06:00
d6adaedc93 Adjust for 10.0 client
This option moved, so point to the new location.
2022-11-13 11:30:29 -06:00
6a985bc67a Add Evoker, empowered casting support 2022-11-11 11:29:15 -06:00
3a5e58bf34 Add Spell ID support for aura tracking (#31) 2022-11-06 08:34:01 -06:00
b467af21c0 Fix CC and Invuln not showing immediately
This is the same fix as was applied to RollTheBones in commit 46883e355b but I failed to audit the rest of the mod for places where this was possible. This one was reported over on the Curse addon page comments.
2022-10-31 23:36:38 -05:00
21 changed files with 602 additions and 89 deletions

View File

@ -3,7 +3,7 @@ IceCastBar = IceCore_CreateClass(IceBarElement)
local IceHUD = _G.IceHUD
IceCastBar.Actions = { None = 0, Cast = 1, Channel = 2, Instant = 3, Success = 4, Failure = 5 }
IceCastBar.Actions = { None = 0, Cast = 1, Channel = 2, Instant = 3, Success = 4, Failure = 5, ReverseChannel = 6 }
IceCastBar.prototype.action = nil
IceCastBar.prototype.actionStartTime = nil
@ -49,6 +49,13 @@ function IceCastBar.prototype:init(name)
self:SetDefaultColor("CastChanneling", 242, 242, 10)
self:SetDefaultColor("CastSuccess", 242, 242, 70)
self:SetDefaultColor("CastFail", 1, 0, 0)
if GetUnitEmpowerMinHoldTime then
self:SetDefaultColor("EmpowerStage0", 165, 165, 165)
self:SetDefaultColor("EmpowerStage1", 242, 42, 10)
self:SetDefaultColor("EmpowerStage2", 242, 142, 10)
self:SetDefaultColor("EmpowerStage3", 242, 242, 10)
self:SetDefaultColor("EmpowerStage4", 242, 242, 242)
end
self.unit = "player"
self.delay = 0
@ -109,6 +116,12 @@ function IceCastBar.prototype:Enable(core)
self:RegisterEvent("UNIT_SPELLCAST_CHANNEL_UPDATE", "SpellCastChannelUpdate") -- unit, spell, rank
self:RegisterEvent("UNIT_SPELLCAST_CHANNEL_STOP", "SpellCastChannelStop") -- unit, spell, rank
if GetUnitEmpowerHoldAtMaxTime then
self:RegisterEvent("UNIT_SPELLCAST_EMPOWER_START", "SpellCastChannelStart")
self:RegisterEvent("UNIT_SPELLCAST_EMPOWER_UPDATE", "SpellCastChannelUpdate")
self:RegisterEvent("UNIT_SPELLCAST_EMPOWER_STOP", "SpellCastChannelStop")
end
end
self:Show(false)
end
@ -311,7 +324,13 @@ function IceCastBar.prototype:PositionIcons()
self.barFrame.icon:SetHeight(AuraIconHeight * self.moduleSettings.auraIconScale)
end
function IceCastBar.prototype:GetRemainingCastTime()
return self.actionStartTime + self.actionDuration - GetTime()
end
function IceCastBar.prototype:GetCurrentCastDurationMs()
return (GetTime() - (self.actionStartTime or GetTime())) * 1000
end
-- OnUpdate handler
function IceCastBar.prototype:MyOnUpdate()
@ -322,17 +341,15 @@ function IceCastBar.prototype:MyOnUpdate()
return
end
local time = GetTime()
self:Update()
self:SetTextAlpha()
-- handle casting and channeling
if (self.action == IceCastBar.Actions.Cast or self.action == IceCastBar.Actions.Channel) then
local remainingTime = self.actionStartTime + self.actionDuration - time
if (self.action == IceCastBar.Actions.Cast or self.action == IceCastBar.Actions.Channel or self.action == IceCastBar.Actions.ReverseChannel) then
local remainingTime = self:GetRemainingCastTime()
local scale = 1 - (self.actionDuration ~= 0 and remainingTime / self.actionDuration or 0)
if (self.moduleSettings.reverseChannel and self.action == IceCastBar.Actions.Channel) then
if self.action == IceCastBar.Actions.ReverseChannel then
scale = self.actionDuration ~= 0 and remainingTime / self.actionDuration or 0
end
@ -343,14 +360,22 @@ function IceCastBar.prototype:MyOnUpdate()
end
local timeString = self.moduleSettings.showCastTime and string.format("%.1fs ", remainingTime) or ""
self:SetBottomText1(timeString .. self.actionMessage)
local empowerString = self.NumStages ~= nil and (L["Stage %d"]):format(self:GetCurrentStage()) or ""
local line1 = timeString .. self.actionMessage
if self.moduleSettings.empowerStageTextDisplay == "TOPLINE" then
line1 = line1 .. " " .. empowerString
end
if self.moduleSettings.empowerStageTextDisplay == "BOTTOMLINE" then
self:SetBottomText2(empowerString)
end
self:SetBottomText1(line1)
return
end
-- stop bar if casting or channeling is done (in theory this should not be needed)
if (self.action == IceCastBar.Actions.Cast or self.action == IceCastBar.Actions.Channel) then
if (self.action == IceCastBar.Actions.Cast or self.action == IceCastBar.Actions.Channel or self.action == IceCastBar.Actions.ReverseChannel) then
self:StopBar()
return
end
@ -361,13 +386,15 @@ function IceCastBar.prototype:MyOnUpdate()
self.action == IceCastBar.Actions.Success or
self.action == IceCastBar.Actions.Failure)
then
local scale = time - self.actionStartTime
local scale = GetTime() - self.actionStartTime
if (scale > 1) then
self:StopBar()
return
end
self:UpdateBar(1, self:GetCurrentCastingColor())
if (self.action == IceCastBar.Actions.Failure) then
self:FlashBar("CastFail", 1-scale, self.actionMessage, "CastFail")
else
@ -381,12 +408,60 @@ function IceCastBar.prototype:MyOnUpdate()
self:StopBar()
end
function IceCastBar.prototype:GetCurrentCastingColor()
local updateColor = "CastCasting"
if self.action == IceCastBar.Actions.Channel then
updateColor = "CastChanneling"
function IceCastBar.prototype:GetStageDuration(stage)
if not GetUnitEmpowerMinHoldTime then
return 0
end
return updateColor
if stage == 0 then
return GetUnitEmpowerMinHoldTime(self.unit)
end
return GetUnitEmpowerStageDuration(self.unit, stage);
end
function IceCastBar.prototype:GetDurationUpToStage(stage)
if stage == nil or stage < 0 then
return 0
end
local total = 0
for i=0,stage-1 do
total = total + self:GetStageDuration(i)
end
return total
end
function IceCastBar.prototype:GetCurrentStage()
if not GetUnitEmpowerMinHoldTime then
return 0
end
local castDuration = self:GetCurrentCastDurationMs()
for i=1,self.NumStages do
if castDuration < self:GetDurationUpToStage(i) then
return i - 1
end
end
return self.NumStages
end
function IceCastBar.prototype:IsCastingEmpowerSpell()
return self.NumStages ~= nil
end
function IceCastBar.prototype:GetCurrentCastingColor()
if self:IsCastingEmpowerSpell() then
return ("EmpowerStage%d"):format(self:GetCurrentStage())
end
if self.action == IceCastBar.Actions.Channel or self.action == IceCastBar.Actions.ReverseChannel then
return "CastChanneling"
end
return "CastCasting"
end
function IceCastBar.prototype:FlashBar(color, alpha, text, textColor)
@ -405,8 +480,8 @@ function IceCastBar.prototype:FlashBar(color, alpha, text, textColor)
end
function IceCastBar.prototype:StartBar(action, message)
local spell, rank, displayName, icon, startTime, endTime, isTradeSkill
function IceCastBar.prototype:StartBar(action, message, spellId)
local spell, rank, displayName, icon, startTime, endTime, isTradeSkill, numStages
if IceHUD.SpellFunctionsReturnRank then
spell, rank, displayName, icon, startTime, endTime, isTradeSkill = UnitCastingInfo(self.unit)
else
@ -416,7 +491,28 @@ function IceCastBar.prototype:StartBar(action, message)
if IceHUD.SpellFunctionsReturnRank then
spell, rank, displayName, icon, startTime, endTime = UnitChannelInfo(self.unit)
else
spell, displayName, icon, startTime, endTime = UnitChannelInfo(self.unit)
spell, displayName, icon, startTime, endTime, isTradeSkill, _, _, _, numStages = UnitChannelInfo(self.unit)
end
end
if spellId and not spell then
spell, rank, icon = GetSpellInfo(spellId)
end
local isChargeSpell = numStages and numStages > 0
if isChargeSpell then
self.NumStages = numStages
endTime = endTime + GetUnitEmpowerHoldAtMaxTime(self.unit)
action = IceCastBar.Actions.ReverseChannel
else
self.NumStages = nil
end
if self.moduleSettings.reverseChannel then
if action == IceCastBar.Actions.Channel then
action = IceCastBar.Actions.ReverseChannel
elseif action == IceCastBar.Actions.ReverseChannel then
action = IceCastBar.Actions.Channel
end
end
@ -424,7 +520,7 @@ function IceCastBar.prototype:StartBar(action, message)
if LibClassicCasterino and not spell then
self:StopBar()
elseif not spell then
return
return
end
if icon ~= nil then
@ -465,6 +561,7 @@ function IceCastBar.prototype:StopBar()
self.actionDuration = nil
self:SetBottomText1()
self:SetBottomText2()
self:SetScale(0)
self:Show(false)
end
@ -499,7 +596,7 @@ function IceCastBar.prototype:SpellCastStart(event, unit, castGuid, spellId)
IceHUD:Debug("SpellCastStart", unit, castGuid, spellId)
--UnitCastingInfo(unit)
self:StartBar(IceCastBar.Actions.Cast)
self:StartBar(IceCastBar.Actions.Cast, nil, spellId)
self.current = castGuid
end
@ -514,11 +611,13 @@ function IceCastBar.prototype:SpellCastStop(event, unit, castGuid, spellId)
if (self.action ~= IceCastBar.Actions.Success and
self.action ~= IceCastBar.Actions.Failure and
self.action ~= IceCastBar.Actions.Channel)
self.action ~= IceCastBar.Actions.Channel and
self.action ~= IceCastBar.Actions.ReverseChannel)
then
self:StopBar()
self.current = nil
end
self.current = nil
end
@ -532,7 +631,7 @@ function IceCastBar.prototype:SpellCastFailed(event, unit, castGuid, spellId)
end
-- channeled spells will call ChannelStop, not cast failed
if self.action == IceCastBar.Actions.Channel then
if self.action == IceCastBar.Actions.Channel or self.action == IceCastBar.Actions.ReverseChannel then
return
end
@ -547,7 +646,7 @@ function IceCastBar.prototype:SpellCastFailed(event, unit, castGuid, spellId)
end
end
self:StartBar(IceCastBar.Actions.Failure, "Failed")
self:StartBar(IceCastBar.Actions.Failure, "Failed", nil, spellId)
end
function IceCastBar.prototype:SpellCastInterrupted(event, unit, castGuid, spellId)
@ -561,7 +660,7 @@ function IceCastBar.prototype:SpellCastInterrupted(event, unit, castGuid, spellI
self.current = nil
self:StartBar(IceCastBar.Actions.Failure, "Interrupted")
self:StartBar(IceCastBar.Actions.Failure, "Interrupted", spellId)
end
function IceCastBar.prototype:SpellCastDelayed(event, unit, castGuid, spellId)
@ -582,7 +681,7 @@ function IceCastBar.prototype:SpellCastSucceeded(event, unit, castGuid, spellId)
--IceHUD:Debug("SpellCastSucceeded", unit, castGuid, spellId)
-- never show on channeled (why on earth does this event even fire when channeling starts?)
if (self.action == IceCastBar.Actions.Channel) then
if (self.action == IceCastBar.Actions.Channel or self.action == IceCastBar.Actions.ReverseChannel) then
return
end
@ -595,7 +694,7 @@ function IceCastBar.prototype:SpellCastSucceeded(event, unit, castGuid, spellId)
-- show after normal successfull cast
if (self.action == IceCastBar.Actions.Cast) then
self:StartBar(IceCastBar.Actions.Success, spell.. self:GetShortRank(rank))
self:StartBar(IceCastBar.Actions.Success, spell.. self:GetShortRank(rank), spellId)
return
end
@ -608,7 +707,12 @@ function IceCastBar.prototype:SpellCastSucceeded(event, unit, castGuid, spellId)
end
end
self:StartBar(IceCastBar.Actions.Success, spell.. self:GetShortRank(rank))
-- handle special spells that are used for quests or other things that don't apply to the player
if self.unit == "player" and not IsPlayerSpell(spellId) then
return
end
self:StartBar(IceCastBar.Actions.Success, spell.. self:GetShortRank(rank), spellId)
end

View File

@ -645,10 +645,11 @@ function IceCore.prototype:GetModuleOptions()
for i = 1, table.getn(self.elements) do
local modName = self.elements[i]:GetElementName()
local modDesc = self.elements[i]:GetElementDescription()
local opt = self.elements[i]:GetOptions()
options[modName] = {
type = 'group',
desc = L["Module options"],
desc = modDesc,
name = modName,
args = opt
}

View File

@ -63,6 +63,10 @@ function IceElement.prototype:GetElementName()
return self.elementName
end
function IceElement.prototype:GetElementDescription()
return L["Module options"]
end
function IceElement.prototype:Create(parent)
assert(parent, "IceElement 'parent' can't be nil")

View File

@ -36,6 +36,7 @@ else
end
-- compatibility/feature flags
IceHUD.GetPlayerAuraBySpellID = _G["C_UnitAuras"] and C_UnitAuras.GetPlayerAuraBySpellID
IceHUD.SpellFunctionsReturnRank = IceHUD.WowMain and IceHUD.WowVer < 80000
IceHUD.EventExistsPlayerPetChanged = IceHUD.WowMain and IceHUD.WowVer < 80000
IceHUD.EventExistsPetBarChanged = IceHUD.WowMain and IceHUD.WowVer < 80000
@ -494,6 +495,16 @@ function IceHUD:GetAuraCount(auraType, unit, ability, onlyMine, matchByName)
return 0
end
-- Support for Spell IDs
if (IceHUD.GetPlayerAuraBySpellID and tonumber(ability) ~= nil) then
local aura = C_UnitAuras.GetPlayerAuraBySpellID(ability)
if aura ~= nil then
return aura.applications
else
return 0
end
end
local i = 1
local name, _, texture, applications
if IceHUD.SpellFunctionsReturnRank then

View File

@ -1,5 +1,5 @@
## Interface: 100000
## Interface-Retail: 100000
## Interface: 100002
## Interface-Retail: 100002
## Interface-Classic: 11403
## Interface-BCC: 20504
## Interface-Wrath: 30400
@ -99,6 +99,8 @@ modules\Stagger.lua
modules\PlayerAltMana.lua
modules\ArcaneCharges.lua
modules\RollTheBones.lua
modules\EssencePower.lua
modules\DruidEnergy.lua
#@do-not-package@
IceHUD_Options\Json.lua

View File

@ -1,5 +1,5 @@
## Interface: 100000
## Interface-Retail: 100000
## Interface: 100002
## Interface-Retail: 100002
## Interface-Classic: 11403
## Interface-BCC: 20504
## Interface-Wrath: 30400

View File

@ -85,13 +85,13 @@ If you have |cff42ffffDogTags|r enabled, you can open the Text Settings for the
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
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 -> |cffffdc42Interface|r -> |cffffdc42Names|r -> |cffffdc42Personal Resource Display|r (or Options -> |cffffdc42Combat|r -> |cffffdc42Personal Resource Display|r, in 10.0+).
|cff9999ff19. Why is there no target castbar for Classic?|r
The Classic game client doesn't offer a reliable way to show castbars for anyone except the player. You can install the LibCasterCasterino addon to enable support, but it's a best guess and not at all accurate.
The Classic game client doesn't offer a reliable way to show castbars for anyone except the player. You can install the |cff42ffffLibCasterCasterino|r addon to enable support, but it's a best guess and not at all accurate.
|cff9999ff20. Why do buff/debuff timers not work in Classic?|r
The Classic game client doesn't provide this information to addons because it wasn't a feature when the game first released. You can install the LibClassicDurations addon to enable support, but it's a best guess and not at all accurate.]]
The Classic game client doesn't provide this information to addons because it wasn't a feature when the game first released. You can install the |cff42ffffLibClassicDurations|r addon to enable support, but it's a best guess and not at all accurate.]]
}
}
},

View File

@ -52,7 +52,13 @@ function IceStackCounter_GetOptions(frame, opts)
opts["auraName"] = {
type = 'input',
name = L["Aura to track"],
desc = L["Which buff/debuff this counter will be tracking. \n\nRemember to press ENTER after filling out this box with the name you want or it will not save."],
desc = function()
if IceHUD.GetPlayerAuraBySpellID then
return L["Which buff/debuff this counter will be tracking. Can use the name or spell id. \n\nRemember to press ENTER after filling out this box with the name you want or it will not save."]
else
return L["Which buff/debuff this counter will be tracking. \n\nRemember to press ENTER after filling out this box with the name you want or it will not save."]
end
end,
get = function()
return frame.moduleSettings.auraName
end,

View File

@ -278,14 +278,14 @@ function IceUnitBar.prototype:Update()
-- This looks slightly quirky. Basically the easiest way for me to achieve this is to have lowThresholdColor override
-- the scaled color. You'll need to switch them both on to get things to work.
if( self.moduleSettings.lowThresholdColor ) then
if( self.healthPercentage < self.moduleSettings.lowThreshold ) then
if( self.healthPercentage <= self.moduleSettings.lowThreshold ) then
self.settings.colors[ "ScaledHealthColor" ] = self.settings.colors[ "MinHealthColor" ]
else
elseif not self.moduleSettings.scaleHealthColor then
self.settings.colors[ "ScaledHealthColor" ] = self.settings.colors[ "MaxHealthColor" ]
end
if( self.manaPercentage < self.moduleSettings.lowThreshold ) then
if( self.manaPercentage <= self.moduleSettings.lowThreshold ) then
self.settings.colors[ "ScaledManaColor" ] = self.settings.colors[ "MinManaColor" ]
else
elseif not self.moduleSettings.scaleManaColor then
self.settings.colors[ "ScaledManaColor" ] = self.settings.colors[ "MaxManaColor" ]
end
end

View File

@ -1,5 +1,40 @@
# Changelog
v1.14.8:
- Fix Color By Health % to work with Low Threshold Color option. Previously, if Low Threshold was set, the color was always either MaxHealth/MaxMana or MinHealth/MinMana, it would never be colored by health %. Now if both are set, it will scale by health % until it reaches the low threshold, at which point it will switch to the Min color.
- Fix Low Threshold color and flashing to work at the same percentage. Previously these were slightly different such that it would start flashing at 40% but not turn to the Min color until 39.9999%, for example.
v1.14.7:
- Add option to scale absorb bar by the unit's maximum health.
v1.14.6:
- Add ability for buff/debuff watchers to only display when the specified buff/debuff is missing. This also adds the ability to require that the given unit exists. So if you had Unit set to Target, Display mode set to Missing, and Only if unit exists checked, you'd show the bar if you have a target and they don't have the given buff/debuff.
- Don't flash the castbar for instant-cast spells that the player didn't cast (such as internal quest spells).
- Add DruidEnergy module (disabled by default). This module will show the player's Energy level if they're a Druid and currently shapeshifted to a non-energy-using form (eligible forms are configurable by the user).
v1.14.5:
- Fix castbar flashing. There are controls on the player castbar module for flashing when a spell succeeds or fails, and separate controls for flashing when an instant cast completes. Those were broken, but now work again.
- Add "@" after the number when the Combo Points module is in Numeric mode, "Show Charged points" is enabled, and the current combo point is charged.
- Fix Charged point support in the ComboPointsBar module.
v1.14.4:
- Update TOC for 10.0.2
v1.14.3:
- Add Spell ID support for aura tracking.
- Add Evoker support.
- Add Empowered Casting (hold-to-cast levels) support.
v1.14.2:
- Fix CC and Invuln modules not showing immediately when they should.
v1.14.1:
- Fix Hide Party feature on pre-10.0 clients.

View File

@ -39,6 +39,9 @@ function CastBar.prototype:GetDefaultSettings()
settings["rangeColor"] = true
settings["bAllowExpand"] = false
settings["respectLagTolerance"] = true
settings["lockUpperTextAlpha"] = true
settings["lockLowerTextAlpha"] = true
settings["empowerStageTextDisplay"] = "TOPLINE"
return settings
end
@ -236,6 +239,7 @@ function CastBar.prototype:GetOptions()
end,
set = function(info, v)
self.moduleSettings.lockUpperTextAlpha = v
self.moduleSettings.lockLowerTextAlpha = v
self:Redraw()
end,
order = 13
@ -308,7 +312,26 @@ function CastBar.prototype:GetOptions()
disabled = function()
return not self.moduleSettings.enabled
end,
}
},
empowerStageText = {
type = 'select',
name = L["Empower stage label display"],
desc = L["How to display the stage of an empowered spell"],
get = function()
return self.moduleSettings.empowerStageTextDisplay
end,
set = function(info, value)
self.moduleSettings.empowerStageTextDisplay = value
end,
values = { NONE = L["Don't show"], TOPLINE = L["After spell name"], BOTTOMLINE = L["Below spell name"] },
disabled = function()
return not self.moduleSettings.enabled
end,
hidden = function()
return not GetUnitEmpowerMinHoldTime
end,
},
}
}

View File

@ -462,10 +462,14 @@ function IceClassPowerCounter.prototype:CheckValidSpec()
end
end
function IceClassPowerCounter.prototype:GetPowerEvent()
return IceHUD.UnitPowerEvent
end
function IceClassPowerCounter.prototype:DisplayCounter()
self:UnregisterEvent("PLAYER_LEVEL_UP")
self:RegisterEvent(IceHUD.UnitPowerEvent, "UpdateRunePower")
self:RegisterEvent(self:GetPowerEvent(), "UpdateRunePower")
self:RegisterEvent("UNIT_DISPLAYPOWER", "UpdateRunePower")
self:RegisterEvent("PLAYER_ENTERING_WORLD", "EnteringWorld")
if IceHUD.EventExistsUnitMaxPower then
@ -493,7 +497,7 @@ function IceClassPowerCounter.prototype:EnteringWorld()
end
function IceClassPowerCounter.prototype:UpdateRunePower(event, arg1, arg2)
if event and (event == IceHUD.UnitPowerEvent or event == "UNIT_POWER_FREQUENT") and arg1 ~= "player" and arg1 ~= "vehicle" then
if event and (event == self:GetPowerEvent() or event == "UNIT_POWER_FREQUENT") and arg1 ~= "player" and arg1 ~= "vehicle" then
return
end

View File

@ -545,6 +545,9 @@ function ComboPoints.prototype:UpdateComboPoints(...)
self.frame.numeric:SetTextColor(r, g, b, 0.7)
local pointsText = tostring(points)
if self.moduleSettings.bShowCharged and self:IsChargedPoint(points) then
pointsText = pointsText.."@"
end
if anticipate > 0 then
pointsText = pointsText.."+"..tostring(anticipate)
end

View File

@ -11,6 +11,7 @@ function ComboPointsBar.prototype:init()
self:SetDefaultColor("ComboPointsBarMin", 1, 1, 0)
self:SetDefaultColor("ComboPointsBarMax", 0, 1, 0)
self:SetDefaultColor("ChargedComboPointBar", 0.3137254901960784, 0.3725490196078432, 1)
self.bTreatEmptyAsFull = true
end
@ -52,6 +53,26 @@ function ComboPointsBar.prototype:GetOptions()
end,
}
opts["bShowCharged"] = {
type = 'toggle',
width = 'double',
name = L["Show Charged points"],
desc = L["Whether or not to color a charged combo point a separate color and append an @ sign to the number. Set the ChargedComboPointBar color to the color you would like it to be."],
get = function()
return self.moduleSettings.bShowCharged
end,
set = function(info, v)
self.moduleSettings.bShowCharged = v
self:UpdateComboPoints()
end,
disabled = function()
return not self.moduleSettings.enabled
end,
hidden = function()
return not GetUnitChargedPowerPoints
end,
}
return opts
end
@ -62,6 +83,7 @@ function ComboPointsBar.prototype:GetDefaultSettings()
defaults.alwaysDisplay = false
defaults.desiredLerpTime = 0.05
defaults.bShowWithNoTarget = true
defaults.bShowCharged = true
return defaults
end
@ -84,17 +106,7 @@ function ComboPointsBar.prototype:Enable(core)
end
if GetUnitChargedPowerPoints then
self:RegisterEvent("UNIT_POWER_POINT_CHARGE", "UpdateChargedComboPoints")
end
self:UpdateChargedComboPoints()
end
function ComboPointsBar.prototype:UpdateChargedComboPoints()
if GetUnitChargedPowerPoints then
local chargedPowerPoints = GetUnitChargedPowerPoints("player")
self.chargedPowerPointIndex = chargedPowerPoints and chargedPowerPoints[1]
self:UpdateComboPoints()
self:RegisterEvent("UNIT_POWER_POINT_CHARGE", "UpdateComboPoints")
end
end
@ -131,20 +143,46 @@ function ComboPointsBar.prototype:UpdateComboPoints(...)
points = nil
end
local isCharged = self:IsChargedPoint(points) and self.moduleSettings.bShowCharged
if points == nil or points == 0 or (not UnitExists("target") and not self.moduleSettings.bShowWithNoTarget) then
self:Show(self.moduleSettings.alwaysDisplay)
self:UpdateBar(0, "undef")
else
self:Show(true)
self:SetScaledColor(color, (points - 1) / 4.0, self.settings.colors["ComboPointsBarMax"], self.settings.colors["ComboPointsBarMin"])
if isCharged then
color.r, color.g, color.b = self:GetColor("ChargedComboPointBar")
else
self:SetScaledColor(color, (points - 1) / 4.0, self.settings.colors["ComboPointsBarMax"], self.settings.colors["ComboPointsBarMin"])
end
self:UpdateBar(points / UnitPowerMax("player", SPELL_POWER_COMBO_POINTS), "undef")
self.barFrame.bar:SetVertexColor(color.r, color.g, color.b, self.alpha)
end
self:SetBottomText1(points or "0")
if self.chargedPowerPointIndex then
self:SetBottomText2(self.chargedPowerPointIndex)
local pointsText = tostring(points or 0)
if isCharged then
pointsText = pointsText .. "@"
end
self:SetBottomText1(pointsText or "0")
end
function ComboPointsBar.prototype:IsChargedPoint(point)
if not GetUnitChargedPowerPoints or not point then
return false
end
local chargedPoints = GetUnitChargedPowerPoints("player")
if not chargedPoints then
return false
end
for i=1, #chargedPoints do
if chargedPoints[i] == point then
return true
end
end
return false
end
function ComboPointsBar.prototype:Update()

View File

@ -10,6 +10,7 @@ local buffOrDebuff = {"buff", "debuff"}
local validBuffTimers = {"none", "seconds", "minutes:seconds", "minutes"}
local AuraIconWidth = 20
local AuraIconHeight = 20
local displayModes = {NORMAL = L["When present"], ALWAYS = L["Always"], WHEN_TARGETING = L["Always, when targeting"], MISSING = L["When missing"]}
IceCustomBar.prototype.auraDuration = -1
IceCustomBar.prototype.auraEndTime = -1
@ -28,6 +29,16 @@ end
function IceCustomBar.prototype:Enable(core)
IceCustomBar.super.prototype.Enable(self, core)
-- fix up for new display mode setting
if self.moduleSettings.displayWhenTargeting then
self.moduleSettings.displayMode = displayModes.WHEN_TARGETING
self.moduleSettings.displayWhenTargeting = nil
end
if self.moduleSettings.displayWhenEmpty then
self.moduleSettings.displayMode = displayModes.ALWAYS
self.moduleSettings.displayWhenEmpty = nil
end
if IceHUD.IceCore:ShouldUseDogTags() then
DogTag = LibStub("LibDogTag-3.0", true)
if DogTag then
@ -149,8 +160,7 @@ function IceCustomBar.prototype:GetDefaultSettings()
settings["buffOrDebuff"] = "buff"
settings["barColor"] = {r=1, g=0, b=0, a=1}
settings["trackOnlyMine"] = true
settings["displayWhenEmpty"] = false
settings["displayWhenTargeting"] = false
settings["displayMode"] = displayModes.NORMAL
settings["hideAnimationSettings"] = true
settings["buffTimerDisplay"] = "minutes"
settings["maxDuration"] = 0
@ -329,16 +339,18 @@ function IceCustomBar.prototype:GetOptions()
opts["buffToTrack"] = {
type = 'input',
name = L["Aura to track"],
desc = L["Which buff/debuff this bar will be tracking.\n\nRemember to press ENTER after filling out this box with the name you want or it will not save."],
desc = function()
if IceHUD.GetPlayerAuraBySpellID then
return L["Which buff/debuff this bar will be tracking. Can use the name or spell id. \n\nRemember to press ENTER after filling out this box with the name you want or it will not save."]
else
return L["Which buff/debuff this bar will be tracking.\n\nRemember to press ENTER after filling out this box with the name you want or it will not save."]
end
end,
get = function()
return self.moduleSettings.buffToTrack
end,
set = function(info, v)
local orig = v
--Parnic: we now allow spell IDs to be used directly
--if tonumber(v) ~= nil then
-- v = GetSpellInfo(tonumber(v))
--end
if v == nil then
v = orig
end
@ -429,38 +441,39 @@ function IceCustomBar.prototype:GetOptions()
order = 30.8,
}
opts["displayWhenEmpty"] = {
type = 'toggle',
name = L["Display when empty"],
desc = L["Whether or not to display this bar even if the buff/debuff specified is not present."],
get = function()
return self.moduleSettings.displayWhenEmpty
opts["displayMode"] = {
type = 'select',
values = displayModes,
name = L["Display mode"],
desc = L["When to show the bar"],
get = function(info)
return IceHUD:GetSelectValue(info, self.moduleSettings.displayMode)
end,
set = function(info, v)
self.moduleSettings.displayWhenEmpty = v
self.moduleSettings.displayMode = info.option.values[v]
self:UpdateCustomBar()
end,
disabled = function()
return not self.moduleSettings.enabled
end,
order = 30.9
order = 30.9,
}
opts["displayWhenTargeting"] = {
opts["displayWhenUnitExists"] = {
type = 'toggle',
name = L["Display when targeting"],
desc = L["Whether to display this bar when you target a unit, even if the buff/debuff specified is not present."],
get = function()
return self.moduleSettings.displayWhenTargeting
name = L["Only if unit exists"],
desc = L["If checked, the bar will only be displayed (according to the 'Display mode' rules) when the Unit to Track exists (e.g. if set to Target and you're targeting something)."],
get = function(info)
return self.moduleSettings.displayWhenUnitExists
end,
set = function(info, v)
self.moduleSettings.displayWhenTargeting = v
self.moduleSettings.displayWhenUnitExists = v
self:UpdateCustomBar()
end,
disabled = function()
return not self.moduleSettings.enabled
end,
order = 30.91
order = 30.91,
}
opts["buffTimerDisplay"] = {
@ -864,9 +877,16 @@ function IceCustomBar.prototype:Show(bShouldShow, bForceHide)
return
end
if self.moduleSettings.displayWhenTargeting and self.target then
if self.moduleSettings.displayWhenUnitExists and not UnitExists(self.unit) then
IceCustomBar.super.prototype.Show(self, false)
return
end
if self.moduleSettings.displayMode == displayModes.MISSING then
IceCustomBar.super.prototype.Show(self, not bShouldShow)
elseif self.moduleSettings.displayMode == displayModes.WHEN_TARGETING and self.target then
IceCustomBar.super.prototype.Show(self, true)
elseif self.moduleSettings.displayWhenEmpty then
elseif self.moduleSettings.displayMode == displayModes.ALWAYS then
if not self.bIsVisible then
IceCustomBar.super.prototype.Show(self, true)
end

123
modules/DruidEnergy.lua Normal file
View File

@ -0,0 +1,123 @@
local L = LibStub("AceLocale-3.0"):GetLocale("IceHUD", false)
local DruidEnergy = IceCore_CreateClass(IceUnitBar)
DruidEnergy.prototype.DruidEnergy = nil
DruidEnergy.prototype.DruidEnergyMax = nil
local _, unitClass = UnitClass("player")
local FORM_NONE = 0
local FORM_BEAR = 1
local FORM_TRAVEL = 3
local SPELL_POWER_ENERGY = SPELL_POWER_ENERGY
if Enum and Enum.PowerType then
SPELL_POWER_ENERGY = Enum.PowerType.Energy
end
local shapeshiftFormValues = {NONE = L["No form"], BEAR = L["Bear"], TRAVEL = L["Travel"], OTHER = L["Other"]}
local shapeshiftFormIds = {NONE = FORM_NONE, BEAR = FORM_BEAR, TRAVEL = FORM_TRAVEL}
function DruidEnergy.prototype:init()
DruidEnergy.super.prototype.init(self, "DruidEnergy", "player")
self.side = IceCore.Side.Left
self.offset = 5
self:SetDefaultColor("DruidEnergy", 218, 231, 31)
end
function DruidEnergy.prototype:GetDefaultSettings()
local settings = DruidEnergy.super.prototype.GetDefaultSettings(self)
settings["side"] = IceCore.Side.Left
settings["offset"] = 5
settings["textVisible"] = {upper = true, lower = false}
settings["upperText"] = "[PercentMP(type='Energy'):Round]"
settings["lowerText"] = "[FractionalMP(type='Energy'):Color('dae71f'):Bracket]"
settings.enabled = false
settings.whileInForm = {["BEAR"] = true}
return settings
end
function DruidEnergy.prototype:GetOptions()
local opts = DruidEnergy.super.prototype.GetOptions(self)
opts["whileInForm"] = {
type = 'multiselect',
values = shapeshiftFormValues,
name = L["Show in form"],
desc = L["When the player is in one of the chosen shapeshift forms the bar will be shown, otherwise it will be hidden."],
get = function(info, v)
for key, value in pairs(self.moduleSettings.whileInForm) do
if key == v then
return value
end
end
return false
end,
set = function(info, v, state)
self.moduleSettings.whileInForm[v] = state
self:Update()
end,
disabled = function()
return not self.moduleSettings.enabled
end,
}
return opts
end
function DruidEnergy.prototype:Enable(core)
DruidEnergy.super.prototype.Enable(self, core)
self:RegisterEvent("UPDATE_SHAPESHIFT_FORM", "Update")
self:RegisterEvent("UNIT_POWER_FREQUENT", "Update")
self:RegisterEvent("UNIT_MAXPOWER", "Update")
end
function DruidEnergy.prototype:GetElementDescription()
return L["Always shows the Druid's Energy level while in non-energy-using forms."]
end
function DruidEnergy.prototype:ShouldShow(unit)
local currentForm = GetShapeshiftForm()
for k, v in pairs(self.moduleSettings.whileInForm) do
if currentForm > FORM_TRAVEL and k == "OTHER" then
return v
elseif currentForm == shapeshiftFormIds[k] then
return v
end
end
return false
end
function DruidEnergy.prototype:Update()
DruidEnergy.super.prototype.Update(self)
self.DruidEnergy = UnitPower(self.unit, SPELL_POWER_ENERGY)
self.DruidEnergyMax = UnitPowerMax(self.unit, SPELL_POWER_ENERGY)
self.DruidEnergyPercentage = self.DruidEnergyMax ~= 0 and (self.DruidEnergy/self.DruidEnergyMax) or 0
if (not self.alive or not self:ShouldShow(self.unit) or not self.DruidEnergy or not self.DruidEnergyMax or self.DruidEnergyMax == 0) then
self:Show(false)
return
else
self:Show(true)
end
if not IceHUD.IceCore:ShouldUseDogTags() and self.frame:IsVisible() then
self:SetBottomText1(math.floor(self.DruidEnergyPercentage * 100))
self:SetBottomText2(self:GetFormattedText(self:Round(self.DruidEnergy), self:Round(self.DruidEnergyMax)), "DruidEnergy")
end
self:UpdateBar(self.DruidEnergyMax ~= 0 and self.DruidEnergy / self.DruidEnergyMax or 0, "DruidEnergy")
end
if unitClass == "DRUID" then
IceHUD.DruidEnergy = DruidEnergy:new()
end

74
modules/EssencePower.lua Normal file
View File

@ -0,0 +1,74 @@
local L = LibStub("AceLocale-3.0"):GetLocale("IceHUD", false)
local EssencePower = IceCore_CreateClass(IceClassPowerCounter)
local SPELL_POWER_ESSENCE = SPELL_POWER_ESSENCE
if Enum and Enum.PowerType then
SPELL_POWER_ESSENCE = Enum.PowerType.Essence
end
function EssencePower.prototype:init()
EssencePower.super.prototype.init(self, "EssencePower")
self:SetDefaultColor("EssencePowerNumeric", 150, 150, 255)
self.unit = "player"
self.numericColor = "EssencePowerNumeric"
self.unitPower = SPELL_POWER_ESSENCE
self.minLevel = 0
self.bTreatEmptyAsFull = false
self.runeWidth = self.runeHeight
end
function EssencePower.prototype:Enable(core)
self.numRunes = UnitPowerMax(self.unit, SPELL_POWER_ESSENCE)
self.runeCoords = { }
for i = 1, self.numRunes do
self:SetupNewRune(i)
end
EssencePower.super.prototype.Enable(self, core)
end
function EssencePower.prototype:SetupNewRune(rune)
self.runeCoords[rune] = {0, 1, 0, 1}
end
function EssencePower.prototype:GetPowerEvent()
return "UNIT_POWER_FREQUENT"
end
function EssencePower.prototype:GetDefaultSettings()
local defaults = EssencePower.super.prototype.GetDefaultSettings(self)
defaults["pulseWhenFull"] = false
return defaults
end
function EssencePower.prototype:GetOptions()
local opts = EssencePower.super.prototype.GetOptions(self)
opts.hideBlizz.hidden = function() return true end
return opts
end
function EssencePower.prototype:GetRuneAtlas(rune)
return "UF-Essence-Icon"
end
function EssencePower.prototype:GetShineAtlas(rune)
return "Mage-ArcaneCharge-SmallSpark"
end
function EssencePower.prototype:ShowBlizz()
end
function EssencePower.prototype:HideBlizz()
end
-- Load us up
local _, unitClass = UnitClass("player")
if unitClass == "EVOKER" then
IceHUD.EssencePower = EssencePower:new()
end

View File

@ -1,3 +1,4 @@
local L = LibStub("AceLocale-3.0"):GetLocale("IceHUD", false)
IceTargetAbsorb = IceCore_CreateClass(IceUnitBar)
IceTargetAbsorb.prototype.highestAbsorbSinceLastZero = 0
@ -29,6 +30,28 @@ function IceTargetAbsorb.prototype:GetDefaultSettings()
return settings
end
function IceTargetAbsorb.prototype:GetOptions()
local opts = IceTargetAbsorb.super.prototype.GetOptions(self)
opts["scaleToUnitHealth"] = {
type = 'toggle',
name = L["Scale to health"],
desc = L["Whether the bar's maximum value should be set to the unit's maximum health or not. If set, any absorb above that amount will not be shown."],
get = function()
return self.moduleSettings.scaleToUnitHealth
end,
set = function(info, v)
self.moduleSettings.scaleToUnitHealth = v
self:Update()
end,
disabled = function()
return not self.moduleSettings.enabled
end
}
return opts
end
function IceTargetAbsorb.prototype:Enable(core)
IceTargetAbsorb.super.prototype.Enable(self, core)
@ -47,6 +70,7 @@ function IceTargetAbsorb.prototype:MyUnregisterCustomEvents()
end
function IceTargetAbsorb.prototype:Update()
IceTargetAbsorb.super.prototype.Update(self)
self:UpdateAbsorbAmount()
end
@ -63,13 +87,17 @@ function IceTargetAbsorb.prototype:UpdateAbsorbAmount(event, unit)
self.highestAbsorbSinceLastZero = absorbAmount
end
self.absorbPercent = self.highestAbsorbSinceLastZero ~= 0 and absorbAmount / self.highestAbsorbSinceLastZero or 0
local maxAbsorb = self.highestAbsorbSinceLastZero
if self.moduleSettings.scaleToUnitHealth then
maxAbsorb = self.maxHealth
end
self.absorbPercent = maxAbsorb ~= 0 and IceHUD:Clamp(absorbAmount / maxAbsorb, 0, 1) or 0
if absorbAmount <= 0 or self.highestAbsorbSinceLastZero <= 0 then
if absorbAmount <= 0 or maxAbsorb <= 0 then
self:Show(false)
else
self:Show(true)
self:UpdateBar(absorbAmount / self.highestAbsorbSinceLastZero, self.ColorName)
self:UpdateBar(self.absorbPercent, self.ColorName)
end
if not IceHUD.IceCore:ShouldUseDogTags() and self.frame:IsVisible() then

View File

@ -375,11 +375,12 @@ end
function TargetCC.prototype:MyOnUpdate()
TargetCC.super.prototype.MyOnUpdate(self)
self:UpdateTargetDebuffs(nil, self.unit, true)
self:UpdateTargetDebuffs("internal", self.unit)
end
function TargetCC.prototype:UpdateTargetDebuffs(event, unit, isUpdate)
function TargetCC.prototype:UpdateTargetDebuffs(event, unit)
local name, duration, remaining
local isUpdate = event == "internal"
if not isUpdate or not self.lastUpdateTime then
self.debuffName, self.debuffDuration, self.debuffRemaining = self:GetMaxDebuffDuration(self.unit, self.debuffList)

View File

@ -191,11 +191,12 @@ end
function TargetInvuln.prototype:MyOnUpdate()
TargetInvuln.super.prototype.MyOnUpdate(self)
self:UpdateTargetBuffs(nil, self.unit, true)
self:UpdateTargetBuffs("internal", self.unit)
end
function TargetInvuln.prototype:UpdateTargetBuffs(event, unit, isUpdate)
function TargetInvuln.prototype:UpdateTargetBuffs(event, unit)
local name, duration, remaining
local isUpdate = event == "internal"
if not isUpdate or not self.lastUpdateTime then
self.buffName, self.buffDuration, self.buffRemaining = self:GetMaxbuffDuration(self.unit, self.buffList)

View File

@ -1,5 +1,40 @@
# Changelog
v1.14.8:
- Fix Color By Health % to work with Low Threshold Color option. Previously, if Low Threshold was set, the color was always either MaxHealth/MaxMana or MinHealth/MinMana, it would never be colored by health %. Now if both are set, it will scale by health % until it reaches the low threshold, at which point it will switch to the Min color.
- Fix Low Threshold color and flashing to work at the same percentage. Previously these were slightly different such that it would start flashing at 40% but not turn to the Min color until 39.9999%, for example.
v1.14.7:
- Add option to scale absorb bar by the unit's maximum health.
v1.14.6:
- Add ability for buff/debuff watchers to only display when the specified buff/debuff is missing. This also adds the ability to require that the given unit exists. So if you had Unit set to Target, Display mode set to Missing, and Only if unit exists checked, you'd show the bar if you have a target and they don't have the given buff/debuff.
- Don't flash the castbar for instant-cast spells that the player didn't cast (such as internal quest spells).
- Add DruidEnergy module (disabled by default). This module will show the player's Energy level if they're a Druid and currently shapeshifted to a non-energy-using form (eligible forms are configurable by the user).
v1.14.5:
- Fix castbar flashing. There are controls on the player castbar module for flashing when a spell succeeds or fails, and separate controls for flashing when an instant cast completes. Those were broken, but now work again.
- Add "@" after the number when the Combo Points module is in Numeric mode, "Show Charged points" is enabled, and the current combo point is charged.
- Fix Charged point support in the ComboPointsBar module.
v1.14.4:
- Update TOC for 10.0.2
v1.14.3:
- Add Spell ID support for aura tracking.
- Add Evoker support.
- Add Empowered Casting (hold-to-cast levels) support.
v1.14.2:
- Fix CC and Invuln modules not showing immediately when they should.
v1.14.1:
- Fix Hide Party feature on pre-10.0 clients.