vanilla-wow-addons – Rev 1
?pathlinks?
--[[
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