vanilla-wow-addons – Rev 1
?pathlinks?
-- TODO: some inconsistency with clearcasting, or maybe I'm just stupid. go play more mage.
-- TODO: make it possible to localize help
-- TODO: SCT support. message when rule begins/end or something, shouldn't be hard to add
FiveSec = {
version = "2.1.2",
supportedbuild = "11000",
lastupdate = "May 28, 2006",
name = "FiveSec",
cmd = "/fs",
cmd2 = "/fivesec",
frame = "FiveSecBarFrame",
author = "Silent",
email = "silentaddons@gmail.com",
url = "http://www.curse-gaming.com/mod.php?addid=3319",
events = {
"SPELLCAST_STOP",
"SPELLCAST_CHANNEL_START",
"SPELLCAST_CHANNEL_STOP",
"SPELLCAST_FAILED",
"SPELLCAST_INTERRUPTED",
"CHAT_MSG_SPELL_SELF_DAMAGE", -- need this one for Raptor Strike
"CHAT_MSG_SPELL_PERIODIC_SELF_BUFFS", -- need this one to detect Spirit Tap/Innervate/Blue Dragon aura
"CHAT_MSG_SPELL_AURA_GONE_SELF", -- ... and for when the buffs fade
"UNIT_MANA",
},
help = {
["reset"] = "$v/fs reset$ev: Moves the bar in position above the casting bar.",
["toggle"] = "$v/fs$ev <$von$ev | $voff$ev>: Toggle the addon on or off.",
["mode"] = "$v/fs mode$ev <$vstandard$ev | $vreverse$ev>: Increasing or decreasing bar.",
["move"] = "$v/fs move$ev <$von$ev | $voff$ev>: Turn on to easily move the bar.",
["hidden"] = "$v/fs hidden$ev <$von$ev | $voff$ev>: Turn on to keep functionality without showing the bar (for Perl users).",
["fraction"] = "$v/fs fraction$ev <$von$ev | $voff$ev>: Turn on to show split seconds in the timer.",
["alpha"] = "$v/fs alpha$ev <$v0.1$ev - $v1.0$ev>: Set opacity.",
["scale"] = "$v/fs scale$ev <$v0.5$ev - $v2.0$ev>: Set scale.",
["about"] = "$v/fs about$ev: Displays infomation about this addon.",
},
}
-- addon loading and initialization
--------------------------------------------------------------------------------
function FiveSec:Initalize()
TNE_FiveSec_Enabled = true
TNE_FiveSec_Movable = false
TNE_FiveSec_Reverse = false
TNE_FiveSec_Hidden = false
TNE_FiveSec_Scale = 0.8
TNE_FiveSec_Alpha = 1.0
TNE_FiveSec_SplitSeconds = false
TNE_FiveSec_FIVE_SECONDS = 5 -- duh. but maybe it changes some day
TNE_FiveSec_25FPS = 0.025
TNE_FiveSec_10FPS = 0.1
TOTAL_MANA_REGENERATED = 0 -- this variable can be used to track mana regen from another addon
REGENERATING_MANA = true -- globally available boolean, true if mana regeneration is active
FiveSec:UpdatePosition()
-- setup values
local frame = getglobal(FiveSec.frame)
frame.active = nil
frame.duration = TNE_FiveSec_FIVE_SECONDS
frame.timer = 0
frame.delay = 0
frame.mode = "standard"
frame.fadeOutTime = 1.5
frame.update = 0
frame.updateRate = TNE_FiveSec_25FPS
FiveSec.mana = 0
FiveSec.activeBuffs = {}
-- function hooks
TNE_FiveSec_Old_CastSpell = CastSpell
CastSpell = TNE_FiveSec_CastSpell
TNE_FiveSec_Old_CastSpellByName = CastSpellByName
CastSpellByName = TNE_FiveSec_CastSpellByName
TNE_FiveSec_Old_UseAction = UseAction
UseAction = TNE_FiveSec_UseAction
TNE_FiveSec_Old_SpellStopCasting = SpellStopCasting
SpellStopCasting = TNE_FiveSec_SpellStopCasting
TNE_FiveSec_Old_SpellStopTargeting = SpellStopTargeting
SpellStopTargeting = TNE_FiveSec_SpellStopTargeting
-- chat commands
SlashCmdList["FIVESECCMD"] = TNE_FiveSec_Command
SLASH_FIVESECCMD1 = FiveSec.cmd
SLASH_FIVESECCMD2 = FiveSec.cmd2
-- piggyback ride on blizzards UI management. sweet. -- temporarily disabled
--UIPARENT_MANAGED_FRAME_POSITIONS["FiveSecBarFrame"] = {baseY = 120, bottomEither = 40, pet = 40, reputation = 9}
TNEUtils.Help(FiveSec, "onload")
end
function FiveSec:OnLoadToggle()
local frame, spark = getglobal(FiveSec.frame), getglobal(FiveSec.frame.. "Spark")
frame:SetScale(TNE_FiveSec_Scale)
frame:SetAlpha(0)
FS_Enabled, FS_ReverseMode = nil, nil -- remove old variables
if (TNE_FiveSec_Reverse) then
frame.mode = "reverse"
end
if (TNE_FiveSec_Enabled) then
TNEUtils.CombatEcho(FiveSec.name.. ": Addon enabled.")
TNEUtils.RegisterEvents(FiveSec.frame, FiveSec.events)
frame:Show()
else
TNEUtils.CombatEcho(FiveSec.name.. ": Addon disabled.")
frame:Hide()
end
frame:SetValue(0)
frame:SetMinMaxValues(0, 1)
spark:Hide()
end
function FiveSec:ManaCheck()
if (TNE_FiveSec_Enabled and UnitPowerType("player") == 0) then
-- player is using mana
TNEUtils.RegisterEvents(FiveSec.frame, FiveSec.events)
else
TNEUtils.UnregisterEvents(FiveSec.frame, FiveSec.events)
end
end
-- hooked functions
--------------------------------------------------------------------------------
function TNE_FiveSec_SpellStopCasting()
if (TNE_FiveSec_Enabled) then
FiveSec:ClearTooltip()
FiveSec.nextMelee = nil
FiveSec.nextSpell = nil
end
TNE_FiveSec_Old_SpellStopCasting()
end
function TNE_FiveSec_SpellStopTargeting()
if (TNE_FiveSec_Enabled) then
FiveSec:ClearTooltip()
FiveSec.nextSpell = nil
end
TNE_FiveSec_Old_SpellStopTargeting()
end
function TNE_FiveSec_UseAction(actionID, number, onSelf)
if (TNE_FiveSec_Enabled and not (IsAutoRepeatAction(actionID) or IsConsumableAction(actionID) or GetActionText(actionID))) then
FiveSec:SetTooltipAction(actionID)
FiveSec:ProcessTooltip()
end
TNE_FiveSec_Old_UseAction(actionID, number, onSelf)
end
function TNE_FiveSec_CastSpell(spellId, spellbookTabNum)
--TNEUtils.CombatEcho("CastSpell: ".. spellID) --debug
if (TNE_FiveSec_Enabled) then
FiveSec:SetTooltipSpell(spellId, spellbookTabNum)
FiveSec:ProcessTooltip()
end
TNE_FiveSec_Old_CastSpell(spellId, spellbookTabNum)
end
function TNE_FiveSec_CastSpellByName(spellName, onSelf) -- should catch macro'ed spells
--TNEUtils.CombatEcho2("CastSpellByName: ".. spellName) --debug
-- this loop should break out early most of the times
if (TNE_FiveSec_Enabled) then
for i=1, 255 do
local spell = GetSpellName(i, BOOKTYPE_SPELL)
if (spell) then
if (spell == spellName) then
--TNEUtils.CombatEcho("CastSpellByName found spell ID: ".. 1) --debug
FiveSec:SetTooltipSpell(i, BOOKTYPE_SPELL)
FiveSec:ProcessTooltip()
break;
end
else
break
end
end
end
TNE_FiveSec_Old_CastSpellByName(spellName, onSelf)
end
-- tooltip management
--------------------------------------------------------------------------------
function FiveSec:ProcessTooltip()
if (FiveSec:TooltipSpellHasManaCost()) then
if (FiveSec:TooltipSpellIsNextMelee()) then
FiveSec.nextMelee = FiveSec:TooltipSpellName()
else
FiveSec.nextSpell = true
end
else
FiveSec.nextSpell = nil
end
end
function FiveSec:SetTooltipSpell(spellId, spellbookTabNum)
FiveSecTooltip:SetOwner(getglobal(FiveSec.frame), "ANCHOR_NONE") -- 1.10 ftw
local oldUberTooltips = GetCVar("UberTooltips") -- backup and override ubertooltip settings
SetCVar("UberTooltips", 1)
if (GetSpellName(spellId, spellbookTabNum)) then
FiveSecTooltip:SetSpell(spellId, spellbookTabNum)
end
SetCVar("UberTooltips", oldUberTooltips) -- restore ubertooltip setting
end
function FiveSec:SetTooltipAction(index)
FiveSecTooltip:SetOwner(getglobal(FiveSec.frame), "ANCHOR_NONE") -- 1.10 ftw
local oldUberTooltips = GetCVar("UberTooltips") -- backup and override ubertooltip settings
SetCVar("UberTooltips", 1)
if (GetActionTexture(index)) then -- skip empty action slots
FiveSecTooltip:SetAction(index)
end
SetCVar("UberTooltips", oldUberTooltips) -- restore ubertooltip setting
end
function FiveSec:ClearTooltip()
FiveSecTooltip:ClearLines()
end
function FiveSec:TooltipSpellName()
return FiveSecTooltipTextLeft1:GetText()
end
function FiveSec:TooltipSpellHasManaCost()
local text = FiveSecTooltipTextLeft2:GetText()
if (text) then
return string.find(text, MANA)
else
return nil
end
end
function FiveSec:TooltipSpellIsNextMelee()
local text = FiveSecTooltipTextLeft3:GetText()
if (text) then
return string.find(text, SPELL_ON_NEXT_SWING)
end
return nil
end
-- statusbar managment
--------------------------------------------------------------------------------
function FiveSec:Start()
--TNEUtils.CombatEcho("FiveSec:Start() called") --debug
--if (table.getn(FiveSec.activeBuffs) > 0) then
--return
--end
local frame, text, spark = getglobal(FiveSec.frame), getglobal(FiveSec.frame.. "Text"), getglobal(FiveSec.frame.. "Spark")
local delay, now = 0, GetTime()
if (FiveSec.lastGain) then
--delay = math.mod(FiveSec.lastGain, 2)
delay = 1 - math.mod(now - FiveSec.lastGain, 2) -- not 100% accurate
--delay = 2 - math.mod(now - FiveSec.lastGain, 2)
--delay = math.mod(now - FiveSec.lastGain, 2)
--delay = 1
--pxd("Delay by: ".. (delay))
--if (delay < -0.2) then
-- pxd("Expect tick at (7): ".. now + 7 + delay)
--else
-- pxd("Expect tick at (5): ".. now + 5 + delay)
--end
--pxd("Was expected at: ".. now + delay)
--pxd("Last tick was: ".. now - delay)
end
-- set values
frame.active = 1
frame.startTime = GetTime()
frame.lastUpdate = frame.startTime
frame.delay = TNEUtils.Select(delay < 0, 2 + delay, delay)
--frame.delay = delay
--pxd(frame.delay)
frame.duration = TNE_FiveSec_FIVE_SECONDS + frame.delay
frame.timer = TNEUtils.Select(frame.mode == "reverse", frame.duration, 0)
-- color and decoration
local color = TNE_FiveSec_BarColors["disabled"]
if (table.getn(FiveSec.activeBuffs) > 0) then
color = TNE_FiveSec_BarColors["enabled"]
end
frame:SetStatusBarColor(color.r, color.g, color.b)
frame:SetMinMaxValues(0, frame.duration)
frame:SetValue(frame.timer)
spark:Show()
text:SetText(format(TNE_FiveSec_REGENERATION_IN, frame.duration))
-- display
UIFrameFadeRemoveFrame(frame)
frame:SetAlpha(TNEUtils.Select(TNE_FiveSec_Hidden, 0, TNE_FiveSec_Alpha))
-- set global flags (used in ManaWatch, Perl)
REGENERATING_MANA = false -- global flag: mana regenartion active
if (TOTAL_MANA_REGENERATED > 0) then -- global flag: regenerated mana
TOTAL_MANA_REGENERATED = 0
end
end
function FiveSec:Stop()
--TNEUtils.CombatEcho("FiveSec:Stop() called") --debug
local frame, text, spark = getglobal(FiveSec.frame), getglobal(FiveSec.frame.. "Text"), getglobal(FiveSec.frame.. "Spark")
frame.active = nil
--local color = TNE_FiveSec_BarColors["enabled"]
--frame:SetStatusBarColor(color.r, color.g, color.b)
frame:SetValue(TNEUtils.Select(frame.mode == "reverse", 0, frame.duration))
spark:Hide()
text:SetText(format(TNE_FiveSec_REGENERATION_IN_INT, 0))
if (TOTAL_MANA_REGENERATED < 0) then
TOTAL_MANA_REGENERATED = 0
end
REGENERATING_MANA = true
if (not TNE_FiveSec_Movable) then
UIFrameFadeOut(frame, frame.fadeOutTime * TNE_FiveSec_Alpha, frame:GetAlpha(), 0)
end
end
function FiveSec:WaitWhileChanneling(delayedAt)
local frame, label, text, delay, spark = getglobal(FiveSec.frame), getglobal(FiveSec.frame.. "Label"), getglobal(FiveSec.frame.. "Text"), getglobal(FiveSec.frame.. "Delay"), getglobal(FiveSec.frame.. "Spark")
frame.delayed = delayedAt
frame:SetValue(delayedAt)
label:Hide()
text:Hide()
delay:Show()
delay:SetAlpha(0)
spark:Hide()
UIFrameFlash(delay, 0.4, 0.75, -1, nil, 0, 0.5)
end
function FiveSecBarFrame_OnUpdate(elapsed)
local frame = getglobal(FiveSec.frame)
-- limiter
frame.update = this.update + elapsed
if (frame.update < frame.updateRate) then
return
end
this.update = 0
local now = GetTime()
if (frame.possibleInterruptAt) then
if (now > frame.possibleInterruptAt + 0.5) then
if (frame.wasActiveOnInterrupt) then
FiveSec:Start(now - frame.possibleInterruptAt)
end
frame.possibleInterruptAt = nil
frame.wasActiveOnInterrupt = nil
end
end
if (frame.active) then
-- update timer
frame.timer = frame.timer + TNEUtils.Select(frame.mode == "reverse", frame.lastUpdate - now, now - frame.lastUpdate)
frame.lastUpdate = now
if (FiveSec.channeling) then
if (frame.delayed) then
return -- do nothing until player stops channeling
elseif ((frame.mode == "reverse" and frame.timer < frame.delay) or (frame.mode == "standard" and frame.timer > TNE_FiveSec_FIVE_SECONDS)) then
FiveSec:WaitWhileChanneling(frame.timer)
return
end
elseif (frame.delayed) then
-- restore frame
frame.timer = frame.delayed
frame.delayed = nil
local delayLabel = getglobal(FiveSec.frame.. "Delay")
UIFrameFlashRemoveFrame(delayLabel)
UIFrameFadeRemoveFrame(delayLabel)
delayLabel:Hide()
getglobal(FiveSec.frame.. "Label"):Show()
getglobal(FiveSec.frame.. "Text"):Show()
--frame:SetAlpha(TNEUtils.Select(TNE_FiveSec_Hidden, 0, TNE_FiveSec_Alpha))
end
if (frame.timer < 0 or frame.timer > frame.duration) then
-- time's up, snap to limits and stop
frame.timer = TNEUtils.Select(frame.timer < 0, 0, frame.duration)
FiveSec:Stop()
else
if ((frame.mode == "reverse" and frame.timer < frame.delay) or (frame.mode == "standard" and frame.timer > TNE_FiveSec_FIVE_SECONDS)) then
REGENERATING_MANA = true
end
-- keep going, set time remaining
local frame, text, spark = getglobal(FiveSec.frame), getglobal(FiveSec.frame.. "Text"), getglobal(FiveSec.frame.. "Spark")
frame:SetValue(frame.timer)
--local secondsToRegen = math.ceil(TNEUtils.Select(frame.mode == "reverse", frame.timer, frame.duration - frame.timer))
local secondsToRegen = TNEUtils.Select(frame.mode == "reverse", frame.timer, frame.duration - frame.timer)
if (TNE_FiveSec_SplitSeconds) then
text:SetText(format(TNE_FiveSec_REGENERATION_IN, secondsToRegen))
else
text:SetText(format(TNE_FiveSec_REGENERATION_IN_INT, math.ceil(secondsToRegen)))
end
-- update the spark. I love the spark
local sparkPosition = (frame.timer / frame.duration) * frame:GetWidth()
--spark:SetPoint("CENTER", FiveSec.frame, "LEFT", TNEUtils.Select(sparkPosition < 0, 0, sparkPosition), 0)
spark:SetPoint("CENTER", FiveSec.frame, "LEFT", sparkPosition, 0)
spark:Show()
end
end
end
-- addon logic
--------------------------------------------------------------------------------
function FiveSec:CheckInterrupt()
----pxd("Interrupt call")
local frame = getglobal(FiveSec.frame)
frame.possibleInterruptAt = GetTime()
if (frame.active) then
----pxd(" Already active")
frame.wasActiveOnInterrupt = true
else
----pxd(" Not active. Starting.")
frame.wasActiveOnInterrupt = false
FiveSec:Start()
end
end
function FiveSec:Interrupt()
--this.timer = TNEUtils.Select(this.mode == "reverse", 0, this.fiveSeconds)
FiveSec:Stop()
this.possibleInterruptAt = nil
this.wasActiveOnInterrupt = nil
end
function FiveSecBarFrame_OnEvent()
--if (arg1) then
-- TNEUtils.CombatEcho(event..": ".. arg1) --debug
--else
-- TNEUtils.CombatEcho(event..": no arg1") --debug
--end
if (event == "UNIT_MANA") then
if not (arg1 == "player") then
return
end
local mana = UnitMana("player")
if (mana > FiveSec.mana and FiveSec.mana > 0) then
FiveSec.lastGain = GetTime()
--pxd("Tick at: ".. FiveSec.lastGain)
--else
-- local now = GetTime() -- unreliable
-- if (FiveSec.lastGain) then
-- FiveSec.lastLoss = now
--pxd("Loss at: ".. FiveSec.lastLoss)
--pxd("Difference: ".. 2-math.mod(FiveSec.lastLoss - FiveSec.lastGain, 2))
-- end
end
FiveSec.mana = mana
elseif (event == "SPELLCAST_STOP") then
if (FiveSec.channeling) then
-- we just finished casting a channeled spell (does not trigger rule)
-- do nothing
elseif (FiveSec.nextSpell) then
-- an expected spell will trigger the rule
FiveSec:CheckInterrupt()
end
-- reset
FiveSec.nextSpell = nil
FiveSec:ClearTooltip()
elseif (event == "SPELLCAST_CHANNEL_START") then
-- channeling spell are interesting if they cost mana
if (FiveSec:TooltipSpellHasManaCost()) then
-- flag it so we don't think it's an instant when it stops
FiveSec.channeling = true
FiveSec:Start()
end
FiveSec:ClearTooltip()
elseif (event == "SPELLCAST_CHANNEL_STOP") then
FiveSec.channeling = false
elseif (event == "SPELLCAST_INTERRUPTED" or event == "SPELLCAST_FAILED") then
-- spell was interrupted. abort
-- SPELLCAST_FAILED is when out of range, out of mana, spell on cooldown, or right-click-to-clear
FiveSec.channeling = nil
FiveSec.nextSpell = nil
if (this.possibleInterruptAt) then
--pxd(" EVENT: expected interrupt")
if (not this.wasActiveOnInterrupt) then
FiveSec:Interrupt()
----pxd(" Was not active: Stopping")
--else
----pxd(" Was active: No action")
end
this.possibleInterruptAt = nil
this.wasActiveOnInterrupt = nil
else
--pxd(" EVENT: unexpected interrupt")
end
FiveSec:ClearTooltip()
elseif (event == "CHAT_MSG_SPELL_SELF_DAMAGE" and FiveSec.nextMelee) then
-- Raptor Strike and other hunter abilites are on-next-melee with mana cost. a special bunch, those hunters
if (string.find (arg1, FiveSec.nextMelee)) then
FiveSec:Start()
FiveSec.nextMelee = nil
FiveSec:ClearTooltip()
end
elseif (event == "CHAT_MSG_SPELL_AURA_GONE_SELF") then
-- restore the bar when Blue Dragon aura, Innervate, etc fades
for i, buff in FiveSec.activeBuffs do
if (string.find(arg1, buff)) then
local color = TNE_FiveSec_BarColors["disabled"]
FiveSecBarFrame:SetStatusBarColor(color.r, color.g, color.b)
table.remove(FiveSec.activeBuffs, i)
break
end
end
elseif (event == "CHAT_MSG_SPELL_PERIODIC_SELF_BUFFS") then
-- interrupt the bar when gaining Blue Dragon aura, Innervate, etc
for _, buff in TNE_FiveSec_RegenerationBuffs do
if (string.find(arg1, buff)) then
local color = TNE_FiveSec_BarColors["enabled"]
FiveSecBarFrame:SetStatusBarColor(color.r, color.g, color.b)
--FiveSec:Interrupt()
table.insert(FiveSec.activeBuffs, buff)
break
end
end
elseif (event == "UNIT_DISPLAYPOWER") then
FiveSec:ManaCheck()
elseif (event == "VARIABLES_LOADED") then
FiveSec:OnLoadToggle()
end
end
-- addon managment
--------------------------------------------------------------------------------
function FiveSec:UpdatePosition()
FiveSecBarFrame:ClearAllPoints()
if (CastingBarReplacementFrame) then
FiveSecBarFrame:SetPoint("BOTTOM", "CastingBarReplacementFrame", "TOP", 0, 10)
else
FiveSecBarFrame:SetPoint("BOTTOM", "CastingBarFrame", "TOP", 0, 10)
end
UIParent_ManageFramePositions()
end
function TNE_FiveSec_Command(arg1)
if (not arg1) then return end
local frame = getglobal(FiveSec.frame)
-- reset
if (string.find(arg1, "^"..TNE_FiveSec_CMD_RESET.."$")) then
FiveSec:UpdatePosition()
TNEUtils.PrefixedEcho(FiveSec.name, TNE_FiveSec_HELP_RESET)
-- about
elseif (string.find(arg1, "^"..TNE_FiveSec_CMD_ABOUT.."$")) then
TNEUtils.About(FiveSec)
-- mode
elseif (string.find(arg1, "^"..TNE_FiveSec_CMD_MODE)) then
-- save old mode
local oldMode = frame.mode
if (string.find(arg1, "^"..TNE_FiveSec_CMD_MODE.." "..TNE_FiveSec_CMD_MODE_STANDARD)) then
-- enter standard mode
TNE_FiveSec_Reverse = TNEUtils.SetVar(FiveSec, TNE_FiveSec_Reverse, false, TNE_FiveSec_HELP_REVERSE_MODE, nil)
frame.mode = "standard"
elseif (string.find(arg1, "^"..TNE_FiveSec_CMD_MODE.." "..TNE_FiveSec_CMD_MODE_REVERSE)) then
-- enter reverse mode
TNE_FiveSec_Reverse = TNEUtils.SetVar(FiveSec, TNE_FiveSec_Reverse, true, TNE_FiveSec_HELP_REVERSE_MODE, nil)
frame.mode = "reverse"
else
-- show help
TNEUtils.Help(FiveSec, "mode")
end
-- convert timer to new mode
if (not (frame.mode == oldMode) and (frame.timer > 0)) then
frame.timer = frame.duration - frame.timer
end
-- moving
elseif (string.find(arg1, "^"..TNE_FiveSec_CMD_MOVE)) then
if (string.find(arg1, "^"..TNE_FiveSec_CMD_MOVE.." "..TNE_FiveSec_CMD_OFF.."$") or string.find(arg1, "^"..TNE_FiveSec_CMD_MOVE.." "..TNE_FiveSec_CMD_ON.."$")) then
TNE_FiveSec_Movable = TNEUtils.SetVar(FiveSec, TNE_FiveSec_Movable, string.find(arg1, " "..TNE_FiveSec_CMD_ON.."$"), TNE_FiveSec_HELP_MOVING, nil)
frame:EnableMouse(TNE_FiveSec_Movable)
if (TNE_FiveSec_Movable) then
frame:SetAlpha(TNE_FiveSec_Alpha)
elseif (frame.timer == 0 or frame.timer == frame.duration) then
UIFrameFadeOut(frame, frame.fadeOutTime, frame:GetAlpha(), 0)
end
else
TNEUtils.Help(FiveSec, "move")
end
-- hidden on/off
elseif (string.find(arg1, "^"..TNE_FiveSec_CMD_HIDDEN)) then
if (string.find(arg1, "^"..TNE_FiveSec_CMD_HIDDEN.." "..TNE_FiveSec_CMD_OFF.."$") or string.find(arg1, "^"..TNE_FiveSec_CMD_HIDDEN.." "..TNE_FiveSec_CMD_ON.."$")) then
TNE_FiveSec_Hidden = TNEUtils.SetVar(FiveSec, TNE_FiveSec_Hidden, string.find(arg1, " "..TNE_FiveSec_CMD_ON.."$"), TNE_FiveSec_HELP_HIDDEN, nil)
frame:SetAlpha(TNEUtils.Select(TNE_FiveSec_Hidden, 0, TNE_FiveSec_Alpha))
frame.updateRate = TNEUtils.Select(TNE_FiveSec_Hidden, TNE_FiveSec_10FPS, TNE_FiveSec_25FPS)
else
TNEUtils.Help(FiveSec, "hidden")
end
-- fraction on/off
elseif (string.find(arg1, "^"..TNE_FiveSec_CMD_FRACTION)) then
if (string.find(arg1, "^"..TNE_FiveSec_CMD_FRACTION.." "..TNE_FiveSec_CMD_OFF.."$") or string.find(arg1, "^"..TNE_FiveSec_CMD_FRACTION.." "..TNE_FiveSec_CMD_ON.."$")) then
TNE_FiveSec_SplitSeconds = TNEUtils.SetVar(FiveSec, TNE_FiveSec_SplitSeconds, string.find(arg1, " "..TNE_FiveSec_CMD_ON.."$"), TNE_FiveSec_HELP_FRACTION, nil)
else
TNEUtils.Help(FiveSec, "fraction")
end
-- alpha
elseif (string.find(arg1, "alpha")) then
local _, _, alpha = string.find(arg1, "alpha (.+)")
alpha = tonumber(alpha)
if (alpha >= 0.1 and alpha <= 1.0) then
if not (frame.timer == 0 or frame.timer == frame.duration) or TNE_FiveSec_Movable then
local fadeFunction = TNEUtils.Select(TNE_FiveSec_Alpha > alpha, UIFrameFadeOut, UIFrameFadeIn)
fadeFunction(frame, 0.5, frame:GetAlpha(), alpha)
end
TNE_FiveSec_Alpha = alpha
TNEUtils.PrefixedEcho(FiveSec.name, "Bar alpha value set to $v".. TNE_FiveSec_Alpha.. "$ev.")
else
TNEUtils.PrefixedEcho(FiveSec.name, "Invalid alpha value (must be between $v0.1$ev and $v1.0$ev)")
end
-- scale
elseif (string.find(arg1, "scale")) then
local _, _, scale = string.find(arg1, "scale (.+)")
scale = tonumber(scale)
if (scale >= 0.5 and scale <= 2.0) then
TNE_FiveSec_Scale = scale
frame:SetScale(TNE_FiveSec_Scale)
TNEUtils.PrefixedEcho(FiveSec.name, "Bar scaled to $v".. TNE_FiveSec_Scale.. "$ev.")
else
TNEUtils.PrefixedEcho(FiveSec.name, "Invalid scale value (must be between $v0.5$ev and $v2.0$ev)")
end
-- addon on/off
elseif (string.find(arg1, "^"..TNE_FiveSec_CMD_OFF.."$") or string.find(arg1, "^"..TNE_FiveSec_CMD_ON.."$")) then
TNE_FiveSec_Enabled = TNEUtils.ToggleAddon(FiveSec, FiveSec.frame, TNE_FiveSec_Enabled, string.find(arg1, "^"..TNE_FiveSec_CMD_ON.."$"), nil)
if (TNE_FiveSec_Enabled) then
frame:Show()
else
frame:Hide()
REGENERATING_MANA, TOTAL_MANA_REGENERATED = nil, 0
end
FiveSec:ManaCheck()
-- link above a frame
elseif (string.find(arg1, "link above")) then
local _, _, target = string.find(arg1, "link (.+)")
frame:ClearAllPoints()
frame:SetPoint("BOTTOM", getglobal(target), "TOP", 0, 10)
-- link below a frame
elseif (string.find(arg1, "link below")) then
local _, _, target = string.find(arg1, "link (.+)")
frame:ClearAllPoints()
frame:SetPoint("TOP", getglobal(target), "BOTTOM", 0, -10)
-- custom anchor to frame
elseif (string.find(arg1, "anchor")) then
local _, _, anchor, target, targetAnchor, ox, oy = string.find(arg1, "anchor (.+) (.+) (.+) (.+) (.+)")
frame:ClearAllPoints()
frame:SetPoint(anchor, getglobal(target), targetAnchor, tonumber(ox), tonumber(oy))
-- help
elseif (string.find(arg1, TNE_FiveSec_CMD_HELP)) then
TNEUtils.Help(FiveSec, "list")
-- status
elseif (arg1 == "") then
TNEUtils.PrefixedEcho(FiveSec.name, format(TNE_FiveSec_CMD_ADDON_STATUS, "$v"..TNEUtils.Select(TNE_FiveSec_Enabled, TNE_FiveSec_CMD_ENABLED, TNE_FiveSec_CMD_DISABLED).."$ev", "$v"..FiveSec.cmd.. " "..TNE_FiveSec_CMD_HELP.."$ev"))
else
TNEUtils.PrefixedEcho(FiveSec.name, format(TNE_FiveSec_CMD_UNKNOWN, "$v"..FiveSec.cmd.. " "..TNE_FiveSec_CMD_HELP.."$ev"))
end
end