Compare commits

...

7 Commits

Author SHA1 Message Date
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
10 changed files with 267 additions and 43 deletions

View File

@ -393,6 +393,8 @@ function IceCastBar.prototype:MyOnUpdate()
return return
end end
self:UpdateBar(1, self:GetCurrentCastingColor())
if (self.action == IceCastBar.Actions.Failure) then if (self.action == IceCastBar.Actions.Failure) then
self:FlashBar("CastFail", 1-scale, self.actionMessage, "CastFail") self:FlashBar("CastFail", 1-scale, self.actionMessage, "CastFail")
else else
@ -478,7 +480,7 @@ function IceCastBar.prototype:FlashBar(color, alpha, text, textColor)
end end
function IceCastBar.prototype:StartBar(action, message) function IceCastBar.prototype:StartBar(action, message, spellId)
local spell, rank, displayName, icon, startTime, endTime, isTradeSkill, numStages local spell, rank, displayName, icon, startTime, endTime, isTradeSkill, numStages
if IceHUD.SpellFunctionsReturnRank then if IceHUD.SpellFunctionsReturnRank then
spell, rank, displayName, icon, startTime, endTime, isTradeSkill = UnitCastingInfo(self.unit) spell, rank, displayName, icon, startTime, endTime, isTradeSkill = UnitCastingInfo(self.unit)
@ -493,6 +495,10 @@ function IceCastBar.prototype:StartBar(action, message)
end end
end end
if spellId and not spell then
spell, rank, icon = GetSpellInfo(spellId)
end
local isChargeSpell = numStages and numStages > 0 local isChargeSpell = numStages and numStages > 0
if isChargeSpell then if isChargeSpell then
self.NumStages = numStages self.NumStages = numStages
@ -514,7 +520,7 @@ function IceCastBar.prototype:StartBar(action, message)
if LibClassicCasterino and not spell then if LibClassicCasterino and not spell then
self:StopBar() self:StopBar()
elseif not spell then elseif not spell then
return return
end end
if icon ~= nil then if icon ~= nil then
@ -590,7 +596,7 @@ function IceCastBar.prototype:SpellCastStart(event, unit, castGuid, spellId)
IceHUD:Debug("SpellCastStart", unit, castGuid, spellId) IceHUD:Debug("SpellCastStart", unit, castGuid, spellId)
--UnitCastingInfo(unit) --UnitCastingInfo(unit)
self:StartBar(IceCastBar.Actions.Cast) self:StartBar(IceCastBar.Actions.Cast, nil, spellId)
self.current = castGuid self.current = castGuid
end end
@ -609,8 +615,9 @@ function IceCastBar.prototype:SpellCastStop(event, unit, castGuid, spellId)
self.action ~= IceCastBar.Actions.ReverseChannel) self.action ~= IceCastBar.Actions.ReverseChannel)
then then
self:StopBar() self:StopBar()
self.current = nil
end end
self.current = nil
end end
@ -639,7 +646,7 @@ function IceCastBar.prototype:SpellCastFailed(event, unit, castGuid, spellId)
end end
end end
self:StartBar(IceCastBar.Actions.Failure, "Failed") self:StartBar(IceCastBar.Actions.Failure, "Failed", nil, spellId)
end end
function IceCastBar.prototype:SpellCastInterrupted(event, unit, castGuid, spellId) function IceCastBar.prototype:SpellCastInterrupted(event, unit, castGuid, spellId)
@ -653,7 +660,7 @@ function IceCastBar.prototype:SpellCastInterrupted(event, unit, castGuid, spellI
self.current = nil self.current = nil
self:StartBar(IceCastBar.Actions.Failure, "Interrupted") self:StartBar(IceCastBar.Actions.Failure, "Interrupted", spellId)
end end
function IceCastBar.prototype:SpellCastDelayed(event, unit, castGuid, spellId) function IceCastBar.prototype:SpellCastDelayed(event, unit, castGuid, spellId)
@ -687,7 +694,7 @@ function IceCastBar.prototype:SpellCastSucceeded(event, unit, castGuid, spellId)
-- show after normal successfull cast -- show after normal successfull cast
if (self.action == IceCastBar.Actions.Cast) then 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 return
end end
@ -700,7 +707,12 @@ function IceCastBar.prototype:SpellCastSucceeded(event, unit, castGuid, spellId)
end end
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 end

View File

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

View File

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

View File

@ -100,6 +100,7 @@ modules\PlayerAltMana.lua
modules\ArcaneCharges.lua modules\ArcaneCharges.lua
modules\RollTheBones.lua modules\RollTheBones.lua
modules\EssencePower.lua modules\EssencePower.lua
modules\DruidEnergy.lua
#@do-not-package@ #@do-not-package@
IceHUD_Options\Json.lua IceHUD_Options\Json.lua

View File

@ -1,5 +1,17 @@
# Changelog # Changelog
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: v1.14.4:
- Update TOC for 10.0.2 - Update TOC for 10.0.2

View File

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

View File

@ -11,6 +11,7 @@ function ComboPointsBar.prototype:init()
self:SetDefaultColor("ComboPointsBarMin", 1, 1, 0) self:SetDefaultColor("ComboPointsBarMin", 1, 1, 0)
self:SetDefaultColor("ComboPointsBarMax", 0, 1, 0) self:SetDefaultColor("ComboPointsBarMax", 0, 1, 0)
self:SetDefaultColor("ChargedComboPointBar", 0.3137254901960784, 0.3725490196078432, 1)
self.bTreatEmptyAsFull = true self.bTreatEmptyAsFull = true
end end
@ -52,6 +53,26 @@ function ComboPointsBar.prototype:GetOptions()
end, 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 return opts
end end
@ -62,6 +83,7 @@ function ComboPointsBar.prototype:GetDefaultSettings()
defaults.alwaysDisplay = false defaults.alwaysDisplay = false
defaults.desiredLerpTime = 0.05 defaults.desiredLerpTime = 0.05
defaults.bShowWithNoTarget = true defaults.bShowWithNoTarget = true
defaults.bShowCharged = true
return defaults return defaults
end end
@ -84,17 +106,7 @@ function ComboPointsBar.prototype:Enable(core)
end end
if GetUnitChargedPowerPoints then if GetUnitChargedPowerPoints then
self:RegisterEvent("UNIT_POWER_POINT_CHARGE", "UpdateChargedComboPoints") self:RegisterEvent("UNIT_POWER_POINT_CHARGE", "UpdateComboPoints")
end
self:UpdateChargedComboPoints()
end
function ComboPointsBar.prototype:UpdateChargedComboPoints()
if GetUnitChargedPowerPoints then
local chargedPowerPoints = GetUnitChargedPowerPoints("player")
self.chargedPowerPointIndex = chargedPowerPoints and chargedPowerPoints[1]
self:UpdateComboPoints()
end end
end end
@ -131,20 +143,46 @@ function ComboPointsBar.prototype:UpdateComboPoints(...)
points = nil points = nil
end 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 if points == nil or points == 0 or (not UnitExists("target") and not self.moduleSettings.bShowWithNoTarget) then
self:Show(self.moduleSettings.alwaysDisplay) self:Show(self.moduleSettings.alwaysDisplay)
self:UpdateBar(0, "undef") self:UpdateBar(0, "undef")
else else
self:Show(true) 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:UpdateBar(points / UnitPowerMax("player", SPELL_POWER_COMBO_POINTS), "undef")
self.barFrame.bar:SetVertexColor(color.r, color.g, color.b, self.alpha) self.barFrame.bar:SetVertexColor(color.r, color.g, color.b, self.alpha)
end end
self:SetBottomText1(points or "0") local pointsText = tostring(points or 0)
if self.chargedPowerPointIndex then if isCharged then
self:SetBottomText2(self.chargedPowerPointIndex) pointsText = pointsText .. "@"
end 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 end
function ComboPointsBar.prototype:Update() function ComboPointsBar.prototype:Update()

View File

@ -10,6 +10,7 @@ local buffOrDebuff = {"buff", "debuff"}
local validBuffTimers = {"none", "seconds", "minutes:seconds", "minutes"} local validBuffTimers = {"none", "seconds", "minutes:seconds", "minutes"}
local AuraIconWidth = 20 local AuraIconWidth = 20
local AuraIconHeight = 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.auraDuration = -1
IceCustomBar.prototype.auraEndTime = -1 IceCustomBar.prototype.auraEndTime = -1
@ -28,6 +29,16 @@ end
function IceCustomBar.prototype:Enable(core) function IceCustomBar.prototype:Enable(core)
IceCustomBar.super.prototype.Enable(self, 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 if IceHUD.IceCore:ShouldUseDogTags() then
DogTag = LibStub("LibDogTag-3.0", true) DogTag = LibStub("LibDogTag-3.0", true)
if DogTag then if DogTag then
@ -149,8 +160,7 @@ function IceCustomBar.prototype:GetDefaultSettings()
settings["buffOrDebuff"] = "buff" settings["buffOrDebuff"] = "buff"
settings["barColor"] = {r=1, g=0, b=0, a=1} settings["barColor"] = {r=1, g=0, b=0, a=1}
settings["trackOnlyMine"] = true settings["trackOnlyMine"] = true
settings["displayWhenEmpty"] = false settings["displayMode"] = displayModes.NORMAL
settings["displayWhenTargeting"] = false
settings["hideAnimationSettings"] = true settings["hideAnimationSettings"] = true
settings["buffTimerDisplay"] = "minutes" settings["buffTimerDisplay"] = "minutes"
settings["maxDuration"] = 0 settings["maxDuration"] = 0
@ -431,38 +441,39 @@ function IceCustomBar.prototype:GetOptions()
order = 30.8, order = 30.8,
} }
opts["displayWhenEmpty"] = { opts["displayMode"] = {
type = 'toggle', type = 'select',
name = L["Display when empty"], values = displayModes,
desc = L["Whether or not to display this bar even if the buff/debuff specified is not present."], name = L["Display mode"],
get = function() desc = L["When to show the bar"],
return self.moduleSettings.displayWhenEmpty get = function(info)
return IceHUD:GetSelectValue(info, self.moduleSettings.displayMode)
end, end,
set = function(info, v) set = function(info, v)
self.moduleSettings.displayWhenEmpty = v self.moduleSettings.displayMode = info.option.values[v]
self:UpdateCustomBar() self:UpdateCustomBar()
end, end,
disabled = function() disabled = function()
return not self.moduleSettings.enabled return not self.moduleSettings.enabled
end, end,
order = 30.9 order = 30.9,
} }
opts["displayWhenTargeting"] = { opts["displayWhenUnitExists"] = {
type = 'toggle', type = 'toggle',
name = L["Display when targeting"], name = L["Only if unit exists"],
desc = L["Whether to display this bar when you target a unit, even if the buff/debuff specified is not present."], 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() get = function(info)
return self.moduleSettings.displayWhenTargeting return self.moduleSettings.displayWhenUnitExists
end, end,
set = function(info, v) set = function(info, v)
self.moduleSettings.displayWhenTargeting = v self.moduleSettings.displayWhenUnitExists = v
self:UpdateCustomBar() self:UpdateCustomBar()
end, end,
disabled = function() disabled = function()
return not self.moduleSettings.enabled return not self.moduleSettings.enabled
end, end,
order = 30.91 order = 30.91,
} }
opts["buffTimerDisplay"] = { opts["buffTimerDisplay"] = {
@ -866,9 +877,16 @@ function IceCustomBar.prototype:Show(bShouldShow, bForceHide)
return return
end 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) IceCustomBar.super.prototype.Show(self, true)
elseif self.moduleSettings.displayWhenEmpty then elseif self.moduleSettings.displayMode == displayModes.ALWAYS then
if not self.bIsVisible then if not self.bIsVisible then
IceCustomBar.super.prototype.Show(self, true) IceCustomBar.super.prototype.Show(self, true)
end 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

View File

@ -1,5 +1,17 @@
# Changelog # Changelog
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: v1.14.4:
- Update TOC for 10.0.2 - Update TOC for 10.0.2