From 1132521e40b86682d47b49af2c63f84396858fc2 Mon Sep 17 00:00:00 2001 From: Pawel Date: Sat, 16 May 2015 17:48:50 +0200 Subject: [PATCH] v0.3 --- Media/TDIconAlert.tga | Bin 131116 -> 0 bytes Media/TDIconAlertAnts.tga | Bin 262188 -> 0 bytes Modules/TDWarriorDps.lua | 132 -------------------------------- Modules/module.lua.template | 71 +++++++++++++++++ TDButtons.lua | 178 +++++++++++++++++-------------------------- TDDps.lua | 90 +++++++++++++--------- TDDps.toc | 1 + TDHelper.lua | 59 ++++++++------ 8 files changed, 233 insertions(+), 298 deletions(-) delete mode 100644 Media/TDIconAlert.tga delete mode 100644 Media/TDIconAlertAnts.tga delete mode 100644 Modules/TDWarriorDps.lua create mode 100644 Modules/module.lua.template diff --git a/Media/TDIconAlert.tga b/Media/TDIconAlert.tga deleted file mode 100644 index 87ce00e08502356328e972a28426a39123d5a4c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 131116 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 K2TpoJ?*9S1Ii7a_ diff --git a/Media/TDIconAlertAnts.tga b/Media/TDIconAlertAnts.tga deleted file mode 100644 index 447923b55f70c25428272527816e299051c05c87..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 262188 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 a57_0v-S^vl?^mq= 0.9 and ph > 0.2 then - return _WildStrike; - end - - if sd then - return _Execute; - end - - if rbCount >= 2 and ph > 0.2 then - return _RagingBlow; - end - - if not enrage and (_isUnquenchableThirst or rage < 80) then - return _Bloodthirst; - end - - if _isRavager and ravager then - return _Ravager; - end - - if _isStormBolt and sb then - return _StormBolt; - end - - if _isDragonRoar and dr then - return _DragonRoar; - end - - if rage >= 30 and ph < 0.2 and enrage then - return _Execute; - end - - if bs then - return _WildStrike; - end - - if rbCount > 0 then - return _RagingBlow; - end - - return _Bloodthirst; -end \ No newline at end of file diff --git a/Modules/module.lua.template b/Modules/module.lua.template new file mode 100644 index 0000000..5a96e74 --- /dev/null +++ b/Modules/module.lua.template @@ -0,0 +1,71 @@ +-- Author : Kaminari +-- Create Date : 13:03 2015-04-20 + +-- Spells +local _Spell = 23881; + +-- Auras +local _Aura = 12880; + +-- Talents +local _isTalent = false; + +-- Flags for glow independent +local _FlagHigh = false; + +---------------------------------------------- +-- Pre enable, checking talents +---------------------------------------------- +TDDps_[Class]_CheckTalents = function() + _isTalent = TDTalentEnabled('Talent Name'); + -- other checking functions +end + +---------------------------------------------- +-- Enabling Addon +---------------------------------------------- +function TDDps_[Class]_EnableAddon(mode) + mode = mode or 1; + _TD["DPS_Description"] = "TD [Class] DPS supports: [Spec1], [Spec2], [Spec3]"; + _TD["DPS_OnEnable"] = TDDps_[Class]_CheckTalents; + if mode == 1 then + _TD["DPS_NextSpell"] = TDDps_[Class]_[Spec1]; + end; + if mode == 2 then + _TD["DPS_NextSpell"] = TDDps_[Class]_[Spec2]; + end; + if mode == 3 then + _TD["DPS_NextSpell"] = TDDps_[Class]_[Spec3]; + end; + TDDps_EnableAddon(); +end + +---------------------------------------------- +-- Main rotation: [Spec1] +---------------------------------------------- +TDDps_[Class]_[Spec1] = function() + + local lcd, currentSpell = TDEndCast(); + + return _Spell; +end + +---------------------------------------------- +-- Main rotation: [Spec2] +---------------------------------------------- +TDDps_[Class]_[Spec2] = function() + + local lcd, currentSpell = TDEndCast(); + + return _Spell; +end + +---------------------------------------------- +-- Main rotation: [Spec3] +---------------------------------------------- +TDDps_[Class]_[Spec3] = function() + + local lcd, currentSpell = TDEndCast(); + + return _Spell; +end \ No newline at end of file diff --git a/TDButtons.lua b/TDButtons.lua index ab793bf..30b40c7 100644 --- a/TDButtons.lua +++ b/TDButtons.lua @@ -1,69 +1,33 @@ -local numtdOverlays = 0; -local TDActionSpells = {}; -local TDActionSpellsGlowing = {}; +local TDButton_Spells = {}; +local TDButton_SpellsGlowing = {}; ---------------------------------------------- -- Show Overlay on button ---------------------------------------------- -function TDActionButton_ShowOverlayGlow(self) - if ( self.tdOverlay ) then - self.tdOverlay:Show(); - else - numtdOverlays = numtdOverlays + 1; - self.tdOverlay = CreateFrame("Frame", "ActionButtonTdOverlay" .. numtdOverlays, UIParent); - - self.tdOverlay:SetParent(self); - self.tdOverlay:SetFrameStrata("HIGH") - self.tdOverlay:SetWidth(self:GetWidth() * 1.4) - self.tdOverlay:SetHeight(self:GetHeight() * 1.4) - - local t = self.tdOverlay:CreateTexture(nil,"OVERLAY") - t:SetTexture("Interface\\Cooldown\\ping4") - t:SetBlendMode("ADD"); - t:SetAllPoints(self.tdOverlay); - self.tdOverlay.texture = t; - - self.tdOverlay:SetPoint("CENTER",0,0); - self.tdOverlay:Show(); - end -end - ----------------------------------------------- --- Hide Overlay on button ----------------------------------------------- -function TDActionButton_HideOverlayGlow(self) - if ( self.tdOverlay ) then - self.tdOverlay:Hide(); - end -end - - ----------------------------------------------- --- Show Overlay on button ----------------------------------------------- -function TDActionButton_Glow(self, id, r, g, b) - if ( self.tdOverlays and self.tdOverlays[id] ) then +function TDButton_Glow(self, id, r, g, b, texture) + if (self.tdOverlays and self.tdOverlays[id]) then self.tdOverlays[id]:Show(); else if not self.tdOverlays then self.tdOverlays = {}; end - self.tdOverlays[id] = CreateFrame("Frame", "ActionButtonTdOverlays" .. id, UIParent); + texture = texture or 'Interface\\Cooldown\\ping4'; + self.tdOverlays[id] = CreateFrame('Frame', 'TDButton_Overlay_' .. id, UIParent); self.tdOverlays[id]:SetParent(self); - self.tdOverlays[id]:SetFrameStrata("HIGH") + self.tdOverlays[id]:SetFrameStrata('HIGH') self.tdOverlays[id]:SetWidth(self:GetWidth() * 1.4) self.tdOverlays[id]:SetHeight(self:GetHeight() * 1.4) - local t = self.tdOverlays[id]:CreateTexture(nil, "OVERLAY") - t:SetTexture("Interface\\Cooldown\\ping4") - t:SetBlendMode("ADD"); + local t = self.tdOverlays[id]:CreateTexture(nil, 'OVERLAY') + t:SetTexture(texture) + t:SetBlendMode('ADD'); t:SetAllPoints(self.tdOverlays[id]); t:SetVertexColor(r or 1, g or 0, b or 0); self.tdOverlays[id].texture = t; - self.tdOverlays[id]:SetPoint("CENTER",0,0); + self.tdOverlays[id]:SetPoint('CENTER',0,0); self.tdOverlays[id]:Show(); end end @@ -71,8 +35,8 @@ end ---------------------------------------------- -- Hide Overlay on button ---------------------------------------------- -function TDActionButton_HideGlow(self, id) - if ( self.tdOverlays[id] ) then +function TDButton_HideGlow(self, id) + if (self.tdOverlays[id]) then self.tdOverlays[id]:Hide(); end end @@ -80,19 +44,19 @@ end ---------------------------------------------- -- Fetch button spells ---------------------------------------------- -function TDFetchActions() - TDGlowClear(); - TDActionSpells = {}; - TDActionSpellsGlowing = {}; +function TDButton_Fetch() + TDButton_GlowClear(); + TDButton_Spells = {}; + TDButton_SpellsGlowing = {}; local isBartender = IsAddOnLoaded('Bartender4'); local isElv = IsAddOnLoaded('ElvUI'); if (isBartender) then - TDFetchActionsBartender4(); + TDButton_FetchBartender4(); elseif (isElv) then - TDFetchActionsElvUI(); + TDButton_FetchElvUI(); else - TDFetchActionsBlizzard(); + TDButton_FetchBlizzard(); end print('TDDps: fetched action bars!'); end @@ -100,7 +64,7 @@ end ---------------------------------------------- -- Button spells on original blizzard UI ---------------------------------------------- -function TDFetchActionsBlizzard() +function TDButton_FetchBlizzard() local TDActionBarsBlizzard = {'Action', 'MultiBarBottomLeft', 'MultiBarBottomRight', 'MultiBarRight', 'MultiBarLeft'}; for _, barName in pairs(TDActionBarsBlizzard) do for i = 1, 12 do @@ -116,11 +80,11 @@ function TDFetchActionsBlizzard() actionName = GetSpellInfo(id); end if actionName then - if TDActionSpells[actionName] == nil then - TDActionSpells[actionName] = {}; + if TDButton_Spells[actionName] == nil then + TDButton_Spells[actionName] = {}; end - tinsert(TDActionSpells[actionName], button); + tinsert(TDButton_Spells[actionName], button); end end end @@ -130,7 +94,7 @@ end ---------------------------------------------- -- Button spells on ElvUI ---------------------------------------------- -function TDFetchActionsElvUI() +function TDButton_FetchElvUI() local ret = false; for x = 1, 10 do for i = 1, 12 do @@ -140,11 +104,11 @@ function TDFetchActionsElvUI() if spellId then local actionName, _ = GetSpellInfo(spellId); if actionName then - if TDActionSpells[actionName] == nil then - TDActionSpells[actionName] = {}; + if TDButton_Spells[actionName] == nil then + TDButton_Spells[actionName] = {}; end ret = true; - tinsert(TDActionSpells[actionName], button); + tinsert(TDButton_Spells[actionName], button); end end end @@ -156,7 +120,7 @@ end ---------------------------------------------- -- Button spells on Bartender4 ---------------------------------------------- -function TDFetchActionsBartender4() +function TDButton_FetchBartender4() local ret = false; for i = 1, 120 do local button = _G['BT4Button' .. i]; @@ -166,11 +130,11 @@ function TDFetchActionsBartender4() local actionName, _ = GetSpellInfo(spellId); print(actionName, spellId); if actionName then - if TDActionSpells[actionName] == nil then - TDActionSpells[actionName] = {}; + if TDButton_Spells[actionName] == nil then + TDButton_Spells[actionName] = {}; end ret = true; - tinsert(TDActionSpells[actionName], button); + tinsert(TDButton_Spells[actionName], button); end end end @@ -181,28 +145,20 @@ end ---------------------------------------------- -- Dump spells for debug ---------------------------------------------- -function TDDumpSpells() - for k, button in pairs(TDActionSpells) do +function TDButton_Dump() + for k, button in pairs(TDButton_Spells) do print(k, button:GetName()); end end ---------------------------------------------- --- Glow spell by id ----------------------------------------------- -function TDGlowSpellId(spellId) - local name = GetSpellInfo(spellId); - TDGlowSpell(name); -end - ----------------------------------------------- -- Glow independent button by spell name ---------------------------------------------- -function TDGlowIndependent(spellName, id, r, g, b) +function TDButton_GlowIndependent(spellName, id, r, g, b, texture) local name = GetSpellInfo(spellName) or spellName; - if TDActionSpells[name] ~= nil then - for k, button in pairs(TDActionSpells[name]) do - TDActionButton_Glow(button, id, r, g, b); + if TDButton_Spells[name] ~= nil then + for k, button in pairs(TDButton_Spells[name]) do + TDActionButton_Glow(button, id, r, g, b, texture); end end end @@ -210,9 +166,9 @@ end ---------------------------------------------- -- Clear glow independent button by spell name ---------------------------------------------- -function TDClearGlowIndependent(spellName, id) +function TDButton_ClearGlowIndependent(spellName, id) local name = GetSpellInfo(spellName) or spellName; - for k, button in pairs(TDActionSpells[name]) do + for k, button in pairs(TDButton_Spells[name]) do TDActionButton_HideGlow(button, id); end end @@ -220,42 +176,50 @@ end ---------------------------------------------- -- Glow spell by name ---------------------------------------------- -function TDGlowSpell(spellName) - if TDActionSpells[spellName] ~= nil then - for k, button in pairs(TDActionSpells[spellName]) do - TDActionButton_ShowOverlayGlow(button); - end - TDActionSpellsGlowing[spellName] = 1; - end +function TDButton_GlowSpell(spellName) + if TDButton_Spells[spellName] ~= nil then + for k, button in pairs(TDButton_Spells[spellName]) do + TDButton_Glow(button, 'next'); + end + TDButton_SpellsGlowing[spellName] = 1; + end +end + +---------------------------------------------- +-- Glow spell by id +---------------------------------------------- +function TDButton_GlowSpellId(spellId) + local name = GetSpellInfo(spellId); + TDButton_GlowSpell(name); end ---------------------------------------------- -- Glow next spell by name ---------------------------------------------- -function TDGlowNextSpell(spellName) - TDGlowClear(); - TDGlowSpell(spellName); +function TDButton_GlowNextSpell(spellName) + TDButton_GlowClear(); + TDButton_GlowSpell(spellName); end ---------------------------------------------- -- Glow next spell by id ---------------------------------------------- -function TDGlowNextSpellId(spellId) +function TDButton_GlowNextSpellId(spellId) local spellName = GetSpellInfo(spellId); - TDGlowClear(); - TDGlowSpell(spellName); + TDButton_GlowClear(); + TDButton_GlowSpell(spellName); end ---------------------------------------------- -- Clear all spell glows ---------------------------------------------- -function TDGlowClear() - for spellName, v in pairs(TDActionSpellsGlowing) do +function TDButton_GlowClear() + for spellName, v in pairs(TDButton_SpellsGlowing) do if v == 1 then - for k, button in pairs(TDActionSpells[spellName]) do - TDActionButton_HideOverlayGlow(button); + for k, button in pairs(TDButton_Spells[spellName]) do + TDButton_HideGlow(button, 'next'); end - TDActionSpellsGlowing[spellName] = 0; + TDButton_SpellsGlowing[spellName] = 0; end end end @@ -263,11 +227,11 @@ end ---------------------------------------------- -- Frame init ---------------------------------------------- -local TDButtonsFrame = CreateFrame("FRAME", "TDButtonsFrame"); -TDButtonsFrame:RegisterEvent("PLAYER_ENTERING_WORLD"); +local TDButton_Frame = CreateFrame('FRAME', 'TDButton_Frame'); +TDButton_Frame:RegisterEvent('PLAYER_ENTERING_WORLD'); -local function eventHandler(self, event, ...) - TDFetchActions(); +local function TDButton_EventHandler(self, event, ...) + TDButton_Fetch(); end -TDButtonsFrame:SetScript("OnEvent", eventHandler); \ No newline at end of file +TDButton_Frame:SetScript('OnEvent', TDButton_EventHandler); \ No newline at end of file diff --git a/TDDps.lua b/TDDps.lua index 52be120..ab8faf3 100644 --- a/TDDps.lua +++ b/TDDps.lua @@ -1,15 +1,15 @@ _TD = _TD or {}; -_TD["DPS_Enabled"] = 0; -_TD["DPS_OnEnable"] = nil; -_TD["DPS_NextSpell"] = nil; -_TD["DPS_Description"] = ""; -_TD["DPS_Mode"] = 1; +_TD['DPS_Enabled'] = 0; +_TD['DPS_OnEnable'] = nil; +_TD['DPS_NextSpell'] = nil; +_TD['DPS_Description'] = ''; +_TD['DPS_Mode'] = 1; DPS_Skill = nil; local _DPS_time = 0; -local TDDps_Frame = CreateFrame("frame"); +local TDDps_Frame = CreateFrame('frame'); ---------------------------------------------- -- Disable dps addon functionality @@ -18,13 +18,13 @@ function TDDps_DisableAddon() TDDps_Frame:Hide(); TDDps_Frame:UnregisterAllEvents(); - TDDps_Frame:SetScript("OnUpdate", nil); - TDDps_Frame:SetScript("OnEvent", nil); + TDDps_Frame:SetScript('OnUpdate', nil); + TDDps_Frame:SetScript('OnEvent', nil); - print(_TD["DPS_Description"]); + print(_TD['DPS_Description']); DPS_Skill = nil; - _TD["DPS_Enabled"] = 0; + _TD['DPS_Enabled'] = 0; end ---------------------------------------------- @@ -35,32 +35,32 @@ function TDDps_EnableAddon(mode) print('enabling'); - if _TD["DPS_NextSpell"] == nil then - print("TDDPS: No addon selected, cannot enable"); + if _TD['DPS_NextSpell'] == nil then + print('TDDPS: No addon selected, cannot enable'); return; end - if _TD["DPS_Enabled"] == 1 then + if _TD['DPS_Enabled'] == 1 then return; end - _TD["DPS_Mode"] = mode; + _TD['DPS_Mode'] = mode; TDDps_Frame:Show(); - TDDps_Frame:RegisterEvent("PLAYER_TARGET_CHANGED"); - TDDps_Frame:RegisterEvent("ACTIVE_TALENT_GROUP_CHANGED"); - - TDFetchActions(); + TDDps_Frame:RegisterEvent('PLAYER_TARGET_CHANGED'); + TDDps_Frame:RegisterEvent('ACTIVE_TALENT_GROUP_CHANGED'); + + TDButton_Fetch(); - if _TD["DPS_OnEnable"] then - _TD["DPS_OnEnable"](); + if _TD['DPS_OnEnable'] then + _TD['DPS_OnEnable'](); end - TDDps_Frame:SetScript("OnUpdate", TDDps_OnUpdate); - TDDps_Frame:SetScript("OnEvent", TDDps_OnEvent); + TDDps_Frame:SetScript('OnUpdate', TDDps_OnUpdate); + TDDps_Frame:SetScript('OnEvent', TDDps_OnEvent); - _TD["DPS_Enabled"] = 1; + _TD['DPS_Enabled'] = 1; print('enabled'); end @@ -71,15 +71,10 @@ function TDDps_InvokeNextSpell() -- invoke spell check local oldSkill = DPS_Skill; - DPS_Skill = _TD["DPS_NextSpell"](); - + DPS_Skill = _TD['DPS_NextSpell'](); + if (oldSkill ~= DPS_Skill or oldSkill == nil) and DPS_Skill ~= nil then - - TDGlowNextSpellId(DPS_Skill); - - if _TD["DPS_Debug"] then - print ('skill: '..DPS_Skill); - end + TDButton_GlowNextSpellId(DPS_Skill); end end @@ -87,14 +82,14 @@ end -- Event Script, Target Change, Specializaton Change ---------------------------------------------- function TDDps_OnEvent(event) - if event == "PLAYER_TARGET_CHANGED" then - if (UnitIsFriend("player", "target")) then + if event == 'PLAYER_TARGET_CHANGED' then + if (UnitIsFriend('player', 'target')) then TDGlowClear(); return; else TDDps_InvokeNextSpell(); end - elseif event == "ACTIVE_TALENT_GROUP_CHANGED" then + elseif event == 'ACTIVE_TALENT_GROUP_CHANGED' then TDDps_CheckPlayer(); end end @@ -108,4 +103,29 @@ function TDDps_OnUpdate(self, elapsed) _DPS_time = 0; TDDps_InvokeNextSpell(); end -end \ No newline at end of file +end + +---------------------------------------------- +-- Load appropriate addon for class +---------------------------------------------- +function TDDps_LoadModule() + local class = UnitClass('player'); + class = class:gsub(' ', ''); + local module = 'TDDps_' .. class; + + if not IsAddOnLoaded(module) then + LoadAddOn(module) + end + + if not IsAddOnLoaded(module) then + print('TDDps: Could not find class module.'); + return; + end + + local mode = GetSpecialization(); + local init = module .. '_EnableAddon'; + + _G[init](mode); +end + +-- PLAYER_ALIVE \ No newline at end of file diff --git a/TDDps.toc b/TDDps.toc index 11c0a40..832a6b7 100644 --- a/TDDps.toc +++ b/TDDps.toc @@ -1,4 +1,5 @@ ## Title: TDDps +## Notes: Rotation helper framework. ## Version: 1.0 ## Author: Kaminari ## Interface: 60000 diff --git a/TDHelper.lua b/TDHelper.lua index 3015152..0897b29 100644 --- a/TDHelper.lua +++ b/TDHelper.lua @@ -1,8 +1,11 @@ +-- Global cooldown spell id +_GlobalCooldown = 61304; + ---------------------------------------------- -- Current Specialisation name ---------------------------------------------- -function TDSpecName() +function TD_SpecName() local currentSpec = GetSpecialization(); local currentSpecName = currentSpec and select(2, GetSpecializationInfo(currentSpec)) or "None"; return currentSpecName; @@ -11,7 +14,7 @@ end ---------------------------------------------- -- Is talent enabled ---------------------------------------------- -function TDTalentEnabled(talent) +function TD_TalentEnabled(talent) local found = false; for i=1,7 do for j=1,3 do @@ -27,7 +30,7 @@ end ---------------------------------------------- -- Is aura on player ---------------------------------------------- -function TDAura(name, atLeast) +function TD_Aura(name, atLeast) atLeast = atLeast or 0.2; local spellName = GetSpellInfo(name); local _, _, _, count, _, _, expirationTime = UnitAura("player", spellName); @@ -41,7 +44,7 @@ end ---------------------------------------------- -- Is aura on target ---------------------------------------------- -function TDTargetAura(name, TMinus) +function TD_TargetAura(name, TMinus) TMinus = TMinus or 0; local spellName = GetSpellInfo(name) or name; local _, _, _, _, _, _, expirationTime = UnitAura("target", spellName, nil, 'PLAYER|HARMFUL'); @@ -54,13 +57,17 @@ end ---------------------------------------------- -- When current cast will end ---------------------------------------------- -function TDEndCast() - local c = GetTime()*1000; +function TD_EndCast() + local t = GetTime(); + local c = t*1000; local spell, _, _, _, _, endTime = UnitCastingInfo("player"); + local gstart, gduration = GetSpellCooldown(_GlobalCooldown); + local gcd = gduration - (t - gstart); + if gcd < 0 then gcd = 0; end; if endTime == nil then - return 0, ""; + return 0, "", gcd; end - return (endTime - c)/1000, spell; + return (endTime - c)/1000, spell, gcd; end ---------------------------------------------- @@ -81,7 +88,7 @@ end ---------------------------------------------- -- Simple calculation of global cooldown ---------------------------------------------- -function TDDps_GlobalCooldown() +function TD_GlobalCooldown() local haste = UnitSpellHaste("player"); local gcd = 1.5 / ((haste / 100) + 1); if gcd < 1 then @@ -94,7 +101,7 @@ end ---------------------------------------------- -- Stacked spell CD, charges and max charges ---------------------------------------------- -function TDDps_SpellCharges(spell) +function TD_SpellCharges(spell) local currentCharges, maxCharges, cooldownStart, cooldownDuration = GetSpellCharges(spell); local cd = cooldownDuration - (GetTime() - cooldownStart); if cd > cooldownDuration then @@ -106,28 +113,32 @@ end ---------------------------------------------- -- Is Spell Available ---------------------------------------------- -function TDDps_SpellCooldown(spell, minus) - minus = minus or 0; - local start, duration, enabled = GetSpellCooldown(spell); - if enabled and duration == 0 and start == 0 then - return true; - elseif enabled then - return (duration - (GetTime() - start) - minus) < 0.1; - else - return false; - end; +function TD_SpellAvailable(spell, minus) + local cd = TD_Cooldown(spell, minus); + return cd <= 0, cd; end + ---------------------------------------------- --- Real spell cooldown +-- Spell Cooldown ---------------------------------------------- -function TDDps_SpellCooldownReal(spell) +function TD_Cooldown(spell, minus) + minus = minus or 0; local start, duration, enabled = GetSpellCooldown(spell); if enabled and duration == 0 and start == 0 then return 0; elseif enabled then - return (duration - (GetTime() - start)); + return (duration - (GetTime() - start) - minus); else - return false; + return 100000; end; end + +---------------------------------------------- +-- Current or Future Mana Percent +---------------------------------------------- +function TD_Mana(minus, afterTime) + local _, casting = GetManaRegen(); + local mana = UnitPower("player", 0) - minus + (casting * afterTime); + return mana / UnitPowerMax("player", 0), mana; +end -- 1.7.9.5