--[[ Hunter Timers, by Sorren of Bleeding Hollow (versions up to 1.2) Version 1.6.11 (by Kharthus of Deathwing) v1.6.11 -Added Spanish translation (thanks Geran) -Fixed issues with bar/frame fading and transparency -Added oCB support v1.6.10 -Fixed French trap messages -Fixed traptimemult nil issues -Cleanup code for freezing/immolation trap resists v1.6.9 -Fixed French flare translation -Allowed eCastingBar/otravi to be used with all other HUDs v1.6.8 -Fixed another German typo -Allowed ArcHUD2 and eCastingBar to work at the same time v1.6.7 -Fixed German trap messages v1.6.6 -Added MetaHud support v1.6.5 -Better fix for Clever Traps -Added otravi_CastingBar support v1.6.4 -Fixed Clever Traps talent detection v1.6.3 -Added ArcHUD2 support (thanks to Mapelli0) -Added Nurfed support -Added Bongos support -Added Perl Arcane Bar support -Cleaned up CastTime and eCastingBar support -Localization updates for all languages v1.6.2 -GUI cleanup -Added checkbox for bar growth up/down v1.6.1 -Fixes for ZHM and Devilsaur Eye -Reset function correctly resets any active spells -Cleaned up lua tables for future lua versions (5.1) v1.6.0 -Added Berserking (thanks to AxelRod for the equation) -Added Devilsaur Eye -Added Zandalarian Hero Medallion -Added Earthstrike -Added Badge of the Swarmguard -Added Kiss of the Spider v1.5.7 -Added Jom Gabbar v1.5.6 -Updated toc for patch 1.12 v1.5.5 -Added Simple and Traditional Chinese translations -Escape key will now close the options screen -Added command line option to clear settings v1.5.4 -Fixed bug with Aimed Shot timer when Rapid Fire/Quick Shots bars were disabled -Fixed Rapid Fire length when 2-piece CS bonus is active -Added Gluth to Frenzy list v1.5.3 -Default localization is now enUS (previously only loaded if actually in enUS) -Fixed spell misses v1.5.2 -Added French translation for Hunter's Mark -Fixed mob name parsing v1.5.1 -Restricted loading to only hunters -Fixed Aimed Shot cast timer v1.5 -Added auto shot timer (thanks to Sorren for the hard part) -Added Apply button to options screen -Cleaned up button XML for 1.11 patch -Major GUI/code cleanup v1.4.2 -Fixed Feign Death/Trap macros -Fixed Aimed Shot timer resetting v1.4.1 -Added a few German translations v1.4 -Added Hunter's Mark -Added Primal Blessing -Added Entrapment -Fixed Clever Traps being incorrectly applied to all traps -Fixed target name with Concussive Shot v1.3.3 -Fixed Intimidation (really) v1.3.2 -Fixed Intimidation v1.3.1 -Fixed German death message translation -Optimized UNIT_AURA event handling v1.3 -Fixes for 1.10 tooltips -Increased duration on Quick Shots -Added Expose Weakness -Added Princess Huhuran to frenzy list -Quick Shots will now properly refresh when you regain it during the buff -Fixed bug with Imp Wing Clip expiring that was clearing Wing Clip -Fixed Imp Concussive Shot v1.2 -Added icons -Added a switch to append the name -Dynamic resizing to account for the name space -Added opacities -Added the ability to change the border opacity/color -Added the ability to change text colors -Added even more options, look for yourself -Moved some of the variables I had in localization to globals. These are mostly arrays that contain localised variables, so don't worry about them. -Should properly auto-cascade now. v1.1a -Fixed a trap error, thanks Malathis -Added an option to reset the position of the bars to the center of the screen v1.1 -Thank you Flimflam for helping me out. -Added per target debuffs! Stings etc. will now be added per target, mouseover a bar to see the target -Added support for fear beast -Fixed a bug with scatter shot -Quick shots will now properly refresh when you regain it during the buff v1.0d -The survival tree continues to mock me. v1.0c -Broke improved wingclip while trying to make it localisable, fixed -Broke improved concussive while trying to make it localisable, fixed v1.0b -Deterrence is 10 seconds. weee. -I broke the slash commands by accident. Fixed. v1.0a -Fixed Scorpid Sting -ALL macros should now work! -Fixed an issue with CT_mods casting bar v1.0 -New Shiny gui configuration! -Fixed a crapton of bugs -Should now detect macros and casts from the spellbook -Should no longer explode during frenzy -You can now turn stuff on and off -You can now specify the precision of the time -You can now change the spacing between the bars -Fixed conflict with nurfed casting bar(hopefully discord too) v0.3 -Diminshing returns theoretically works! -Fixed an issue with scaling -Wyvern sting works in theory, couldn't find anyone to test v0.2a -Fixed some action bar issues v0.2 -Fixed more bugs -Added color changing -Added flashing when the timer is about to expire -updated the slash commands v0.1g -Fixed a bunch of bugs -Can now have it grow up or down -Can now lock/unlock v0.1f -Scaling through /sht scale 0-100 (100 being 100%) -Detect trap resists -can now set an extra delay on the aimed shot casting(for those of us who lag a bit) via /sht delay ## where # is miliseconds. -Fix some minor bugs v0.1d -Imp. Wing Clip -Imp. Conc shot -Counterattack -various bugs -minor fade detection v0.1c fixed Bestial wrath, fixed conflict with CastingTimeBar -Added quick shots -added rapid fire -made both affect aimed shot cast time v0.1b fixed an conflict with CT_RaidTracker v0.1a fixed an error with concussive shot v0.1 initial release --]] local checkForTargetDeath = 0; local checkForTarget = nil; local checkForSpell = 0; local targetDebuffs = {}; local playerBuffs = {}; local checkForSpellFail = nil; local checkForSpellName = nil; local trapTimer = nil; local dimin = {}; local shtautoshot = false; local shttimeleft = nil; local shtcasting = false; local shtautotime = 0; local autodelta = 0; local shtdebug = false; local currentHealth = nil; local maxHealth = nil; local percentHealth = nil; local berserkValue = nil; function SHunterTimers_OnLoad() local playerClass, englishClass = UnitClass("player"); if(englishClass ~= "HUNTER") then return; end this:RegisterEvent("VARIABLES_LOADED"); this:RegisterEvent("SPELLS_CHANGED"); this:RegisterEvent("CHARACTER_POINTS_CHANGED"); this:RegisterEvent("PLAYER_ALIVE"); this:RegisterEvent("UNIT_AURA"); this:RegisterEvent("PLAYER_TARGET_CHANGED"); this:RegisterEvent("CHAT_MSG_SPELL_PERIODIC_CREATURE_DAMAGE"); this:RegisterEvent("CHAT_MSG_SPELL_PERIODIC_HOSTILEPLAYER_DAMAGE"); this:RegisterEvent("CHAT_MSG_SPELL_AURA_GONE_OTHER"); this:RegisterEvent("CHAT_MSG_SPELL_AURA_GONE_SELF"); this:RegisterEvent("CHAT_MSG_SPELL_SELF_DAMAGE"); this:RegisterEvent("CHAT_MSG_COMBAT_HOSTILE_DEATH"); this:RegisterEvent("CHAT_MSG_SPELL_PERIODIC_SELF_BUFFS"); this:RegisterEvent("CHAT_MSG_SPELL_PET_DAMAGE"); this:RegisterEvent("CHAT_MSG_MONSTER_EMOTE"); this:RegisterEvent("START_AUTOREPEAT_SPELL"); this:RegisterEvent("STOP_AUTOREPEAT_SPELL"); this:RegisterEvent("SPELLCAST_START"); this:RegisterEvent("SPELLCAST_STOP"); this:RegisterEvent("SPELLCAST_FAILED"); --this:RegisterEvent("SPELLCAST_INTERRUPTED"); --this:RegisterAllEvents(); tinsert(UISpecialFrames,"SHunterTimersOptions"); if(DEFAULT_CHAT_FRAME) then DEFAULT_CHAT_FRAME:AddMessage("Sorren's Hunter Timers "..SHT_VERSION.." Loaded", 1, 0, 0 ); end SlashCmdList["SHUNTERTIMERS"] = function (msg) SHunterTimers_SlashCmd(msg); end SLASH_SHUNTERTIMERS1 = "/shuntertimers"; SLASH_SHUNTERTIMERS2 = "/sht"; targetDebuffs["numDebuffs"] = 0; playerBuffs["numBuffs"] = 0; end function SHunterTimers_SlashCmd(msg) if( msg == "showvars" ) then if( SHTvars["exposeweak"] ) then DEFAULT_CHAT_FRAME:AddMessage("exposeweak", 1, 0, 0 ); else DEFAULT_CHAT_FRAME:AddMessage("exposeweak "..SHT_OFF, 1, 0, 0 ); end return; elseif( msg == "menu" ) then SHunterTimers_ShowOptions(); return; elseif( msg == "reset" ) then for num = 1, 11, 1 do frame = getglobal("SHunterTimersStatus"..num); frame.endTime = 0; end SHunterTimers_ClearActiveSpells(); return; elseif( msg == "clear all" ) then SHunterTimers_ResetOptions(); DEFAULT_CHAT_FRAME:AddMessage("SHT options reset to defaults.", 1, 0, 0); return; elseif( msg == "debug" ) then if ( shtdebug ) then shtdebug = false; DEFAULT_CHAT_FRAME:AddMessage("SHT debugging mode disabled.", 1, 0, 0); else shtdebug = true; DEFAULT_CHAT_FRAME:AddMessage("SHT debugging mode enabled.", 1, 0, 0); end return; elseif( msg == SHT_ON ) then if( SHTvars[SHT_ON] ) then DEFAULT_CHAT_FRAME:AddMessage("SHT already "..SHT_ON, 1, 0, 0); return; else UseAction = SHunterTimers_OnUseAction; CastSpellByName = SHunterTimers_OnCastSpellByName; CastSpell = SHunterTimers_OnCastSpell; SHTvars[SHT_ON] = true; DEFAULT_CHAT_FRAME:AddMessage("SHT "..SHT_ON, 1, 0, 0); return; end elseif( msg == SHT_OFF ) then if( SHTvars[SHT_ON] ) then UseAction = SHunterTimers_Real_UseAction; CastSpellByName = SHunterTimers_Real_CastSpellByName; CastSpell = SHunterTimers_Real_CastSpell; SHTvars[SHT_ON] = false; DEFAULT_CHAT_FRAME:AddMessage("SHT "..SHT_OFF, 1, 0, 0); return; else DEFAULT_CHAT_FRAME:AddMessage("SHT not "..SHT_ON, 1, 0, 0); return; end elseif( string.find( msg, "setbgcolor" ) ) then for r, g, b, a in string.gfind( msg, "setcolor (%d+) (%d+) (%d+) (%d+)" ) do SHTvars["bg"].r = r/10; SHTvars["bg"].g = g/10; SHTvars["bg"].b = b/10; SHTvars["bg"].a = a/10; SHunterTimersFrame:SetBackdropColor( r/10, g/10, b/10, a/10 ); end return; elseif( string.find( msg, "aimed" ) )then if( string.find(msg, SHT_ON ) )then SHTvars["skills"][SHT_AIMED_SHOT] = true; DEFAULT_CHAT_FRAME:AddMessage("SHT: Aimed Shot Casting Bar "..SHT_ON); elseif( string.find( msg, SHT_OFF ) ) then SHTvars["skills"][SHT_AIMED_SHOT] = false; DEFAULT_CHAT_FRAME:AddMessage("SHT: Aimed Shot Casting Bar "..SHT_OFF); else if( SHTvars["skills"][SHT_AIMED_SHOT] ) then SHTvars["skills"][SHT_AIMED_SHOT] = false; DEFAULT_CHAT_FRAME:AddMessage("SHT: Aimed Shot Casting Bar "..SHT_OFF); else SHTvars["skills"][SHT_AIMED_SHOT] = true; DEFAULT_CHAT_FRAME:AddMessage("SHT: Aimed Shot Casting Bar "..SHT_ON); end end elseif( string.find(msg, "aimeddelay" ) ) then for ms in string.gfind(msg, "aimeddelay (%d+)") do SHTvars["aimeddelay"] = ms; DEFAULT_CHAT_FRAME:AddMessage("Aimed delay set to "..ms.."ms"); end elseif( string.find(msg, "delay" ) ) then for ms in string.gfind(msg, "delay (%d+)") do SHTvars["shotdelay"] = ms; DEFAULT_CHAT_FRAME:AddMessage("Shot delay set to "..ms.."ms"); end elseif( string.find(msg, "scale" ) ) then for scale in string.gfind( msg, "scale (%d+)" ) do if( (scale/100) < 0.1 ) then scale = 10; end scale = scale * UIParent:GetScale(); SHTvars["scale"] = scale/100; end SHunterTimersFrame:SetScale( SHTvars["scale"] ); for i=1, 11 do getglobal("SHunterTimersStatus"..i):SetScale( SHTvars["scale"] ); end elseif( string.find(msg, "down") ) then SHTvars["down"] = true; SHunterTimersFrame:ClearAllPoints(); SHunterTimersFrame:SetPoint( "TOPLEFT", "SHunterTimersAnchor", "BOTTOMRIGHT" ); DEFAULT_CHAT_FRAME:AddMessage("SHT: Growing down"); elseif( string.find(msg, "up" ) ) then SHTvars["down"] = false; SHunterTimersFrame:ClearAllPoints(); SHunterTimersFrame:SetPoint( "BOTTOMLEFT", "SHunterTimersAnchor", "TOPRIGHT" ); DEFAULT_CHAT_FRAME:AddMessage("SHT: Growing up"); elseif( msg == "unlock" ) then SHTvars["locked"] = false; SHunterTimersAnchor:Show(); elseif( msg == "lock" ) then SHTvars["locked"] = true; SHunterTimersAnchor:Hide(); elseif( string.find(msg, "colorchange" ) ) then for on in string.gfind(msg, "colorchange (%a+)") do if( on == SHT_ON ) then SHTvars["colorchange"] = true; elseif( on == SHT_OFF ) then SHTvars["colorchange"] = false; end if( on == SHT_ON) or ( on == SHT_OFF ) then DEFAULT_CHAT_FRAME:AddMessage( "SHT: Colorchange is: "..on); end end elseif( string.find( msg, "barcolor" ) ) then for r, g, b in string.gfind(msg, "barcolor ([%d.]+) ([%d.]+) ([%d.]+)") do local red, green, blue = unpack( SHTvars["barstartcolor"] ); SHTvars["barstartcolor"][1] = r; SHTvars["barstartcolor"][2] = g; SHTvars["barstartcolor"][3] = b; local rd, gd, bd = unpack( SHTvars["bardelta"] ); red = rd + red; blue = bd + blue; green = gd + green; red = red - r; green = green - g; blue = blue - b; SHTvars["bardelta"][1] = red; SHTvars["bardelta"][2] = green; SHTvars["bardelta"][3] = blue; DEFAULT_CHAT_FRAME:AddMessage( "SHT: Barcolor set to: "..SHTColor(r, g, b)..r..", "..g..", "..b.."|r"); end elseif( string.find( msg, "barendcolor" ) ) then for red, green, blue in string.gfind(msg, "barendcolor ([%d.]+) ([%d.]+) ([%d.]+)") do local r, g, b = unpack( SHTvars["barstartcolor"] ); r = red - r; g = green - g; b = blue - b; SHTvars["bardelta"][1] = r; SHTvars["bardelta"][2] = g; SHTvars["bardelta"][3] = b; DEFAULT_CHAT_FRAME:AddMessage( "SHT: Barendcolor set to: "..SHTColor(red, green, blue)..red..", "..green..", "..blue.."|r"); end elseif( string.find( msg, "flash" ) ) then for flash in string.gfind( msg, "flash (%d+)" ) do flash = flash * 1; SHTvars["flash"] = flash; if( flash == 0 ) then DEFAULT_CHAT_FRAME:AddMessage("SHT: Bar flash "..SHT_OFF); else DEFAULT_CHAT_FRAME:AddMessage("SHT: Bar flash set to: "..flash.." seconds"); end end elseif( string.find( msg, "step" ) ) then for step in string.gfind( msg, "step ([%d.]+)" ) do SHTvars["step"] = step DEFAULT_CHAT_FRAME:AddMessage("SHT: Step set to: "..step); end elseif( msg == "resetpos" ) then SHunterTimersAnchor:ClearAllPoints(); SHunterTimersAnchor:SetPoint("CENTER", "UIParent", "CENTER", 0, 0 ); elseif( string.find( msg, "(%a+) (%d+)" ) ) then for cmd1, cmd2 in string.gfind( msg, "(%a+) (%d+)" ) do --DEFAULT_CHAT_FRAME:AddMessage(cmd1.."-"..cmd2, 1, 0, 0); SHunterTimersFrame_add( cmd2, cmd1 ); end elseif( msg == "status" ) then local statusstring = ""; local statusstring1 = ""; local statusstring2 = ""; if( SHTvars[SHT_ON] ) then statusstring1 = SHT_ON; else statusstring1 = SHT_OFF; end if( SHTvars["skills"][SHT_AIMED_SHOT] ) then statusstring2 = SHT_ON; else statusstring2 = SHT_OFF; end DEFAULT_CHAT_FRAME:AddMessage(SHT_STATUS_STRINGS[1]); DEFAULT_CHAT_FRAME:AddMessage(format(SHT_STATUS_STRINGS[2], statusstring1, statusstring2)); DEFAULT_CHAT_FRAME:AddMessage(format(SHT_STATUS_STRINGS[3], SHTvars["shotdelay"], SHTvars["aimeddelay"])); DEFAULT_CHAT_FRAME:AddMessage(format(SHT_STATUS_STRINGS[4], SHTvars["flash"], SHTvars["step"])); local r, g, b = unpack( SHTvars["barstartcolor"] ); local rd, gd, bd = unpack( SHTvars["bardelta"] ); statusstring1 = SHTColor(r,g,b)..r..", "..g..", "..b.."|r"; statusstring2 = SHTColor(r+rd, g+gd, b+bd)..(r+rd)..", "..(b+bd)..", "..(g+gd).."|r"; DEFAULT_CHAT_FRAME:AddMessage(format(SHT_STATUS_STRINGS[5], statusstring1, statusstring2)); if( SHTvars["colorchange"] ) then statusstring1 = SHT_ON; else statusstring1 = SHT_OFF; end if( SHTvars["down"] ) then statusstring2 = "down"; else statusstring2 = "up"; end DEFAULT_CHAT_FRAME:AddMessage(format(SHT_STATUS_STRINGS[6], statusstring1, statusstring2)); DEFAULT_CHAT_FRAME:AddMessage(format(SHT_STATUS_STRINGS[7], (SHTvars["scale"]/UIParent:GetScale()*100) ) ); else for key,val in pairs(SHT_SLASH_HELP) do DEFAULT_CHAT_FRAME:AddMessage(val, 1, 1, 0); end end end function SHunterTimersFrame_add( spellDuration, spellName, target ) if( SHTvars["numBars"] < 0 ) then SHTvars["numBars"] = 0; end local allReadyActive = false; local bar; if( SHT_sfind( spellName, SHT_STING ) or string.find( spellName, SHT_CONC_SHOT ) ) then spellDuration = spellDuration + SHTvars["shotdelay"]; end if( spellName == SHT_INTIM ) then --DEFAULT_CHAT_FRAME:AddMessage("Intim", 1, 1, 0 ); if( SHTvars["petIntim"] ) then --DEFAULT_CHAT_FRAME:AddMessage("Pet Intim", 1, 1, 0 ); for num = 1, SHTvars["numBars"], 1 do local barframe = getglobal("SHunterTimersStatus"..num); local textBar = getglobal("SHunterTimersStatus"..num.."BarLeftText"):GetText(); --DEFAULT_CHAT_FRAME:AddMessage("Intim: "..textBar, 1, 1, 0 ); if( string.find( textBar, SHT_PET_INTIM ) ) then --barframe.endTime = 0; allReadyActive = true; bar = num; break; end end end elseif( string.find( spellName, SHT_PRIMED ) ) then if( trapTimer ) then for num = 1, SHTvars["numBars"], 1 do local textBar = getglobal("SHunterTimersStatus"..num.."BarLeftText"):GetText(); --DEFAULT_CHAT_FRAME:AddMessage("Intim: "..textBar, 1, 1, 0 ); if( string.find(textBar, SHT_PRIMED ) ) then allReadyActive = true; bar = num; break; end end end elseif( SHT_sfind( spellName, SHT_STING ) ) then for num = 1, SHTvars["numBars"] do local barframe = getglobal("SHunterTimersStatus"..num); if( SHT_sfind( barframe.spell, SHT_STING ) and ( barframe.target == target ) ) then allReadyActive = true; bar = num; break; end end elseif( SHT_sfind( spellName, SHT_HUNTERS_MARK ) ) then for num = 1, SHTvars["numBars"] do local barframe = getglobal("SHunterTimersStatus"..num); if( SHT_sfind( barframe.spell, SHT_HUNTERS_MARK ) ) then allReadyActive = true; bar = num; break; end end elseif( spellName == SHT_AUTO_SHOT ) and SHTvars["sticky"] then if( SHunterTimersStatus1.spell == SHT_AUTO_SHOT ) then allReadyActive = true; bar = 1; else SHunterTimers_shift(1); allReadyActive = true; SHTvars["numBars"] = SHTvars["numBars"] + 1; bar = 1; end elseif( not string.find( spellName, SHT_FLARE ) ) then for num = 1, SHTvars["numBars"], 1 do local barframe = getglobal("SHunterTimersStatus"..num); if( barframe.spell == spellName ) and (barframe.target == target)then allReadyActive = true; bar = num; break; end end end local num = bar; if( allReadyActive ) then if( SHTvars["numBars"] == 0 ) then SHTvars["numBars"] = 1; end else if( SHTvars["numBars"] == 11 ) then return; end SHTvars["numBars"] = SHTvars["numBars"] + 1; num = SHTvars["numBars"]; end local icon = getglobal("SHunterTimersStatus"..num.."Icon"); local barframe = getglobal("SHunterTimersStatus"..num); local bar = getglobal("SHunterTimersStatus"..num.."Bar"); local leftText = getglobal("SHunterTimersStatus"..num.."BarLeftText"); local rightText = getglobal("SHunterTimersStatus"..num.."BarRightText"); if( not barframe ) then --DEFAULT_CHAT_FRAME:AddMessage("WTFBBQ line 214"); return; end local texture; if( spellName == SHT_IMP_CONC_SHORT ) then texture = SHTvars["textures"][SHT_CONC_SHOT]; elseif( spellName == SHT_IMP_WC_SHORT ) then texture = SHTvars["textures"][SHT_WING_CLIP]; elseif( string.find( spellName, SHT_TRAP ) ) then if( string.find( spellName, SHT_FREEZING_TRAP ) )then texture = SHTvars["textures"][SHT_FREEZING_TRAP] elseif( string.find( spellName, SHT_IMMO_TRAP ) ) then texture = SHTvars["textures"][SHT_IMMO_TRAP] elseif( string.find( spellName, SHT_FROST_TRAP ) ) then texture = SHTvars["textures"][SHT_FROST_TRAP] elseif( string.find( spellName, SHT_EXPL_TRAP ) ) then texture = SHTvars["textures"][SHT_EXPL_TRAP] end elseif( string.find( spellName, SHT_PET_INTIM ) ) then texture = SHTvars["textures"][SHT_INTIM]; elseif( spellName == SHT_AUTO_SHOT ) then texture = GetInventoryItemTexture("player", 18); else texture = SHTvars["textures"][spellName]; end icon:SetTexture(texture); barframe.spell = spellName; barframe.texture = texture; barframe.target = target; barframe.startTime = GetTime(); barframe.duration = spellDuration / 1000; barframe.endTime = barframe.startTime + barframe.duration; bar:SetMinMaxValues(barframe.startTime, barframe.endTime); bar:SetValue( barframe.endTime ); local spellText = SHTColor(unpack(SHTvars["skillcolor"]))..spellName; if( SHTvars["append"] ) and (barframe.target) then spellText = spellText.."|r - "..SHTColor(unpack(SHTvars["targetcolor"]))..barframe.target; end leftText:SetText( spellText ); local text; if( SHTvars["mili"] == 0 ) then text = string.format( SHTColor(unpack(SHTvars["timecolor"])).."%ds", barframe.duration ); else text = string.format( SHTColor(unpack(SHTvars["timecolor"])).."%."..SHTvars["mili"].."f", barframe.duration ); end rightText:SetText( text ); barframe.channeling = true; barframe.fadeOut = false; SHunterTimersFrame:SetAlpha(SHTvars["overallalpha"]); SHT_SetHeight(); if( not SHunterTimersFrame:IsVisible() ) then SHunterTimersFrame:Show(); end local r, g, b, a = unpack( SHTvars["barstartcolor"] ); bar:SetStatusBarColor(r, g, b, a ); getglobal("SHunterTimersStatus"..num.."BGBar"):SetStatusBarColor(r, g, b, 0.25*a); barframe:SetAlpha(SHTvars["overallalpha"]); SHunterTimers_SetWidths(); barframe:Show(); end function SHunterTimers_SetWidths() local largestwidth = 180; if( SHTvars["showtex"] ) then if( SHTvars["largetex"] ) and (SHTvars["barheight"] < 16 ) then largestwidth = largestwidth - 16; else largestwidth = largestwidth - SHTvars["barheight"]; end if( SHTvars["gap"] ) then largestwidth = largestwidth - 5; end end local tarwidth = largestwidth; local extrawidth = 0; for i=1, SHTvars["numBars"] do local width = getglobal("SHunterTimersStatus"..i.."BarLeftText"):GetWidth() + getglobal("SHunterTimersStatus"..i.."BarRightText"):GetWidth(); if( width > largestwidth ) then largestwidth = width; end end if( largestwidth > tarwidth ) and (not SHTvars["hidetext"]) then largestwidth = largestwidth + 40; if( SHTvars["showtex"] ) then extrawidth = SHTvars["barheight"]; if( SHTvars["largetex"] ) and ( SHTvars["barheight"] < 16 ) then extrawidth = 16; end if( SHTvars["gap"] ) then extrawidth = extrawidth + 5; end end for i=1, SHTvars["numBars"] do getglobal("SHunterTimersStatus"..i):SetWidth(largestwidth + extrawidth); getglobal("SHunterTimersStatus"..i.."Bar"):SetWidth(largestwidth); getglobal("SHunterTimersStatus"..i.."BGBar"):SetWidth(largestwidth); end if( SHTvars["padding"] ) then SHunterTimersFrame:SetWidth(largestwidth + extrawidth + 20); else SHunterTimersFrame:SetWidth(largestwidth + extrawidth + 10); end else if( SHTvars["padding"] ) then SHunterTimersFrame:SetWidth( 240 ); else SHunterTimersFrame:SetWidth( 230 ); end local width = 220; if( SHTvars["showtex"] ) then if( SHTvars["largetex"] ) and ( SHTvars["barheight"] < 16) then width = width - 16; else width = width - SHTvars["barheight"]; end if( SHTvars["gap"] ) then width = width - 5; end end for i=1, SHTvars["numBars"] do getglobal("SHunterTimersStatus"..i):SetWidth(220); getglobal("SHunterTimersStatus"..i.."Bar"):SetWidth(width); getglobal("SHunterTimersStatus"..i.."BGBar"):SetWidth(width); end end end function SHunterTimers_OnUpdateBar( id ) if( not SHunterTimersFrame:IsVisible() ) then SHunterTimersFrame:Show(); end local barframe = getglobal("SHunterTimersStatus"..id); if( barframe.channeling ) then local time = GetTime(); local bartext = getglobal( "SHunterTimersStatus"..id.."BarRightText"); local text = barframe.spell; if( barframe.spell == SHT_AUTO_SHOT ) then if(( not shtautoshot ) or ( shtcasting )) and ( not barframe.movetime ) and ( (barframe.endTime - time) <= 0.7 ) then barframe.movetime = time; --DEFAULT_CHAT_FRAME:AddMessage("1 d"); elseif( barframe.movetime ) and (( shtautoshot ) and ( not shtcasting )) then local deltaTime = time - barframe.movetime; --DEFAULT_CHAT_FRAME:AddMessage("2 d"); --DEFAULT_CHAT_FRAME:AddMessage(barframe.endTime.." "..deltaTime.." "..barframe.movetime); barframe.startTime = barframe.startTime + deltaTime; barframe.endTime = barframe.endTime + deltaTime; getglobal("SHunterTimersStatus"..id.."Bar"):SetMinMaxValues(barframe.startTime, barframe.endTime); barframe:SetAlpha(SHTvars["overallalpha"]); barframe.movetime = nil; elseif(( not shtautoshot ) or ( shtcasting )) and ( barframe.movetime ) then if( time - barframe.movetime) > 7 then barframe.channeling = false; barframe.fadeOut = true; barframe.movetime = nil; elseif( time - barframe.movetime ) > 4 then local alpha = barframe:GetAlpha() - SHTvars["step"]; if( alpha > (0.3*SHTvars["overallalpha"]) ) then barframe:SetAlpha(alpha); end end return; end end if( time >= barframe.endTime ) then if( barframe.spell == SHT_AUTO_SHOT ) then return; end barframe.channeling = false; barframe.fadeOut = true; barframe.step = 0; barframe.target = nil; bartext:SetText( SHT_DONE ); if( SHTvars["concuss"] ) and ( text == SHT_CONC_SHOT ) then SHTvars["concuss"] = false; elseif( SHTvars["impconc"] ) and ( text == SHT_IMP_CONC_SHORT ) then SHTvars["impconc"] = false; elseif( SHTvars["rapid"] ) and ( text == SHT_RAPID_FIRE ) then SHTvars["rapid"] = false; elseif( SHTvars["quick"] ) and ( text == SHT_QUICK_SHOTS ) then SHTvars["quick"] = false; elseif( SHTvars["petIntim"] ) and ( text == SHT_PET_INTIM ) then SHTvars["petIntim"] = false; elseif( SHTvars["intimidate"] ) and ( text == SHT_INTIM ) then SHTvars["intimidate"] = false; elseif( SHTvars["deterrence"] ) and ( text == SHT_DETERRENCE ) then SHTvars["deterrence"] = false; elseif( trapTimer ) and string.find( text, SHT_PRIMED ) then trapTimer = false; elseif( SHTvars["wingclip"] ) and ( text == SHT_WING_CLIP ) then SHTvars["wingclip"] = false; elseif( SHTvars["impwing"] ) and ( text == SHT_IMP_WC_SHORT ) then SHTvars["impwing"] = false; elseif( SHTvars["freezing"] ) and ( text == SHT_FREEZING_TRAP ) then SHTvars["freezing"] = false; elseif( SHTvars["scatter"] ) and ( text == SHT_SCATTER ) then SHTvars["scatter"] = false; elseif( SHTvars["wyvern"] ) and ( text == SHT_WYVERN_TEXT ) then SHTvars["wyvern"] = false; elseif( SHTvars["fearbeast"] ) and ( text == SHT_FEAR_BEAST ) then SHTvars["fearbeast"] = false; elseif( SHTvars["exposeweak"] ) and ( text == SHT_EXPOSE_WEAKNESS ) then SHTvars["exposeweak"] = false; elseif( SHTvars["huntersmark"] ) and ( text == SHT_HUNTERS_MARK ) then SHTvars["huntersmark"] = false; elseif( SHTvars["primalblessing"] ) and ( text == SHT_PRIMAL_BLESSING ) then SHTvars["primalblessing"] = false; elseif( SHTvars["entrapment"] ) and ( text == SHT_ENTRAPMENT ) then SHTvars["entrapment"] = false; elseif( SHTvars["berserking"] ) and ( text == SHT_BERSERKING ) then SHTvars["berserking"] = false; elseif( SHTvars["devilsaur"] ) and ( text == SHT_DEVILSAUR ) then SHTvars["devilsaur"] = false; elseif( SHTvars["zhm"] ) and ( text == SHT_ZHM ) then SHTvars["zhm"] = false; elseif( SHTvars["earthstrike"] ) and ( text == SHT_EARTHSTRIKE ) then SHTvars["earthstrike"] = false; elseif( SHTvars["swarmguard"] ) and ( text == SHT_SWARMGUARD ) then SHTvars["swarmguard"] = false; elseif( SHTvars["jomgabbar"] ) and ( text == SHT_JOM_GABBAR ) then SHTvars["jomgabbar"] = false; elseif( SHTvars["spider"] ) and ( text == SHT_KISS_SPIDER ) then SHTvars["spider"] = false; end return; elseif ( SHTvars["quick"] and text == SHT_QUICK_SHOTS and SHTvars["skills"][SHT_QUICK_SHOTS] ) then local i = 1; while( UnitBuff("player", i ) ) do local time = GetTime(); local duration = GetPlayerBuffTimeLeft( GetPlayerBuff( i-1 ) ); SHuntersTooltip:ClearLines(); SHuntersTooltip:SetPlayerBuff( i-1 ); playerBuffs[i] = SHuntersTooltipTextLeft1:GetText(); if ( string.find( playerBuffs[i], SHT_QUICK_SHOTS ) ) then if ( duration > 11 ) then --DEFAULT_CHAT_FRAME:AddMessage(i.." "..playerBuffs[i].." "..duration, 1, 0, 0 ); SHunterTimersFrame_add( duration*1000, SHT_QUICK_SHOTS ); end break; end i = i + 1; end elseif ( SHTvars["rapid"] and text == SHT_RAPID_FIRE and SHTvars["skills"][SHT_RAPID_FIRE] ) then local i = 1; while( UnitBuff("player", i ) ) do local time = GetTime(); local duration = GetPlayerBuffTimeLeft( GetPlayerBuff( i-1 ) ); SHuntersTooltip:ClearLines(); SHuntersTooltip:SetPlayerBuff( i-1 ); playerBuffs[i] = SHuntersTooltipTextLeft1:GetText(); if ( string.find( playerBuffs[i], SHT_RAPID_FIRE ) ) then if ( duration > 18 ) then --DEFAULT_CHAT_FRAME:AddMessage(i.." "..playerBuffs[i].." "..duration, 1, 0, 0 ); SHunterTimersFrame_add( duration*1000, SHT_RAPID_FIRE ); end break; end i = i + 1; end elseif ( SHTvars["primalblessing"] and text == SHT_PRIMAL_BLESSING and SHTvars["skills"][SHT_PRIMAL_BLESSING] ) then local i = 1; while( UnitBuff("player", i ) ) do local time = GetTime(); local duration = GetPlayerBuffTimeLeft( GetPlayerBuff( i-1 ) ); SHuntersTooltip:ClearLines(); SHuntersTooltip:SetPlayerBuff( i-1 ); playerBuffs[i] = SHuntersTooltipTextLeft1:GetText(); if ( string.find( playerBuffs[i], SHT_PRIMAL_BLESSING ) ) then if ( duration > 11 ) then --DEFAULT_CHAT_FRAME:AddMessage(i.." "..playerBuffs[i].." "..duration, 1, 0, 0 ); SHunterTimersFrame_add( duration*1000, SHT_PRIMAL_BLESSING ); end break; end i = i + 1; end end local bar = getglobal("SHunterTimersStatus"..id.."Bar"); local value = barframe.startTime + barframe.endTime - time; bar:SetValue( value ); local timeleft = barframe.duration - (time - barframe.startTime); local timeleftstring; if( SHTvars["mili"] == 0 ) then timeleftstring = string.format( SHTColor(unpack(SHTvars["timecolor"])).."%ds", timeleft ); else timeleftstring = string.format( SHTColor(unpack(SHTvars["timecolor"])).."%."..SHTvars["mili"].."f", timeleft ); end getglobal("SHunterTimersStatus"..id.."BarRightText"):SetText(timeleftstring); if( SHTvars["colorchange"] ) then local percent = (time - barframe.startTime)/(barframe.endTime - barframe.startTime); local r, g, b, a = unpack( SHTvars["barstartcolor"] ); local redd, greend, blued, alphad = unpack( SHTvars["bardelta"] ); redd = r + redd*percent; greend = g + greend*percent; blued = b + blued*percent; alphad = a + alphad*percent; bar:SetStatusBarColor( redd, greend, blued, alphad ); getglobal("SHunterTimersStatus"..id.."BGBar"):SetStatusBarColor( redd, greend, blued, 0.25*alphad ); end if( timeleft < SHTvars["flash"] ) and ( barframe.spell ~= SHT_AUTO_SHOT ) then if( barframe.step == 0 ) then barframe.step = -SHTvars["step"]; end local alpha = barframe:GetAlpha() + barframe.step; if( alpha < 0.2 ) then barframe.step = SHTvars["step"]; elseif( alpha > SHTvars["overallalpha"] ) then barframe.step = -SHTvars["step"]; end barframe:SetAlpha(alpha); end elseif( barframe.fadeOut ) then if( trapTimer ) then local textBar = getglobal("SHunterTimersStatus"..id.."BarLeftText"):GetText(); if( string.find( textBar, "primed" ) ) then trapTimer = false; end end local alpha = barframe:GetAlpha() - 0.05; if( alpha > 0 ) then barframe:SetAlpha(alpha); else barframe.fadeOut = false; barframe:Hide(); SHTvars["numBars"] = SHTvars["numBars"] - 1; SHunterTimers_AutoCascade( 1, false ); end end end function SHunterTimersFrame_OnUpdate(elapsed) if( (elapsed - this.updateTime) > 1 ) then this.updateTime = elapsed; SHunterTimersFrame:SetScale( SHTvars["scale"] ); for i=1, SHT_NUM_BARS do getglobal("SHunterTimersStatus"..i):SetScale( SHTvars["scale"] ); end for key, val in pairs(dimin) do if( (elapsed - dimin[key]["time"]) > 20 ) then dimin[key] = nil; end end SHT_SetHeight(); end if ( SHTvars["numBars"] > 0 ) then SHunterTimersFrame:Show(); SHunterTimersFrame:SetAlpha( SHTvars["overallalpha"] ); else local alpha = SHunterTimersFrame:GetAlpha() - 0.05; if( alpha > 0 ) then SHunterTimersFrame:SetAlpha(alpha); else SHunterTimersFrame:Hide(); end end end function SHT_init() if( not SHTvars ) then SHTvars = {}; SHTvars["bg"] = { r=0, g=0, b=0, a=7 }; end if( SHTvars[SHT_ON] == nil ) then SHTvars[SHT_ON] = true; end if( not SHTvars["borderalpha"] ) then SHTvars["borderalpha"] = { [1] = 1; [2] = 1; [3] = 1; [4] = 1; }; end SHunterTimersFrame:SetBackdropColor( SHTvars["bg"].r, SHTvars["bg"].g, SHTvars["bg"].b, SHTvars["bg"].a ); SHunterTimersFrame:SetBackdropBorderColor( unpack(SHTvars["borderalpha"]) ); SHTvars["numBars"] = 0; SHunterTimers_Real_UseAction = UseAction; SHunterTimers_Real_CastSpellByName = CastSpellByName; SHunterTimers_Real_CastSpell = CastSpell; if( not SHTvars["skills"] ) then SHTvars["skills"] = {}; end for i=1, SHT_NUM_TIMERS do if( SHTvars["skills"][SHT_OPTIONS_TIMERS[i]] == nil ) then SHTvars["skills"][SHT_OPTIONS_TIMERS[i]] = true; end end if( not SHTvars["shotdelay"] ) then SHTvars["shotdelay"] = 200; end if( not SHTvars["aimeddelay"] ) then SHTvars["aimeddelay"] = 200; end if( not SHTvars["scale"] ) then SHTvars["scale"] = UIParent:GetScale(); end if( SHTvars["locked"] == nil ) then SHTvars["locked"] = false; end if( not SHTvars["locked"] ) then SHunterTimersAnchor:Show(); else SHunterTimersAnchor:Hide(); end if( not SHTvars["mili"] ) then SHTvars["mili"] = 2; end if( SHTvars["flash"] == nil ) then SHTvars["flash"] = 5; end if( not SHTvars["skillcolor"] ) then local r, g, b = SHunterTimersStatus1BarLeftText:GetTextColor(); --local a = SHunterTimersStatus1BarLeftText:GetAlpha(); SHTvars["skillcolor"] = { [1] = r, [2] = g, [3] = b, [4] = 1 }; end if( not SHTvars["timecolor"] ) then local r, g, b = SHunterTimersStatus1BarRightText:GetTextColor(); --local a = SHunterTimersStatus1BarRightText:GetAlpha(); SHTvars["timecolor"] = { [1] = r, [2] = g, [3] = b, [4] = 1 }; end if( not SHTvars["targetcolor"] ) then local r, g, b = SHunterTimersStatus1BarLeftText:GetTextColor(); --local a = SHunterTimersStatus1BarRightText:GetAlpha(); SHTvars["targetcolor"] = { [1] = r, [2] = g, [3] = b, [4] = 1 }; end if( not SHTvars["barstartcolor"] ) then SHTvars["barstartcolor"] = { [1] = 0, [2] = 0.8, [3] = 0, [4] = 1 }; end if( not SHTvars["barstartcolor"][4] ) then SHTvars["barstartcolor"][4] = 1; end if( not SHTvars["bardelta"] ) then SHTvars["bardelta"] = { [1] = 0.8, [2] = -0.8, [3] = 0, [4] = 0}; end if( not SHTvars["bardelta"][4] ) then SHTvars["bardelta"][4] = 0; end if( SHTvars["step"] == nil ) then SHTvars["step"] = 0.015; end if( SHTvars["colorchange"] == nil ) then SHTvars["colorchange"] = false; end if( not SHTvars["bardistance"] ) then SHTvars["bardistance"] = 10; end if( SHTvars["down"] == nil ) then SHTvars["down"] = true; end if( SHTvars["down"] ) then SHunterTimersFrame:ClearAllPoints(); SHunterTimersFrame:SetPoint( "TOPLEFT", "SHunterTimersAnchor", "BOTTOMRIGHT" ); else SHunterTimersFrame:ClearAllPoints(); SHunterTimersFrame:SetPoint( "BOTTOMLEFT", "SHunterTimersAnchor", "TOPRIGHT" ); end if( SHTvars["append"] == nil ) then SHTvars["append"] = false; end if( not SHTvars["overallalpha"] ) then SHTvars["overallalpha"] = 1; end SHunterTimers_ClearActiveSpells(); for i=1, SHT_NUM_TIMERS do --Check boxes getglobal("SHunterTimersOptionsTimersCheckButton"..i.."Text"):SetText(SHT_OPTIONS_TIMERS[i]); end for i=1, SHT_NUM_OPTIONS do --Check boxes getglobal("SHunterTimersOptionsBarsCheckButton"..i.."Text"):SetText(SHT_OPTIONS_BARS[i]); end for i=1, SHT_NUM_SLIDERS do --Sliders getglobal("SHunterTimersOptionsBarsSlider"..i.."SliderTitle"):SetText(SHT_OPTIONS_SLIDER[i]); getglobal("SHunterTimersOptionsBarsSlider"..i.."SliderLow"):SetText(SHT_OPTIONS_SLIDER_ENDS[i][1]) getglobal("SHunterTimersOptionsBarsSlider"..i.."SliderHigh"):SetText(SHT_OPTIONS_SLIDER_ENDS[i][2]); end if( not SHTvars["textures"] ) then SHTvars["textures"] = {}; end if( SHTvars["showtex"] == nil ) then SHTvars["showtex"] = true; end if( SHTvars["largetex"] == nil ) then SHTvars["largetex"] = false; end if( SHTvars["hidetext"] == nil ) then SHTvars["hidetext"] = false; end if( SHTvars["hidetime"] == nil ) then SHTvars["hidetime"] = false; end if( SHTvars["gap"] == nil ) then SHTvars["gap"] = true; end if( SHTvars["padding"] == nil ) then SHTvars["padding"] = true; end if( not SHTvars["barheight"] ) then SHTvars["barheight"] = 10; end if( SHTvars["sticky"] == nil ) then SHTvars["sticky"] = true; end if( SHTvars["traptimemult"] == nil ) then SHTvars["traptimemult"] = 1; end getglobal("SHunterTimersOptionsTimersLabel1Label"):SetText(SHT_OPTIONS_TIMERS_TEXT); for i=1, SHT_NUM_LABELS do getglobal("SHunterTimersOptionsBarsLabel"..i.."Label"):SetText(SHT_OPTIONS_LABELS[i]); end getglobal("SHunterTimersOptionsTitleString"):SetText("Sorren's Hunter Timers "..SHT_VERSION); SHunterTimers_SetSettings(); SHunterTimersOptions:SetScale(UIParent:GetScale()*0.8); end function SHunterTimersFrame_OnEvent() if ( shtdebug ) then if ( arg1 ) then DEFAULT_CHAT_FRAME:AddMessage(event.." "..arg1, 1, 0, 0 ); else DEFAULT_CHAT_FRAME:AddMessage(event, 1, 0, 0 ); end end if( event == "VARIABLES_LOADED" ) then SHT_init(); return; end if( event == "SPELLS_CHANGED" ) then SHunterTimers_UpdateSpells(); return; end if( event == "CHARACTER_POINTS_CHANGED" or event == "PLAYER_ALIVE" ) then local _, _, _, _, rank = GetTalentInfo( 3, 7 ); --Clever traps SHTvars["traptimemult"] = 1 + (rank * 0.15); return; end if( not SHTvars[SHT_ON] ) then return; end if( event == "CHAT_MSG_SPELL_PERIODIC_CREATURE_DAMAGE" ) or ( event == "CHAT_MSG_SPELL_PERIODIC_HOSTILEPLAYER_DAMAGE" ) then if( string.find( arg1, SHT_TRAP ) ) then if( trapTimer ) then for mob, effect in string.gfind( arg1, SHT_TRAP_AFFLICT_STRING ) do --DEFAULT_CHAT_FRAME:AddMessage(effect.." "..mob); SHunterTimers_addDebuff( effect, mob ); end end elseif( string.find( arg1, SHT_FEAR_BEAST ) ) then for mob, effect in string.gfind( arg1, SHT_AFFLICT_STRING ) do --DEFAULT_CHAT_FRAME:AddMessage(effect.." "..mob); if( string.find(effect, SHT_FEAR_BEAST) ) and ( mob == UnitName("target") ) then SHTvars["fearbeast"] = true; SHunterTimers_addDebuff( SHT_FEAR_BEAST, mob ); end end elseif( string.find( arg1, SHT_EXPOSE_WEAKNESS ) ) then for mob, effect in string.gfind( arg1, SHT_AFFLICT_STRING ) do --DEFAULT_CHAT_FRAME:AddMessage(effect.." "..mob); if( string.find(effect, SHT_EXPOSE_WEAKNESS) ) and ( mob == UnitName("target") ) then SHTvars["exposeweak"] = true; SHunterTimers_addDebuff( SHT_EXPOSE_WEAKNESS, mob ); end end elseif( string.find( arg1, SHT_ENTRAPMENT ) ) then for mob, effect in string.gfind( arg1, SHT_AFFLICT_STRING ) do --DEFAULT_CHAT_FRAME:AddMessage(effect.." "..mob); if( string.find(effect, SHT_ENTRAPMENT) ) and ( mob == UnitName("target") ) then SHTvars["entrapment"] = true; SHunterTimers_addDebuff( SHT_ENTRAPMENT, mob ); end end end elseif( event == "CHAT_MSG_SPELL_PERIODIC_SELF_BUFFS" ) then --DEFAULT_CHAT_FRAME:AddMessage(event.." "..arg1, 1, 0, 0 ); if( string.find( arg1, SHT_QUICK_SHOTS ) ) then SHTvars["quick"] = true; SHTvars["quicktime"] = GetTime(); if(SHTvars["skills"][SHT_QUICK_SHOTS]) then SHunterTimersFrame_add( 12000, SHT_QUICK_SHOTS ); end elseif( string.find( arg1, SHT_RAPID_FIRE ) ) then SHTvars["rapid"] = true; SHTvars["rapidtime"] = GetTime(); if (SHTvars["skills"][SHT_RAPID_FIRE]) then SHunterTimersFrame_add( 15000, SHT_RAPID_FIRE ); end elseif( string.find( arg1, SHT_PRIMAL_BLESSING ) ) then SHTvars["primalblessing"] = true; if (SHTvars["skills"][SHT_PRIMAL_BLESSING]) then SHunterTimersFrame_add( 12000, SHT_PRIMAL_BLESSING ); end elseif( string.find( arg1, SHT_DETERRENCE ) and SHTvars["skills"][SHT_DETERRENCE] ) then SHTvars["deterrence"] = true; SHunterTimersFrame_add( 10000, SHT_DETERRENCE ); elseif( string.find( arg1, SHT_BERSERKING ) ) then SHTvars["berserking"] = true; currentHealth = UnitHealth("player"); maxHealth = UnitHealthMax("player"); percentHealth = currentHealth / maxHealth; if(percentHealth >= 0.40) then berserkValue = (1.30 - percentHealth)/3; else berserkValue = 0.30; end if (SHTvars["skills"][SHT_BERSERKING]) then SHunterTimersFrame_add( 10000, SHT_BERSERKING ); end elseif( string.find( arg1, SHT_DEVILSAUR_PROC ) ) then if ( SHTvars["skills"][SHT_DEVILSAUR] ) then SHunterTimersFrame_add( 20000, SHT_DEVILSAUR ); SHTvars["devilsaur"] = true; end elseif( string.find( arg1, SHT_ZHM_PROC ) ) then if ( SHTvars["skills"][SHT_ZHM] ) then SHunterTimersFrame_add( 20000, SHT_ZHM ); SHTvars["zhm"] = true; end elseif( string.find( arg1, SHT_EARTHSTRIKE ) ) then if ( SHTvars["skills"][SHT_EARTHSTRIKE] ) then SHunterTimersFrame_add( 20000, SHT_EARTHSTRIKE ); SHTvars["earthstrike"] = true; end elseif( string.find( arg1, SHT_SWARMGUARD ) ) then if ( SHTvars["skills"][SHT_SWARMGUARD] ) then SHunterTimersFrame_add( 30000, SHT_SWARMGUARD ); SHTvars["swarmguard"] = true; end elseif( string.find( arg1, SHT_JOM_GABBAR ) ) then if ( SHTvars["skills"][SHT_JOM_GABBAR] and not SHTvars["jomgabbar"] ) then SHunterTimersFrame_add( 20000, SHT_JOM_GABBAR ); SHTvars["jomgabbar"] = true; end elseif( string.find( arg1, SHT_KISS_SPIDER ) ) then SHTvars["spider"] = true; if (SHTvars["skills"][SHT_KISS_SPIDER]) then SHunterTimersFrame_add( 15000, SHT_KISS_SPIDER ); end end elseif( event == "CHAT_MSG_SPELL_PET_DAMAGE" ) then if( string.find( arg1, SHT_RESIST ) or string.find( arg1, SHT_IMMUNE) ) then if( string.find( arg1, SHT_INTIM ) ) then for i=1, SHTvars["numBars"] do local text = getglobal("SHunterTimersStatus"..i).spell; if( string.find( text, SHT_PET_INTIM ) ) then getglobal("SHunterTimersStatus"..i).endTime = 0; end end else for trap in string.gfind( arg1, SHT_FIND_TRAP_FAILED ) do if( trapTimer ) and ( string.find( trap, SHT_FREEZING_TRAP ) or string.find( trap, SHT_IMMO_TRAP ) )then for i=1, SHTvars["numBars"] do local text = getglobal("SHunterTimersStatus"..i.."BarLeftText"):GetText(); if( string.find( text, trap.." "..SHT_PRIMED ) ) then getglobal("SHunterTimersStatus"..i).endTime = 0; end end end end end end elseif( event == "CHAT_MSG_SPELL_SELF_DAMAGE" ) then if(SHTvars["skills"][SHT_WING_CLIP]) and ( string.find( arg1, SHT_YOUR..SHT_WING_CLIP ) ) and ( string.find( arg1, SHT_HITS ) or string.find(arg1, SHT_CRITS ) ) then SHTvars["wingclip"] = true; local name = UnitName("target"); SHunterTimersFrame_add( 10000, SHT_WING_CLIP, name ); elseif( string.find( arg1, SHT_FAILED ) ) then local name = UnitName("target"); for spell in string.gfind( arg1, SHT_FAILED_STRING) do --DEFAULT_CHAT_FRAME:AddMessage(spell); for i=1, SHTvars["numBars"] do local barframe = getglobal("SHunterTimersStatus"..i); --local text = getglobal("SHunterTimersStatus"..i.."BarLeftText"):GetText(); if( barframe.spell == spell ) and ( barframe.target == name )then getglobal("SHunterTimersStatus"..i).endTime = 0; end end end elseif( string.find(arg1, SHT_MISSES ) ) then local name = UnitName("target"); for spell in string.gfind( arg1, SHT_MISSES_STRING ) do for i=1, SHTvars["numBars"] do local barframe = getglobal("SHunterTimersStatus"..i); --local text = getglobal("SHunterTimersStatus"..i.."BarLeftText"):GetText(); if( barframe.spell == spell ) and ( barframe.target == name )then getglobal("SHunterTimersStatus"..i).endTime = 0; end end end elseif(SHTvars["skills"][SHT_COUNTER]) and ( string.find( arg1, SHT_YOUR..SHT_COUNTER ) and (string.find( arg1, SHT_HITS ) or string.find( arg1, SHT_CRITS )) )then SHunterTimersFrame_add( 5000, SHT_COUNTER, UnitName("target") ); end elseif( event == "CHAT_MSG_COMBAT_HOSTILE_DEATH" ) then if( SHTvars["numBars"] > 0 ) then for target in string.gfind( arg1, SHT_DIES ) do checkForTarget = target; end checkForTargetDeath = GetTime(); end elseif( event == "CHAT_MSG_MONSTER_EMOTE" ) then if( SHTvars["skills"][SHT_FRENZY] and (string.find(arg1, SHT_FRENZY_EMOTE ) or string.find(arg1, SHT_FRENZY_FLAMEGOR ) )) then if( arg2 == SHT_CHROMAGGUS ) then SHunterTimersFrame_add( 15000, SHT_FRENZY, SHT_CHROMAGGUS ); elseif( arg2 == SHT_FLAMEGOR ) then SHunterTimersFrame_add( 10000, SHT_FRENZY, SHT_FLAMEGOR ); elseif( arg2 == SHT_MAGMADAR ) then SHunterTimersFrame_add( 15000, SHT_FRENZY, SHT_MAGMADAR ); elseif( arg2 == SHT_HUHURAN ) then SHunterTimersFrame_add( 10000, SHT_FRENZY, SHT_HUHURAN ); elseif( arg2 == SHT_GLUTH ) then SHunterTimersFrame_add( 10000, SHT_FRENZY, SHT_GLUTH ); end end elseif( event == "PLAYER_TARGET_CHANGED" ) then if(SHTvars["numBars"]== 0 ) then return; end local time = GetTime(); if( time - checkForTargetDeath < 1 ) then for num = 1, SHTvars["numBars"], 1 do --local text = getglobal("SHunterTimersStatus"..num.."BarLeftText"):GetText(); local barframe = getglobal("SHunterTimersStatus"..num); if( barframe.target == checkForTarget ) then barframe.endTime = 0; end end end elseif( event == "SPELLCAST_START" ) then --DEFAULT_CHAT_FRAME:AddMessage(event.." "..arg1, 1, 0, 0 ); checkForSpellFail = true; checkForTarget = UnitName("target"); checkForSpellName = arg1; elseif( event == "SPELLCAST_FAILED" ) then if( checkForSpellFail ) then if( SHTvars["skills"][SHT_AIMED_SHOT] and ( checkForSpellName == SHT_AIMED_SHOT ) ) then SHTvars["aimed"] = false; end checkForSpellFail = false; checkForSpellName = nil; end elseif( event == "SPELLCAST_STOP" ) then --DEFAULT_CHAT_FRAME:AddMessage(event, 1, 0, 0 ); --DEFAULT_CHAT_FRAME:AddMessage(checkForSpellName, 1, 0, 0 ); if( checkForSpellFail ) then checkForSpellFail = false; local name = UnitName("target"); if( SHT_sfind( checkForSpellName, SHT_STING ) ) then SHunterTimers_addDebuff( checkForSpellName, name ); elseif( SHTvars["skills"][SHT_INTIM]) and ( string.find( checkForSpellName, SHT_INTIM ) ) then SHTvars["petIntim"] = true; SHunterTimersFrame_add( 15000, SHT_PET_INTIM ); elseif( SHTvars["skills"][SHT_BW]) and ( string.find( checkForSpellName, SHT_BW ) ) then SHunterTimersFrame_add( 15000, checkForSpellName ); elseif( SHTvars["skills"][SHT_FLARE]) and ( string.find( checkForSpellName, SHT_FLARE ) ) then SHunterTimersFrame_add( 30000, checkForSpellName ); elseif( SHTvars["skills"][SHT_HUNTERS_MARK]) and ( string.find( checkForSpellName, SHT_HUNTERS_MARK ) ) then if ( name ~= nil ) then SHTvars["huntersmark"] = true; SHunterTimers_addDebuff( SHT_HUNTERS_MARK, name ); end elseif( string.find( checkForSpellName, SHT_TRAP ) ) then if( SHTvars["skills"][checkForSpellName]) then trapTimer = true; SHunterTimersFrame_add( 60000, checkForSpellName.." "..SHT_PRIMED ); end elseif( SHTvars["skills"][SHT_SCATTER]) and ( string.find( checkForSpellName, SHT_SCATTER ) ) then local duration = 4000; if(name) and ( dimin[name] ) and ((GetTime() - dimin[name]["time"]) < 20) then for i=1, dimin[name]["times"] do duration = duration/2; end end SHTvars["scatter"] = true; SHunterTimersFrame_add( duration, checkForSpellName, name ); elseif( SHTvars["skills"][SHT_FEAR_BEAST]) and ( checkForSpellName == SHT_FEAR_BEAST ) then SHTvars["fearbeast"] = true; elseif( SHTvars["skills"][SHT_CONC_SHOT]) and ( checkForSpellName == SHT_CONC_SHOT ) then SHTvars["concuss"] = true; SHunterTimers_addDebuff( checkForSpellName, name ); elseif( SHTvars["skills"][SHT_AIMED_SHOT] and ( checkForSpellName == SHT_AIMED_SHOT ) ) then SHTvars["aimed"] = false; else SHunterTimers_addDebuff( checkForSpellName, name ); end checkForSpellName = nil; elseif( shtautoshot ) and ( not shtcasting ) then SHT_AddAutoShot(); end if( shtcasting ) then shtcasting = false; end --[[DEFAULT_CHAT_FRAME:AddMessage(GetTime() - autodelta ); DEFAULT_CHAT_FRAME:AddMessage("auto: "..GetTime() - shtautotime ); autodelta = GetTime(); shtautotime = GetTime();--]] --DEFAULT_CHAT_FRAME:AddMessage(checkForSpell, 1, 0, 0 ); elseif( event == "UNIT_AURA" ) then if( arg1 == "target" ) then --DEFAULT_CHAT_FRAME:AddMessage(event.." "..arg1, 1, 0, 0 ); local time = GetTime(); local name = UnitName("target"); --DEFAULT_CHAT_FRAME:AddMessage(time, 1, 0, 0 ); local i = 1; while( UnitDebuff("target", i ) ) do SHuntersTooltip:ClearLines(); SHuntersTooltip:SetUnitDebuff("target", i ); targetDebuffs[i] = SHuntersTooltipTextLeft1:GetText(); --DEFAULT_CHAT_FRAME:AddMessage(i.." "..targetDebuffs[i], 1, 0, 0 ); if( string.find( targetDebuffs[i], SHT_INTIM ) ) and ( not SHTvars["intimidate"] ) then SHTvars["intimidate"] = true; SHunterTimers_addDebuff( SHT_INTIM, name ); break; elseif( string.find( targetDebuffs[i], SHT_IMP_CONC ) ) and ( not SHTvars["impconc"] ) then SHTvars["impconc"] = true; SHunterTimers_addDebuff( SHT_IMP_CONC_SHORT, name ); break; elseif( string.find( targetDebuffs[i], SHT_IMP_WC ) ) and ( not SHTvars["impwing"] ) then SHTvars["impwing"] = true; SHunterTimersFrame_add( 5000, SHT_IMP_WC_SHORT, name ); break; elseif( string.find( targetDebuffs[i], SHT_EXPOSE_WEAKNESS ) ) and ( not SHTvars["exposeweak"] ) then SHTvars["exposeweak"] = true; SHunterTimers_addDebuff( SHT_EXPOSE_WEAKNESS, name ); break; end i = i + 1; end end elseif( event == "CHAT_MSG_SPELL_AURA_GONE_OTHER" ) then for effect, target in string.gfind(arg1, SHT_FADE_STRING ) do if( SHTvars["freezing"] ) and string.find(effect, SHT_FREEZING_TRAP ) then for i=1, SHTvars["numBars"] do local barframe = getglobal( "SHunterTimersStatus"..i); --local text = getglobal( "SHunterTimersStatus"..i.."BarLeftText"):GetText(); if( barframe.spell == SHT_FREEZING_TRAP ) and ( barframe.target == target ) then --SHunterTimersFrame_add( 20000, "Diminishing Returns" ); getglobal("SHunterTimersStatus"..i).endTime = 0; end end if( not dimin[target] ) then dimin[target] = {}; end dimin[target]["time"] = GetTime(); if( dimin[target]["times"] == nil ) then dimin[target]["times"] = 1; else dimin[target]["times"] = dimin[target]["times"] + 1; end elseif( SHTvars["scatter"] ) and string.find( effect, SHT_SCATTER ) then for i=1, SHTvars["numBars"] do local barframe = getglobal( "SHunterTimersStatus"..i) --local text = getglobal("SHunterTimersStatus"..i.."BarLeftText"):GetText(); if( barframe.spell == SHT_SCATTER ) and ( barframe.target == target ) then getglobal("SHunterTimersStatus"..i).endTime = 0; end end if( not dimin[target] ) then dimin[target] = {}; end dimin[target]["time"] = GetTime(); if( dimin[target]["times"] == nil ) then dimin[target]["times"] = 1; else dimin[target]["times"] = dimin[target]["times"] + 1; end elseif( SHTvars["fearbeast"] ) and string.find( effect, SHT_FEAR_BEAST ) then for i=1, SHTvars["numBars"] do local barframe = getglobal( "SHunterTimersStatus"..i); --local text = getglobal("SHunterTimersStatus"..i.."BarLeftText"):GetText(); if( barframe.spell == SHT_FEAR_BEAST ) and (barframe.target == target ) then getglobal("SHunterTimersStatus"..i).endTime = 0; end end elseif( SHTvars["wyvern"] ) and string.find( effect, SHT_WYVERN ) then for i=1, SHTvars["numBars"] do local barframe = getglobal( "SHunterTimersStatus"..i); local text = getglobal("SHunterTimersStatus"..i.."BarLeftText"):GetText(); if( text == SHT_WYVERN_TEXT ) and (barframe.target == target ) then getglobal("SHunterTimersStatus"..i).endTime = 0; end end if( not dimin[target] ) then dimin[target] = {}; end dimin[target]["time"] = GetTime(); if( dimin[target]["times"] == nil ) then dimin[target]["times"] = 1; else dimin[target]["times"] = dimin[target]["times"] + 1; end elseif( SHTvars["wingclip"] ) and string.find( effect, SHT_WING_CLIP ) and not ( string.find( effect, SHT_IMP_WC ) ) then for i=1, SHTvars["numBars"] do --local text = getglobal( "SHunterTimersStatus"..i.."BarLeftText"):GetText(); local barframe = getglobal( "SHunterTimersStatus"..i); if( barframe.spell == SHT_WING_CLIP ) and ( barframe.target == target ) then getglobal("SHunterTimersStatus"..i).endTime = 0; end end elseif( SHTvars["exposeweak"] ) and string.find( effect, SHT_EXPOSE_WEAKNESS ) then for i=1, SHTvars["numBars"] do local barframe = getglobal( "SHunterTimersStatus"..i); if( barframe.spell == SHT_EXPOSE_WEAKNESS ) and ( barframe.target == target ) then getglobal("SHunterTimersStatus"..i).endTime = 0; end end elseif( SHTvars["entrapment"] ) and string.find( effect, SHT_ENTRAPMENT ) then for i=1, SHTvars["numBars"] do local barframe = getglobal( "SHunterTimersStatus"..i); if( barframe.spell == SHT_ENTRAPMENT ) and ( barframe.target == target ) then getglobal("SHunterTimersStatus"..i).endTime = 0; end end elseif( SHTvars["huntersmark"] ) and string.find( effect, SHT_HUNTERS_MARK ) then for i=1, SHTvars["numBars"] do local barframe = getglobal( "SHunterTimersStatus"..i); if( barframe.spell == SHT_HUNTERS_MARK ) and ( barframe.target == target ) then getglobal("SHunterTimersStatus"..i).endTime = 0; end end end end elseif( event == "CHAT_MSG_SPELL_AURA_GONE_SELF" ) then --DEFAULT_CHAT_FRAME:AddMessage(event.." "..arg1, 1, 0, 0); for effect, target in string.gfind(arg1, SHT_FADE_STRING ) do if( SHTvars["quick"] ) and string.find( effect, SHT_QUICK_SHOTS ) then SHTvars["quick"] = false; for i=1, SHTvars["numBars"] do local barframe = getglobal( "SHunterTimersStatus"..i); if( barframe.spell == SHT_QUICK_SHOTS ) then getglobal("SHunterTimersStatus"..i).endTime = 0; end end elseif( SHTvars["rapid"] ) and string.find( effect, SHT_RAPID_FIRE ) then SHTvars["rapid"] = false; for i=1, SHTvars["numBars"] do local barframe = getglobal( "SHunterTimersStatus"..i); if( barframe.spell == SHT_RAPID_FIRE ) then getglobal("SHunterTimersStatus"..i).endTime = 0; end end elseif( SHTvars["primalblessing"] ) and string.find( effect, SHT_PRIMAL_BLESSING ) then for i=1, SHTvars["numBars"] do local barframe = getglobal( "SHunterTimersStatus"..i); if( barframe.spell == SHT_PRIMAL_BLESSING ) then getglobal("SHunterTimersStatus"..i).endTime = 0; end end elseif( SHTvars["berserking"] ) and string.find( effect, SHT_BERSERKING ) then SHTvars["berserking"] = false; for i=1, SHTvars["numBars"] do local barframe = getglobal( "SHunterTimersStatus"..i); if( barframe.spell == SHT_BERSERKING ) then getglobal("SHunterTimersStatus"..i).endTime = 0; end end elseif( SHTvars["spider"] ) and string.find( effect, SHT_KISS_SPIDER ) then SHTvars["spider"] = false; for i=1, SHTvars["numBars"] do local barframe = getglobal( "SHunterTimersStatus"..i); if( barframe.spell == SHT_KISS_SPIDER ) then getglobal("SHunterTimersStatus"..i).endTime = 0; end end end end elseif( event == "START_AUTOREPEAT_SPELL" ) then shtautotime = GetTime(); shtautoshot = true; --SHT_AddAutoShot(); elseif( event == "STOP_AUTOREPEAT_SPELL" ) then shtautoshot = false; end end function SHunterTimers_addDebuff( debuff, mob ) if (SHTvars["skills"][SHT_SERPENT]) and ( debuff == SHT_SERPENT ) then SHunterTimersFrame_add( 15000, SHT_SERPENT, mob ); --currentSting = "Serpent Sting"; elseif(SHTvars["skills"][SHT_SCORPID]) and ( debuff == SHT_SCORPID ) then SHunterTimersFrame_add( 20000, SHT_SCORPID, mob ); --currentSting = "Scorpid Sting"; elseif(SHTvars["skills"][SHT_VIPER]) and ( debuff == SHT_VIPER ) then SHunterTimersFrame_add( 8000, SHT_VIPER, mob ); --currentSting = "Viper Sting"; elseif(SHTvars["skills"][SHT_WYVERN]) and ( debuff == SHT_WYVERN ) then local duration = 12000; local name = UnitName("target"); if( dimin[name] ) and ( ( GetTime() - dimin[name]["time"]) < 20 )then for i=1, dimin[name]["times"] do duration = duration / 2; end end SHTvars["wyvern"] = true; SHunterTimersFrame_add( duration, SHT_WYVERN_TEXT, name ); elseif(SHTvars["skills"][SHT_CONC_SHOT]) and ( debuff == SHT_IMP_CONC_SHORT ) then SHunterTimersFrame_add( 3000, SHT_IMP_CONC_SHORT, mob ); elseif(SHTvars["skills"][SHT_FEAR_BEAST] ) and ( debuff == SHT_FEAR_BEAST ) then SHunterTimersFrame_add( 20000, SHT_FEAR_BEAST, mob ); elseif(SHTvars["skills"][SHT_CONC_SHOT]) and ( debuff == SHT_CONC_SHOT ) then SHunterTimersFrame_add( 4000, SHT_CONC_SHOT, mob ); elseif(SHTvars["skills"][SHT_HUNTERS_MARK]) and ( debuff == SHT_HUNTERS_MARK ) then SHunterTimersFrame_add( 120000, SHT_HUNTERS_MARK, mob ); elseif(SHTvars["skills"][SHT_INTIM]) and ( debuff == SHT_INTIM ) then SHunterTimersFrame_add( 3000, SHT_INTIM, mob ); elseif(SHTvars["skills"][SHT_EXPOSE_WEAKNESS]) and ( debuff == SHT_EXPOSE_WEAKNESS ) then SHunterTimersFrame_add( 7000, SHT_EXPOSE_WEAKNESS, mob ); elseif(SHTvars["skills"][SHT_ENTRAPMENT]) and ( debuff == SHT_ENTRAPMENT ) then SHunterTimersFrame_add( 5000, SHT_ENTRAPMENT, mob ); elseif( string.find( debuff, SHT_TRAP ) ) then if( trapTimer ) then trapTimer = false; for num = 1, SHTvars["numBars"] do local barframe = getglobal( "SHunterTimersStatus"..num); local text = getglobal("SHunterTimersStatus"..num.."BarLeftText"):GetText(); if( string.find( text, SHT_PRIMED ) ) then barframe.endTime = 0; end end if(SHTvars["skills"][SHT_FREEZING_TRAP]) and ( string.find( debuff, SHT_FREEZING_TRAP ) ) then SHTvars["freezing"] = true; local duration = 20000*SHTvars["traptimemult"]; if(mob) and ( dimin[mob] ) and ( ( GetTime() - dimin[mob]["time"]) < 20 )then for i=1, dimin[mob]["times"] do duration = duration / 2; end end SHunterTimersFrame_add( duration, SHT_FREEZING_TRAP, mob ); elseif(SHTvars["skills"][SHT_FROST_TRAP]) and ( string.find( debuff, SHT_FROST_TRAP ) ) then SHunterTimersFrame_add( 30000*SHTvars["traptimemult"], SHT_FROST_TRAP.." "..SHT_AURA ); elseif(SHTvars["skills"][SHT_IMMO_TRAP]) and ( string.find( debuff, SHT_IMMO_TRAP ) ) then SHunterTimersFrame_add( 15000, SHT_IMMO_TRAP, mob ); elseif(SHTvars["skills"][SHT_EXPL_TRAP]) and ( string.find( debuff, SHT_EXPL_TRAP ) ) then SHunterTimersFrame_add( 20000, SHT_EXPL_TRAP.." "..SHT_AURA ); end end end end function SHunterTimers_cascadeBar( id ) local barframefrom = getglobal("SHunterTimersStatus"..(id+1)); if( not barframefrom ) or not ( barframefrom:IsVisible() and (barframefrom.channeling or barframefrom.fadeOut) )then getglobal("SHunterTimersStatus"..id):Hide(); SHunterTimers_SetWidths(); SHT_SetHeight(); return; end local barframeto = getglobal("SHunterTimersStatus"..id); local barto = getglobal("SHunterTimersStatus"..id.."Bar"); local textLeftto = getglobal("SHunterTimersStatus"..id.."BarLeftText"); local textRightto = getglobal("SHunterTimersStatus"..id.."BarRightText"); local iconto = getglobal("SHunterTimersStatus"..id.."Icon"); id = id + 1; local barfrom = getglobal("SHunterTimersStatus"..id.."Bar"); local textLeftfrom = getglobal("SHunterTimersStatus"..id.."BarLeftText"); local textRightfrom = getglobal("SHunterTimersStatus"..id.."BarRightText"); barframeto.texture = barframefrom.texture; iconto:SetTexture(barframeto.texture); barframeto.startTime = barframefrom.startTime; barframeto.endTime = barframefrom.endTime; barframeto.duration = barframefrom.duration; barframeto.channeling = barframefrom.channeling; barframeto.fadeOut = barframefrom.fadeOut; barframeto.target = barframefrom.target; barframeto.spell = barframefrom.spell; barto:SetMinMaxValues(barframeto.startTime, barframeto.endTime); barto:SetValue(barfrom:GetValue()); textLeftto:SetText(textLeftfrom:GetText()); textRightto:SetText(textRightfrom:GetText()); barframeto:SetAlpha(barframefrom:GetAlpha()); barframeto:Show(); SHunterTimers_cascadeBar( id ); end function SHunterTimers_shift( id, curr ) if( id > SHTvars["numBars"] ) or ( SHTvars["numBars"] == 11 ) then return; end if( not curr ) then curr = SHTvars["numBars"] + 1; end if( curr == id ) then --DEFAULT_CHAT_FRAME:AddMessage("shiftend"); return; end SHunterTimers_CopyBar( curr, curr-1 ); SHunterTimers_shift( id, curr-1 ); end function SHunterTimers_CopyBar(to, from) local barframeto = getglobal("SHunterTimersStatus"..to); local barto = getglobal("SHunterTimersStatus"..to.."Bar"); local textLeftto = getglobal("SHunterTimersStatus"..to.."BarLeftText"); local textRightto = getglobal("SHunterTimersStatus"..to.."BarRightText"); local iconto = getglobal("SHunterTimersStatus"..to.."Icon"); local barframefrom = getglobal("SHunterTimersStatus"..from); local barfrom = getglobal("SHunterTimersStatus"..from.."Bar"); local textLeftfrom = getglobal("SHunterTimersStatus"..from.."BarLeftText"); local textRightfrom = getglobal("SHunterTimersStatus"..from.."BarRightText"); barframeto.texture = barframefrom.texture; iconto:SetTexture(barframeto.texture); barframeto.startTime = barframefrom.startTime; barframeto.endTime = barframefrom.endTime; barframeto.duration = barframefrom.duration; barframeto.channeling = barframefrom.channeling; barframeto.fadeOut = barframefrom.fadeOut; barframeto.target = barframefrom.target; barframeto.spell = barframefrom.spell; barto:SetMinMaxValues(barframeto.startTime, barframeto.endTime); barto:SetValue(barfrom:GetValue()); textLeftto:SetText(textLeftfrom:GetText()); textRightto:SetText(textRightfrom:GetText()); barframeto:SetAlpha(barframefrom:GetAlpha()); barframeto:Show(); end function SHunterTimers_AutoCascade(id, last) if( id == SHT_NUM_BARS ) then return; end if( id == 0 ) then id = 1; end local barframe = getglobal("SHunterTimersStatus"..id); if( barframe:IsVisible() ) then SHunterTimers_AutoCascade(id+1, false); else local barframenext = getglobal("SHunterTimersStatus"..id+1); if( barframenext:IsVisible() ) then SHunterTimers_cascadeBar(id); if( last ) then SHunterTimers_AutoCascade( id-1, true ); else SHunterTimers_AutoCascade( id+1, false ); end else SHunterTimers_AutoCascade(id+1, true); end end end function SHunterTimers_OnUseAction( slot, checkFlags, checkSelf ) SHuntersTooltip:ClearLines(); SHuntersTooltip:SetAction(slot); local text = SHuntersTooltipTextLeft1:GetText(); SHunterTimers_SetStates(text); SHunterTimers_Real_UseAction( slot, checkFlags, checkSelf ); end function SHunterTimers_OnCastSpell(spellID, spellTab) SHuntersTooltip:ClearLines(); SHuntersTooltip:SetSpell(spellID, spellTab); local text = SHuntersTooltipTextLeft1:GetText(); SHunterTimers_SetStates(text); SHunterTimers_Real_CastSpell(spellID, spellTab); end function SHunterTimers_OnCastSpellByName(spellName) SHunterTimers_SetStates(spellName); SHunterTimers_Real_CastSpellByName(spellName); end function SHunterTimers_SetStates(text) if( text ) then --DEFAULT_CHAT_FRAME:AddMessage(text); for spell in string.gfind( text, SHT_SPELL_RANK_STRIP ) do --strip the (Rank #) portion --DEFAULT_CHAT_FRAME:AddMessage(text.." "..spell); text = spell; end if( string.find( text, SHT_AIMED_SHOT ) ) then if( SHTvars["skills"][SHT_AIMED_SHOT] and not SHTvars["aimed"]) then SHTvars["aimed"] = true; local duration = 3; if( SHTvars["rapid"] ) then duration = duration / 1.4; end if( SHTvars["quick"] ) then duration = duration / 1.3; end if ( SHTvars["berserking"] ) then duration = duration / (1 + berserkValue); end if( SHTvars["spider"] ) then duration = duration / 1.2; end shtcasting = true; local name = UnitName("player"); local arg1 = SHT_AIMED_SHOT; local arg2 = duration * 1000 + SHTvars["aimeddelay"]; if( IsAddOnLoaded("MetaHud") and MetaHudOptions["castingbar"] == 1 ) then MetaHud.spellname = arg1; MetaHud_EventFrame.startTime = GetTime(); MetaHud_EventFrame.maxValue = MetaHud_EventFrame.startTime + (arg2 / 1000); MetaHud_EventFrame.holdTime = 0; MetaHud_EventFrame.casting = 1; MetaHud_EventFrame.delay = 0; MetaHud_EventFrame.channeling = nil; MetaHud_EventFrame.fadeOut = nil; MetaHud_EventFrame.flash = nil; MetaHud_EventFrame.duration = floor(arg2 / 100) / 10; MetaHud.Casting = true; MetaHud:updateAlpha(); MetaHud_Casttime_Text:SetAlpha(1); MetaHud_Castdelay_Text:SetAlpha(1); MetaHud_Casting_Bar:Show(); MetaHud_Flash_Bar:Hide(); elseif( IsAddOnLoaded("Perl_ArcaneBar") and Perl_ArcaneBar_Config[name]["Enabled"] == 1 ) then Perl_ArcaneBar:SetStatusBarColor(1.0, 0.7, 0.0, Perl_ArcaneBar_Config[name]["Transparency"]); Perl_ArcaneBarSpark:Show(); Perl_ArcaneBarFrame.startTime = GetTime(); Perl_ArcaneBarFrame.maxValue = Perl_ArcaneBarFrame.startTime + (arg2 / 1000); Perl_ArcaneBar:SetMinMaxValues(Perl_ArcaneBarFrame.startTime, Perl_ArcaneBarFrame.maxValue); Perl_ArcaneBar:SetValue(Perl_ArcaneBarFrame.startTime); Perl_ArcaneBarFrame:SetAlpha(0.8); Perl_ArcaneBarFrame.holdTime = 0; Perl_ArcaneBarFrame.casting = 1; Perl_ArcaneBarFrame.fadeOut = nil; Perl_ArcaneBarFrame:Show(); Perl_ArcaneBarFrame.delaySum = 0; if (Perl_ArcaneBar_Config[name]["ShowTimer"] == 1) then Perl_ArcaneBar_CastTime:Show(); else Perl_ArcaneBar_CastTime:Hide(); end Perl_ArcaneBarFrame.mode = "casting"; end if( IsAddOnLoaded("eCastingBar") and eCastingBar_Saved[eCastingBar_Player].Enabled == 1 ) then eCastingBar_SpellcastStart( "", arg1, arg2 ); elseif ( IsAddOnLoaded("otravi_CastingBar") ) then otravi_CastingBar:SpellStart(arg1,arg2); elseif ( IsAddOnLoaded("oCB") ) then oCB:SpellStart(arg1,arg2); end if( IsAddOnLoaded("ArcHUD2") and ArcHUD:HasModule("Casting") and ArcHUD:IsModuleActive("Casting") ) then ArcHUD:GetModule("Casting").f:UpdateColor({["r"] = 1.0, ["g"] = 0.7, ["b"] = 0}); ArcHUD:GetModule("Casting").Text:SetText(arg1); ArcHUD:GetModule("Casting").startValue = 0; ArcHUD:GetModule("Casting").f:SetMax(arg2); ArcHUD:GetModule("Casting").channeling = 0; ArcHUD:GetModule("Casting").f.casting = 1; ArcHUD:GetModule("Casting").spellstart = GetTime(); ArcHUD:GetModule("Casting").stopSet = false; if(ArcHUD.db.profile.FadeIC > ArcHUD.db.profile.FadeOOC) then ArcHUD:GetModule("Casting").f:SetRingAlpha(ArcHUD.db.profile.FadeIC); else ArcHUD:GetModule("Casting").f:SetRingAlpha(ArcHUD.db.profile.FadeOOC); end elseif ( IsAddOnLoaded("Bongos_CastBar") ) then BCastBarCastBar:SetStatusBarColor(1.0, 0.7, 0.0); BCastBarCastBarSpark:Show(); BCastBarCastBar.startTime = GetTime(); BCastBarCastBar.maxValue = BCastBarCastBar.startTime + (arg2 / 1000); BCastBarCastBar:SetMinMaxValues(BCastBarCastBar.startTime, BCastBarCastBar.maxValue); BCastBarCastBar:SetValue(BCastBarCastBar.startTime); BCastBarCastBarText:SetText(arg1); BCastBarCastBar:SetAlpha( BCastBarCastBar:GetParent():GetAlpha() ); BCastBarCastBar.holdTime = 0; BCastBarCastBar.casting = 1; BCastBarCastBar.fadeOut = nil; BCastBarCastBar:Show(); BCastBarCastBar.mode = "casting"; elseif ( IsAddOnLoaded("Nurfed_Hud") ) then Nurfed_Hudcastingbar:SetVertexColor(1.0, 1.0, 0.0); Nurfed_Hudcastingspell:SetText(arg1); Nurfed_Hudcasting.startTime = GetTime(); Nurfed_Hudcasting.maxValue = Nurfed_Hudcasting.startTime + (arg2 / 1000); Nurfed_Hudcasting:SetAlpha(1.0); Nurfed_Hudcasting.holdTime = 0; Nurfed_Hudcasting.casting = 1; Nurfed_Hudcasting.fadeOut = nil; Nurfed_Hudcasting:Show(); Nurfed_Hudcasting.mode = "casting"; else if( IsAddOnLoaded("CastTime") ) then CastTime.delaySum = 0; CastTime.spellname = arg1; CastTime.startTime = GetTime(); CastTime.maxValue = CastTime.startTime + (arg2 / 1000); CastTimeFrame:Show(); end if( IsAddOnLoaded("CT_MasterMod") ) then CT_CastBarFrame.spellName = arg1; end if ( IsAddOnLoaded("MetaHud") and MetaHudOptions["bcastingbar"] == 0 ) then elseif ( IsAddOnLoaded("Perl_ArcaneBar") and Perl_ArcaneBar_Config[name]["HideOriginal"] == 1 ) then elseif ( IsAddOnLoaded("eCastingBar") and eCastingBar_Saved[eCastingBar_Player].Enabled == 1 ) then elseif ( IsAddOnLoaded("otravi_CastingBar") ) then elseif ( IsAddOnLoaded("oCB") ) then else CastingBarFrameStatusBar:SetStatusBarColor(1.0, 0.7, 0.0); CastingBarSpark:Show(); CastingBarFrame.startTime = GetTime(); CastingBarFrame.maxValue = CastingBarFrame.startTime + (arg2 / 1000); CastingBarFrameStatusBar:SetMinMaxValues(CastingBarFrame.startTime, CastingBarFrame.maxValue); CastingBarFrameStatusBar:SetValue(CastingBarFrame.startTime); CastingBarText:SetText(arg1); CastingBarFrame:SetAlpha(1.0); CastingBarFrame.holdTime = 0; CastingBarFrame.casting = 1; CastingBarFrame.fadeOut = nil; CastingBarFrame:Show(); CastingBarFrame.mode = "casting"; end end end end if( SHT_sfind( text, SHT_STING ) or string.find( text, SHT_TRAP ) or string.find( text, SHT_INTIM ) or string.find( text, SHT_BW ) or string.find( text, SHT_FLARE ) or string.find( text, SHT_HUNTERS_MARK ) or string.find( text, SHT_CONC_SHOT ) or string.find( text, SHT_SCATTER ) or string.find( text, SHT_AIMED_SHOT ) ) then checkForSpellFail = true; checkForSpellName = text; elseif ( string.find( text, SHT_FEIGN_DEATH ) ) then -- Do nothing or FD/trap macros break elseif( not string.find( text, SHT_AUTO_SHOT ) ) then checkForSpellFail = true; checkForSpellName = "dummy for autoshot"; --DEFAULT_CHAT_FRAME:AddMessage("Button pressed: "..text, 1, 1, 0 ); end end end function SHunterTimers_ShowOptions() for i=1, SHT_NUM_TIMERS do if( SHTvars["skills"][SHT_OPTIONS_TIMERS[i]] ) then getglobal("SHunterTimersOptionsTimersCheckButton"..i):SetChecked(1); else getglobal("SHunterTimersOptionsTimersCheckButton"..i):SetChecked(0); end end if( SHTvars[SHT_ON] ) then SHunterTimersOptionsBarsCheckButtonOn:SetChecked(1); else SHunterTimersOptionsBarsCheckButtonOn:SetChecked(0); end if( SHTvars["locked"] ) then SHunterTimersOptionsBarsCheckButton1:SetChecked(1); else SHunterTimersOptionsBarsCheckButton1:SetChecked(0); end if( SHTvars["colorchange"] ) then SHunterTimersOptionsBarsCheckButton2:SetChecked(1); else SHunterTimersOptionsBarsCheckButton2:SetChecked(0); end if( SHTvars["showtex"] ) then SHunterTimersOptionsBarsCheckButton3:SetChecked(1); else SHunterTimersOptionsBarsCheckButton3:SetChecked(0); end if( SHTvars["largetex"] ) then SHunterTimersOptionsBarsCheckButton4:SetChecked(1); else SHunterTimersOptionsBarsCheckButton4:SetChecked(0); end if( SHTvars["gap"] ) then SHunterTimersOptionsBarsCheckButton5:SetChecked(0); else SHunterTimersOptionsBarsCheckButton5:SetChecked(1); end if( SHTvars["append"] ) then SHunterTimersOptionsBarsCheckButton6:SetChecked(1); else SHunterTimersOptionsBarsCheckButton6:SetChecked(0); end if( SHTvars["padding"] ) then SHunterTimersOptionsBarsCheckButton7:SetChecked(0); else SHunterTimersOptionsBarsCheckButton7:SetChecked(1); end if( SHTvars["hidetext"] ) then SHunterTimersOptionsBarsCheckButton8:SetChecked(1); else SHunterTimersOptionsBarsCheckButton8:SetChecked(0); end if( SHTvars["hidetime"] ) then SHunterTimersOptionsBarsCheckButton9:SetChecked(1); else SHunterTimersOptionsBarsCheckButton9:SetChecked(0); end if( SHTvars["sticky"] ) then SHunterTimersOptionsBarsCheckButton10:SetChecked(1); else SHunterTimersOptionsBarsCheckButton10:SetChecked(0); end if( SHTvars["down"] ) then SHunterTimersOptionsBarsCheckButton11:SetChecked(1); else SHunterTimersOptionsBarsCheckButton11:SetChecked(0); end SHunterTimersOptionsBarsEditBox1:SetText(SHTvars["aimeddelay"]); SHunterTimersOptionsBarsEditBox2:SetText(SHTvars["shotdelay"]); local r, g, b, a = unpack(SHTvars["barstartcolor"]); local rd, gd, bd, ad = unpack( SHTvars["bardelta"] ); rd = rd + r; gd = gd + g; bd = bd + b; ad = ad + a; SHunterTimersOptionsBarsColor1Swatch:SetVertexColor(r, g, b); SHunterTimersOptionsBarsColor1Swatch.r = r; SHunterTimersOptionsBarsColor1Swatch.g = g; SHunterTimersOptionsBarsColor1Swatch.b = b; SHunterTimersOptionsBarsColor1Swatch.a = a; SHunterTimersOptionsBarsColor2Swatch:SetVertexColor(rd, gd, bd); SHunterTimersOptionsBarsColor2Swatch.r = rd; SHunterTimersOptionsBarsColor2Swatch.g = gd; SHunterTimersOptionsBarsColor2Swatch.b = bd; SHunterTimersOptionsBarsColor2Swatch.a = ad; SHunterTimersOptionsBarsColor3Swatch:SetVertexColor(SHTvars["bg"].r, SHTvars["bg"].g, SHTvars["bg"].b, SHTvars["bg"].a); SHunterTimersOptionsBarsColor3Swatch.r = SHTvars["bg"].r; SHunterTimersOptionsBarsColor3Swatch.g = SHTvars["bg"].g; SHunterTimersOptionsBarsColor3Swatch.b = SHTvars["bg"].b; SHunterTimersOptionsBarsColor3Swatch.a = SHTvars["bg"].a; SHunterTimersOptionsBarsColor4Swatch:SetVertexColor( unpack( SHTvars["borderalpha"]) ); SHunterTimersOptionsBarsColor4Swatch.r, SHunterTimersOptionsBarsColor4Swatch.g, SHunterTimersOptionsBarsColor4Swatch.b, SHunterTimersOptionsBarsColor4Swatch.a = unpack( SHTvars["borderalpha"] ); SHunterTimersOptionsBarsColor5Swatch:SetVertexColor(unpack(SHTvars["skillcolor"])); SHunterTimersOptionsBarsColor5Swatch.r, SHunterTimersOptionsBarsColor5Swatch.g, SHunterTimersOptionsBarsColor5Swatch.b, SHunterTimersOptionsBarsColor5Swatch.a = unpack( SHTvars["skillcolor"] ); SHunterTimersOptionsBarsColor6Swatch:SetVertexColor(unpack(SHTvars["timecolor"])); SHunterTimersOptionsBarsColor6Swatch.r, SHunterTimersOptionsBarsColor6Swatch.g, SHunterTimersOptionsBarsColor6Swatch.b, SHunterTimersOptionsBarsColor6Swatch.a = unpack( SHTvars["timecolor"] ); SHunterTimersOptionsBarsColor7Swatch:SetVertexColor(unpack(SHTvars["targetcolor"])); SHunterTimersOptionsBarsColor7Swatch.r, SHunterTimersOptionsBarsColor7Swatch.g, SHunterTimersOptionsBarsColor7Swatch.b, SHunterTimersOptionsBarsColor7Swatch.a = unpack( SHTvars["targetcolor"] ); SHunterTimersOptionsBarsSlider1Slider:SetValue(SHTvars["bardistance"]); SHunterTimersOptionsBarsSlider2Slider:SetValue(SHTvars["scale"]/UIParent:GetScale()); SHunterTimersOptionsBarsSlider3Slider:SetValue(SHTvars["mili"]); SHunterTimersOptionsBarsSlider4Slider:SetValue(SHTvars["flash"]); SHunterTimersOptionsBarsSlider5Slider:SetValue(SHTvars["step"]); SHunterTimersOptionsBarsSlider6Slider:SetValue(SHTvars["overallalpha"]); SHunterTimersOptionsBarsSlider7Slider:SetValue(SHTvars["barheight"]); SHunterTimersOptions:Show(); end function SHunterTimers_SaveOptions() for i=1, SHT_NUM_TIMERS do if( getglobal("SHunterTimersOptionsTimersCheckButton"..i):GetChecked() == 1 ) then SHTvars["skills"][SHT_OPTIONS_TIMERS[i]] = true; else SHTvars["skills"][SHT_OPTIONS_TIMERS[i]] = false; end end if( SHunterTimersOptionsBarsCheckButtonOn:GetChecked() == 1 ) then SHTvars[SHT_ON] = true; else SHTvars[SHT_ON] = false; end if( SHunterTimersOptionsBarsCheckButton1:GetChecked() == 1 ) then SHTvars["locked"] = true; SHunterTimersAnchor:Hide(); else SHTvars["locked"] = false; SHunterTimersAnchor:Show(); end if( SHunterTimersOptionsBarsCheckButton2:GetChecked() == 1 ) then SHTvars["colorchange"] = true; else SHTvars["colorchange"] = false; end if( SHunterTimersOptionsBarsCheckButton3:GetChecked() == 1 ) then SHTvars["showtex"] = true; else SHTvars["showtex"] = false; end if( SHunterTimersOptionsBarsCheckButton4:GetChecked() == 1 ) then SHTvars["largetex"] = true; else SHTvars["largetex"] = false; end if( SHunterTimersOptionsBarsCheckButton5:GetChecked() == 1 ) then SHTvars["gap"] = false; else SHTvars["gap"] = true; end if( SHunterTimersOptionsBarsCheckButton6:GetChecked() == 1 ) then SHTvars["append"] = true; else SHTvars["append"] = false; end if( SHunterTimersOptionsBarsCheckButton7:GetChecked() == 1 ) then SHTvars["padding"] = false; else SHTvars["padding"] = true; end if( SHunterTimersOptionsBarsCheckButton8:GetChecked() == 1 ) then SHTvars["hidetext"] = true; else SHTvars["hidetext"] = false; end if( SHunterTimersOptionsBarsCheckButton9:GetChecked() == 1 ) then SHTvars["hidetime"] = true; else SHTvars["hidetime"] = false; end if( SHunterTimersOptionsBarsCheckButton10:GetChecked() == 1 ) then SHTvars["sticky"] = true; else SHTvars["sticky"] = false; end if( SHunterTimersOptionsBarsCheckButton11:GetChecked() == 1 ) then SHTvars["down"] = true; else SHTvars["down"] = false; end SHTvars["aimeddelay"] = 1*SHunterTimersOptionsBarsEditBox1:GetText(); SHTvars["shotdelay"] = 1*SHunterTimersOptionsBarsEditBox2:GetText(); SHTvars["barstartcolor"][1] = SHunterTimersOptionsBarsColor1Swatch.r; SHTvars["barstartcolor"][2] = SHunterTimersOptionsBarsColor1Swatch.g; SHTvars["barstartcolor"][3] = SHunterTimersOptionsBarsColor1Swatch.b; SHTvars["barstartcolor"][4] = SHunterTimersOptionsBarsColor1Swatch.a; SHTvars["bardelta"][1] = SHunterTimersOptionsBarsColor2Swatch.r - SHunterTimersOptionsBarsColor1Swatch.r; SHTvars["bardelta"][2] = SHunterTimersOptionsBarsColor2Swatch.g - SHunterTimersOptionsBarsColor1Swatch.g; SHTvars["bardelta"][3] = SHunterTimersOptionsBarsColor2Swatch.b - SHunterTimersOptionsBarsColor1Swatch.b; SHTvars["bardelta"][4] = SHunterTimersOptionsBarsColor2Swatch.a - SHunterTimersOptionsBarsColor1Swatch.a; SHTvars["borderalpha"][1] = SHunterTimersOptionsBarsColor4Swatch.r; SHTvars["borderalpha"][2] = SHunterTimersOptionsBarsColor4Swatch.g; SHTvars["borderalpha"][3] = SHunterTimersOptionsBarsColor4Swatch.b; SHTvars["borderalpha"][4] = SHunterTimersOptionsBarsColor4Swatch.a; SHTvars["skillcolor"][1] = SHunterTimersOptionsBarsColor5Swatch.r; SHTvars["skillcolor"][2] = SHunterTimersOptionsBarsColor5Swatch.g; SHTvars["skillcolor"][3] = SHunterTimersOptionsBarsColor5Swatch.b; SHTvars["skillcolor"][4] = SHunterTimersOptionsBarsColor5Swatch.a; SHTvars["timecolor"][1] = SHunterTimersOptionsBarsColor6Swatch.r; SHTvars["timecolor"][2] = SHunterTimersOptionsBarsColor6Swatch.g; SHTvars["timecolor"][3] = SHunterTimersOptionsBarsColor6Swatch.b; SHTvars["timecolor"][4] = SHunterTimersOptionsBarsColor6Swatch.a; SHTvars["targetcolor"][1] = SHunterTimersOptionsBarsColor7Swatch.r; SHTvars["targetcolor"][2] = SHunterTimersOptionsBarsColor7Swatch.g; SHTvars["targetcolor"][3] = SHunterTimersOptionsBarsColor7Swatch.b; SHTvars["targetcolor"][4] = SHunterTimersOptionsBarsColor7Swatch.a; SHTvars["bg"].r = SHunterTimersOptionsBarsColor3Swatch.r; SHTvars["bg"].g = SHunterTimersOptionsBarsColor3Swatch.g; SHTvars["bg"].b = SHunterTimersOptionsBarsColor3Swatch.b; SHTvars["bg"].a = SHunterTimersOptionsBarsColor3Swatch.a; SHTvars["bardistance"] = SHunterTimersOptionsBarsSlider1Slider:GetValue(); SHTvars["scale"] = SHunterTimersOptionsBarsSlider2Slider:GetValue()*UIParent:GetScale(); SHTvars["mili"] = SHunterTimersOptionsBarsSlider3Slider:GetValue(); SHTvars["flash"] = SHunterTimersOptionsBarsSlider4Slider:GetValue(); SHTvars["step"] = SHunterTimersOptionsBarsSlider5Slider:GetValue(); SHTvars["overallalpha"] = SHunterTimersOptionsBarsSlider6Slider:GetValue(); SHTvars["barheight"] = SHunterTimersOptionsBarsSlider7Slider:GetValue(); SHunterTimers_SetSettings(); end function SHunterTimers_SaveCloseOptions() SHunterTimers_SaveOptions(); SHunterTimersOptions:Hide(); end function SHunterTimers_ResetOptions() SHTvars = {}; SHTvars["bg"] = { r=0, g=0, b=0, a=7 }; SHTvars[SHT_ON] = true; SHTvars["borderalpha"] = { [1] = 1; [2] = 1; [3] = 1; [4] = 1; }; SHunterTimersFrame:SetBackdropColor( SHTvars["bg"].r, SHTvars["bg"].g, SHTvars["bg"].b, SHTvars["bg"].a ); SHunterTimersFrame:SetBackdropBorderColor( unpack(SHTvars["borderalpha"]) ); SHTvars["numBars"] = 0; SHTvars["skills"] = {}; for i=1, SHT_NUM_TIMERS do if( SHTvars["skills"][SHT_OPTIONS_TIMERS[i]] == nil ) then SHTvars["skills"][SHT_OPTIONS_TIMERS[i]] = true; end end SHTvars["shotdelay"] = 200; SHTvars["aimeddelay"] = 200; SHTvars["scale"] = UIParent:GetScale(); SHTvars["locked"] = false; SHunterTimersAnchor:Show(); SHTvars["down"] = true; SHunterTimersFrame:ClearAllPoints(); SHunterTimersFrame:SetPoint( "TOPLEFT", "SHunterTimersAnchor", "BOTTOMRIGHT" ); SHTvars["mili"] = 2; SHTvars["flash"] = 5; local r, g, b = SHunterTimersStatus1BarLeftText:GetTextColor(); SHTvars["skillcolor"] = { [1] = r, [2] = g, [3] = b, [4] = 1 }; local r, g, b = SHunterTimersStatus1BarRightText:GetTextColor(); SHTvars["timecolor"] = { [1] = r, [2] = g, [3] = b, [4] = 1 }; local r, g, b = SHunterTimersStatus1BarLeftText:GetTextColor(); SHTvars["targetcolor"] = { [1] = r, [2] = g, [3] = b, [4] = 1 }; SHTvars["barstartcolor"] = { [1] = 0, [2] = 0.8, [3] = 0, [4] = 1 }; SHTvars["bardelta"] = { [1] = 0.8, [2] = -0.8, [3] = 0, [4] = 0}; SHTvars["step"] = 0.015; SHTvars["colorchange"] = false; SHTvars["bardistance"] = 10; SHTvars["append"] = false; SHTvars["overallalpha"] = 1; SHunterTimers_ClearActiveSpells(); for i=1, SHT_NUM_TIMERS do --Check boxes getglobal("SHunterTimersOptionsTimersCheckButton"..i.."Text"):SetText(SHT_OPTIONS_TIMERS[i]); end for i=1, SHT_NUM_OPTIONS do --Check boxes getglobal("SHunterTimersOptionsBarsCheckButton"..i.."Text"):SetText(SHT_OPTIONS_BARS[i]); end for i=1, SHT_NUM_SLIDERS do --Sliders getglobal("SHunterTimersOptionsBarsSlider"..i.."SliderTitle"):SetText(SHT_OPTIONS_SLIDER[i]); getglobal("SHunterTimersOptionsBarsSlider"..i.."SliderLow"):SetText(SHT_OPTIONS_SLIDER_ENDS[i][1]) getglobal("SHunterTimersOptionsBarsSlider"..i.."SliderHigh"):SetText(SHT_OPTIONS_SLIDER_ENDS[i][2]); end SHTvars["textures"] = {}; SHunterTimers_UpdateSpells(); SHTvars["showtex"] = true; SHTvars["largetex"] = false; SHTvars["hidetext"] = false; SHTvars["hidetime"] = false; SHTvars["gap"] = true; SHTvars["padding"] = true; SHTvars["barheight"] = 10; SHTvars["sticky"] = true; local _, _, _, _, rank = GetTalentInfo( 3, 7 ); --Clever traps SHTvars["traptimemult"] = 1 + (rank * 0.15); getglobal("SHunterTimersOptionsTimersLabel1Label"):SetText(SHT_OPTIONS_TIMERS_TEXT); for i=1, SHT_NUM_LABELS do getglobal("SHunterTimersOptionsBarsLabel"..i.."Label"):SetText(SHT_OPTIONS_LABELS[i]); end getglobal("SHunterTimersOptionsTitleString"):SetText("Sorren's Hunter Timers "..SHT_VERSION); SHunterTimers_SetSettings(); end function SHunterTimers_SetSettings() if( SHTvars[SHT_ON] ) then UseAction = SHunterTimers_OnUseAction; CastSpellByName = SHunterTimers_OnCastSpellByName; CastSpell = SHunterTimers_OnCastSpell; else UseAction = SHunterTimers_Real_UseAction; CastSpellByName = SHunterTimers_Real_CastSpellByName; CastSpell = SHunterTimers_Real_CastSpell; end SHunterTimersFrame:SetBackdropColor(SHTvars["bg"].r, SHTvars["bg"].g, SHTvars["bg"].b, SHTvars["bg"].a); SHunterTimersFrame:SetBackdropBorderColor(unpack(SHTvars["borderalpha"] ) ); if( SHTvars["down"] ) then SHunterTimersFrame:ClearAllPoints(); SHunterTimersFrame:SetPoint( "TOPLEFT", "SHunterTimersAnchor", "BOTTOMRIGHT" ); else SHunterTimersFrame:ClearAllPoints(); SHunterTimersFrame:SetPoint( "BOTTOMLEFT", "SHunterTimersAnchor", "TOPRIGHT" ); end for i=1, SHT_NUM_BARS do local barframe = getglobal("SHunterTimersStatus"..i); local bar = getglobal( "SHunterTimersStatus"..i.."Bar"); local bg = getglobal( "SHunterTimersStatus"..i.."BGBar"); local barwidth = 220; barframe:SetHeight( SHTvars["barheight"] ); bar:SetHeight( SHTvars["barheight"] ); bg:SetHeight( SHTvars["barheight"] ); local icon = getglobal("SHunterTimersStatus"..i.."Icon"); if( SHTvars["showtex"] ) then icon:Show(); if( SHTvars["gap"] ) then barwidth = barwidth - 5; end if( SHTvars["largetex"] ) and ( SHTvars["barheight"] < 16) then barframe:SetHeight(16); icon:SetHeight(16); icon:SetWidth(16); barwidth = barwidth - 16; else icon:SetHeight( SHTvars["barheight"] ); icon:SetWidth( SHTvars["barheight"] ); barwidth = barwidth - SHTvars["barheight"]; end bar:ClearAllPoints(); if( SHTvars["gap"] ) then bar:SetPoint("LEFT", "SHunterTimersStatus"..i.."Icon", "RIGHT", 5, 0 ); else bar:SetPoint("LEFT", "SHunterTimersStatus"..i.."Icon", "RIGHT", 0, 0 ); end bg:ClearAllPoints(); if( SHTvars["gap"] ) then bg:SetPoint("LEFT", "SHunterTimersStatus"..i.."Icon", "RIGHT", 5, 0 ); else bg:SetPoint("LEFT", "SHunterTimersStatus"..i.."Icon", "RIGHT", 0, 0 ); end else icon:Hide(); bar:SetPoint("LEFT", "SHunterTimersStatus"..i, "LEFT", 0, 0 ); bg:SetPoint("LEFT", "SHunterTimersStatus"..i, "LEFT", 0, 0 ); end barframe:SetWidth(220); bar:SetWidth(barwidth); bg:SetWidth(barwidth); if( SHTvars["hidetext"] ) then getglobal("SHunterTimersStatus"..i.."BarLeftText"):Hide(); else getglobal("SHunterTimersStatus"..i.."BarLeftText"):Show(); end if( SHTvars["hidetime"] ) then getglobal("SHunterTimersStatus"..i.."BarRightText"):Hide(); else getglobal("SHunterTimersStatus"..i.."BarRightText"):Show(); end end local height; if( not SHTvars["largetex"] ) or ( SHTvars["barheight"] >= 16 ) then height = SHTvars["numBars"] * (SHTvars["barheight"] + SHTvars["bardistance"]) - SHTvars["bardistance"] + 10; else height = SHTvars["numBars"] * (16 + SHTvars["bardistance"]) - SHTvars["bardistance"] + 10; end if( SHTvars["padding"] ) then SHunterTimersFrame:SetWidth( 240 ); SHunterTimersStatus1:SetPoint( "TOPLEFT", "SHunterTimersFrame", "TOPLEFT", 10, -10 ); height = height + 10; else SHunterTimersFrame:SetWidth( 230 ); SHunterTimersStatus1:SetPoint( "TOPLEFT", "SHunterTimersFrame", "TOPLEFT", 5, -5 ); end SHunterTimersFrame:SetHeight(height); for i=2, SHT_NUM_BARS do getglobal("SHunterTimersStatus"..i):ClearAllPoints(); getglobal("SHunterTimersStatus"..i):SetPoint("TOP", "SHunterTimersStatus"..(i-1), "BOTTOM", 0, -SHTvars["bardistance"]); end SHunterTimersFrame:SetScale( SHTvars["scale"] ); SHunterTimersFrame:SetAlpha( SHTvars["overallalpha"] ); for i=1, SHT_NUM_BARS do getglobal("SHunterTimersStatus"..i):SetScale( SHTvars["scale"] ); getglobal("SHunterTimersStatus"..i):SetAlpha( SHTvars["overallalpha"] ); end end function SHT_SetHeight() local height; if( not SHTvars["largetex"] ) or ( SHTvars["barheight"] >= 16 ) then height = SHTvars["numBars"] * (SHTvars["barheight"] + SHTvars["bardistance"]) - SHTvars["bardistance"] + 10; else height = SHTvars["numBars"] * (16 + SHTvars["bardistance"]) - SHTvars["bardistance"] + 10; end if( SHTvars["padding"] ) then height = height + 10; end SHunterTimersFrame:SetHeight(height); SHunterTimers_SetWidths(); end function SHunterTimers_UpdateSpells() for key,val in pairs(SHTvars["skills"]) do local i = 1; while( GetSpellTexture(i, BOOKTYPE_SPELL) ) do local spellName = GetSpellName(i, BOOKTYPE_SPELL); if( spellName == key ) then SHTvars["textures"][key] = GetSpellTexture(i, BOOKTYPE_SPELL); break; end i = i + 1; end end SHTvars["textures"][SHT_QUICK_SHOTS] = "Interface\\Icons\\Ability_Warrior_InnerRage"; SHTvars["textures"][SHT_FRENZY] = "Interface\\Icons\\Ability_Druid_ChallangingRoar"; SHTvars["textures"][SHT_EXPOSE_WEAKNESS] = "Interface\\Icons\\Ability_Hunter_SniperShot"; SHTvars["textures"][SHT_PRIMAL_BLESSING] = "Interface\\Icons\\Ability_Hunter_Harass"; SHTvars["textures"][SHT_ENTRAPMENT] = "Interface\\Icons\\Spell_Nature_StrangleVines"; SHTvars["textures"][SHT_DEVILSAUR] = "Interface\\Icons\\Ability_Hunter_Pet_Raptor"; SHTvars["textures"][SHT_ZHM] = "Interface\\Icons\\INV_Jewelry_Necklace_13"; SHTvars["textures"][SHT_EARTHSTRIKE] = "Interface\\Icons\\Spell_Nature_AbolishMagic"; SHTvars["textures"][SHT_SWARMGUARD] = "INV_Misc_AhnQirajTrinket_04"; SHTvars["textures"][SHT_JOM_GABBAR] = "Interface\\Icons\\Ability_Poisons"; SHTvars["textures"][SHT_KISS_SPIDER] = "Interface\\Icons\\INV_Trinket_Naxxramas04"; end function SHunterTimers_ClearActiveSpells() SHTvars["concuss"] = false; SHTvars["impconc"] = false; SHTvars["rapid"] = false; SHTvars["quick"] = false; SHTvars["petIntim"] = false; SHTvars["intimidate"] = false; SHTvars["deterrence"] = false; SHTvars["wingclip"] = false; SHTvars["impwing"] = false; SHTvars["freezing"] = false; SHTvars["scatter"] = false; SHTvars["wyvern"] = false; SHTvars["fearbeast"] = false; SHTvars["exposeweak"] = false; SHTvars["huntersmark"] = false; SHTvars["primalblessing"] = false; SHTvars["entrapment"] = false; SHTvars["aimed"] = false; SHTvars["berserking"] = false; SHTvars["devilsaur"] = false; SHTvars["zhm"] = false; SHTvars["earthstrike"] = false; SHTvars["swarmguard"] = false; SHTvars["jomgabbar"] = false; SHTvars["spider"] = false; end local SHTSetColorFunc = { [1] = function() SHTSetColor(1) end, [2] = function() SHTSetColor(2) end, [3] = function() SHTSetColor(3) end, [4] = function() SHTSetColor(4) end, [5] = function() SHTSetColor(5) end, [6] = function() SHTSetColor(6) end, [7] = function() SHTSetColor(7) end }; local SHTSetOpacityFunc = { [1] = function() SHTSetOpacity(1) end, [2] = function() SHTSetOpacity(2) end, [3] = function() SHTSetOpacity(3) end, [4] = function() SHTSetOpacity(4) end, [5] = function() SHTSetOpacity(5) end, [6] = function() SHTSetOpacity(6) end, [7] = function() SHTSetOpacity(7) end }; local SHTCancelFunc = { [1] = function(x) SHTCancelColor(1, x) end, [2] = function(x) SHTCancelColor(2, x) end, [3] = function(x) SHTCancelColor(3, x) end, [4] = function(x) SHTCancelColor(4, x) end, [5] = function(x) SHTCancelColor(5, x) end, [6] = function(x) SHTCancelColor(6, x) end, [7] = function(x) SHTCancelColor(7, x) end }; function SHT_ColorPicker(id) CloseMenus(); local texture = getglobal("SHunterTimersOptionsBarsColor"..id.."Swatch"); ColorPickerFrame.func = SHTSetColorFunc[id]; ColorPickerFrame:SetColorRGB(texture.r, texture.g, texture.b); ColorPickerFrame.previousValues = {r = texture.r, g = texture.g, b = texture.b, opacity =texture.a}; ColorPickerFrame.cancelFunc = SHTCancelFunc[id]; if( id < 5 ) then ColorPickerFrame.hasOpacity = true; ColorPickerFrame.opacity = 1 - texture.a; ColorPickerFrame.opacityFunc = SHTSetOpacityFunc[id]; else ColorPickerFrame.hasOpacity = false; end --OpacityFrame.opacityFunc = SHTSetOpacityFunc[id]; ColorPickerFrame:Show(); end function SHTSetOpacity(id) local a = 1 - OpacitySliderFrame:GetValue(); local texture = getglobal("SHunterTimersOptionsBarsColor"..id.."Swatch"); --DEFAULT_CHAT_FRAME:AddMessage(id); texture:SetAlpha(a); texture.a = a; end function SHTSetColor(id) local r, g, b = ColorPickerFrame:GetColorRGB(); local texture = getglobal("SHunterTimersOptionsBarsColor"..id.."Swatch"); --SHTSetOpacity(id); texture:SetVertexColor(r, g, b); texture.r = r; texture.g = g; texture.b = b; end function SHTCancelColor(id, prev) local texture = getglobal("SHunterTimersOptionsBarsColor"..id.."Swatch"); local r = prev.r; local g = prev.g; local b = prev.b; local a = prev.opacity; texture:SetVertexColor(r, g, b); texture:SetAlpha( a ); texture.r = r; texture.g = g; texture.b = b; texture.a = a; end function SHTColor(r, g, b, a) if( not a ) then a = 1; end return string.format("|c%02x%02x%02x%02x", (a*255), (r*255), (g*255), (b*255)); end function SHunterTimers_Tooltip(barframe) --DEFAULT_CHAT_FRAME:AddMessage(barframe:GetName()); if( barframe.target ) then GameTooltip_SetDefaultAnchor(GameTooltip, barframe); GameTooltip:ClearLines(); GameTooltip:AddLine( barframe.target ); GameTooltip:Show(); end end function SHT_sfind( s, pattern ) for p in string.gfind( pattern, "([^|]+)" ) do if( string.find( s, p ) )then return string.find( s, p ); end end return false; end function SHT_AddAutoShot() if( not SHTvars["skills"][SHT_AUTO_SHOT] ) then return; end shttimeleft = UnitRangedDamage("player"); SHunterTimersFrame_add( shttimeleft*1000, SHT_AUTO_SHOT ); end