WOW Macro Library (DPS Rotations, Healing, Tanking, etc) menu

User Tag List

Page 1 of 31 12345 ... LastLast
Results 1 to 15 of 464
  1. #1
    Viral Fly-by's Avatar Contributor
    Reputation
    136
    Join Date
    Dec 2009
    Posts
    376
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    WOW Macro Library (DPS Rotations, Healing, Tanking, etc)

    ViralFly-by's Macro Library

    Ok...for my own sanity and for the sake of timeliness and organization, I have decided to start my own thread for my macros.

    My goal with this thread is to keep the first posts as my posts where I can edit/update them so that everything is always available at the beginning of the thread. I'll keep one post per class for the macros below and have links to jump right to them here in the beginning. I'll keep everything updated with the latest changes, fixes, enhancements that I've made to the macros. All of my macros come with a description as well as an explanation of the logic executed by the macro. The descriptions and explanations very clearly state what the macro does, what it does NOT do, and how it can be customized (where applicable). I've done my best in each macro to make them do as well as is possible...even always trying to account for talent choices, different haste values, etc. whenever possible.

    Below is the table of contents for this thread. You will find links to the post for each class as well as other relevant posts.

    Table of Contents
    1. Introduction
    2. Work Queue and Current Development Status
    3. Class Macros:
      1. Death Knight
      2. Druid
      3. Hunter
      4. Mage
      5. Rogue
      6. Paladin
      7. Priest
      8. Shaman
      9. Warlock
      10. Warrior
    4. Miscellaneous Macros
    5. Changelog
    6. FAQ


    Things You Need
    1. World of Warcraft
    2. LuaNinja (Total noob? Elitetech can help.)
    3. Kudos and Love...because you owe a ton of both to Cypher for LuaNinja
    4. Super Duper Macro
    5. A Brain
    Last edited by Viral Fly-by; 12-30-2009 at 04:12 PM.

    WOW Macro Library (DPS Rotations, Healing, Tanking, etc)
  2. #2
    Viral Fly-by's Avatar Contributor
    Reputation
    136
    Join Date
    Dec 2009
    Posts
    376
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Work Queue and Current Development Status

    Testing:
    1. Mutilate Rogue
    2. Affliction Warlock


    Current Queue:
    1. Resto Druid (Elitetech request)
    2. MM Hunter (sensisativa request)
    3. Unholy DK DPS (multiple request)
    4. Combat Rogue (Tardo request)
    5. Balance Druid (grambaM request)


    Planned but not yet prioritized:
    1. Feral Tank
    2. Destro Lock
    3. Disc Priest (Gnobiwan request)
    4. Blood DK DPS


    Finally here's ones I thought of but not even looked into and don't know if people want them anyway:
    1. Demonic Pact Warlock
    2. Holy Priest
    3. DK Tanking (Blood and/or Frost)
    4. Boomkin
    5. etc etc etc


    Completed:
    1. Enhancement Shaman
    2. Prot Pally 969 Rotation
    3. Felguard/Emberstorm Warlock
    4. Holy Paladin
    5. Resto Shaamn
    6. Elemental Shaman
    7. Mutilate Rogue
    8. Feral DPS
    9. Ret Paladin
    10. Affliction Warlock
    Last edited by Viral Fly-by; 01-06-2010 at 02:21 AM.

  3. #3
    Viral Fly-by's Avatar Contributor
    Reputation
    136
    Join Date
    Dec 2009
    Posts
    376
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Death Knight


    ================================================================================
    ================================================================================
    ================================================================================




    No macros yet... Stay tuned!

  4. #4
    Viral Fly-by's Avatar Contributor
    Reputation
    136
    Join Date
    Dec 2009
    Posts
    376
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Druid


    ================================================================================
    ================================================================================
    ================================================================================


    Feral DPS

    STATUS: Working
    Last Update: 2010-01-05

    Now for the Feral Druid DPS macro... Kitty is a nice priority rotation so it's fairly simple to model, but dealing with energy as well makes it a pain. This one will keep up Savage Roar and Rip as it's top priorities. It will also keep up Mangle (if not done via Mangle or Trauma by someone else in the party/raid) and Rake. It will refresh Savage Roar if it is either down or it will fall before the next time you need to Rip...this is so SR is for sure up when you Rip. It will only Rip with 5 combo points. If you are sitting at 5 CPs but Rip is still ticking, it will wait on it to fall. This is because clipping Rip is undesireable and may not work anyway because of the "a more powerful spell is already active" message. While waiting for Rip to fall, if your energy will reach 100 by the time Rip falls, then it will go ahead and use that excess energy to Mange/Rake/Shred. If it won't reach 100 by the time Rip falls, then it will just wait. If SR and Rip are both up, it will Mangle as necessary, Rake as necessary, and Shred for combo points. It will automaticall use Tiger's Fury when low on energy EXCEPT for when using it would produce useless energy while waiting for Rip to fall. It won't use Berserk, but it WILL understand that abilities cost half the energy while it's up. It WILL pop Barkskin when you're low on heatlh but it will do nothing else defensive.

    Code:
    # Version: 20100105
    /run if UnitHealth("player")/UnitHealthMax("player")<0.40 and GetSpellCooldown("Barkskin")==0 then CastSpellByName("Barkskin") end
    /run vSR=0 b={UnitBuff("player","Savage Roar")}; if b[7]~=nil then vSR=b[7]-GetTime() end;
    /run vTrauma=0 i=1 while(i<=40)do a={UnitDebuff("target",i)} if a[8]~="player" and (a[1]=="Mangle (Cat)" or a[1]=="Mangle (Bear)" or a[1]=="Trauma") then vTrauma=1 break else i=i+1 end end;
    /run vRip=0; vRake=0; vMangle=0; for i=1,40 do a={UnitDebuff("target",i)} if a[8]=="player" then d=a[7]-GetTime(); if a[1]=="Rip" then vRip=d elseif a[1]=="Rake" then vRake=d elseif a[1]=="Mangle (Cat)" then vMangle=d end end end
    /run c=CastSpellByName; p=UnitPower("player"); if GetSpellCooldown("Tiger's Fury")==0 and not UnitBuff("player","Berserk") and p<30 then if GetComboPoints("player")>4 then if vRip==0 or 60+p+vRip*10<100 then c("Tiger's Fury") end else c("Tiger's Fury") end end
    /run sre=({GetSpellInfo("Savage Roar")})[4]; if GetComboPoints("player")>0 and (vSR==0 or vSR-vRip<1 or (vSR<=3 and vRip>9)) and UnitPower("player")>=sre then CastSpellByName("Savage Roar") end
    /run c=CastSpellByName; p=UnitPower("player"); if GetComboPoints("player")>4 then if vRip==0 then if p>({GetSpellInfo("Rip")})[4] then c("Rip") end else d=vRip*10-5; me=({GetSpellInfo("Mangle (Cat)")})[4]; re=({GetSpellInfo("Rake")})[4]; se=({GetSpellInfo("Shred")})[4]; if d+p>=100 then if p>=me and vTrauma==0 and vMangle<3 then c("Mangle (Cat)") elseif p>=re and vRake<3 then c("Rake") elseif p>=se then c("Shred") end end end end
    /run if not UnitDebuff("target","Faerie Fire") and not UnitDebuff("target","Faerie Fire (Feral)") and GetSpellCooldown("Faerie Fire (Feral)")==0 then CastSpellByName("Faerie Fire (Feral)") end
    /run cp=GetComboPoints("player"); p=UnitPower("player"); if vTrauma==0 and vMangle<=vRake and not (((vSR==0 or vSR-vRip<0.5) and cp>0 and p<25) or cp>4) then me=({GetSpellInfo("Mangle (Cat)")})[4]; if vMangle<3 and p>=me then CastSpellByName("Mangle (Cat)") end end
    /run cp=GetComboPoints("player"); p=UnitPower("player"); if not (((vSR==0 or vSR-vRip<0.5) and cp>0 and p<25) or cp>4) and vRake<vMangle then re=({GetSpellInfo("Rake")})[4]; if vRake<2.5 and p>=re then CastSpellByName("Rake") end end
    /run cp=GetComboPoints("player"); p=UnitPower("player"); se=({GetSpellInfo("Shred")})[4]; if not (((vSR==0 or vSR-vRip<0.5) and cp>0 and p<25) or cp>4) then if p>se then CastSpellByName("Shred") end end
    /run StaticPopup_Hide("MACRO_ACTION_FORBIDDEN");
    The Logic:
    1. If your health is below 40% and Barkskin is ready, then Barkskin
    2. If Tiger's Fury is ready and you have less than 30 energy, then Tiger's Fury
    3. If you have at least 1 combo point, have at least 25 energy, and Savage Roar is down, will fall before Rip falls, or will fall soon and Rip has lots of time, then Savage Roar
    4. If you have a full 5 combo points...
      1. If Rip is down and you have the energy to Rip, then Rip
      2. Else...if you'll pass 100 energy before Rip falls...
        1. If you need to Mangle, then Mangle
        2. If you need to Rake, then Rake
        3. Shred

    5. If the target doesn't have Faerie Fire, then Faerie Fire
    6. If not waiting on energy for SR or Rip and you need to Mangle and have the energy, then Mangle
    7. If not waiting on energy for SR or Rip and you need to Rake and have the energy, then Rake
    8. If not waiting on energy for SR or Rip and have the energy, then Shred


    Other Notes:
    1. There is no way to detect if you are behind the target for Shred...so it just casts Shred and assumes you are smart enough to stand behind.
    2. It won't Mangle if someone else is putting up Mangle or Trauma.
    3. It won't use TF when the energy would be wasted.
    4. It autodetects the cost of abilities to handle various energy costs because of talents/Clearcasting/Berserk.
    5. It does NOT assume you have Survival Instincts and try to use it.
    6. It does NOT pop Berserk but it will utilize the reduced energy costs.
    7. It does NOT attempt to use Maim to interrupt.
    8. If you crit streak right after Rip and get 5 CPs, it will sit there waiting on Savage Roar or Rip...only using a special when there is excess energy.
    9. If won't ever Ferocious Bite...I thought about making it FB instead of Rip below a certain health threshold on target.
    10. If spammed it will clip the last tick of Rake. In my testing this performed better than ensuring it never clips.
    Last edited by Viral Fly-by; 01-08-2010 at 02:08 PM.

  5. #5
    Viral Fly-by's Avatar Contributor
    Reputation
    136
    Join Date
    Dec 2009
    Posts
    376
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Hunter


    ================================================================================
    ================================================================================
    ================================================================================




    No macros yet... Stay tuned!

  6. #6
    Viral Fly-by's Avatar Contributor
    Reputation
    136
    Join Date
    Dec 2009
    Posts
    376
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Mage


    ================================================================================
    ================================================================================
    ================================================================================




    No macros yet... Stay tuned!

  7. #7
    Viral Fly-by's Avatar Contributor
    Reputation
    136
    Join Date
    Dec 2009
    Posts
    376
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Rogue


    ================================================================================
    ================================================================================
    ================================================================================


    Assassination (Mutilate)

    STATUS: Working
    Last Update: 2010-01-07

    Here's my Mutilate Rogue macro... It automatically kicks the target if casting and it automatically does ToT on your focus. It will only ToT if you are in combat or stealthed...it does it stealthed so that you can ToT right before you open which is desired. Beyond that, it keeps up Hunger for Blood and Slice and Dice using Envenom to refresh. It checks all bleeds for Hunger for Blood (but does not check Mangle or Trauma since those are NOT bleeds and will NOT allow HfB). It will put up a Rupture if needed for HfB. If the target has more than 500K HP remaining, it will use Vanish to get Overkill (HP limit to prevent wasting vanish cooldown). If you have a full 5 combo points and a full 5 stacks of deadly poision, it will use Cold Blood for that Envenom. It will sometimes do nothing while waiting for energy for critical abilities. It will just Mutilate for combo points until at least 4 before doing an Envenom. If you have 4 combo points but not at least 4 stack so Deadly Poison, it will wait on the poison before using Envenom (it will Mutilate with extra energy while waiting for deadly poison stacks). (Note: It will not wait on the poison stacks if Envenom is needed to refresh SnD.)

    Code:
    # Version: 20100107
    /run if GetSpellCooldown("Kick")==0 and IsSpellInRange("Kick","target") and (UnitCastingInfo("target") or UnitChannelInfo("target")) then CastSpellByName("Kick") StopMacro() end
    /run vHfB=0 b={UnitBuff("player", "Hunger for Blood")}; if b[7]~=nil then vHfB=b[7]-GetTime() end;
    /run vSnD=0 b={UnitBuff("player", "Slice and Dice")}; if b[7]~=nil then vSnD=b[7]-GetTime() end;
    /run if (UnitAffectingCombat("player") or IsStealthed()==1) and UnitExists("focus") and GetSpellCooldown("Tricks of the Trade")==0 and IsSpellInRange("Tricks of the Trade","focus") then RunMacroText("/cast [@focus] Tricks of the Trade") end
    /run if IsStealthed()==1 and UnitPower("player")>= 50 then CastSpellByName("Garrote") StopMacro() end
    /run local ud=UnitDebuff; local c=CastSpellByName; local p=UnitPower("player"); if vHfB<4 then if ud("target","Rupture") or ud("target","Garrote") or ud("target","Deep Wounds") or ud("target","Rend") or ud("target","Savage Rend") or ud("target","Pounce Bleed") or ud("target","Rake") or ud("target","Rip") or ud("target","Piercing Shots") then if p>=15 then c("Hunger for Blood") end else if GetComboPoints("player")>0 then if p>=25 then c("Rupture") end else if p>=55 then c("Mutilate") end end end end
    /run local c=CastSpellByName; local p=UnitPower("player"); if vHfB>=4 and vSnD==0 then if GetComboPoints("player")>0 then if p>=25 then c("Slice and Dice") end else if p>=55 then c("Mutilate") end end end
    /run local c=CastSpellByName; local p=UnitPower("player"); if vHfB>=4 and vSnD<4 then if GetComboPoints("player")>0 then if p>=35 then c("Envenom") end else if p>=55 then c("Mutilate") end end end
    /run if vHfB>=4 and vSnD>=4 and not UnitBuff("player","Overkill") and GetSpellCooldown("Vanish")==0 and not UnitBuff("player", "Stealth") and UnitHealth("target")>500000 then CastSpellByName("Vanish") end
    /run if vHfB>=4 and vSnD>=4 and GetComboPoints("player")<4 and UnitPower("player")>=55 then CastSpellByName("Mutilate") end
    /run local c=CastSpellByName; local p=UnitPower("player"); local cp=GetComboPoints("player"); if vHfB>=4 and vSnD>=4 and cp>=4 and p>=35 then local dp=0; local i=1; while(i<=40)do local d={UnitDebuff("target",i)}; if d[1]=="Deadly Poison IX" and d[8]=="player" then dp=d[4] break end i=i+1 end; if dp>=4 then if cp==5 and dp==5 and GetSpellCooldown("Cold Blood")==0 then c("Cold Blood") end c("Envenom") elseif p>=85 then c("Mutilate") end end
    /run StaticPopup_Hide("MACRO_ACTION_FORBIDDEN");
    The Logic:
    1. If Kick is ready and the target is casting, then Kick
    2. If ToT is ready, you have a focus, and you are either in combat or stealthed, then ToT your focus
    3. If you are stealthed and have at least 50 energy, then Garrote
    4. If HfB is down or has less than 4 seconds remaining...
      1. If the target has a bleed...
        1. If you have 15 energy, then (re)activate HfB

      2. Else...
        1. If you have at least 1 CP and 25 energy, then put up a Rupture
        2. Else if you have at least 55 energy, Mutilate to get CP

    5. IF HfB is good but SnD is down...
      1. If you have at least 1 CP...
        1. If you have 25 energy, activate Slice and Dice

      2. Else (0 CP) if you have 55 energy, Mutilate to get CP
    6. If HfB is good but SnD has less than 4 seconds remaining...
      1. If you have at least 1 CP...
        1. If you have 35 energy, activate Envenom

      2. Else (0 CP) if you have 55 energy, Mutilate to get CP
    7. If HfB is good, SnD is good, you don't have Overkill, you're not Stealthed, Vanish is ready, and the target has more than 500K hp, then Vanish
    8. If HfB is good, SnD is good, you have less than 4 CP, and you have at 55 energy, then Mutilate to get CP
    9. If HfB is good, SnD is good, and you have at least 4 CP...
      1. If you have at least 4 stacks of Deadly Poison and 35 energy...
        1. If you have 5 CP and 5 stacks of DP and Cold Blood is ready, then Cold Blood
        2. Envenom
      2. Else (not enough Deadly Poison) if you have 85 energy, Mutilate
    Last edited by Viral Fly-by; 01-08-2010 at 02:07 PM.

  8. #8
    Viral Fly-by's Avatar Contributor
    Reputation
    136
    Join Date
    Dec 2009
    Posts
    376
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Paladin


    ================================================================================
    ================================================================================
    ================================================================================


    Holy

    STATUS: Working
    Last Update: 2010-01-06

    Here's my Holy Paladin macro... It uses your focus as the person to keep up Beacon and Sacred Shield. So you basically focus the tank and let the macro work. It will keep BoL and SS on the tank, and it will heal accordingly. If no one needs healing, it will Cleanse debuffs. It will also judge light on the focus target (tank's target). It will also pop Divine Plea if low on mana and it will bubble if you get low on health. It will use Divine Favor when someone is low and it will even use Hand of Protection on a caster that is low. It will use Divine Illumination when many targets have taken moderate damage in anticipation of many heals being cast.

    Also it fully uses Beacon of Light. It will always heal a different target and let Beacon heal the tank. If the tank needs much more healing than any other target, it will still heal someone else because Beacon will heal the tank...but it will use a larger spell because the tank needs it.

    Code:
    # Version: 20100106
    /run vFoL=3000; vHS=6000; vHL=8000; vHOPhp=0.2; vHOPmana=18000; vDFavor=0.2; vIllumNum=0.2; vIllumDmg=5000;
    /run vGroup="raid"; vNPS=1; vNPE=GetNumRaidMembers(); if vNPE==0 then vGroup="party"; vNPS=0; vNPE=GetNumPartyMembers() end; 
    /run if UnitHealth("player")/UnitHealthMax("player")<0.10 and GetSpellCooldown("Divine Shield")==0 and IsUsableSpell("Divine Shield") then SpellStopCasting() CastSpellByName("Divine Shield") end;
    /run if GetSpellCooldown("Divine Plea")==0 and UnitPower("player")/UnitPowerMax("player")<=0.50 then CastSpellByName("Divine Plea") end;
    /run local f=0; if UnitExists("focus") and UnitInRange("focus")==1 and UnitIsDeadOrGhost("focus")~=1 then for i=1,40 do local d={UnitBuff("focus",i)}; if d[1]=="Beacon of Light" and d[8]=="player" and d[7]-GetTime()>=3 then f=1; break end end if f==0 then RunMacroText("/cast [@focus] Beacon of Light") end end;
    /run local a,n,d=0,0,0; for i=vNPS,vNPE do local tt="player"; if i>0 then tt=vGroup..i end; if UnitExists(tt) and UnitInRange(tt)==1 and UnitIsDeadOrGhost(tt)~=1 then a=UnitHealthMax(tt)-UnitHealth(tt) end; if a>1000 then n=n+1 d=d+a end end; if n>(vNPE*vIllumNum) and d/n>vIllumDmg and GetSpellCooldown("Divine Illumination")==0 then CastSpellByName("Divine Illumination") end;
    /run local e,n,h,hm=UnitExists,UnitName,UnitHealth,UnitHealthMax; local f,w,fh,m="focus","focus",0,0; if e(f) then fh=hm(f)-h(f) end; for i=vNPS,vNPE do local a,tt=0,"player"; if i>0 then tt=vGroup..i end; if n(tt)~=n(f) then a=hm(tt)-h(tt) end; if a>m and UnitInRange(tt)==1 and UnitIsDeadOrGhost(tt)~=1 then m=a w=tt end end; if fh>2*m then m=fh end; if m>0 then vHealTarget=w vHealDmg=m else vHealTarget=nil vHealDmg=0 end
    /run local w,m=vHealTarget,vHealDmg; if w~=nil then local n,cd,ud,sp=UnitName,GetSpellCooldown,UnitDebuff,GetUnitSpeed("player"); local p=UnitHealth(w)/UnitHealthMax(w); local s=nil; if n(w)~=n("player") and p<vHOPhp and IsSpellInRange("Hand of Protection",w)==1 and UnitPowerMax(w)>vHOPmana and cd("Hand of Protection")==0 and UnitAffectingCombat(w)==1 and not ud(w,"Forbearance") and not ud(w,"Ice Block") then s="Hand of Protection" else if p<vDFavor and cd("Divine Favor")==0 then CastSpellByName("Divine Favor") end if cd("Holy Shock")==0 and (m>=vHS or (sp>0 and m>=vFoL)) then s="Holy Shock" elseif sp>0 and m>=vFoL and UnitBuff("player","Infusion of Light") then s="Flash of Light" elseif sp==0 then if m>=vHL then s="Holy Light" elseif m>=vFoL then s="Flash of Light" end end end; if s~=nil then RunMacroText("/cast [@"..w.."] "..s) end end
    /run if UnitExists("focustarget") and UnitInRange("focus")==1 and UnitAffectingCombat("focus")==1 and GetSpellCooldown("Judgement of Light") == 0 then RunMacroText("/cast [@focustarget] Judgement of Light") end;
    /run local f=0; if UnitExists("focus") and UnitInRange("focus")==1 and UnitIsDeadOrGhost("focus")~=1 then for i=1,40 do local d={UnitBuff("focus",i)}; if d[1]=="Sacred Shield" and d[8]=="player" and d[7]-GetTime()>=3 then f=1; break end end if f==0 then RunMacroText("/cast [@focus] Sacred Shield") end end;
    /run local w=nil; local m=0; for i=vNPS,vNPE do local tt="player"; if i>0 then tt=vGroup..i end; if UnitExists(tt) and UnitInRange(tt)==1 and UnitIsDeadOrGhost(tt)~=1 then for j=1,40 do local d={UnitDebuff(tt,j)}; if (d[5]=="Magic" or d[5]=="Poison" or d[5]=="Disease") and d[7]>m then w=tt; m=d[7] end end end end; if w~=nil then RunMacroText("/cast [@"..w.."] Cleanse") end;
    /run StaticPopup_Hide("MACRO_ACTION_FORBIDDEN");
    The Overall Logic:
    1. If you are under 10% health and Divine Shield is available, then stop casting and Divine Shield.
    2. If you are under 50% mana and Divine Plea is available, then Divine Plea.
    3. If you have a focus in range and your Beacon of Light is either not present or has 3 seconds or less remaining, then Beacon of Light your focus.
    4. If at least 20% of the party/raid have taken at least 1000 damage and the average damage per person is over 5000, use Divine Illumination if available.
    5. If a party/raid member needs healing, heal them.
    6. If your focus is in range and has a target and Judgement of Light is ready, then Judge your focus's target.
    7. If your you have a focus in range and Sacred Shield is either not present or has 3 seconds or less remaining, then Sacred Shield your focus.
    8. If a party/raid member has a debuff, Cleanse.


    The Healing Logic:
    1. If the target is below 20% hp, within 30yds, is a caster (max power > 18K), and doesn't have Forbearance, then Hand of Protection.
    2. If the target is under 10% hp and Divine Favor is available, then Divine Favor for the heal.
    3. If Holy Shock is ready and the target needs 6000 or more healing, then Holy Shock.
    4. If target needs 8000 or more healing, then Holy Light.
    5. If target needs 3000 or more healing, then Flash of Light.
    6. If no target needs at least 3000 healing, do nothing.


    Customization:
    There are 8 variables at the beginning of the 1st line. These control which spell is chosen for which situation and should be adjusted for how big your heals hit.
    1. vFoL: The minimum damage taken to be healed by a Flash of Light (3000 in code above).
    2. vHS: The minimum damage taken to be healed by Holy Shock (6000 in code above).
    3. vHL: The minimum damage taken to be healed by Holy Light (8000 in code above).
    4. vHOPhp: The percentage health at which Hand of Protection will be used on a caster (0.20 for 20% in code above).
    5. vHOPmana: The amount of "max power" a target must have to be considered for Hand of Protection (18000 in code above).
    6. vDFavor: The percentage health at which Divine Favor will be used for the next heal (0.1 for 10% in code above).
    7. vIllumNum: The percentage of party/raid members that must have taken damage to trigger use of Divine Illumination (0.2 for 20% in code above).
    8. vIllumDmg: The average per-person damage taken that must exist to trigger use of Divine Illumination (5000 in code above).


    Other Notes and Future Revisions:
    1. This does NOT attempt to use Lay on Hands for either healing or mana...this may be added in the future.
    2. It never uses Avenging Wrath...this is unlikely to be added (only you know when you really need it on a given fight).




    ================================================================================
    ================================================================================
    ================================================================================


    Protection

    STATUS: Working
    Last Update: 2010-01-04

    Here are macros for the standard Prot Paladin 969 rotation. If you want to learn about the rotation, there is a decent overview of it on TankSpot that I suggest. I've created 4 versions of the macro with various complexities. The first is a basic 969 that does not attempt to keep Sacred Shield up on yourself. It also does not use Hammer of Wrath. The 2nd version will sometimes skip dropping Consecration to instead rebuff Sacred Shield. The 3rd is the same as the 2nd except it will skip Judgement to rebuff Sacred Shield instead. The 4th is the most advanced. It will sometimes skip Consecration to rebuff Sacred Shield and it will also use Hammer of Wrath in place of every other Judgement (every other one so that we maintain the Judgement of Wisdom debuff on the target).

    They will all "reset" the rotation if you don't push the macro for more than 9 seconds (between pulls). They will NOT reset if you change target (useful for switching targets during trash). It will also not "skip" if you do something else with your GCD. If you do a Hand of Reckoning to taunt, it will just go right back to where it was...it won't skip over an ability because you used that GCD elsewhere.

    Notes:
    1. These will not automatically use Divine Protection...only you really know when you need it.
    2. They will not activate Divine Plea. You should activate it once on your own and then have it be refreshed by Guarded by the Light.


    Standard 969 (Judge, HotR, HS, SoR, Cons):
    Code:
    # Version: 20100104-Standard
    /run if vProtTS==nil then vProtTS=GetTime() end; if vProt6==nil then vProt6=0 end; if vProt9==nil then vProt9=0 end; if vProt969==nil then vProt969=9 end; 
    /run if GetTime()-vProtTS>9 then vProt6=0; vProt9=0; vProt969=9; end; vProtTS=GetTime();
    /run if vProt969==9 and vProt9==0 and GetSpellCooldown("Judgement of Wisdom")==0 then CastSpellByName("Judgement of Wisdom"); vProt9=1; vProt969=6; end;
    /run if vProt969==9 and vProt9==1 and GetSpellCooldown("Holy Shield")==0 then CastSpellByName("Holy Shield"); vProt9=2; vProt969=6; end;
    /run if vProt969==9 and vProt9==2 and GetSpellCooldown("Consecration")==0 then CastSpellByName("Consecration"); vProt9=0; vProt969=6; end;
    /run if vProt969==6 and vProt6==0 and GetSpellCooldown("Hammer of the Righteous")==0 then CastSpellByName("Hammer of the Righteous"); vProt6=1; vProt969=9; end;
    /run if vProt969==6 and vProt6==1 and GetSpellCooldown("Shield of Righteousness")==0 then CastSpellByName("Shield of Righteousness"); vProt6=0; vProt969=9; end;
    969 with SS for Cons (Judge, HotR, HS, SoR, SS/Cons):
    Code:
    # Version: 20100104-SSCons
    /run if vProtTS==nil then vProtTS=GetTime() end; if vProt6==nil then vProt6=0 end; if vProt9==nil then vProt9=0 end; if vProt969==nil then vProt969=9 end; 
    /run if GetTime()-vProtTS>9 then vProt6=0; vProt9=0; vProt969=9; end; vProtTS=GetTime();
    /run if vProt969==9 and vProt9==0 and GetSpellCooldown("Judgement of Wisdom")==0 then CastSpellByName("Judgement of Wisdom"); vProt9=1; vProt969=6; end;
    /run if vProt969==9 and vProt9==1 and GetSpellCooldown("Holy Shield")==0 then CastSpellByName("Holy Shield"); vProt9=2; vProt969=6; end;
    /run if vProt969==9 and vProt9==2 then i=1 while(i<=40) do a={UnitBuff("player",i)} if a[1]=="Sacred Shield" and a[8]=="player" then break else i=i+1 end end if i>40 then RunMacroText("/cast [@player] Sacred Shield"); vProt9=0; vProt969=6; elseif GetSpellCooldown("Consecration")==0 then CastSpellByName("Consecration"); vProt9=0; vProt969=6; end end;
    /run if vProt969==6 and vProt6==0 and GetSpellCooldown("Hammer of the Righteous")==0 then CastSpellByName("Hammer of the Righteous"); vProt6=1; vProt969=9; end;
    /run if vProt969==6 and vProt6==1 and GetSpellCooldown("Shield of Righteousness")==0 then CastSpellByName("Shield of Righteousness"); vProt6=0; vProt969=9; end;
    969 with SS for Judgement (SS/Judge, HotR, HS, SoR, Cons):
    Code:
    # Version: 20100104-SSJudge
    /run if vProtTS==nil then vProtTS=GetTime() end; if vProt6==nil then vProt6=0 end; if vProt9==nil then vProt9=0 end; if vProt969==nil then vProt969=9 end; 
    /run if GetTime()-vProtTS>9 then vProt6=0; vProt9=0; vProt969=9; end; vProtTS=GetTime();
    /run if vProt969==9 and vProt9==0 then i=1 while(i<=40) do a={UnitBuff("player",i)} if a[1]=="Sacred Shield" and a[8]=="player" then break else i=i+1 end end if i>40 then RunMacroText("/cast [@player] Sacred Shield"); vProt9=1; vProt969=6; elseif GetSpellCooldown("Judgement of Wisdom")==0 then CastSpellByName("Judgement of Wisdom"); vProt9=1; vProt969=6; end end;
    /run if vProt969==9 and vProt9==1 and GetSpellCooldown("Holy Shield")==0 then CastSpellByName("Holy Shield"); vProt9=2; vProt969=6; end;
    /run if vProt969==9 and vProt9==2 and GetSpellCooldown("Consecration")==0 then CastSpellByName("Consecration"); vProt9=0; vProt969=6; end;
    /run if vProt969==6 and vProt6==0 and GetSpellCooldown("Hammer of the Righteous")==0 then CastSpellByName("Hammer of the Righteous"); vProt6=1; vProt969=9; end;
    /run if vProt969==6 and vProt6==1 and GetSpellCooldown("Shield of Righteousness")==0 then CastSpellByName("Shield of Righteousness"); vProt6=0; vProt969=9; end;
    969 with SS for Cons and HoW for every other Judgement (HoW/Judge, HotR, HS, SoR, SS/Cons):
    Code:
    # Version: 20100104-SSCons-HowJudge
    /run if vProtTS==nil then vProtTS=GetTime() end; if vProtJudge==nil then vProtJudge=0 end; if vProt6==nil then vProt6=0 end; if vProt9==nil then vProt9=0 end; if vProt969==nil then vProt969=9 end; 
    /run if GetTime()-vProtTS>9 then vProt6=0; vProt9=0; vProt969=9; end; vProtTS=GetTime();
    /run if vProt969==9 and vProt9==0 and (UnitHealth("target")/UnitHealthMax("target")>0.2 or vProtJudge==1) and GetSpellCooldown("Judgement of Wisdom")==0 then CastSpellByName("Judgement of Wisdom"); vProt9=1; vProt969=6; vProtJudge=0; end;
    /run if vProt969==9 and vProt9==0 and UnitHealth("target")/UnitHealthMax("target")<=0.2 and vProtJudge==0 and GetSpellCooldown("Hammer of Wrath")==0 then CastSpellByName("Hammer of Wrath"); vProt9=1; vProt969=6; vProtJudge=1; end;
    /run if vProt969==9 and vProt9==1 and GetSpellCooldown("Holy Shield")==0 then CastSpellByName("Holy Shield"); vProt9=2; vProt969=6; end;
    /run if vProt969==9 and vProt9==2 then i=1 while(i<=40) do a={UnitBuff("player",i)} if a[1]=="Sacred Shield" and a[8]=="player" then break else i=i+1 end end if i>40 then RunMacroText("/cast [@player] Sacred Shield"); vProt9=0; vProt969=6; elseif GetSpellCooldown("Consecration")==0 then CastSpellByName("Consecration"); vProt9=0; vProt969=6; end end;
    /run if vProt969==6 and vProt6==0 and GetSpellCooldown("Hammer of the Righteous")==0 then CastSpellByName("Hammer of the Righteous"); vProt6=1; vProt969=9; end;
    /run if vProt969==6 and vProt6==1 and GetSpellCooldown("Shield of Righteousness")==0 then CastSpellByName("Shield of Righteousness"); vProt6=0; vProt969=9; end;
    The Logic:
    1. (9s #1) Judgement of Wisdom (maybe Sacred Shield of Hammer of Wrath depending on version)
    2. (6s #1) Hammer of the Righteous
    3. (9s #2) Holy Shield
    4. (6s #2) Shield of Righteousness
    5. (9s #3) Consecration (maybe Sacred Shield depending on version)


    Global Variables for State (for those who care):
    1. vProtTS :: Used to detect if been more than 9 seconds since the macro ran so it can reset.
    2. vProt969 :: Used to determine if the next ability is a 9-second one or a 6-second one.
    3. vProt9 :: Used to determine where in the sequence of the 9-second abilities the macro is...in first above, 0 = judge next, 1 = holy shield next, 2 = consecrate next.
    4. vProt6 :: Used to determine where in the sequence of the 6-second abilities the macro is...in first above, 0 = HotR next, 1 = SoR next.
    5. vProtJudge :: Used in the last macro above to alternate the "judgement" spot in the rotation between HoW and JoW. You only want to HoW every other to maintain the judgement effect.




    ================================================================================
    ================================================================================
    ================================================================================


    Retribution

    STATUS: Working
    Last Update: 2010-01-08

    Now for a Retribution Paladin macro... It follows the first come first serve priority system used by ret. It automatically detects your T9 and T10 set bonuses and adjusts the gear accordingly. Cooldown and range checks are included for all spells. Details about the priorities can be found below. Use of Holy Wrath is configurable with a variable.

    As for utility, the macro will automatically bubble if you get low on HP. It will also automatically use your Divine Plea (it tries to use it while all DPS skills are on CD but will use it as priority if mana drops lower). It will use both Hammer of Justice and Arcane Torrent to interrupt (but not at the same time of course). If you are moving but are slowed, it will automatically use Hand of Freedom. If you pull aggro or get too high on threat, it will use Hand of Salvation. It will also keep your Sacred Shield on you if all DPS skills are on cooldown.

    The macro will also automatically pop Avenging Wrath. It won't waste it on low health targets. If you are using Seal of Corruption/Vengeance, it will wait until you have 5 stacks of the debuff to pop it.

    Code:
    # Version: 20100108
    /startattack
    /run vUseHolyWrath=false
    /run local n=0; local sets={{48602,48631,1},{50324,50328,10},{51160,51164,10},{51275,51279,10}}; local slots={"HeadSlot","ShoulderSlot","ChestSlot","HandsSlot","LegsSlot"}; for i=1,#slots do local id=tonumber(({string.find(GetInventoryItemLink("player", ({GetInventorySlotInfo(slots[i])})[1]), "^\124c%x+\124Hitem:([^:]+):.*\124h%[.*%]")})[3]); for j=1,#sets do if id>=sets[j][1] and id<=sets[j][2] then n=n+sets[j][3] end end end; local a=n-math.floor(n/10)*10; local b=math.floor(n/10); vRet=0; if a>1 and b<2 then vRet=1 elseif a>1 and b>1 then vRet=2 elseif b>3 then vRet=3 end;
    /run if type(vJoW)~="function" then vJoW=function() if GetSpellCooldown("Judgement of Wisdom")==0 and IsUsableSpell("Judgement of Wisdom") and IsSpellInRange("Judgement of Wisdom","target") then CastSpellByName("Judgement of Wisdom") end end end;
    /run if type(vHoW)~="function" then vHoW=function() if GetSpellCooldown("Hammer of Wrath")==0 and IsUsableSpell("Hammer of Wrath") and IsSpellInRange("Hammer of Wrath","target") and UnitHealth("target")/UnitHealthMax("target")<0.2 then CastSpellByName("Hammer of Wrath") end end end;
    /run if type(vCS)~="function" then vCS=function() if GetSpellCooldown("Crusader Strike")==0  and IsUsableSpell("Crusader Strike") and IsSpellInRange("Crusader Strike","target") then CastSpellByName("Crusader Strike") end end end;
    /run if type(vDS)~="function" then vDS=function() if GetSpellCooldown("Divine Storm")==0 and IsUsableSpell("Divine Storm") and IsSpellInRange("Crusader Strike","target") then CastSpellByName("Divine Storm") end end end;
    /run if type(vCons)~="function" then vCons=function() if UnitPower("player")/UnitPowerMax("player")>=0.25 and GetSpellCooldown("Consecration")==0 and IsUsableSpell("Consecration") and IsSpellInRange("Crusader Strike","target") then CastSpellByName("Consecration") end end end;
    /run if type(vExo)~="function" then vExo=function() if UnitBuff("player", "The Art of War") and GetSpellCooldown("Exorcism")==0 and IsUsableSpell("Exorcism") and IsSpellInRange("Exorcism","target") then CastSpellByName("Exorcism") end end end;
    /run if type(vHWrath)~="function" then vHWrath=function() if vUseHolyWrath and GetSpellCooldown("Holy Wrath")==0 and IsUsableSpell("Holy Wrath") and IsSpellInRange("Crusader Strike","target") then CastSpellByName("Holy Wrath") end end end;
    /run if type(vPlea)~="function" then vPlea=function(m) if GetSpellCooldown("Divine Plea")==0 and UnitPower("player")/UnitPowerMax("player")<=m then CastSpellByName("Divine Plea") end end end;
    /run if UnitHealth("player")/UnitHealthMax("player")<0.10 then if GetSpellCooldown("Divine Shield")==0 and IsUsableSpell("Divine Shield") then SpellStopCasting() CastSpellByName("Divine Shield") elseif GetSpellCooldown("Divine Protection")==0 and IsUsableSpell("Divine Protection") then SpellStopCasting() CastSpellByName("Divine Protection") end end
    /run local t={UnitDetailedThreatSituation("player","target")}; if GetNumPartyMembers()>0 and (t[1]==1 or (t[5] ~=nil and t[5]>25000 and t[3]>90)) and GetSpellCooldown("Hand of Salvation")==0 then RunMacroText("/cast [@player] Hand of Salvation") end
    /run if (vRetInt==nil or GetTime()-vRetInt>1) and (UnitCastingInfo("target") or UnitChannelInfo("target")) then if IsUsableSpell("Hammer of Justice") and GetSpellCooldown("Hammer of Justice")==0 and IsSpellInRange("Hammer of Justice", "target")==1 then SpellStopCasting() CastSpellByName("Hammer of Justice") vRetInt=GetTime() elseif IsUsableSpell("Arcane Torrent") and GetSpellCooldown("Arcane Torrent")==0 and IsSpellInRange("Crusader Strike", "target")==1 then SpellStopCasting() CastSpellByName("Arcane Torrent") vRetInt=GetTime() end end
    /run local s=GetUnitSpeed("player"); if GetSpellCooldown("Hand of Freedom")==0 and s>0 and s<4.5 then RunMacroText("/cast [@player] Hand of Freedom") end;
    /run vPlea(0.20)
    /run if UnitAffectingCombat("player") and UnitHealth("target")>200000 and GetSpellCooldown("Avenging Wrath")==0 and IsUsableSpell("Avenging Wrath") and IsSpellInRange("Crusader Strike","target") then if UnitBuff("player","Seal of Corruption") or UnitBuff("player","Seal of Vengeance") then local i=1 while(i<=40)do local a={UnitDebuff("target",i)}; if (a[1]=="Holy Vengeance" or a[1]=="Blood Corruption") and a[8]=="player" and a[4]==5 then break else i=i+1 end end; if i<=40 then CastSpellByName("Avenging Wrath") end else CastSpellByName("Avenging Wrath") end end
    /run if vRet==0 then vHoW() vCS() vJoW() vDS() vCons() vExo() vHWrath() vPlea(0.70) end
    /run if vRet==1 then vJoW() vHoW() vCS() vDS() vCons() vExo() vHWrath() vPlea(0.70) end
    /run if vRet==2 then vJoW() vDS() vHoW() vCS() vCons() vExo() vHWrath() vPlea(0.70) end
    /run if vRet==3 then vDS() vCS() vJoW() vHoW() vCons() vExo() vHWrath() vPlea(0.70) end
    /run if UnitPower("player")/UnitPowerMax("player")>=0.50 then local f=0; for i=1,40 do local d={UnitBuff("player",i)}; if d[1]=="Sacred Shield" and d[8]=="player" then f=1 break end end; if f==0 then RunMacroText("/cast [@player] Sacred Shield") end end;
    /run StaticPopup_Hide("MACRO_ACTION_FORBIDDEN");
    The Overall Logic:
    1. If you are under 10% health and either Divine Shield or Divine Protection are available, then stop casting and Divine Shield/Protection.
    2. If you have at least 25K threat and either have pulled aggro or above 90% of aggro threat, then Hand of Salvation.
    3. If the target is casting and either Hammer of Justice or Arcane Torrent are available, then interrupt.
    4. If you are under 20% mana and Divine Plea is available, then Divine Plea.
    5. If you are moving, are slowed, and Hand of Freedom is available, then Hand of Freedom.
    6. If your target has more 200K hp and is in melee range and Avenging Wrath is ready...
      1. If you have Seal of Corruption/Vengeance on and the debuff is fully stacked to 5, then Avenging Wrath.
      2. Else (some other Seal) Avenging Wrath.
    7. Use the highest priority DPS skill that is off cooldown and in range.
    8. If below 70% mana and Divine Plea is available, then Divine Plea.
    9. If your Sacred Shield is not on you and you have at least 50% mana, Sacred Shield yourself.


    The DPS Priorities:
    1. Default:
      • Hammer of Wrath > Crusader Strike > Judgement > Divine Storm > Consecration > Exorcism > Holy Wrath
    2. 2-piece T9:
      • Judgement > Hammer of Wrath > Crusader Strike > Divine Storm > Consecration > Exorcism > Holy Wrath
    3. 2-piece T9 and 2-piece T10:
      • Judgement > Divine Storm > Hammer of Wrath > Crusader Strike > Consecration > Exorcism > Holy Wrath
    4. 4-piece T10:
      • Divine Storm > Crusader Strike > Judgement > Hammer of Wrath > Consecration > Exorcism > Holy Wrath


    Customizations:
    1. vUseHolyWrath :: If set to true, the macro will use Holy Wrath (default false for no holy wrath use).


    Other Notes:
    1. Sacred Shield is only refreshed on yourself if you have at least 50% mana.
    2. Consecration is only used if you have at least 25% mana.
    3. Hand of Freedom is used when running is slowed to less than backpedal speed.
    Last edited by Viral Fly-by; 01-08-2010 at 02:07 PM.

  9. #9
    Viral Fly-by's Avatar Contributor
    Reputation
    136
    Join Date
    Dec 2009
    Posts
    376
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Priest


    ================================================================================
    ================================================================================
    ================================================================================




    No macros yet... Stay tuned!

  10. #10
    Viral Fly-by's Avatar Contributor
    Reputation
    136
    Join Date
    Dec 2009
    Posts
    376
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Shaman


    ================================================================================
    ================================================================================
    ================================================================================


    Elemental

    STATUS: Working
    Last Update: 2010-01-04

    Now for the Elemental Shaman macro. See below for the details about how the priorities of the rotation work. This is a pretty complex macro as it even adjusts itself for your haste and talents (so it's still optimal during Bloodlust for example). It will also drop your totems, refresh water shield, and use Thunderstorm for mana.

    By default it just does a standard single target DPS rotation. However, if you manually drop a Magma Totem...then it detects that you are AOEing and will act accordingly. In AOE mode it will cast Fire Nova and it will also use Thunderstorm on CD (not just for mana). Also if you have an Air Totem but no Fire Totem, it assumes this is because you dropped a Magma Totem that expired so it will even replace it for you.

    Code:
    # Version: 20100104
    /run vGCD=({GetSpellInfo("Lesser Healing Wave")})[7]/1000; 
    /run vLVB={GetSpellCooldown("Lava Burst")}; if vLVB[1]==0 then vLVB=0 else vLVB=vLVB[2]+vLVB[1]-GetTime() end;
    /run if not UnitBuff("player", "Water Shield") then CastSpellByName("Water Shield") end;
    /run if UnitAffectingCombat("player")==1 and ({GetTotemInfo(4)})[2]=="" then CastSpellByName("Call of the Elements") end;
    /run if GetSpellCooldown("Thunderstorm")==0 and UnitPower("player")/UnitPowerMax("player")<0.40 and UnitAffectingCombat("player")==1 then CastSpellByName("Thunderstorm") end;
    /run local i=1 while(i<=40)do local a={UnitDebuff("target",i)}; if a[1]=="Flame Shock" and a[8]=="player" and a[7]-GetTime()>2 then break else i=i+1 end end; if i>40 and GetSpellCooldown("Flame Shock")==0 then CastSpellByName("Flame Shock") end;
    /run if GetSpellCooldown("Lava Burst")==0 then CastSpellByName("Lava Burst") end;
    /run if vLVB>vGCD and ({GetTotemInfo(1)})[2]=="Magma Totem VII" then if GetSpellCooldown("Fire Nova")==0 then CastSpellByName("Fire Nova") elseif GetSpellCooldown("Thunderstorm")==0 then CastSpellByName("Thunderstorm") end end;
    /run local t=({GetSpellInfo("Chain Lightning")})[7]/1000; if vLVB>t and GetSpellCooldown("Chain Lightning")==0 and UnitBuff("player", "Clearcasting") then CastSpellByName("Chain Lightning") end;
    /run if vLVB>vGCD and ({GetTotemInfo(1)})[2]=="" and ({GetTotemInfo(4)})[2]~="" then CastSpellByName("Magma Totem") end;
    /run local t=({GetSpellInfo("Lightning Bolt")})[7]/1000; if vLVB>t then CastSpellByName("Lightning Bolt") end;
    /run local be=({GetTalentInfo(1,18)})[5]; local rev=({GetTalentInfo(1,6)})[5]; local fscd=8-be-5*rev; local fs=0; local i=1; while(i<=40)do local a={UnitDebuff("target",i)}; if a[1]=="Flame Shock" and a[8]=="player" then fs=a[7]-GetTime() break else i=i+1 end end; if vLVB>vGCD and fs>fscd and GetSpellCooldown("Frost Shock")==0 then CastSpellByName("Frost Shock") end;
    /run StaticPopup_Hide("MACRO_ACTION_FORBIDDEN");
    The Logic:
    1. If you do not have Water Shield, refresh Water Shield.
    2. If you are in combat but do not have an Air Totem, Call of the Elements.
    3. If TS is ready and you are under 40% mana, Thunderstorm.
    4. If your Flame Shock is not on the target or has less than 2 seconds remaining, Flame Shock.
    5. If LvB is ready, Lava Burst.
    6. If your fire totem is a max rank Magma Totem and the cooldown on LvB is more than a GCD (haste adjusted)...
      1. If Fire Nova is ready, Fire Nova.
      2. If Thunderstorm is ready, Thunderstorm.
    7. If Chain Lightning is ready and the cooldown on LvB is more than CL cast time (haste adjusted) AND you have Clearcasting, Chain Lightning.
    8. If the cooldown on LvB is more than a GCD (haste adjusted) and you have an Air totem but no Fire totem, drop Magma Totem. (This assumes you activated AOE mode by dropping a Magma Totem and it has now expired.)
    9. If the cooldown on LvB is more than Lightning Bolt cast time (haste adjusted), Lightning Bolt.
    10. If the cooldown on LvB is more than a GCD (haste adjusted) and the duration of your Flame Shock is at least 2 seconds longer than your shock cooldown (talent adjusted), then Frost Shock.

    (Note: That last step basically never happens...the time before next Lava Burst would have to be more than a GCD, but less than lightning bolt cast time...AND you not have CL+Clearcasting...AND your flame shock have sufficient duration.)

    Note that this rotation is good for DPS, but it is hard on mana. It will only cast Chain Lightning if you have Clearcasting to save mana, but if you have decent crit you will still basically be casting it as soon as it comes up since Clearcasting will always be there.

    Also, the macro adjusts everything for your haste. So if you have more or less, then it will adjust itself accordingly. So if you have a trinket that procs haste or get a buff like Power Infusion or Bloodlust, it will continue to do the exact right thing for maximum damage.

    Finally, the macro does not interrupt...if you would like to abandon any cast to interrupt your target, add this as the first line:
    Code:
    /run if UnitIsEnemy("player", "target") and (UnitCastingInfo("target") or UnitChannelInfo("target")) and GetSpellCooldown("Wind Shear")==0 and IsSpellInRange("Wind Shear", "target")==1 then SpellStopCasting() CastSpellByName("Wind Shear") end
    If you prefer to let your current cast finish and then attempt to interrupt, use this line instead:
    Code:
    /run if not UnitCastingInfo("player") and UnitIsEnemy("player", "target") and (UnitCastingInfo("target") or UnitChannelInfo("target")) and GetSpellCooldown("Wind Shear")==0 and IsSpellInRange("Wind Shear", "target")==1 then CastSpellByName("Wind Shear") end
    Since Wind Shear is off the GCD, it should still interrupt perfectly with the second option...it just won't cancel a cast to do it...all elemental cast times are short so it should be more than sufficient for most interrupting needs...but if you really don't want to miss it, use the first option.



    ================================================================================
    ================================================================================
    ================================================================================


    Enhancement

    STATUS: Working
    Last Update: 2010-01-04

    Here's the Enhancement Shaman macro. It does a standard enhancement rotation as of 3.3. It keeps Lightning Shield up and keeps Flame Shock on the target. It uses the instant cast with 5 Maelstrom Weapon stacks. It keeps up Stormstrike and uses Earth Shock (preferably with SS up). It will also drop your totems via Call of the Elements if you are in combat and they are not down.

    By default it does single target DPS. This means that MW is used for a Lightning Bolt and Fire Nova is not used. Also in single target mode it will keep up a Searing Totem.

    If you drop a Magma Totem manually (or as part of your Call of the Elements), then it switches to "AOE mode". The AOE mode will use Fire Nova and auto refresh Magma Totem when it's down. The AOE mode will persist until you drop combat or until you drop a Fire Totem other than Magma.

    Code:
    # Version: 20100104
    /run if vAOE==nil or UnitAffectingCombat("player")~=1 then vAOE=0 end; 
    /run local t=({GetTotemInfo(1)})[2]; if t=="Magma Totem VII" then vAOE=1 elseif t~="" then vAOE=0 end
    /run if GetSpellCooldown("Wind Shear")==0 and IsSpellInRange("Wind Shear","target") and (UnitCastingInfo("target") or UnitChannelInfo("target")) then SpellStopCasting() CastSpellByName("Wind Shear") end
    /run if GetSpellCooldown("Shamanistic Rage")==0 and UnitPower("player")/UnitPowerMax("player")<0.20 then CastSpellByName("Shamanistic Rage") end
    /run local c=({UnitBuff("player","Maelstrom Weapon")})[4] if c~=nil and c==5 then CastSpellByName("Lightning Bolt") end
    /run if UnitAffectingCombat("player")==1 and ({GetTotemInfo(1)})[2]=="" then CastSpellByName("Call of the Elements") end;
    /run local i=1 while(i<=40) do local a={UnitDebuff("target",i)} if a[1]=="Flame Shock" and a[8]=="player" then break else i=i+1 end end; if i>40 and GetSpellCooldown("Flame Shock")==0 then CastSpellByName("Flame Shock") end
    /run local i=1 while(i<=40) do local a={UnitDebuff("target",i)} if a[1]=="Stormstrike" and a[8]=="player" then break else i=i+1 end end; if i<=40 and GetSpellCooldown("Earth Shock")==0 then CastSpellByName("Earth Shock") end
    /run if GetSpellCooldown("Stormstrike")==0 then CastSpellByName("Stormstrike") end
    /run if GetSpellCooldown("Earth Shock")==0 then CastSpellByName("Earth Shock") end
    /run if vAOE==1 and ({GetTotemInfo(1)})[2]=="" then CastSpellByName("Magma Totem") end
    /run if vAOE==1 and ({GetTotemInfo(1)})[2]~="" and GetSpellCooldown("Fire Nova")==0 then CastSpellByName("Fire Nova") end
    /run local c=({UnitBuff("player","Lightning Shield")})[4] if c==nil or c<2 then CastSpellByName("Lightning Shield") end
    /run if GetSpellCooldown("Lava Lash")==0 then CastSpellByName("Lava Lash") end
    The Logic:
    1. If the target is casting and Wind Shear is ready, then stop casting and Wind Shear.
    2. If Shamanistic Rage is ready and you are below 20% mana, then Shamanistic Rage.
    3. If you have 5 stacks of Maelstrom Weapon, then Lightning Bolt.
    4. If you are in combat but don't have a fire totem down, then Call of the Elements to drop totems.
    5. If the target does not have your Flame Shock and Flame Shock is ready, then Flame Shock.
    6. If the target has your Stormstrike and Earth Shock is ready, then Earth Shock.
    7. If Stormstrike is ready, then Stormstrike.
    8. If Earth Shock is ready, then Earth Shock.
    9. If AOE mode and you don't have a fire totem, then redrop Magma Totem.
    10. If AOE mode and Fire Nova is ready, then Fire Nova.
    11. If your Lightning Shield is down or has less than 2 stacks remaining, refresh Lightning Shield.
    12. If Lava Lash is ready, then Lava Lash.




    ================================================================================
    ================================================================================
    ================================================================================


    Restoration

    STATUS: Working
    Last Update: 2010-01-05

    Now for the Resto Shaman macro... It uses your focus as the person to keep up Earth Shield. So you basically focus the tank and let the macro work. It will keep Earth Shield on the tank, and it will heal accordingly. If no one needs healing, it will Cleanse debuffs. It will also refresh Water Shield on the shaman and drop Mana Tide if your mana is low. The macro will also attempt to interrupt your target if you are within range and Wind Shear is off CD. Finally, it will also detect if you have no fire totem active and drop your totems (it uses the Call of the Elements set to drop them).

    Code:
    # Version: 20100105
    /run vRT=2500; vRT2=5000; vLHW=4000; vHW=10000; vCH=10000; vNS=0.10;
    /run vGroup="raid"; vNPS=1; vNPE=GetNumRaidMembers(); if vNPE==0 then vGroup="party"; vNPS=0; vNPE=GetNumPartyMembers() end; 
    /run if UnitIsEnemy("player", "target") and (UnitCastingInfo("target") or UnitChannelInfo("target")) and GetSpellCooldown("Wind Shear")==0 and IsSpellInRange("Wind Shear", "target")==1 then SpellStopCasting() CastSpellByName("Wind Shear") end
    /run if GetSpellCooldown("Mana Tide Totem")==0 and UnitPower("player")/UnitPowerMax("player")<=0.10 and UnitAffectingCombat("player")==1 then CastSpellByName("Mana Tide Totem") end;
    /run local f=0; if UnitExists("focus") and UnitInRange("focus")==1 and UnitIsDeadOrGhost("focus")~=1 then for i=1,40 do d={UnitBuff("focus",i)}; if d[1]=="Earth Shield" and d[8]=="player" and d[4]>1 and d[7]-GetTime()>=60 then f=1; break end end if f==0 then RunMacroText("/cast [@focus] Earth Shield") end end;
    /run local m=0; local s,w; for i=vNPS,vNPE do local tt="player"; if i>0 then tt=vGroup..i end; if UnitExists(tt) and UnitInRange(tt)==1 and UnitIsDeadOrGhost(tt)~=1 then local a=UnitHealthMax(tt)-UnitHealth(tt); if a>m then m=a w=tt end end end; if GetSpellCooldown("Riptide")==0 and m>=vRT and m<vRT2 then s="Riptide" elseif m>=vHW then if GetSpellCooldown("Nature's Swiftness")==0 and UnitHealth(w)/UnitHealthMax(w)<vNS then s="NS" elseif UnitBuff("player","Tidal Waves") or UnitBuff("player","Bloodlust") or UnitBuff("player","Heroism") then s="Healing Wave" else s="Lesser Healing Wave" end elseif m>=vLHW then if UnitPowerMax(w) < vCH then s="Chain Heal" else s="Lesser Healing Wave" end end; if s=="NS" then SpellStopCasting(); CastSpellByName("Nature's Swiftness"); SpellStopCasting(); s="Healing Wave" end; if s~=nil then RunMacroText("/cast [@"..w.."] "..s) end;
    /run local w=nil; local m=0; for i=vNPS,vNPE do local tt="player"; if i>0 then tt=vGroup..i end; if UnitExists(tt) and UnitInRange(tt)==1 and UnitIsDeadOrGhost(tt)~=1 then for j=1,40 do local d={UnitDebuff(tt,j)}; if (d[5]=="Curse" or d[5]=="Poison" or d[5]=="Disease") and d[7]>m then w=tt; m=d[7] end end end end; if w~=nil then RunMacroText("/cast [@"..w.."] Cleanse Spirit") end;
    /run if not UnitBuff("player", "Water Shield") then CastSpellByName("Water Shield") end
    /run if UnitAffectingCombat("player")==1 then t={GetTotemInfo(1)}; if t[2]==nil or t[2]=="" then CastSpellByName("Call of the Elements") end end
    /run StaticPopup_Hide("MACRO_ACTION_FORBIDDEN");
    The Overall Logic:
    1. If your target is an enemy that is casting and Wind Shear is available and you are in range, then stop casting and Wind Shear.
    2. If you are under 10% mana and Mana Tide is available, then Mana Tide.
    3. If your Earth Shield on your focus is not present, has only 1 charge remaining, or has less than a minute remaining, then Earth Shield your focus.
    4. If a party/raid member needs healing, heal them.
    5. If a party/raid member has a debuff, Cleanse Spirit.
    6. If your Water Shield is down, then Water Shield.
    7. If your fire totem is not down, then drop totems with Call of the Elements.


    The Healing Logic:
    1. If Riptide is ready and the target needs between 2500 and 5000 healing, then Riptide.
    2. If the target needs 10000 or more healing...
      1. If Nature's Swiftness is available and the target is below 10% health, then NS+HW.
      2. If you have Tidal Waves or Bloodlust/Heroism, then Healing wave.
      3. Lesser Healing Wave
    3. If target needs 4000 or more healing...
      1. If the target is melee (detected by having less than 10K "power"), then Chain Heal.
      2. Lesser Healing Wave
    4. If no target needs at least 4000 healing, do nothing.


    Customization:
    There are 6 variables at the beginning of the 1st line. These control which spell is chosen for which situation and should be adjusted for how big your heals hit and how you want to heal.
    1. vRT: The minimum damage taken to be healed by Riptide (2500 in code above).
    2. vRT2: The maximum damage taken to be healed by Riptide (5000 in code above).
    3. vHW: The minimum damage taken to consider using Healing Wave or NS (also will not chain heal because assumed target needs heals faster) (10000 in code above).
    4. vNS: The fraction of health that triggers the use of Nature's Swiftness (0.10 in code above).
    5. vLHW: The minimum damage taken to be healed by Lesser Healing Wave or Chain Heal (4000 in code above).
    6. vCH: The max "power" that will be healed with Chain Heal.


    About Chain Healing:
    So the macro does a check on how much "power" the unit has using UnitPowerMax. This will return small numbers for melee (for example 100 for warriors, DKs, ferals, most rogues, etc) including ret and prot paladins. Since melee are likely to be grouped together, we will chain heal for the splash healing. If the target has more max "power" such as a mage or warlock, then we will just use LHW because it's more likely that CH won't jump anyway.

    Notable problems with this logic are enhancement shamans and some hunters. Most hunters should have over 10K mana so will count as "ranged"...which is correct. But enhancement shamans have over 10K as well but they are melee. I find it acceptable though.

    If you do not like this healing methodology and would prefer to always use Chain Heal, then set the vCH variable to something like 99999. Since everyone will have less than that, it will always chain heal. Similarly, if you prefer to always use LHW and never Chain Heal, then set vCH to 0.
    Last edited by Viral Fly-by; 01-08-2010 at 02:06 PM.

  11. #11
    Viral Fly-by's Avatar Contributor
    Reputation
    136
    Join Date
    Dec 2009
    Posts
    376
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Warlock


    ================================================================================
    ================================================================================
    ================================================================================


    Affliction

    STATUS: Working (Latest Version Awaiting Confirmation)
    Last Update: 2010-01-08

    Time for the Affliction Warlock macro. It keeps up the standard four debuffs with the standard priority (Haunt > Corruption > Curse of Agony > Unstable Affliction). It will cast instant Shadow Bolts with Shadow Trance. It will use Shadow Bolt for filler except during execute phase when Drain Soul is used. It will refresh dots as they fall. For Haunt and UA, it will start to cast them before they fall based on the cast time of the spell which is calculated to account for haste from gear/buffs/Bloodlust/etc. It will not cast a filler spell unless it will complete before any dots need refreshing (see below for more information). It will clip Drain Soul to refresh dots but will also sometimes wait for a Drain Soul tick to do so (see below for more information).

    Code:
    # Version: 20100108
    /run vHauntClip=100000; vCorrClip=250000; vCurseClip=250000; vUAClip=250000; vDotDelay=0.5; vDrainClipDelay=1.0; vHauntTravel=0.25;
    /run vHaunt,vUA,vCorr,vCurse=0,0,0,0; local i=1 while(i<=40)do local a={UnitDebuff("target",i)}; if a[8]=="player" then if a[1]=="Haunt" then vHaunt=a[7]-GetTime() elseif a[1]=="Unstable Affliction" then vUA=a[7]-GetTime() elseif a[1]=="Corruption" then vCorr=a[7]-GetTime() elseif a[1]=="Curse of Agony" then vCurse=a[7]-GetTime() end end i=i+1 end
    /run if vUAflag==nil then vUAflag=0 end; if ({UnitCastingInfo("player")})[1]=="Unstable Affliction" and vUAts==nil then vUAflag=1 vUAts=GetTime() end; if vUAflag==1 and GetTime()-vUAts>2 then vUAflag=0 vUAts=nil end
    /run vCanDrain=false; if UnitHealth("target")/UnitHealthMax("target")<0.25 then vCanDrain=true end;
    /run vDrainClip=true; local t={UnitChannelInfo("player")}; if t[1]=="Drain Soul" then local dsTick=(t[6]-t[5])/5000; t=GetTime()-(t[5]/1000); while(t-dsTick>0)do t=t-dsTick end; vDrainClip = ((dsTick-t)>vDrainClipDelay) end
    /run if UnitHealth("player") < 2000 then RunMacroText("/use Fel Healthstone") end
    /run if ({UnitChannelInfo("player")})[1]~="Drain Soul" and UnitHealth("player") > 7000 and (UnitPower("Player") < 3000 or not UnitBuff("player", "Life Tap")) then CastSpellByName("Life Tap") end 
    /run if vDrainClip and UnitBuff("player","Shadow Trance") and GetSpellCooldown("Shadow Bolt")==0 then CastSpellByName("Shadow Bolt") end
    /run local haunt=({GetSpellInfo("Haunt")})[7]/1000; if vHaunt<haunt+vHauntTravel and GetSpellCooldown("Haunt")==0 and vDrainClip and (UnitHealth("target")>vHauntClip or not vCanDrain) then CastSpellByName("Haunt") end
    /run if vCorr==0 and GetSpellCooldown("Corruption")==0 and vDrainClip and (UnitHealth("target")>vCorrClip or not vCanDrain) then CastSpellByName("Corruption") end
    /run if vCurse==0 and GetSpellCooldown("Curse of Agony")==0 and vDrainClip and (UnitHealth("target")>vCurseClip or not vCanDrain) then CastSpellByName("Curse of Agony") end
    /run local ua=({GetSpellInfo("Unstable Affliction")})[7]/1000; if vUA<ua+0.1 and vUAflag==0 and GetSpellCooldown("Unstable Affliction")==0 and vDrainClip and (UnitHealth("target")>vUAClip or not vCanDrain) then CastSpellByName("Unstable Affliction") end
    /run if ({UnitChannelInfo("player")})[1]~="Drain Soul" then local haunt=({GetSpellInfo("Haunt")})[7]/1000; local ua=({GetSpellInfo("Unstable Affliction")})[7]/1000; local sb=({GetSpellInfo("Shadow Bolt")})[7]/1000; local h = UnitHealth("target"); local dsTick=({GetSpellInfo("Searing Pain")})[7]/1000*2; local t,s; if vCanDrain then t=dsTick s="Drain Soul" else t=sb s="Shadow Bolt" end; if (h<vUAClip or t<vUA+ua+vDotDelay) and (h<vHauntClip or t<vHaunt+haunt+vHauntTravel+vDotDelay) and (h<vCorrClip or t<vCorr+vDotDelay) and (h<vCurseClip or t<vCurse+vDotDelay) then CastSpellByName(s) end end
    /run StaticPopup_Hide("MACRO_ACTION_FORBIDDEN");
    The Logic:
    1. If you have less than 2K hp, eat your Fel Healthstone.
    2. If you are not channeling Drain Soul, have at least 7K hp, and either don't have the buff or have less than 3K mana, then Life Tap.
    3. If you have Shadow Trance, then Shadow Bolt.
    4. If the target has at least 100K hp Haunt is either down or will fall before the cast completes, then Haunt (0.25 second travel time assumed).
    5. If the target has at least 250K hp and does not have your Corruption, then Corruption.
    6. If the target has at least 250K hp and does not have your Curse of Agony, then Curse of Agony.
    7. If the target has at least 250K hp and Unstable Affliction is either down or will fall before the cast completes, then Unstable Affliction.
    8. If the target is below 25% health and a Drain Soul will have at least 1 tick before the next dot needs casting, then Drain Soul.
    9. If a Shadow Bolt will cast before the next dot needs casting, then Shadow Bolt.


    Customization:
    There are 6 variables at the beginning of the 1st line. These control how the macro will behave in various situations.
    1. vHauntClip: The minimum health the mob must have for Haunt to be cast (100K default).
    2. vCorrClip: The minimum health the mob must have for Corruption to be cast (250K default).
    3. vCurseClip: The minimum health the mob must have for Curse of Agony to be cast (250K default).
    4. vUAClip: The minimum health the mob must have for Unstable Affliction to be cast (250K default).
    5. vDotDelay: The number of seconds you are willing to delay the casting of a dot in order to cast a filler spell (0.5 second default).
    6. vDrainClipDelay: The number of seconds you are willing to wait for a Drain Soul tick before reapplying a dot (1.0 second default).
    7. vHauntTravel: The travel time of Haunt to the target (0.25 second default).


    Dot Recasting:

    The macro will attempt to recast dots as soon as possible for maximum uptime without clipping. For Unstable Affliction and Haunt, this includes the cast time which is calculated to account for all haste (gear/buffs/Bloodlust/etc). So if fully buffed your UA cast is down to 1.1, then the macro will consider it eligible for casting 1.1 seconds before the one on the target expires. This helps ensure maximum uptime without clipping at all haste levels and during Bloodlust. The same calculation is done for Haunt. Haunt is assumed to have a 0.25 travel time to the target for these calculations. So Haunt will not be eligible for casting until the time remaining on the debuff is less than (Haunt Cast Time + Haunt Travel Time). The instant dots are not eligible for casting until they have fallen off the target (really only Curse since Corruption should stay refreshed forever by Haunt).

    Also dots will not be (re)cast on targets with low hp. The thresholds for casting dots are controlled by the variables in the first line. This is so you don't waste time dotting up a low health trash mob. But it also prevents you from breaking a Drain Soul to redot a target that is about to die. If there is still a lot of health, then clipping to redot is desirable, but there isn't much point to breaking Drain Soul if the mob is about to die anyway.


    Dot Delay (vDotDelay):

    One of the many key decisions in Affliction is whether or not to cast the next filler spell (either Shadow Bolt or Drain Soul). In the macro, I calculate the cast time of Shadow Bolt (haste adjusted for gear/buffs/Bloodlust/etc) and determine if you can complete the cast before a dot spell will need refreshing.

    Example: Your Shadow Bolt cast time is 2.1 seconds and your Curse of Agony debuff will last 2.2 seconds...cast Shadow Bolt.
    Example: Your SB cast is 2.1s and your Curse of Agony debuff will last 0.6s...do NOT cast SB...wait to do Curse.
    Example: Your SB cast is 2.1s, your Haunt is 1.25s, and your Haunt debuff will last 4s...cast SB (it will finish in time to still cast Haunt on schedule).
    Example: Your SB cast is 2.1s, your Haunt is 1.25s, and your Haunt debuff will last 2.5s...do NOT cast SB (it won't finish before it's time to cast Haunt).

    As you can see from these examples, the macro will sometimes not cast a filler spell because it will delay the casting of a dot spell. However I don't think you should never delay the casting of a dot spell at all. I think the extra damage of a Shadow Bolt is worth delaying a dot by a small amount...but what is that amount? That amount is the vDotDelay. It defaults to 0.5 seconds. So if casting the next Shadow Bolt will make you only 0.5 seconds late casting a dot, that's ok...go ahead and Shadow Bolt.

    Consider these examples with vDotDelay at the default 0.5 seconds.
    Example: Your SB cast is 2.1s and your CoA debuff will last 1.7s...cast SB (it will only delay CoA by 0.4 seconds which is less than vDotDelay).
    Example: Your SB cast is 2.1s and your CoA debuff will last 1.5s...do NOT cast SB(it will delay CoA by 0.6 seconds which is MORE than vDotDelay).

    The perfect value for this delay is not known and probably varies with different levels of haste/spellpower/etc. You may adjust the behavior by changing the value of vDotDelay. If you want to never delay any dots, the set it to 0. Unless the Shadow Bolt can complete entirely before the dot needs to be cast, it won't be cast. This will lower the number of Shadow Bolts you cast but give you absolute maximum dot uptime. If you always want to cast the Shadow Bolt unless a dot already needs to be refreshed, then set vDotDelay to something like 10. That means it will be willing to delay a dot as long as necessary. With that setting, if the dots are ticking, it will cast a Shadow Bolt whether the dots are at full duration or just 5 milliseconds from expiration. This will increase the number of Shadow Bolts you cast at the expense of uptime on dots.


    Dot Delay with Drain Soul:

    In the previous section I discussed the mechanics of the Dot Delay specifically with regard to using Shadow Bolt as the filler. Below 25% health, the macro will be using Drain Soul as the filler. We obviously don't want to have to wait for the entire Drain Soul channel before refreshing dots so it will clip. So the macro calculates the time until the first tick of Drain Soul (this is adjusted for haste from gear/buffs/Bloodlust/etc). So all of the logic from the previous section applies to Drain Soul as well...except it checks to see if the first tick of Drain Soul will happen before a dot needs refreshing. If you won't get at least 1 tick of Drain Soul before it's time to refresh a dot, it won't waste the mana to start channeling Drain Soul.


    Drain Soul Clipping:

    It is desirable during the execute phase to clip your Drain Soul in order to refresh dots. However Drain Soul is a very high DPS spell and ideally you won't clip it right before it's about to tick. The macro handles this situation. If you are channeling Drain Soul, it will calculate the time until the next tick (adjusted for haste from gear/buffs/Bloodlust/etc). If Drain Soul is about to tick, it will wait for the tick before clipping it to recast a dot. How much it is willing to wait is controlled by the vDrainClipDelay variable. This defaults to 1.0 second. So if you are channeling Drain Soul and it is time to recast a dot, it will NOT clip the Drain Soul if there will be a tick from Drain Soul in less than 1.0 second. You can customize this behavior by adjusting the value of vDrainClipDelay. If you never want to wait for a tick and always clip Drain Soul immediately, set vDrainClipDelay to 0. This will clip Drain Soul faster causing fewer Drain Soul ticks but will keep your dots up more. As another example if you always want to wait for the next Drain Soul tick before refreshing dots, then set vDrainClipDelay to 3. This will give you more Drain Soul ticks at the expense of a small delay in refreshing dots because of waiting for the tick before clipping. As with other customizations, the default value is an attempt to guess at an optimal balance.



    ================================================================================
    ================================================================================
    ================================================================================


    Hybrid (Felguard/Emberstorm)

    STATUS: Working
    Last Update: 2010-01-07

    So here's a macro for the once-popular Felguard/Emberstorm spec. This was extremely popular a few patches ago and is still one of the best and probably the simplest to play (hence easy to macro). The macro basically maintains Corruption, Curse of Agony, and Immolate on the mob (depending on its hp) and uses Incinerate as filler. It will switch to Soul Fire with the Decimation buff. The macro does NOT automatically eat your healthstone or check that your armor/spellstone/firestone. It also doesn't try to check if you should be doing CoE (no other source of the debuff up on target). It could also of course be changed to do CoD instead for high HP targets. Expect future revisions to add these features.

    The Spec: Talent Calculator - World of Warcraft

    Code:
    # Version: 20100107
    /run if vImmo==nil then vImmo=0 end; if ({UnitCastingInfo("player")})[1]=="Immolate" and vImmots==nil then vImmo=1 vImmots=GetTime() end; if vImmo==1 and GetTime()-vImmots>2 then vImmo=0 vImmots=nil end
    /run if UnitHealth("player") < 2000 then RunMacroText("/use Fel Healthstone") end;
    /run if UnitHealth("player") > 7000 and (UnitPower("Player") < 3000 or not UnitBuff("player", "Life Tap")) then CastSpellByName("Life Tap") end
    /run if UnitBuff("player", "Decimation") then CastSpellByName("Soul Fire") end
    /run if UnitHealth("target")>100000 then local i=1 while(i<=40)do local a={UnitDebuff("target",i)}; if a[1]=="Corruption" and a[8]=="player" and a[7]-GetTime()>0 then break else i=i+1 end end; if i>40 and GetSpellCooldown("Corruption")==0 then CastSpellByName("Corruption") end end
    /run if UnitHealth("target")>100000 then local i=1 while(i<=40)do local a={UnitDebuff("target",i)}; if a[1]=="Curse of Agony" and a[8]=="player" and a[7]-GetTime()>0 then break else i=i+1 end end; if i>40 and GetSpellCooldown("Corruption")==0 then CastSpellByName("Curse of Agony") end end
    /run if UnitHealth("target")>50000 then local immo=({GetSpellInfo("Immolate")})[7]/1000; local i=1 while(i<=40)do local a={UnitDebuff("target",i)}; if a[1]=="Immolate" and a[8]=="player" and a[7]-GetTime()>immo then break else i=i+1 end end; if i>40 and vImmo==0 and GetSpellCooldown("Immolate")==0 then CastSpellByName("Immolate") end end
    /run CastSpellByName("Incinerate")
    /run StaticPopup_Hide("MACRO_ACTION_FORBIDDEN");
    The Logic:
    1. If you have less than 2K hp, eat your Fel Healthstone.
    2. If you have at least 7K hp, then Life Tap if either you don't have the buff or you have less than 3K mana.
    3. If you have Decimation for another half second, cast Soul Fire (half-second because of latency).
    4. If the target has at least 100K hp and does not have your Corruption, then Corruption.
    5. If the target has at least 100K hp and does not have your Curse of Agony, then Curse of Agony.
    6. If the target has at least 50K hp and does not have your Immolate, then Immolate.
    7. Cast Incinerate (filler spell)
    Last edited by Viral Fly-by; 01-08-2010 at 03:26 PM.

  12. #12
    Viral Fly-by's Avatar Contributor
    Reputation
    136
    Join Date
    Dec 2009
    Posts
    376
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Warrior


    ================================================================================
    ================================================================================
    ================================================================================




    No macros yet... Stay tuned!

  13. #13
    Viral Fly-by's Avatar Contributor
    Reputation
    136
    Join Date
    Dec 2009
    Posts
    376
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Miscellaneous Macros

    This is where I'm going to keep random macros that are more general or that serve a special purpose. I may also put some lua explanations and other macro tidbits here.


    ================================================================================


    Target the Skull (or the X):
    [SPOILER]
    A common macro request is how to "target the skull". Access to the protected functions via LuaNinja makes this more possible. These macros will attempt to target the Skull. If the skull is not found, they will instead try to target the Red X.

    This first one works as long as someone else in your party or raid is already targetting the skull or X. If no one is, then your target will remain unchanged.
    Code:
    /run local targetIcon=function(icon) local g="raid"; local nps=1; local npe=GetNumRaidMembers(); if npe==0 then g="party"; nps=0; npe=GetNumPartyMembers() end; for i=nps,npe do if UnitExists(g..i) and UnitExists(g..i.."target") and GetRaidTargetIndex(g..i.."target")==icon then TargetUnit(g..i.."target") break end end end; targetIcon(8); if not UnitExists("target") or GetRaidTargetIndex("target")~=8 then targetIcon(7) end;
    This second one will first try to find someone in your party or raid who is already targetting the skull or X. If no one is, it will tab target up to 10 times looking for the symbol.
    Code:
    /run local targetIcon=function(icon) local g="raid"; local nps=1; local npe=GetNumRaidMembers(); if npe==0 then g="party"; nps=0; npe=GetNumPartyMembers() end; local f=0; for i=nps,npe do if UnitExists(g..i) and UnitExists(g..i.."target") and GetRaidTargetIndex(g..i.."target")==8 then TargetUnit(g..i.."target") f=1 break end end; if f==0 then for n=1,10 do TargetNearestEnemy(); if GetRaidTargetIndex("target")==8 then break end end end end; targetIcon(8); if not UnitExists("target") or GetRaidTargetIndex("target")~=8 then targetIcon(7) end;
    [/SPOILER]

    Mark the Blood Beasts on Saurfang:
    [SPOILER]
    I, for one, like having marks on the Blood Beasts...I think it makes it easier to see where they are and how many are still alive. It's also easier to call for help on a specific symbol. So if you have Assist in your raid, you can use this macro to put a mark on all of them. Works on both 10-man (Skull and Red X) and 25-man (Skull, Red X, Blue Square, Moon, Green Triangle). This macro also requires LuaNinja. This is not possible without access to the protected functions which is why Deadly Boss Mods cannot mark them even if it wanted to do so.
    Code:
    /run local index=8; for i=1,10 do TargetNearestEnemy(); if (UnitName("target")=="Blood Beast" and GetRaidTargetIndex("target")==nil) then SetRaidTarget("target", index); index=index-1; end end
    [/SPOILER]

    ================================================================================
    ================================================================================
    ================================================================================


    Lua Explanations

    Formatting and Reading the Macros:
    [SPOILER]
    One of the things I've been asked a lot is how in the heck some of these macros work. I hope to explain some of that with this post.

    First off, let me say that FORMATTING THE MACRO LIKE REAL CODE makes a huge difference as to how understandable it is. For example, consider this line from a macro:
    Code:
    /run f=0; if UnitExists("focus") then for i=1,40 do d={UnitBuff("focus",i)}; if d~=nil and d[1]=="Earth Shield" and d[8]=="player" and d[4]>1 and d[7]-GetTime()>=60 then f=1; break end end if f==0 then RunMacroText("/cast [@focus] Earth Shield") end end;
    WTF? Now format it properly...
    Code:
    /run f=0; 
    if UnitExists("focus") then 
    	for i=1,40 do 
    		d={UnitBuff("focus",i)}; 
    		if d~=nil and d[1]=="Earth Shield" and d[8]=="player" and d[4]>1 and d[7]-GetTime()>=60 then 
    			f=1; 
    			break 
    		end 
    	end 
    	if f==0 then 
    		RunMacroText("/cast [@focus] Earth Shield") 
    	end 
    end;
    Hopefully that makes more sense...you can see it's saying "if the focus exists" and then it's looking 1 to 40 checking each buff to see if it is Earth Shield from the player and some other stuff (they are checking the number of charges and time remaining). If it find such a buff on the focus, it sets f=1. So if the loop finishes and never found the buff, f will still be 0 (from the first line). So then we say "if f==0 then" and cast a new earth shield. Voila!
    [/SPOILER]
    Heal Line from Resto Shaman:
    [SPOILER]
    Now for something a bit more complex...this is the "heal" line from my Resto Shaman macro...I've formatted it and added in comments in green to explain what each part is doing:
    Code:
    RT=2500;  -- Set variable for minimum damage taken to use Riptide
    RT2=5000; -- Set variable for maximum damage taken to use Riptide
    LHW=4000; -- Set variable for min dmg taken to use Lesser Healing Wave
    HW=10000; [COLOR="SeaGreen"]-- Set variable for min dmg taken to use Healing Wavev
    CH=10000; -- Set variable for "chain hheal threshold"
    NS=0.10;  -- Set variable for health threshold that will trigger use of Nature's Swiftness
    
    
    -- So we're going to be scanning the party/raid to find out who to heal...so we need unitids
    -- If it's a party, we need:  player, party1, party2, party3, party4
    -- If it's a raid, we need:  raid1, raid2, ..., raid40
    -- So we want to set 3 variables:
    --   t is the prefix of the unitid, either raid or party
    --   nps is "num players start"...so start with 1 for raid...start with 0 for party (party0 will become "player" later)
    --   npe is "num players end"...so it is the number of people in the raid/party
    
    t="raid"; nps=1; 
    npe=GetNumRaidMembers(); -- How many members in raid?  If no raid, we'll get 0.
    if npe==0 then -- if it was not a raid
    	-- then go party mode
    	t="party"; nps=0; npe=GetNumPartyMembers() 
    end; 
    
    s=nil; -- s will eventually hold the name of the spell we're going to cast
    m=0;   -- m will hold the maximum amount of damage taken by any raid/party member
    w=f;   -- w will hold the unitid of the person who took the max dmg
    
    -- loop through all the people in the raid/partyv
    for i=nps,npe do 
    	-- set tt to the unitid to check
    	-- normally just t..i is correct...but there is no partyN unitid for you,
    	-- so we use this if statement to change "party0" into "player"
    	if i==0 then tt="player" else tt=t..i end; 
    
    	-- if that unit exists, is in range, and isn't dead
    	if UnitExists(tt) and UnitInRange(tt)==1 and UnitIsDeadOrGhost(tt)~=1 then 
    		-- a holds how much damage they've taken
    		a=UnitHealthMax(tt)-UnitHealth(tt); 
    		-- if a is more than m, this person is our new "max damage" person
    		if a>m then 
    			-- save the damage they took (m) and their unit (w)
    			m=a w=tt 
    		end 
    	end 
    end; 
    
    -- after the loop is complete, we now know who is missing the most hp (w is their unitid) 
    -- and how much hp they are missing (m), so use those values to choose a spell (s)
    
    -- If Riptide is ready and the damage falls within Riptide's range, then set our spell to Riptide
    if GetSpellCooldown("Riptide")==0 and m>=RT and m<RT2 then 
    	s="Riptide" 
    
    -- Else if the damage is high enough to warrant a full Healing Wave...
    elseif m>=HW then 
    	-- If NS is ready and their health is below the NS threshold, then set our spell to NS
    	if GetSpellCooldown("Nature's Swiftness")==0 and UnitHealth(w)/UnitHealthMax(w)<NS then 
    		s="NS" 
    
    	-- Else if you have Tidal Waves or Bloodlust, then set our spell to Healing Wave
    	elseif UnitBuff("player","Tidal Waves") or UnitBuff("player","Bloodlust") or UnitBuff("player","Heroism") then 
    		s="Healing Wave" 
    
    	-- Otherwise just use LHW
    	else 
    		s="Lesser Healing Wave" 
    	end 
    
    -- Else if they've taken enough damage to warrant healing at all...
    elseif m>=LHW then 
    	-- If their maximum "power" is less than the Chain Heal threshold, set our spell to CH
    	-- The premise is that people with low max "power" are melee and so they are close enough
    	-- to each other to let CH bounce. People with higher max "power" are likely ranged and so
    	-- CH may not bounce so then LHW is faster/better.
    	if UnitPowerMax(w) < CH then 
    		s="Chain Heal" 
    
    	-- Otherwise just use LHW
    	else 
    		s="Lesser Healing Wave" 
    	end 
    end; 
    
    -- now we know who to heal and how to heal them...so let's do it.
    
    
    -- If we're using NS, stop casting and pop NS...then set the spell to Healing Wave
    if s=="NS" then 
    	SpellStopCasting(); 
    	CastSpellByName("Nature's Swiftness"); 
    	SpellStopCasting(); 
    	s="Healing Wave" 
    end; 
    
    -- Finally...if a spell was selected, cast that spell (s) on the appropriate unitid (w)
    -- If the person with the most damage wasn't hurt enough to warrrant healing, s will
    -- still be nil and so no  spell will be cast.
    if s~=nil then 
    	RunMacroText("/cast [@"..w.."] "..s) 
    end;
    This is how I write them...properly formatted...then at the very end I just delete all the new lines to combine each concrete step into it's own /run line.

    Hopefully someone finds this useful or at least interesting and maybe it helps some understand a bit more about what in the heck is going on in these macros. If you have any specific questions, just ask! =)
    [/SPOILER]
    Affliction Warlock:
    [SPOILER]
    This is the Affliction Warlock macro...there's a LOT going on here...
    Code:
    vHauntClip=100000;  -- Threshold of HP at which we will no longer clip Drain Soul to cast Haunt
    vCorrClip=250000;   -- Threshold of HP at which we will no longer clip Drain Soul to cast Corruption
    vCurseClip=250000;  -- Threshold of HP at which we will no longer clip Drain Soul to cast Curse of Agony
    vUAClip=250000;     -- Threshold of HP at which we will no longer clip Drain Soul to cast Unstable Affliction
    
    vDotDelay=0.5;      -- Number of seconds we're willing to delay the casting of a dot to finish a Shadow Bolt or Drain Soul tick
    vDrainClipDelay=1.0;-- Number of seconds we're willing to delay the clipping of Drain Soul to wait it to tick
    
    vHauntTravel=0.25;  -- The assumed travel time of Haunt to the target
    
    -- These variables hold the remaining duration on our target of each dot.
    vHaunt,vUA,vCorr,vCurse=0,0,0,0; 
    
    -- For each of the 40 debuffs...
    local i=1 while(i<=40)do 
    	local a={UnitDebuff("target",i)}; -- Get the debuff's info
    
    	-- If it is our debuff...	
    	if a[8]=="player" then 
    		-- If it's Haunt, store the time remaining in vHaunt
    		if a[1]=="Haunt" then vHaunt=a[7]-GetTime() 
    		-- If it's UA, store the time remaining in vUA
    		elseif a[1]=="Unstable Affliction" then vUA=a[7]-GetTime() 
    		-- If it's Corruption, store the time remaining in vCorruption
    		elseif a[1]=="Corruption" then vCorr=a[7]-GetTime() 
    		-- If it's Curse of Agony, store the time remaining in vCurse
    		elseif a[1]=="Curse of Agony" then vCurse=a[7]-GetTime() 
    		end 
    	end
    	i=i+1 
    end
    
    
    -- We need to prevent double casting of Unstable Affliction...we're going
    -- to use the variables vUAflag and vUAts to store whether or not we've cast
    -- UA in the last 2 seconds.
    
    
    -- Initialize it to 0 (meaning DO cast UA)
    if vUAflag==nil then vUAflag=0 end; 
    -- If we're CURRENTLY casting UA and the timestamp isn't already set...
    if ({UnitCastingInfo("player")})[1]=="Unstable Affliction" and vUAts==nil then 
    	-- Record that UA is being cast and record the time at which we observed the ongoing cast.
    	-- Setting the flag to 1 will prevent UA from being cast again.
    	vUAflag=1 vUAts=GetTime() 
    end;
    -- If the flag is set...but the time at which it was set was more than 2 seconds ago...
    if vUAflag==1 and GetTime()-vUAts>2 then 
    	-- Reset the flag and timestamp to allow UA again.
    	vUAflag=0 vUAts=nil 
    end
    
    -- vCanDrain holds whether or not the target is under 25% so we should Drain Soul
    vCanDrain=false; if UnitHealth("target")/UnitHealthMax("target")<0.25 then vCanDrain=true end;
    
    -- vDrainClip holds whether or not to clip Drain Soul...it will not be clipped if
    -- the next tick will occur in the amount of time defined by vDrainClipDelay above.
    vDrainClip=true; -- Assume we are going to clip
    local t={UnitChannelInfo("player")}; -- Get our spell channeling info
    -- If we are channeling Drain Soul...
    if t[1]=="Drain Soul" then
    	-- Determine time between ticks of Drain Soul accounting for all haste gear/buffs/etc...
    	-- Drain Soul is a 15-second channel that ticks every 3 seconds base...so we just take the total time of THIS Drain Soul and divide by 5...
    	local dsTick=(t[6]-t[5])/5000; -- (endTime - startTime) / 5000 (5000 rather than 5 to convert milliseconds to seconds)
    	-- Set t to how many seconds Drain Soul has been channeling so far...
    	t=GetTime()-(t[5]/1000); 
    	-- Subtract the time of any ticks that have already taken place...
    	-- This leaves t containing how many seconds into the current tick we are...
    	while(t-dsTick>0)do t=t-dsTick end; 
    	-- Set t to how many seconds until the next tick
    	t=dsTick-t;
    	-- Set vDrainClip to true if the next tick won't occur before the time defined by vDrainClipDelay...otherwise false (meaning we'll wait for the tick)
    	vDrainClip = (t>vDrainClipDelay) 
    end
    
    -- If we're under 2K health, use our Healthstone
    if UnitHealth("player") < 2000 then RunMacroText("/use Fel Healthstone") end
    
    -- If we're not channelling Drain Soul, have at least 7K health, and either have less than 3K mana or don't have the Life Tap buff, then Life Tap
    if ({UnitChannelInfo("player")})[1]~="Drain Soul" and UnitHealth("player") > 7000 and (UnitPower("Player") < 3000 or not UnitBuff("player", "Life Tap")) then CastSpellByName("Life Tap") end 
    
    -- If we can clip Drain Soul (from above) and we have Shadow Trance, then instant Shadow Bolt
    if vDrainClip and UnitBuff("player","Shadow Trance") and GetSpellCooldown("Shadow Bolt")==0 then CastSpellByName("Shadow Bolt") end
    
    
    -- Haunt
    local haunt=({GetSpellInfo("Haunt")})[7]/1000; -- get the current cast time of haunt with all haste/buffs/etc
    -- If the remaining time on Haunt debuff (vHaunt) is less than the cast time (haunt) plus the travel time (vHauntTravel)...
    if vHaunt<haunt+vHauntTravel 
    	-- and Haunt is off cooldown
    	and GetSpellCooldown("Haunt")==0 
    	-- and we're either not channeling Drain Soul or can clip it...
    	and vDrainClip 
    	-- and the target is either not in execute range or has health above the threshold set by vHauntClip...
    	and (UnitHealth("target")>vHauntClip or not vCanDrain) 
    -- then cast Haunt.
    then CastSpellByName("Haunt") end
    
    -- Corruption
    -- If Corruption is down and the other conditions same as Haunt...then cast Corruption
    if vCorr==0 and GetSpellCooldown("Corruption")==0 and vDrainClip and (UnitHealth("target")>vCorrClip or not vCanDrain) then CastSpellByName("Corruption") end
    
    -- Curse of Agony
    -- If CoA is down and the other conditions same as Haunt...then cast Curse of Agony
    if vCurse==0 and GetSpellCooldown("Curse of Agony")==0 and vDrainClip and (UnitHealth("target")>vCurseClip or not vCanDrain) then CastSpellByName("Curse of Agony") end
    
    -- Unstable Affliction
    local ua=({GetSpellInfo("Unstable Affliction")})[7]/1000; -- get the current cast time of UA with all haste/buffs/etc
    -- If the cast time of UA (ua) is at least 0.1 seconds longer than the remaining duration of the UA debuff (vUA) and the other conditions same as Haunt...then cast UA
    if vUA+0.1<ua and vUAflag==0 and GetSpellCooldown("Unstable Affliction")==0 and vDrainClip and (UnitHealth("target")>vUAClip or not vCanDrain) then CastSpellByName("Unstable Affliction") end
    
    
    -- Filler (Shadow Bolt or Drain Soul)
    -- Only cast a filler spell if we're not already channeling Drain Soul...
    if ({UnitChannelInfo("player")})[1]~="Drain Soul" then 
    	-- Get the cast time of Haunt, Unstable Affliction, and Shadow Bolt with current haste/buffs/etc...
    	local haunt=({GetSpellInfo("Haunt")})[7]/1000; 
    	local ua=({GetSpellInfo("Unstable Affliction")})[7]/1000; 
    	local sb=({GetSpellInfo("Shadow Bolt")})[7]/1000; 
    	
    	-- Get current health of target
    	local h = UnitHealth("target");
    	
    	-- Get time between ticks for a Drain Soul cast with current haste/buffs/ticks...
    	-- This works because Drain Soul ticks every 3 seconds base and Searing Pain is 1.5 seconds base...
    	-- ...so 2 Searing Pain casts == 1 Drain Soul tick
    	local dsTick=({GetSpellInfo("Searing Pain")})[7]/1000*2; 
    
    	local t,s; -- s is spell we'll cast...t is time we need (time to complete SB...or time until first tick of DS)
    	
    	-- If execute range (vCanDrain), then set spell to Drain Soul and time needed to the time until the first tick
    	if vCanDrain then t=dsTick s="Drain Soul" 
    	-- Else set spell to Shadow Bolt and time to the cast time of Shadow Bolt
    	else t=sb s="Shadow Bolt" end; 
    	
    	-- If either the target's health is so low we won't clip Drain Soul to cast UA...
    	-- ...or our available time (t) is less than the duration of UA debuff (vUA) plus cast time of UA (ua) plus the dot delay (vDotDelay)...
    	if (h < vUAClip or t < vUA+ua+vDotDelay) 
    		-- and the same is true of Haunt...
    		and (h < vHauntClip or t < vHaunt+haunt+vHauntTravel+vDotDelay )
    		-- and the same is true of Corruption...
    		and (h < vCorrClip or t < vCorr+vDotDelay)
    		-- and the same is true of Curse of Agony...
    		and (h < vCurseClip or t < vCurse+vDotDelay)
    	-- If all that is true...we can cast a Shadow Bolt before a dot needs refreshing...or we can get AT LEAST ONE tick of Drain Soul before a dot needs refreshing...
    	then CastSpellByName(s) end -- so cast it!
    end
    [/SPOILER]
    Last edited by Viral Fly-by; 01-08-2010 at 03:30 PM.

  14. #14
    Viral Fly-by's Avatar Contributor
    Reputation
    136
    Join Date
    Dec 2009
    Posts
    376
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Changelog

    • 2010-01-08
      1. Added Holy Wrath to Retribution Paladin
      2. Added Version Numbers to Macros and Last Updated on posts
      3. Updated Affliction Warlock (bug and logic fixes)
      4. Added Affliction Warlock to Lua Explanations

    • 2010-01-07
      1. Added Lua Explanation to Miscellaneous Macros

    • 2010-01-06
      1. More tweaks Affliction Warlock
      2. Added two Miscellaneous Macros

    • 2010-01-05
      1. Tweaked/Fixed Affliction Warlock
      2. Small tweak to Assassination Rogue

    • 2010-01-04
      1. Updated Holy Paladin (tweaks and fixes)
      2. Added Affliction Warlock (needs testing)

    • 2010-01-03
      1. Updated Felguard/Emberstorm Warlock (fixed double immolate)

    • 2010-01-02
      1. Updated Holy Paladin (new features and fixes)
      2. Updated Retribution Paladin (fixes and enhancements)

    • 2010-01-01
      1. Added Retribution Paladin
      2. Added Balance Druid to Queue

    • 2009-12-31
      1. Fixed typo in Holy Paladin and Resto Shaman (hat tip Elitetech)
      2. Fixed bug (hopefully) causing Holy Paladin not to judge (hat tip ToonsThatPwn and pinhe1ro)
      3. Moved Combat Rogue and Ret Paladin to active work queue

    • 2009-12-30
      1. Added to FAQ
      2. Created Thread
      3. Imported current macros

    • 2009-12-29
      1. Wrote Intro, Queue, FAQ, Class posts, etc.
    Last edited by Viral Fly-by; 01-08-2010 at 03:31 PM.

  15. #15
    Viral Fly-by's Avatar Contributor
    Reputation
    136
    Join Date
    Dec 2009
    Posts
    376
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    FAQ

    1. Q: Do you have MSN/etc?
      • A: No. If that changes, you'll see it here and in the thread.


    2. Q: How do I use these macros?
      • A: You need LuaNinja and SuperDuperMacro. Copy-paste the macro into SDM, drag it to a bar, spam.


    3. Q: Can you make me a macro for PVP?
      • A: No. PVP is too situational. Maybe someday I'll write some macros for PVP, but not right now.


    4. Q: Can you make me a macro for some specific situation in PVP like doing an interrupt?
      • A: That's more likely. I can help with small scope macros for specific things in PVP.


    5. Q: Should I post in the thread or send a PM with my question/request?
      • A: Either is acceptable...but if you post in the thread, others may answer and others may benefit from the knowledge.


    6. Q: Can you make me a macro for XXX?
      • A: Check out my work queue above to see what I'm working on now and what's upcoming. If you want something else, post in the thread.


    7. Q: How come the XXX macro doesn't do YYY?
      • A: Most likely it's because I didn't think it should... I don't always think the macro should do everything for you. Maybe it's so you can use those abilities on your own more optimally if you actually know how to play. Heaven forbid you have to play your character! ZOMG!


    8. Q: How do I do this one specific thing in Lua?
      • A: Search my macros for code doing something similar. If you can't find it, ask in the thread. I may also make a thread about Lua questions in particular.


    9. Q: How do I find out if I am behind the target for Shred or Backstab in a macro?
      • A: You can't. Stop parry-gibbing your tank and get behind the mob noob.


    10. Q: How do I make the macro spam itself while I'm in combat?
      • A: You don't...you lazy bastard. If you really want to know it's out there...but if you're too lazy to push the button, you may be too lazy to find it.


    11. Q: The macro just says in say/party/guild/etc chat the code when I press it.
      • A: This is caused by bad line endings. Re copy-paste the macro from the thread. You can also try going the code and making sure each whitespace character (space or newline) really is just that.


    12. Q: Can I contribute my macro to your collection?
      • A: Maybe. I hold them to a very high standard. In fact, I'm very dissatisfied with even my own macros for some silly things they do or how they perform suboptimally. If you have a great one though I will add it with credit to you. Otherwise I might take it and rewrite it in my style with my enhancements and tweaks and then include it. It's a case-by-case basis.


    13. Q: How can I help?
      • A: Test the macros. I don't have all the classes. In the Main Menu, under Interface, under Help, check Display Lua Errors. If the macro gives an error, post what exactly it is and is not doing as well as the first few lines of the error if there is one. The more information you give the better I can debug.
      • A: Tell me what you want...for classes I don't know as well I need details about priorities/rotations/etc.


    14. Q: Your macro isn't working.
      • A: Is it one of the ones in testing? If so, post your problem with any errors (see above about testing). If not, it should work.


    15. Q: It's one that's tested but it still doesn't work.
      • A: Do you have LuaNinja working? Did you copy-paste it correctly? It works for others...it must be you. Don't make us all laugh at you.


    16. Q: So I took your macro and I added all this cool stuff but now it doesn't work quite right...can you help?
      • A: Maybe...it depends on my mood...if you're a hapless noob and you totally fouled it up then probably not... Also it depends on what you're trying to make it do...I don't agree with everything everyone thinks should be in the macros.



Page 1 of 31 12345 ... LastLast

Similar Threads

  1. [Selling] [DPSEngine] Automated Rotations For Vanilla WoW 1.12.1 (Elysium/Nost/Kronos/Etc)
    By Soapbox in forum WoW Private Server Buy Sell Trade
    Replies: 19
    Last Post: 12-15-2017, 07:40 AM
  2. Frost Spec DK DPS Rotation Macro
    By HonorEtVeritas in forum WoW UI, Macros and Talent Specs
    Replies: 7
    Last Post: 07-30-2011, 12:35 AM
  3. [Guide] How to be a Feral Druid Tank [Bear] (Rotation, spec, prof, etc)
    By Willzy in forum World of Warcraft Guides
    Replies: 7
    Last Post: 09-13-2010, 05:58 PM
  4. [Fury Warrior][Macro] DPS Rotation with Instaslam! + Proc bypass method
    By Muramasa in forum WoW UI, Macros and Talent Specs
    Replies: 6
    Last Post: 07-24-2010, 11:56 PM
  5. DK dps rotation macro(blood/unholy)
    By Shakenbaken2 in forum WoW UI, Macros and Talent Specs
    Replies: 7
    Last Post: 08-05-2009, 11:10 AM
All times are GMT -5. The time now is 08:10 AM. Powered by vBulletin® Version 4.2.3
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. User Alert System provided by Advanced User Tagging (Pro) - vBulletin Mods & Addons Copyright © 2024 DragonByte Technologies Ltd.
Digital Point modules: Sphinx-based search