diff --git a/ClassicAPI.lua b/ClassicAPI.lua index 0ac50ae..63c9b13 100644 --- a/ClassicAPI.lua +++ b/ClassicAPI.lua @@ -197,6 +197,34 @@ function API.GetSpellBonusHealing() return GetSpellBonusHealing() end +-------------------------------------------------------------------------------- +-- Unit Power +-------------------------------------------------------------------------------- + +-- Current power for a specific Enum.PowerType (0=Mana, 1=Rage, 2=Focus, +-- 3=Energy, 4=Happiness), or the unit's primary power when powerType is omitted. +-- Display-divided (rage reads 0..100). Falls back to UnitMana without ClassicAPI. +function API.UnitPower(unit, powerType) + if type(UnitPower) == "function" then return UnitPower(unit, powerType) end + return UnitMana(unit) +end + +function API.UnitPowerMax(unit, powerType) + if type(UnitPowerMax) == "function" then return UnitPowerMax(unit, powerType) end + return UnitManaMax(unit) +end + +-- Power deficit (max - current) for the type / primary power, in one call. +function API.UnitPowerMissing(unit, powerType) + if type(UnitPowerMissing) == "function" then return UnitPowerMissing(unit, powerType) end + return (UnitManaMax(unit) or 0) - (UnitMana(unit) or 0) +end + +-- Unit's primary power type as an integer (0=Mana .. 4=Happiness). +function API.UnitPowerType(unit) + return UnitPowerType(unit) +end + -------------------------------------------------------------------------------- -- State -------------------------------------------------------------------------------- diff --git a/Conditionals.lua b/Conditionals.lua index 152c43c..1e51fd1 100644 --- a/Conditionals.lua +++ b/Conditionals.lua @@ -55,15 +55,14 @@ function CleveRoids.GetCachedPlayerHealthPercent() end function CleveRoids.GetCachedPlayerPowerPercent() - local API = CleveRoids.NampowerAPI - local power = API and API.GetUnitPower and API.GetUnitPower("player") or UnitMana("player") - local max = API and API.GetUnitMaxPower and API.GetUnitMaxPower("player") or UnitManaMax("player") + local API = CleveRoids.ClassicAPI + local power = API.UnitPower("player") + local max = API.UnitPowerMax("player") return max > 0 and (100 * power / max) or 0 end function CleveRoids.GetCachedPlayerPower() - local API = CleveRoids.NampowerAPI - return API and API.GetUnitPower and API.GetUnitPower("player") or UnitMana("player") + return CleveRoids.ClassicAPI.UnitPower("player") end function CleveRoids.GetCachedTargetHealthPercent() @@ -3299,9 +3298,9 @@ end -- returns: True or false function CleveRoids.ValidatePower(unit, operator, amount) if not unit or not operator or not amount then return false end - local API = CleveRoids.NampowerAPI - local power = API and API.GetUnitPower and API.GetUnitPower(unit) or UnitMana(unit) - local maxPower = API and API.GetUnitMaxPower and API.GetUnitMaxPower(unit) or UnitManaMax(unit) + local API = CleveRoids.ClassicAPI + local power = API.UnitPower(unit) + local maxPower = API.UnitPowerMax(unit) local powerPercent = maxPower > 0 and (100 * power / maxPower) or 0 if CleveRoids.operators[operator] then @@ -3318,8 +3317,7 @@ end -- returns: True or false function CleveRoids.ValidateRawPower(unit, operator, amount) if not unit or not operator or not amount then return false end - local API = CleveRoids.NampowerAPI - local power = API and API.GetUnitPower and API.GetUnitPower(unit) or UnitMana(unit) + local power = CleveRoids.ClassicAPI.UnitPower(unit) if power and CleveRoids.operators[operator] then return CleveRoids.comparators[operator](power, amount) @@ -3328,23 +3326,15 @@ function CleveRoids.ValidateRawPower(unit, operator, amount) return false end --- Raw caster-form mana for druids (SuperWoW: 2nd return of UnitMana) +-- Raw caster-form mana for druids. Read the mana power slot directly +-- (0 = Enum.PowerType.Mana) so it works while shapeshifted, when the druid's +-- primary power is rage/energy -- no SuperWoW 2nd-return-of-UnitMana needed. function CleveRoids.ValidateDruidRawMana(unit, operator, amount) unit = unit or "player" if not operator or amount == nil then return false end if (CleveRoids.playerClass ~= "DRUID") then return false end - -- SuperWoW returns: current-form power, caster-form mana - local _, casterMana = UnitMana(unit) - - -- Fallback: if for some reason we didn't get a 2nd value and we're in caster form now - if type(casterMana) ~= "number" then - if UnitPowerType and UnitPowerType(unit) == 0 then - casterMana = UnitMana(unit) - else - return false - end - end + local casterMana = CleveRoids.ClassicAPI.UnitPower(unit, 0) local cmp = CleveRoids.comparators and CleveRoids.comparators[operator] return cmp and cmp(casterMana, amount) or false @@ -3357,10 +3347,7 @@ end -- returns: True or false function CleveRoids.ValidatePowerLost(unit, operator, amount) if not unit or not operator or not amount then return false end - local API = CleveRoids.NampowerAPI - local maxPower = API and API.GetUnitMaxPower and API.GetUnitMaxPower(unit) or UnitManaMax(unit) - local power = API and API.GetUnitPower and API.GetUnitPower(unit) or UnitMana(unit) - local powerLost = maxPower - power + local powerLost = CleveRoids.ClassicAPI.UnitPowerMissing(unit) if CleveRoids.operators[operator] then return CleveRoids.comparators[operator](powerLost, amount) @@ -8266,7 +8253,7 @@ CleveRoids.Keywords = { if not UnitExists(unit) then return false end return Or(conditionals.powertype, function(powerTypeName) - local powerType = UnitPowerType(unit) + local powerType = CleveRoids.ClassicAPI.UnitPowerType(unit) local powerTypeLower = string.lower(powerTypeName or "") if powerTypeLower == "mana" then @@ -8289,7 +8276,7 @@ CleveRoids.Keywords = { if not UnitExists(unit) then return true end return NegatedMulti(conditionals.nopowertype, function(powerTypeName) - local powerType = UnitPowerType(unit) + local powerType = CleveRoids.ClassicAPI.UnitPowerType(unit) local powerTypeLower = string.lower(powerTypeName or "") if powerTypeLower == "mana" then diff --git a/Core.lua b/Core.lua index e19e60d..1678d92 100644 --- a/Core.lua +++ b/Core.lua @@ -947,13 +947,14 @@ function CleveRoids.TestForActiveAction(actions) -- Prefer IsSpellUsable result if available (Nampower) actions.active.oom = (notEnoughPower == 1) else - -- SuperWoW: UnitMana returns (current power, caster mana) for druids - local currentPower, casterMana = UnitMana("player") - - -- For druids with SuperWoW, use caster mana for spell cost checks - local manaToCheck = currentPower - if CleveRoids.playerClass == "DRUID" and type(casterMana) == "number" then - manaToCheck = casterMana + -- Read caster mana directly for druids (the mana slot survives + -- shapeshift, 0 = Enum.PowerType.Mana); other classes use their + -- primary power. Replaces the SuperWoW UnitMana 2nd-return hack. + local manaToCheck + if CleveRoids.playerClass == "DRUID" then + manaToCheck = CleveRoids.ClassicAPI.UnitPower("player", 0) + else + manaToCheck = CleveRoids.ClassicAPI.UnitPower("player") end actions.active.oom = (manaToCheck < actions.active.spell.cost) diff --git a/NampowerAPI.lua b/NampowerAPI.lua index 6ab97c0..c040d7c 100644 --- a/NampowerAPI.lua +++ b/NampowerAPI.lua @@ -3492,32 +3492,5 @@ function API.GetUnitMaxHealth(unitToken) return UnitHealthMax(unitToken) end --- powerType: nil=current, 0=mana, 1=rage, 2=focus, 3=energy --- GetUnitField uses power1-power4 fields -local POWER_FIELDS = { [0] = "power1", [1] = "power2", [2] = "power3", [3] = "power4" } -local MAX_POWER_FIELDS = { [0] = "maxPower1", [1] = "maxPower2", [2] = "maxPower3", [3] = "maxPower4" } - -function API.GetUnitPower(unitToken, powerType) - if API.features.hasGetUnitField and GetUnitField and powerType then - local field = POWER_FIELDS[powerType] - if field then - local val = GetUnitField(unitToken, field) - if val then return val end - end - end - return UnitMana(unitToken) -end - -function API.GetUnitMaxPower(unitToken, powerType) - if API.features.hasGetUnitField and GetUnitField and powerType then - local field = MAX_POWER_FIELDS[powerType] - if field then - local val = GetUnitField(unitToken, field) - if val then return val end - end - end - return UnitManaMax(unitToken) -end - -- Expose API globally for other addons _G.CleveRoidsNampowerAPI = API