Public feed
#889867
/*
======================================================================
RCore.iss - Routine Core 2.0* Put this in openbot/routines
======================================================================
*/
objectdef RCore inherits oBase
{
/*
======================================================================
Core Variables - Don't touch.
======================================================================
*/
variable int TravelingForm = 0 ;The Position on the shapeshift bar of the form to be used for Traveling
variable int DPSForm = 0 ;The Position on the shapeshift bar of the form to be used for DPS
variable int SurvForm = 0 ;The Position on the shapeshift bar of the form to be used for Survival
variable int CurrentForm = 0 ;The Position on the shapeshift bar of the form I am currently in. 0 if in no form
variable int HealTarget = 0 ;The Group number of the person I am trying to heal
variable int MsgType = 1 ;For RDebug. The level of the line I am checking to output.
variable int TargetCD = 0 ;For RTarget. How long left until I can switch targets, in pulses.
variable int WaitTime = 0 ;For RWait. How long to wait for.
variable int ReqForm = 0 ;For Usable checks. The form I need to be in to use the skill.
variable int CurrentSpellSchool = 0 ;For Immunties. The school of the last spell I tried to cast.
variable int Immunity = 0 ;For Immunties. Which spell school I am avoiding using.
variable int CostMulti = 1 ;For Usable checks. Set from whether you are currently using energy/rage/mana.
variable int AssistTarget = 1 ;The Group number of the person I am assisting. Usually either the tank or whoever is in combat.
variable int NewForm = 0 ;For RShift. The form I am trying to get to.
variable int NewFormIndex = 0 ;For RShift. The Position on the shapeshift bar of the form I am trying to use.
variable int Random = 0 ;Random number generated between 1-100 when a random decison is needed.
variable int DangerLevel = 0 ;The current level danger. Set from SetDanger.
variable int Dangerlvl = 0 ;Danger interpretation of the raw number for the routine to use.
variable int i = 0 ;Fixed.
variable int j = 0 ;Fixed.
variable int ReleaseTime = 0
variable int TrinketCooldown = 0
variable int CombatTime = 0 ;For checking if combat has gone on too long
variable int CombatStart = ${LavishScript.RunningTime} ;For checking if combat has gone on too long
variable int CurrentWait = 0 ;For RWait. The time remaining to wait.
variable int PullTimer = 0 ;For Pulling. Timer starts when I first attempt to pull. For checking for bad pulls or doing one off buffs.
variable int PullTimeOut = 20000 ;For Pulling. How long before trying another pull? Def 20000.
variable int RTraining = 0 ;For Training at Moonglade. The stage through the training routine I am currently on.
variable int Form1 = 1 ;For Getting the positions of forms on the shapeshift bar.
variable int Form2 = 2 ;For Getting the positions of forms on the shapeshift bar.
variable int Form3 = 3 ;For Getting the positions of forms on the shapeshift bar.
variable int Form4 = 4 ;For Getting the positions of forms on the shapeshift bar.
variable int Form5 = 5 ;For Getting the positions of forms on the shapeshift bar.
variable int Form6 = 6 ;For Getting the positions of forms on the shapeshift bar.
variable int Form7 = 7 ;For Getting the positions of forms on the shapeshift bar.
variable int Form8 = 8 ;For Getting the positions of forms on the shapeshift bar.
variable string CurrentSpell = "Nothing" ;For Immunities. The last spell I tried to cast.
variable string Msg = "" ;For passing UI errors from the actual routine. The UI error string.
variable string RealmChar = "${ISXWoW.RealmName}_${Me.Name}_${Me.Class}"
variable bool Behind = FALSE ;For Energy routine. Am I behind the target?
variable point3f TargetLoc = 0,0,0 ;For Training at Moonglade. Where to move to next.
/*
======================================================================
Initialize
======================================================================
*/
method Initialize()
{
/* Add extra pulses */
Bot:AddPulse["RCore","CurePulse",${Class.CureCheck},TRUE,TRUE]
if ${Class.JoinGroups}
{
Bot:AddPulse["RCore","GroupPulse",100,TRUE,TRUE]
}
if ${Class.StartGroup} && ${Group.Members} == 0 && ${WoWScript[GetFriendInfo(1),5]}
{
WoWScript InviteUnit(\"${WoWScript[GetFriendInfo(1)]}\")
}
/* Auto-start the routine if applicable */
This:Output["Auto-start: ${Class.AutoStart}"]
if ${Class.AutoStart}
{
Bot.PauseFlag:Set[FALSE]
}
This:LoadConfig
This:Output[Ritz's Core Routine V2.0 Loaded.]
This:Output[Algebraic!]
}
/*
======================================================================
Shut Down
======================================================================
*/
method ShutDown()
{
/* Target myself to get any nearby bots running RCore to come to me */
target ${Me}
}
/*
=====================================================================
Group Pulse (Only called if ${Class.JoinGroups} == TRUE)
=====================================================================
*/
method GroupPulse()
{
if ${Group.Members} == 0 && ${Me.PctHPs} > 10
{
/* If I'm not in a group, accept any invites */
wowscript AcceptGroup()
wowscript StaticPopup1:Hide()
}
}
/*
=====================================================================
Need Combat Idle
=====================================================================
*/
member NeedCombatIdle()
{
/* If I have no target, my target is not in combat, or I'm targetting myself or a friend, do CombatIdle */
if ${Party.AssistType.Equal["ASSIST"]} && (!${Me.Target(exists)} || !${Me.Target.InCombat} || ${Me.Target.Name.Equal[${Me.Name}]} || ${Target.ReactionLevel} > 4)
{
This:RDebug["I need to do Idle in combat stuff",3]
return TRUE
}
This:RDebug["I don't need to do Idle in combat stuff",3]
return FALSE
}
/*
=====================================================================
Combat Idle
=====================================================================
*/
method CombatIdle()
{
Party:Assist
}
/*
=====================================================================
Cure Pulse
=====================================================================
*/
method CurePulse()
{
if !${Me.InCombat}
{
CombatStart:Set[${LavishScript.RunningTime}]
}
if ${Me.Buff[Drink](exists)} && ${Me.PctMana} < 90
{
return
}
if ${Me.PctMana} > 15 && !${Toon.Casting}
{
Party:CureAll()
}
}
/*
=====================================================================
Mana Buff Check
=====================================================================
*/
method ManaBuffCheck()
{
if ${This.Usable[${Class.ManaBuffSpell},${Class.FManaBuffSpell}]}
{
Party:PartyCast[100, 100, 30, ${Class.ManaBuffSpell}, TRUE, FALSE]
}
}
/*
=====================================================================
Stealth (or Shadowmeld)
=====================================================================
*/
method Stealth()
{
if ${Toon.IsDotted}
{
return
}
if !${Me.Buff[${Class.StealthSpell}](exists)} && ${This.Usable[${Class.StealthSpell},${Class.FStealthSpell}]}
{
Toon:CastSpell[${Class.StealthSpell}]
return
}
if !${Me.Buff[${Class.StealthSpell}](exists)} && !${Me.Buff[Shadowmeld](exists)} && !${Movement.Speed} && ${This.Usable["Shadowmeld",${Class.FShadowmeld}]}
{
Toon:CastSpell[Shadowmeld]
return
}
return
}
/*
=====================================================================
Need Buff
=====================================================================
*/
member NeedBuff()
{
if ${This.NeedSelfBuff}
{
return TRUE
}
if !${Me.Buff[${Class.Buff1}](exists)} && ${This.Usable[${Class.Buff1},${Class.FBuff1}]}
{
return TRUE
}
if !${Me.Buff[${Class.Buff2}](exists)} && ${This.Usable[${Class.Buff2},${Class.FBuff2}]}
{
return TRUE
}
if !${Me.Buff[${Class.Buff3}](exists)} && ${This.Usable[${Class.Buff3},${Class.FBuff3}]}
{
return TRUE
}
if ${This.CurrentForm} == ${Class.FPotion} && !${This.checkForScrolls.Equal["NONE"]}
{
return TRUE
}
return FALSE
}
/*
=====================================================================
Need Rest
=====================================================================
*/
member NeedRest()
{
if ${This.RWait} > 0
{
return TRUE
}
if ${This.RTraining} == 15 && ${POI.NeedClassTrainer} == TRUE
{
return FALSE
}
if ${This.RTraining} > 0
{
return TRUE
}
if (${Party.AssistType.Equal["REST"]} && (${POI.Type.Equal[HOTSPOT]} || ${POI.Type.Equal[MOB]})
{
return TRUE
}
if ${Me.Buff[Drink](exists)} || ${Me.Buff[Food](exists)} || ${Me.Buff[Resurrection Sickness](exists)}
{
return TRUE
}
if (${Me.PctHPs} < ${Class.RestHP}) || (${Me.PctMana} < ${Class.RestMana} && ${Me.Power.Equal["Mana"]})
{
return TRUE
}
return FALSE
}
/*
=====================================================================
Buff Pulse
=====================================================================
*/
method BuffPulse()
{
This:CheckCurrentForm
if ${This.NeedSelfBuff}
{
target ${Me}
This:BuffRoutine
return
}
if !${Me.Buff[${Class.Buff1}](exists)} && ${This.Usable[${Class.Buff1},${Class.FBuff1}]}
{
target ${Me}
This:BuffRoutine
return
}
if !${Me.Buff[${Class.Buff2}](exists)} && ${This.Usable[${Class.Buff2},${Class.FBuff2}]}
{
target ${Me}
This:BuffRoutine
return
}
if !${Me.Buff[${Class.Buff3}](exists)} && ${This.Usable[${Class.Buff3},${Class.FBuff3}]}
{
return TRUE
}
if ${This.CurrentForm} == ${Class.FPotion} && !${This.checkForScrolls.Equal["NONE"]}
{
This:RTarget[${Me.GUID},3]
Consumable:UseScroll[${This.checkForScrolls}]
return
}
return FALSE
}
/*
=====================================================================
Rest Pulse
=====================================================================
*/
method RestPulse()
{
This:CheckCurrentForm
if ${This.CurrentWait} > 0
{
This:RWait[${This.CurrentWait}]
return
}
if !${POI.NeedClassTrainer} && ${This.RTraining} == 16
{
RTraining:Set[0]
}
if ${Me.Casting}
{
This:DoubleCastCheck
return
}
if (${Me.Buff[Drink](exists)} && ${Me.PctMana} < 95 && ${Me.Power.Equal["Mana"]}) || (${Me.Buff[Food](exists)} && ${Me.PctHPs} < 95)
{
This:Stealth
return
}
else
{
if ${Me.Sitting}
{
wowpress jump
}
}
if ${Me.PctMana} < ${Class.RestMana}
{
if ${Consumable.HasDrink} && !${Me.Buff[Drink](exists)}
{
if ${Movement.Speed}
{
move -stop
This:RWait[15]
}
else
{
This:RDebug["Rest - Need a drink",1]
Consumable:useDrink
This:RWait[5]
}
}
}
if ${Me.PctHPs} < ${Class.RestHP}
{
if ${Consumable.HasFood} && !${Me.Buff[Food](exists)}
{
if ${Movement.Speed}
{
move -stop
This:RWait[15]
}
else
{
This:RDebug["Rest - Need food",1]
Consumable:useFood
This:RWait[5]
}
}
}
if ${POI.NeedClassTrainer} == TRUE && ${RTraining} == 0 && ${Spell["Teleport: Moonglade"](exists)} && ${Item[Hearthstone](exists)} && ${Class.UseMoonglade}
{
This:RShift[0]
RTraining:Set[1]
POI.NeedClassTrainer:Set[FALSE]
return
}
if ${RTraining} > 0 && !${WoWScript["GetContainerItemCooldown(${Item[Hearthstone].Bag.Number}, ${Item[Hearthstone].Slot})", 2]}
{
This:RShift[0]
This:RTrain
return
}
if ${Me.Buff[Resurrection Sickness](exists)}
{
This:RDebug["Rest - Rez Sickness.. Waiting",2]
move -stop
This:Stealth
}
if ${Party.AssistType.Equal["REST"]} && (${POI.Type.Equal[HOTSPOT]} || ${POI.Type.Equal[MOB]})
{
target ${Group.Member[${Party.AssistTarget}]}
if ${Group.Member[${Party.AssistTarget}].Distance} > 10
{
Navigator:MoveToLoc[${Group.Member[${Party.AssistTarget}].X},${Group.Member[${Party.AssistTarget}].Y},${Group.Member[${Party.AssistTarget}].Z}]
}
else
{
move -stop
This:Stealth
}
}
if ${Me.PctHPs} < ${Class.HealHP}
{
target ${Me}
This:HealRoutine
return
}
if ${Party.AssistType.Equal["ALONE"]} && (${POI.Type.Equal[HOTSPOT]} || ${POI.Type.Equal[MOB]})
{
This:RDebug["I'm all alone... Stopping",2]
Target ${Me}
Navigator:Clear
move -stop
This:Stealth
return
}
return
}
/*
=====================================================================
Pull Pulse
=====================================================================
*/
method PullPulse()
{
if ${Me.Sitting}
{
wowpress jump
}
CurrentSpell:Set["Nothing"]
CurrentSpellSchool:Set[0]
This:CheckCurrentForm
This:DangerLevel:Set[0]
if !${Toon.TargetIsBestTarget} && ${Target.ReactionLevel} <= 4 && !${Me.Casting}
{
This:RDebug["Pull Pulse 1",3]
This:RTarget[${Targeting.TargetCollection.Get[1].GUID},0]
}
if (${Me.Target(exists)} && ${Me.Target.ReactionLevel} > 4 && ${Me.Target.Target(exists)}) || !${Me.Target(exists)}
{
This:RDebug["Pull Pulse 2",3]
This:RTarget[${Me.Target.Target.GUID},0]
}
if ${Me.Target(exists)} && ${Toon.ValidTarget[${Target.GUID}]}
{
Navigator:FaceXYZ[${Target.X},${Target.Y},${Target.Z}]
}
if ${Class.StartGroup} && ${Group.Members} == 0 && ${WoWScript[GetFriendInfo(1),5]}
{
WoWScript InviteUnit(\"${WoWScript[GetFriendInfo(1)]}\")
return
}
if ${Class.SetLoot} && ${Group.Members} > 0 && ${Group.Leader.Name.Equal[${Me.Name}]}
{
if !${WoWScript[GetLootMethod()].Equal[freeforall]}
{
WoWScript SetLootMethod("freeforall")
}
if ${WoWScript[GetLootThreshold()]} != 4
{
WoWScript SetLootThreshold(4)
}
}
if ${PullTimer} == 0
{
if ${CurrentForm} != ${DPSForm}
{
if ${CurrentForm} == ${SurvForm} && ${Me.PctMana} < 80
{
return
}
else
{
This:RShift[${DPSForm}]
This:RDebug["Pull - Shifting to DPS form (${DPSForm})",1]
return
}
}
else
{
PullTimer:Set[${LavishScript.RunningTime} + ${PullTimeOut}]
}
}
if ${Me.Target(exists)} && ${Target.CreatureType.Equal["Mechanical"]} || ${Target.Name.Find["Infernal"]} || ${Target.Name.Find["Imp"]} || ${Target.Name.Find["Earth"]}
{
Immunity:Set[8]
}
else
{
Immunity:Set[0]
}
if ${Party.Tanking} && ${Class.HealHP} != ${Class.SoloHealHP}
{
This:RDebug["Set Solo Config",0]
Class.HealHP:Set[${Class.SoloHealHP}]
}
if !${Party.Tanking} && ${Class.HealHP} != ${Class.GroupHealHP}
{
This:RDebug["Set Party Config",0]
Class.HealHP:Set[${Class.GroupHealHP}]
}
if ${Me.Power.Equal["Rage"]}
{
CostMulti:Set[0.1]
This:BearPull
return
}
if ${Me.Power.Equal["Energy"]}
{
CostMulti:Set[1]
This:CatPull
return
}
if ${Me.Power.Equal["Mana"]}
{
CostMulti:Set[1]
This:BalancePull
}
return
}
/*
=====================================================================
Attack Pulse
=====================================================================
*/
method AttackPulse()
{
if ${Me.Sitting}
{
wowpress jump
}
RTraining:Set[0]
PullTimer:Set[0]
Random:Set[${Math.Rand[100]}]
This:CheckCurrentForm
This:SetDanger
CurrentSpell:Set["Nothing"]
CurrentSpellSchool:Set[0]
This:DoubleCastCheck
if ${This.CurrentWait} > 0
{
This:RWait[${This.CurrentWait}]
return
}
variable guidlist Aggros
Aggros:Search[-units,-nearest,-aggro,-alive,-range 0-40]
if (${Target.Tapped} && !${Target.TappedByMe})
{
This:RDebug["Abandoning the target",0]
GlobalBlacklist:Insert[${Target.GUID},60000]
if ${Target.Target.Name.Equal[${Me.Name}]}
{
Toon:Flee[TRUE]
return
}
elseif ${Target.Target.Player(exists)} && ${Target.Target.Name.NotEqual[${Me.Name}]}
{
target ${Target.Target.GUID}
return
}
}
if ${Dangerlvl} >= 3
{
Toon:Flee[TRUE]
return
}
if ${Me.Target(exists)} && !${Target.LineOfSight}
{
Navigator:MoveToMob[${Target.GUID}]
This:RDebug["Attack - No Line of Sight, moveing to target",2]
return
}
if ${Me.PctHPs} < ${Class.HealHP}
{
target ${Me}
This:HealRoutine
return
}
This:ManaRoutine
This:CheckTarget
if ${Dangerlvl} == 0
{
This:RDebug["Attack - Easy fight - going to DPS form [${DPSForm}]",1]
This:RShift[${DPSForm}]
}
elseif ${Dangerlvl} > 1
{
This:RDebug["Attack - Getting tricky - Resorting to Survival form [${SurvForm}]",1]
This:RShift[${SurvForm}]
}
/* Trinkets */
if ${Me.Equip[13](exists)} && ${Dangerlvl} > ${Class.UseTrinket1}
{
TrinketCooldown:Set[${WoWScript[GetInventoryItemCooldown("player"\, 13)]}]
This:RDebug["Attack - Trinket 1 Cooldown is ${TrinketCooldown},3]
if ${TrinketCooldown} == 0
{
Me.Equip[13]:Use
}
}
if ${Me.Equip[14](exists)} && ${Dangerlvl} > ${Class.UseTrinket2}
{
TrinketCooldown:Set[${WoWScript[GetInventoryItemCooldown("player"\, 14)]}]
This:RDebug["Attack - Trinket 2 Cooldown is ${TrinketCooldown},3]
if ${TrinketCooldown} == 0
{
Me.Equip[14]:Use
}
}
if ${Party.Tanking}
{
Party:Tank()
}
if !${Toon.TargetIsBestTarget}
{
This:RDebug["Attack Pulse 1",3]
This:RTarget[${Targeting.TargetCollection.Get[1].GUID},0]
}
if ${Me.Power.Equal["Rage"]}
{
CostMulti:Set[0.1]
This:BearRoutine
return
}
if ${Me.Power.Equal["Energy"]}
{
CostMulti:Set[1]
This:CatRoutine
return
}
if ${Me.Power.Equal["Mana"]}
{
CostMulti:Set[1]
if ${Dangerlvl} == 1 && ${CurrentForm}==0
{
This:RDebug["Attack - I'm in Caster form and in a bit of danger - Resorting to Survival form [${SurvForm}]",1]
This:RShift[${SurvForm}]
}
This:BalanceRoutine
}
return
}
/*
=====================================================================
Double Cast Check
=====================================================================
*/
method DoubleCastCheck()
{
if !${This.Healing}
{
return
}
Random:Set[${Math.Rand[100]}]
if ${Group.Member[${HealTarget}].PctHPs} > ${Class.HealHP} * 1.3
{
if ${Random} < 50
{
wowpress JUMP
}
else
{
WoWScript SpellStopCasting()
}
This:RDebug["Stopping any double-cast heals",1]
}
}
/*
=====================================================================
RShift
=====================================================================
*/
method RShift(int NewForm)
{
variable guidlist Aggros
Aggros:Search[-units,-nearest,-aggro,-alive,-range 0-40]
if ${Me.Power.Equal["Energy"]} && ${NewForm} != ${CurrentForm}
{
if ${Me.Target.Attackable} && ${This.Usable[${Class.InteruptAttack},${Class.FInteruptAttack},${Class.SInteruptAttack}]} && ${Target.Casting(exists)}
{
This:RDebug["RShift - ${Class.InteruptAttack}",1]
Toon:CastSpell[${Class.InteruptAttack}]
return
}
}
if ${Me.Target.Attackable} && ${Me.Power.Equal["Rage"]} && ${NewForm} != ${CurrentForm}
{
if ${This.Usable[${Class.RageInterupt},${Class.FRageInterupt},${Class.SRageInterupt}]}
{
This:RDebug["RShift - ${Class.RageInterupt}",1]
Toon:CastSpell[${Class.RageInterupt}]
return
}
}
if ${CurrentForm} == 0 && ${NewForm} != 0
{
This:ManaRoutine
if ${Me.PctHPs} < 90 && ${Me.PctMana} > 40 && !${Me.Buff[${Class.HoTHeal}](exists)} && ${This.Usable[${Class.HoTHeal},${Class.FHoTHeal}]}
{
This:RTarget[${Me.GUID},2]
Toon:CastSpell[${Class.HoTHeal}]
This:RDebug["RShift - Casting ${Class.HoTHeal}",2]
return
}
if ${Me.Target.Attackable} && ${Me.Target(exists} && ${Me.Target.ReactionLevel} < 4 && ${Me.Target.PctHPs} < 10 && ${Me.PctHPs} > 30 && ${This.Usable[${Class.KBSpell},${Class.FKBSpell},${Class.SKBSpell}]}
{
Toon:CastSpell[${Class.KBSpell}]
This:RDebug["RShift - Casting ${Class.KBSpell}",2]
return
}
}
if ${CurrentForm} != ${NewForm}
{
This:CancelAllForms
if ${NewForm} != 0
{
This:RDebug["RShift - Shifting to ${NewForm}",2]
if ${WoWScript[GetShapeshiftFormInfo(${NewForm}),2](exists)}
{
WoWScript CastShapeshiftForm(${NewForm})
}
elseif ${This.Usable[${Class.FormForDPS},0]}
{
Toon:CastSpell[${Class.FormForDPS}]
}
}
}
}
/*
=====================================================================
Balance Pull
=====================================================================
*/
method BalancePull()
{
This:RWait[${CurrentWait}]
if ${CurrentWait} > 0
{
return
}
if ${Me.InCombat}
{
return
}
if ${Me.Target(exists)} && ${Target.ReactionLevel} <= 4
{
Navigator:FaceXYZ[${Target.X},${Target.Y},${Target.Z}]
}
if ${LavishScript.RunningTime} > ${PullTimer} && ${Party.Tanking}
{
This:RDebug["Balance Pull - Pull timeout - Blackisting",1]
GlobalBlacklist:Insert[${Target.GUID},3600000]
PullTimer:Set[${LavishScript.RunningTime} + ${PullTimeOut}]
return
}
if ${Target.Distance} > (${Class.MaxRange}-5) && !${Toon.Casting}
{
This:RDebug["Balance Pull - Out of range - moving closer",1]
Navigator:MoveToMob[${Target.GUID}]
return
}
else
{
if ${Me.PctMana} < ${Class.MeleeMod}
{
This:RDebug["Balance Pull - Low mana, wanding",1]
if ${Me.Equip[Ranged](exists)} && ${Spell[Shoot](exists)}
{
if ${Target.Distance} > 25 && !${Toon.Casting} && !${Me.Action[Shoot].AutoRepeat}
{
This:RDebug["Balance Pull - Wanding but out of range - moving closer",1]
Navigator:MoveToMob[${Target.GUID}]
if ${Random} < ${Class.JumpFreq} && ${Target.Distance} > 10
{
wowpress JUMP
}
return
}
else
{
move -stop
This:RDebug["Balance Pull - Wanding",2]
Toon:CastSpell[Shoot]
}
}
else
{
if !${Me.Attacking}
{
This:RDebug["Balance Pull - Turning on autoattack",2]
WoWScript AttackTarget()
}
Navigator:MoveToMob[${Target.GUID}]
}
return
}
elseif ${Movement.Speed}
{
move -stop
return
}
if ${This.Usable[${Class.PullSpell1},${Class.FPullSpell1},${Class.SPullSpell1}]}
{
This:RDebug["Balance Pull - Pulling with ${Class.PullSpell1}",2]
Toon:CastSpell[${Class.PullSpell1}]
This:RWait[5]
return
}
elseif ${This.Usable[${Class.PullSpell2},${Class.FPullSpell2},${Class.SPullSpell2}]}
{
This:RDebug["Balance Pull - Pulling with ${Class.PullSpell2}",2]
Toon:CastSpell[${Class.PullSpell2}]
This:RWait[5]
return
}
elseif ${This.Usable[${Class.PullSpell3},${Class.FPullSpell3},${Class.SPullSpell3}]}
{
This:RDebug["Balance Pull - Pulling with ${Class.PullSpell3}",2]
Toon:CastSpell[${Class.PullSpell3}]
This:RWait[5]
return
}
else
{
Navigator:MoveToMob[${Target.GUID}]
}
}
}
/*
=====================================================================
Bear Pull
=====================================================================
*/
method BearPull()
{
This:RWait[${CurrentWait}]
if ${CurrentWait} > 0
{
return
}
if ${LavishScript.RunningTime} > ${PullTimer}
{
This:RShift[0]
This:RDebug["Bear Pull - Nothings happening - Trying a Caster form pull.",1]
PullTimer:Set[${LavishScript.RunningTime} + ${PullTimeOut}]
return
}
if !${Me.Attacking}
{
This:RDebug["Bear Pull - Turning on Autoattack",2]
WoWScript AttackTarget()
}
if ${This.Usable[${Class.PullAttack1},${Class.FPullAttack1},${Class.PullAttack1}]}
{
This:RDebug["Bear Pull - ${Class.PullAttack1}",2]
Toon:CastSpell[${Class.PullAttack1}]
return
}
if ${This.Usable[${Class.PullAttack2},${Class.FPullAttack2},${Class.SPullAttack2}]}
{
This:RDebug["Bear Pull - ${Class.PullAttack2}",2]
Toon:CastSpell[${Class.PullAttack2}]
}
if ${Target.Distance}> 4.5
{
This:RDebug["Bear Pull - No pulling tecniques available - body pulling",2]
Navigator:MoveToMob[${Target.GUID}]
}
}
/*
=====================================================================
Cat Pull
=====================================================================
*/
method CatPull()
{
This:RWait[${CurrentWait}]
if ${CurrentWait} > 0
{
return
}
if ${LavishScript.RunningTime} > ${PullTimer}
{
This:RShift[0]
This:RDebug["Cat Pull - Nothings happening - Trying a Caster form pull.",1]
PullTimer:Set[${LavishScript.RunningTime} + ${PullTimeOut}]
return
}
if !${Toon.IsDotted} && ${Target.Distance} < 20 && ${This.Usable[${Class.StealthSpell},${Class.FStealthSpell}]}
{
This:RDebug["Cat Pull - Nearly at the target - ${Class.StealthSpell}ing",1]
Toon:CastSpell[${Class.StealthSpell}]
This:RWait[5]
}
if (${Spell[${Class.StealthSpell}].Cooldown} && !${Me.Buff[${Class.StealthSpell}](exists)} && ${Me.GlobalCooldown} == 0) && ${Target.Distance} < 20
{
This:RDebug["Cat Pull - Waiting for Prowl CD/Energy",2]
move -stop
return
}
if ${Me.CurrentPower} > 90 && !${Me.Buff[${Class.PullBuff}](exists)} && ${Me.CurrentPower} == 100 && ${Me.Target.Distance} < 20 && ${Target.Distance} > 15 && ${This.Usable[${Class.PullBuff},${Class.FPullBuff},${Class.SPullBuff}]}
{
This:RDebug["Cat Pull - ${Class.PullBuff}",2]
Toon:CastSpell[${Class.PullBuff}]
}
if ${Me.Target.Distance} < 20 && ${This.Usable[${Class.PullPrep},${Class.FPullPrep},${Class.SPullPrep}]}
{
This:RDebug["Cat Pull - ${Class.PullPrep}",2]
Toon:CastSpell[${Class.PullPrep}]
}
This:CheckBehind
if ${Me.Target.Distance} > 4
{
Navigator:MoveToMob[${Target.GUID}]
}
else
{
move -stop
}
if ${Behind}
{
if ${This.Usable[${Class.BackPull1},${Class.FBackPull1},${Class.SBackPull1}]}
{
move -stop
This:RDebug["Cat Pull - Using ${Class.BackPull1}",2]
Toon:CastSpell[${Class.BackPull1}]
return
}
if ${This.Usable[${Class.BackPull2},${Class.FBackPull2},${Class.SBackPull2}]}
{
move -stop
This:RDebug["Cat Pull - Using ${Class.BackPull2}",2]
Toon:CastSpell[${Class.BackPull2}]
return
}
if ${This.Usable[${Class.BackPull3},${Class.FBackPull3},${Class.SBackPull3}]}
{
move -stop
This:RDebug["Cat Pull - Using ${Class.BackPull3}",2]
Toon:CastSpell[${Class.BackPull3}]
return
}
if ${This.Usable[${Class.FrontPull1},${Class.FFrontPull1},${Class.SFrontPull1}]}
{
move -stop
This:RDebug["Cat Pull - Using ${Class.FrontPull1}",2]
Toon:CastSpell[${Class.FrontPull1}]
return
}
}
else
{
if ${This.Usable[${Class.FrontPull1},${Class.FFrontPull1},${Class.SFrontPull1}]}
{
move -stop
This:RDebug["Cat Pull - Using ${Class.FrontPull1}",2]
Toon:CastSpell[${Class.FrontPull1}]
return
}
if ${This.Usable[${Class.FrontPull2},${Class.FFrontPull2},${Class.SFrontPull2}]}
{
move -stop
This:RDebug["Cat Pull - Using ${Class.FrontPull2}",2]
Toon:CastSpell[${Class.FrontPull1}]
return
}
if ${This.Usable[${Class.FrontPull3},${Class.FFrontPull3},{$Class.SFrontPull3}]}
{
move -stop
This:RDebug["Cat Pull - Using ${Class.FrontPull3}",2]
Toon:CastSpell[${Class.FrontPull3}]
return
}
}
}
/*
=====================================================================
Balance Routine
=====================================================================
*/
method BalanceRoutine()
{
variable guidlist PVEAggro
variable guidlist PVPAggro
variable guidlist SafeRange
if ${Me.Target(exists)} && ${Me.Target.ReactionLevel} > 4
{
This:RDebug["Balance Routine",3]
This:RTarget[${Me.Target.Target.GUID},0]
}
if ${Me.Target(exists)} && ${Target.ReactionLevel} <= 4
{
Navigator:FaceXYZ[${Target.X},${Target.Y},${Target.Z}]
}
if !${Me.Target(exists)} || ${Me.Target.ReactionLevel} > 4
{
if ${Party.AssistType.Equal["ASSIST"]}
{
Party:Assist
}
return
}
variable guidlist Aggros
Aggros:Search[-units,-nearest,-aggro,-alive,-range 0-40]
if !${Me.Attacking} && !${Me.Equip[Ranged](exists)}
{
This:RDebug["Balance Routine - Turning on Autoattack",2]
WoWScript AttackTarget()
}
if ${Me.Buff[Feared](exists)} && ${This.Usable["Will of the Forsaken",${Class.FWilloftheForsaken}]}
{
Toon:CastSpell[Will of the Forsaken]
return
}
if ${Target.Distance} > ${Class.MaxRange} && !${Toon.Casting}
{
This:RDebug["Balance Routine - out of range - moving closer",1]
Navigator:MoveToMob[${Target.GUID}]
if ${Random} < ${Class.JumpFreq} && ${Target.Distance} > 10
{
wowpress JUMP
}
return
}
if ${Target.Casting(exists)} && ${This.Usable[${Class.InteruptSpell},${Class.FInteruptSpell},${Class.SInteruptSpell}]}
{
WoWScript SpellStopCasting()
Toon:CastSpell[${Class.InteruptSpell}]
}
if ${Target.Casting(exists)} && ${This.Usable["War Stomp",${Class.FWarStomp}]}
{
if ${Me.Target.Distance} < 8
{
This:RDebug["Balance Routine - War Stomp to interupt the spell",1]
move -stop
Toon:CastSpell[War Stomp]
}
}
if ${Target.PctHPs} < 15 && ${Me.PctHPs} > 60 && ${Me.PctMana} > 40 && ${This.Usable[${Class.KBSpell},${Class.FKBSpell},${Class.SKBSpell}]}
{
Toon:CastSpell[${Class.KBSpell}]
return
}
if ${Group.Member[${Party.AssistTarget}](exists)} && !${Target.Player(exists)} && ${Group.Member[${Party.AssistTarget}].Name.NotEqual[${Me.Name}]} && ${Group.Member[${Party.AssistTarget}].Distance} < 30 && ${Target.Target.Name.Equal[${Me.Name}]} && !${Party.Tanking} && ${This.Usable[${Class.AggroSpell},${Class.FAggroSpell},${Class.SAggroSpell}]}
{
WoWScript SpellStopCasting()
Toon:CastSpell[${Class.AggroSpell}]
return
}
PVPAggro:Search[-players, -pvp, -units, -alive, -aggro, -attackable, -range 0-8]
This:RDebug["PvP aggro count = ${PVPAggro.Count}",3]
if ${PVPAggro.Count} > 0 && ${This.Usable[${Class.PanicSpell},${Class.FPanicSpell},${Class.SPanicSpell}]}
{
if ${Me.Action[Shoot].AutoRepeat}
{
WoWScript SpellStopCasting()
}
This:RDebug["Balance Routine - Pvp! ${Class.PanicSpell}",1]
move -stop
Toon:CastSpell[${Class.PanicSpell}]
return
}
PVEAggro:Search[-units, -targetingme, -alive, -range 0-8]
SafeRange:Search[-units,-alive,-nonpvp,-nonfriendly,-nocritters,-untapped,-levels ${This.MinLvL}-100,-notflying,-attackable,-range 0-35]
This:RDebug["PvE aggro count = ${PVEAggro.Count}",3]
This:RDebug["Mobs within the safe range: ${SafeRange.Count}",3]
if ${PVEAggro.Count} > (${SafeRange.Count} + 1) && ${This.Usable[${Class.PanicSpell},${Class.FPanicSpell},${Class.SPanicSpell}]}
{
WoWScript SpellStopCasting()
This:RDebug["Balance Routine - ${Class.PanicSpell}",1]
move -stop
Toon:CastSpell[${Class.PanicSpell}]
return
}
PVEAggro:Search[-units, -targetingme, -alive, -attackable, -range 0-30]
PVPAggro:Search[-players, -targetingme, -alive, -attackable, -range 0-30]
if (${PVEAggro.Count} > 1 || ${PVPAggro.Count} > 0) && ${Me.PctHPs} < 75 && ${This.Usable[${Class.DefSpell},${Class.FDefSpell}]}
{
WoWScript SpellStopCasting()
This:RDebug["Balance Routine - ${Class.DefSpell}",1]
Toon:CastSpell[${Class.DefSpell}]
return
}
if ${Target.Distance} <= 10 && (${This.IsRooted} || !${Target.Target.Name.Equal[${Me.Name}]}) && (((${Target.PctHPs} < ${Class.MeleeMod2}) || (${Me.PctMana} < ${Class.MeleeMod}) && ${Spell[Shoot](exists)})
{
Navigator:MoveBackward[1000]
return
}
if ${Unit[${Target}].CreatureType.Equal[Totem]} || (!${Target.Type.Equal[Player]} && !${Me.Buff[${Class.ManaBuffSpell}](exists)} && ((${Target.PctHPs} < ${Class.MeleeMod2}) || (${Me.PctMana} < ${Class.MeleeMod}) || (${Me.Buff[Spirit Tap](exists)} && ${Me.PctMana} < 90)))
{
if ${Me.Equip[Ranged](exists)} && ${Spell[Shoot](exists)}
{
if ${Target.Distance} > 25 && !${Toon.Casting} && !${Me.Action[Shoot].AutoRepeat}
{
This:RDebug["Balance Routine - Wanding but out of range - moving closer",1]
Navigator:MoveToMob[${Target.GUID}]
if ${Random} < ${Class.JumpFreq} && ${Target.Distance} > 10
{
wowpress JUMP
}
return
}
elseif !${Me.Action[Shoot].AutoRepeat}
{
move -stop
This:RDebug["Balance Routine - Wanding",2]
Toon:CastSpell[Shoot]
}
}
elseif ${Target.Distance} > 4.5
{
Navigator:MoveToMob[${Target.GUID}]
}
else
{
move -stop
}
return
}
elseif ${Movement.Speed}
{
move -stop
}
if ${Me.Action[Shoot].AutoRepeat}
{
WoWScript SpellStopCasting()
}
elseif !${Me.Attacking}
{
WoWScript AttackTarget()
}
if ${Toon.Casting}
{
return
}
This:ManaBuffCheck
if ${This.IsRooted} && ${Me.Target.Distance} < 10 && ${Targeting.TargetCollection.Get[2](exists)}
{
This:RTarget[${Targeting.TargetCollection.Get[2].GUID},0]
This:RDebug["Balance Routine - Switching to the non-rooted target",1]
}
if ${Targeting.TargetCollection.Get[2](exists)} && !${Unit[${Targeting.TargetCollection.Get[2]}].Buff[${Class.CCSpell}](exists)} && ${Unit[${Targeting.TargetCollection.Get[2]}].CreatureType.Equal[${Class.CCType}]} && !${Unit[${Targeting.TargetCollection.Get[2]}].Buff[${Class.DoTSpell1}](exists)} && !${Unit[${Targeting.TargetCollection.Get[2]}].Buff[${Class.DoTSpell2}](exists)}
{
if ${This.Usable[${Class.CCSpell},${Class.FCCSpell},${Class.SCCSpell}]}
{
This:RTarget[${Targeting.TargetCollection.Get[2].GUID},2]
Toon:CastSpell[${Class.CCSpell}]
This:RDebug["Balance Routine - ${Class.CCSpell} ${Target}",1]
This:RTarget[${Targeting.TargetCollection.Get[1].GUID},0]
}
}
if ${Me.Target(exists)} && ${Target.PctHPs} > 70 && (${Dangerlvl}>=1 || ${Target.Level} >= ${Me.Level}) && ${This.Usable[${Class.PetSpell},${Class.FPetSpell}]}
{
if ${Math.Distance[${Me.X},${Me.Y},${Target.X},${Target.Y}]}< ${Class.MaxRange}
{
This:RDebug["Balance Routine - ${Class.PetSpell}!",1]
Toon:CastSpell[${Class.PetSpell}]
ISXWoW:ClickTerrain[${Target.X}, ${Target.Y}, ${Target.Z}]
}
}
if !${Me.Buff[${Class.MeleeBuffSpell}](exists)} && ${Target.Distance} < 10 && ${Me.Target.Target.Name.Equal[${Me.Name}]} && ${This.Usable[${Class.MeleeBuffSpell},${Class.FMeleeBuffSpell},${Class.SMeleeBuffSpell}]}
{
This:RDebug["Balance Routine - Buffing ${Class.MeleeBuffSpell}",2]
Toon:CastSpell[${Class.MeleeBuffSpell}]
return
}
if ${Target.PctHPs} > 60 && (${Group.Member[${Party.AssistTarget}].PctHPs} < 90 || ${Me.PctHPs} < 90) && !${Target.Buff[${Class.LeechSpell}](exists)} && ${This.Usable[${Class.LeechSpell},${Class.FLeechSpell},${Class.SLeechSpell}]}
{
This:RDebug["Balance Routine - Applying ${Class.LeechSpell}",2]
Toon:CastSpell[${Class.LeechSpell}]
return
}
if ${Target.PctHPs} > 30 && !${Target.Buff[${Class.DoTSpell1}](exists)} && ${This.Usable[${Class.DoTSpell1},${Class.FDoTSpell1},${Class.SDoTSpell1}]}
{
This:RDebug["Balance Routine - Dotting ${Class.DoTSpell1}",2]
Toon:CastSpell[${Class.DoTSpell1}]
This:RWait[15]
return
}
if ${Target.PctHPs} > 30 && !${Target.Buff[${Class.DoTSpell2}](exists)} && ${This.Usable[${Class.DoTSpell2},${Class.FDoTSpell2},${Class.SDoTSpell2}]}
{
This:RDebug["Balance Routine - Dotting ${Class.DoTSpell2}",2]
Toon:CastSpell[${Class.DoTSpell2}]
This:RWait[5]
return
}
if ${Target.PctHPs} > 30 && !${Target.Buff[${Class.DoTSpell3}](exists)} && ${This.Usable[${Class.DoTSpell3},${Class.FDoTSpell3},${Class.SDoTSpell3}]}
{
This:RDebug["Balance Routine - Dotting ${Class.DoTSpell3}",2]
Toon:CastSpell[${Class.DoTSpell3}]
This:RWait[5]
return
}
if !${Me.Buff[Focused Casting](exists)} && ${Me.Target.Distance} < 5 && ${This.Usable[${Class.NukeSpell1},${Class.FNukeSpell1},${Class.SNukeSpell1}]} && ${Target.PctHPs} > 70 && !${Me.Buff[${Class.ProtectSpellDebuff}](exists)} && ${Target.PctHPs} > 80 && ${This.Usable[${Class.ProtectSpell},${Class.FProtectSpell}]}
{
This:RDebug["Balance Routine - Buffing ${Class.ProtectSpell} so I can keep spamming ${Class.NukeSpell1}",2]
Toon:CastSpell[${Class.ProtectSpell}]
return
}
if !${Movement.Speed} && ${Target.PctHPs} > 10 && (${Target.Distance} > 10 || ${Me.Buff[${Class.ProtectSpell}](exists)} || !${Me.Target.Target.Name.Equal[${Me.Name}]}) && ${This.Usable[${Class.NukeSpell1},${Class.FNukeSpell1},${Class.SNukeSpell1}]}
{
This:RDebug["Balance Routine - Casting ${Class.NukeSpell1}",2]
Toon:CastSpell[${Class.NukeSpell1}]
return
}
if ${This.Usable[${Class.NukeSpell2},${Class.FNukeSpell2},${Class.SNukeSpell2}]}
{
This:RDebug["Balance Routine - Casting ${Class.NukeSpell2}",2]
Toon:CastSpell[${Class.NukeSpell2}]
return
}
if ${This.Usable[${Class.NukeSpell3},${Class.FNukeSpell3},${Class.SNukeSpell3}]}
{
This:RDebug["Balance Routine - Casting ${Class.NukeSpell3}",2]
Toon:CastSpell[${Class.NukeSpell3}]
return
}
if ${Target.CurrentMana} > 0 && ${This.Usable["Mana Tap",${Class.FManaTap}]}
{
Toon:CastSpell[Mana Tap]
return
}
if ${Me.PctMana} < 85 && ${Me.Buff[Mana Tap].Application} == 3 && ${This.Usable["Arcane Torrent"],${Class.FArcaneTorrent}}
{
Toon:CastSpell[Arcane Torrent]
return
}
return
}
/*
=====================================================================
Bear Routine
=====================================================================
*/
method BearRoutine()
{
if ${Me.Target(exists)} && ${Me.Target.ReactionLevel} > 4 && ${Me.Target.Target(exists)}
{
This:RDebug["Bear Routine 1",3]
This:RTarget[${Me.Target.Target.GUID},0]
}
if ${Me.Target.ReactionLevel} > 4
{
return
}
if ${Me.Target(exists)}&& ${Target.ReactionLevel} <= 4
{
Navigator:FaceXYZ[${Target.X},${Target.Y},${Target.Z}]
}
variable guidlist Aggros
Aggros:Search[-units,-nearest,-aggro,-alive,-range 0-40]
if !${Targeting.TargetCollection.Get[1](exists)} && ${Me.Buff[${Class.RageBoost}](exists)} && ${DangerLevel} < 3
{
This:RDebug["Bear Routine - Removing ${Class.RageBoost} so I can get out of combat",1]
Me.Buff[${Class.RageBoost}]:Remove
return
}
if !${Me.Attacking}
{
This:RDebug["Bear Routine - Turning on Autoattack",2]
WoWScript AttackTarget()
}
if ${Target.Distance} > 4.5
{
This:RDebug["Bear Routine - Getting into Melee range"],1
Navigator:MoveToMob[${Target.GUID}]
if ${Random} < ${Class.JumpFreq} && ${Target.Distance} > 10
{
wowpress JUMP
}
if ${This.Usable[${Class.InterceptAttack},${Class.FInterceptAttack},${Class.SInterceptAttack}]}
{
This:RDebug["Bear Routine - Using ${Class.InterceptAttack}",2]
Toon:CastSpell[${Class.InterceptAttack}]
return
}
}
else
{
if ${Movement.Speed}
{
move -stop
}
}
if ${Me.PctHPs} < 70 && ${This.Usable[${Class.RagePanic},${Class.FRagePanic},${Class.SRagePanic}]}
{
This:RDebug["Bear Routine - In Bear form - using ${Class.RagePanic}",2]
Toon:CastSpell[${Class.RagePanic}]
}
if !${Me.Action[${Class.RageAttackBase}].Active} && ${Me.CurrentRage} > 10 && ${This.Usable[${Class.RageAttackBase},${Class.FRageAttackBase},${Class.SRageAttackBase}]}
{
This:RDebug["Bear Routine - Getting ${Class.RageAttackBase} ready",2]
Toon:CastSpell[${Class.RageAttackBase}]
}
if ${Target.Casting(exists)} && ${This.Usable[${Class.RageInterupt},${Class.FRageInterupt},${Class.SRageInterupt}]}
{
This:RDebug["Bear Routine - ${Class.RageInterupt} to interupt cast",1]
Toon:CastSpell[${Class.RageInterupt}]
}
if ${Target.Target.Name.NotEqual[${Me}]} && !${Target.Player(exists)} && ${Party.Tanking} && ${This.Usable[${Class.AggroTaunt},${Class.FAggroTaunt},${Class.SAggroTaunt}]}
{
This:RDebug["Bear Routine - ${Class.AggroTaunt}",2]
Toon:CastSpell[${Class.AggroTaunt}]
}
if ${Aggros.Count} < 3 && ${Me.PctHPs} > ${Class.EnrageMod} && ${This.Usable[${Class.RageBoost},${Class.FRageBoost}]}
{
This:RDebug["Bear Routine - ${Class.RageBoost}",2]
Toon:CastSpell[${Class.RageBoost}]
}
if !${Target.Buff[${Class.ShoutDebuff}](exists)} && ${Target.PctHPs} > 20 && ${Me.Target.Distance} < 10 && ${Me.InCombat} && ${Toon.ValidTarget[${Target.GUID}]} && ${This.Usable[${Class.ShoutDebuff},${Class.FShoutDebuff},${Class.SShoutDebuff}]}
{
This:RDebug["Bear Routine - Using ${Class.ShoutDebuff}",2]
Toon:CastSpell[${Class.ShoutDebuff}]
}
if ${Me.PctRage} > 15 && ${This.Usable[${Class.RageAttack1},${Class.FRageAttack1},${Class.SRageAttack1}]}
{
This:RDebug["Bear Routine - ${Class.RageAttack1}",2]
Toon:CastSpell[${Class.RageAttack1}]
}
if !${Target.Buff[${Class.RageDoTAttack1}](exists)} && ${This.Usable[${Class.RageDoTAttack1},${Class.FRageDoTAttack1},${SClass.RageDoTAttack1}]}
{
This:RDebug["Bear Routine - ${Class.RageDoTAttack1}",2]
Toon:CastSpell[${Class.RageDoTAttack1}]
}
if !${Target.Buff[${Class.RageDoTAttack2}](exists)} && ${Target.PctHPs} > 30 && ${This.Usable[${Class.RageDoTAttack2},${Class.FRageDoTAttack2},${SClass.RageDoTAttack2}]}
{
This:RDebug["Bear Routine - ${Class.RageDoTAttack2}",2]
Toon:CastSpell[${Class.RageDoTAttack2}]
}
if !${Target.Buff[${Class.RageDoTAttack3}](exists)} && ${Me.CurrentRage} > 30 && ${This.Usable[${Class.RageDoTAttack3},${Class.FRageDoTAttack3},${SClass.RageDoTAttack3}]}
{
This:RDebug["Bear Routine - ${Class.RageDoTAttack3}",2]
Toon:CastSpell[${Class.RageDoTAttack3}]
}
if ${Me.CurrentRage} > ${SwipeMod} && ${Targeting.TargetCollection.Get[2](exists)} && ${This.Usable[${Class.RageAoE},${Class.FRageAoE},${Class.SRageAoE}]}
{
This:RDebug["Bear Routine - ${Class.RageAoE} at adds",2]
Toon:CastSpell[${Class.RageAoE}]
}
}
/*
=====================================================================
Cat Routine
=====================================================================
*/
method CatRoutine()
{
This:CheckBehind
if ${Me.Target(exists)} && ${Me.Target.ReactionLevel} > 4 && ${Me.Target.Target(exists)}
{
This:RDebug["Cat 1",3]
This:RTarget[${Me.Target.Target.GUID},0]
}
if ${Me.Target.ReactionLevel} > 4 || ${Me.Target.Dead}
{
return
}
if !${Me.Target.Target.Name.Equal[${Me.Name}]} && !${Behind} && ${Target.Distance} < 5
{
move forward 1000
return
}
if ${Me.Target(exists)} && ${Target.ReactionLevel} <= 4
{
Navigator:FaceXYZ[${Target.X},${Target.Y},${Target.Z}]
}
if ${Target.Buff[Maim](exists)} || ${Target.Buff[Gouge](exists)}
{
if ${Me.Attacking}
{
This:RDebug["Cat Routine - Turning off Autoattack",2]
WoWScript AttackTarget()
}
if !${Behind}
{
move forward 1000
return
}
else
{
move -stop
}
if ${Me.CurrentPower} < 90
{
return
}
}
if !${Me.Attacking}
{
This:RDebug["Cat Routine - Turning on Autoattack",2]
WoWScript AttackTarget()
}
if ${Target.Player(exists)}
{
if ${Target.Distance} > 2
{
This:RDebug["Cat Routine - PVP! - Getting into Melee Range",1]
Navigator:MoveToMob[${Target.GUID}]
if ${Random} < ${Class.JumpFreq} && ${Target.Distance} > 10
{
wowpress JUMP
}
if ${Target.Distance} > 20 && ${This.Usable[${Class.SpeedBoost},${Class.FSpeedBoost}]}
{
Toon:CastSpell[${Class.SpeedBoost}]
}
}
else
{
if ${Movement.Speed}
{
move -stop
}
}
}
else
{
if ${Target.Distance} > 4.5
{
This:RDebug["Cat Routine - Getting into Melee Range",1]
Navigator:MoveToMob[${Target.GUID}]
if ${Random} < ${Class.JumpFreq} && ${Target.Distance} > 10
{
wowpress JUMP
}
if ${Target.Distance} > 20 && ${This.Usable[${Class.SpeedBoost},${Class.FSpeedBoost}]}
{
Toon:CastSpell[${Class.SpeedBoost}]
}
}
else
{
if ${Movement.Speed}
{
move -stop
}
}
}
if ${Target.Casting(exists)} && ${This.Usable[${Class.InteruptAttack},${Class.FInteruptAttack},${Class.SInteruptAttack}]}
{
This:RDebug["Cat Routine - ${Class.InteruptAttack} to stop Casting",1]
Toon:CastSpell[${Class.InteruptAttack}]
return
}
if ${Target.Casting(exists)} && ${This.Usable[${Class.InteruptAttack2},${Class.FInteruptAttack2},${Class.SClass.InteruptAttack2}]}
{
This:RDebug["Cat Routine - ${Class.InteruptAttack2} to stop Casting",1]
Toon:CastSpell[${Class.InteruptAttack2}]
return
}
if ${Group.Member[${Party.AssistTarget}](exists)} && !${Target.Player(exists)} && ${Group.Member[${Party.AssistTarget}].Name.NotEqual[${Me.Name}]} < 30 && ${Group.Member[${Party.AssistTarget}].Distance} < 30 && ${Group.Member[${Party.AssistTarget}].Distance} > 5 && ${Target.Target.Name.Equal[${Me.Name}]} && !${Party.Tanking} && ${Group.Members} > 0 && ${This.Usable[${Class.AggroAttack},${Class.FAggroAttack},${Class.SAggroAttack}]}
{
Toon:CastSpell[${Class.AggroAttack}]
return
}
if ${Me.ComboPoints} == 5 || (${Me.ComboPoints} > 2 && ${Target.Casting(exists)}) || (${Me.ComboPoints}*7 > ${Target.PctHPs})
{
if ${This.Usable[${Class.KBFinish},${Class.FKBFinish},${Class.SKBFinish}]}
{
This:RDebug["Cat Routine - Using ${Class.KBFinish}",2]
Toon:CastSpell[${Class.KBFinish}]
return
}
}
if ${Behind} && ${This.Usable[${Class.BackAttack},${Class.FBackAttack},${Class.SBackAttack}]}
{
This:RDebug["Cat Routine - I'm behind the target - using ${Class.BackAttack}",2]
Toon:CastSpell[${Class.BackAttack}]
return
}
if ${Behind} && ${Spell[${Class.BackAttack}](exists)} && ${Class.FocusBack}
{
This:RDebug["Behind the target - saving energy for ${Class.BackAttack}",2]
return
}
if !${Target.Buff[${Class.DoTAttack1}](exists)} && ${This.Usable[${Class.DoTAttack1},${Class.FDoTAttack1},${Class.SDoTAttack1}]}
{
This:RDebug["Cat Routine - ${Class.DoTAttack1}",2]
Toon:CastSpell[${Class.DoTAttack1}]
return
}
if !${Target.Buff[${Class.DoTAttack2}](exists)} && ${This.Usable[${Class.DoTAttack2},${Class.FDoTAttack2},${Class.SDoTAttack2}]}
{
This:RDebug["Cat Routine - ${Class.DoTAttack2}",2]
Toon:CastSpell[${Class.DoTAttack2}]
return
}
if !${Target.Buff[${Class.DoTAttack3}](exists)} && ${This.Usable[${Class.DoTAttack3},${Class.FDoTAttack3},${Class.SDoTAttack3}]}
{
This:RDebug["Cat Routine - ${Class.DoTAttack3}",2]
Toon:CastSpell[${Class.DoTAttack3}]
return
}
if ${Target.PctHPs}<(${Me.ComboPoints}*15)
{
if ${This.Usable[${KBAttack},${FKBAttack},${SKBAttack}]}
{
This:RDebug["Cat Routine - Using ${KBAttack}",2]
Toon:CastSpell[${KBAttack}]
return
}
}
if ${Target.PctHPs}<(${Me.ComboPoints}*20)
{
if !${Target.Buff[${Class.DoTFinish}](exists)} && ${This.Usable[${Class.DoTFinish},${Class.FDoTFinish},${Class.SDoTFinish}]}
{
This:RDebug["Cat Routine - Using ${Class.DoTFinish}",2]
Toon:CastSpell[${Class.DoTFinish}]
return
}
}
if ${This.Usable[${Class.FrontAttack1},${Class.FFrontAttack1},${Class.SFrontAttack1}]}
{
This:RDebug["Cat Routine - Using ${Class.FrontAttack1}",2]
Toon:CastSpell[${Class.FrontAttack1}]
return
}
if ${This.Usable[${Class.FrontAttack2},${Class.FFrontAttack2},${Class.SFrontAttack2}]}
{
This:RDebug["Cat Routine - Using ${Class.FrontAttack2}",2]
Toon:CastSpell[${Class.FrontAttack2}]
return
}
}
/*
=====================================================================
Heal Routine
=====================================================================
*/
method HealRoutine()
{
This:CheckCurrentForm
if ${Me.Sitting}
{
wowpress jump
}
if ${Target.Distance} > 35
{
Navigator:MoveToMob[${Target.GUID}]
return
}
if ${Movement.Speed}
{
move -stop
}
if ${CurrentForm} != ${Class.FCheapHeal}
{
This:RShift[${Class.FCheapHeal}]
return
}
target ${Group.Member[${Party.AssistTarget}]}
variable guidlist Aggros
Aggros:Search[-units,-nearest,-aggro,-targetingme,-alive,-range 0-5]
This:PotRoutine
if ${This.Usable["War Stomp",${Class.FWarStomp}]}
{
if ${Me.Target.Distance} < 8
{
This:RDebug["Balance Routine - War Stomp before healing",1]
move -stop
Toon:CastSpell[War Stomp]
}
}
if !${Me.Buff[Focused Casting](exists)} && !${Me.Buff[${Class.ProtectSpellDebuff}](exists)} && ${Aggros.Count} > 0 && ${This.Usable[${Class.ProtectSpell},${Class.FProtectSpell}]}
{
This:RDebug["Balance Routine - Buffing ${Class.ProtectSpell} before I heal",2]
Toon:CastSpell[${Class.ProtectSpell}]
}
if ${This.Usable[${Class.HealBuffSpell},${Class.FHealBuffSpell}]}
{
Toon:CastSpell[${Class.HealBuffSpell}]
This:RDebug["Heal Routine - Casting ${Class.HealBuffSpell}",2]
}
This:RDebug["Heal Routine on ${Group.Member[${Party.AssistTarget}].Name}",2]
if ${Group.Member[${Party.AssistTarget}].PctHPs} < ${Class.SaveMod} && (!${Target.Buff[${Class.SaveHeal}](exists)} | !${Target.Buff[${Class.SaveHealDebuff}](exists)}) && ${Me.InCombat} && ${This.Usable[${Class.SaveHeal},${Class.FSaveHeal}]}
{
HealTarget:Set[${Party.AssistTarget}]
Toon:CastSpell[${Class.SaveHeal}]
This:RDebug["Heal Routine - Casting ${Class.SaveHeal}",2]
}
if (${Me.PctHPs} < ${Class.HealHP} && ${Target.PctHPs} < ${Class.HealHP} && !${Target.Name.Equal[${Me.Name}]} && !${Target.Buff[${Class.GroupHeal}](exists)}) && ${Me.Target.Distance} > 3 && ${Me.Target.Distance} < 30 && ${This.Usable[${Class.GroupHeal},${Class.FGroupHeal}]}
{
Toon:CastSpell[${Class.GroupHeal}]
HealTarget:Set[${Party.AssistTarget}]
This:RDebug["Heal Routine - Casting ${Class.GroupHeal}",2]
This:RWait[3]
}
if ${Target.PctHPs} < ${Class.FastHealHP} && !${Target.Buff[${Class.FastHeal}](exists)} && ${This.Usable[${Class.FastHeal},${Class.FFastHeal}]}
{
Toon:CastSpell[${Class.FastHeal}]
HealTarget:Set[${Party.AssistTarget}]
This:RDebug["Heal Routine - Casting ${Class.FastHeal}",2]
This:RWait[3]
}
if ${Target.PctHPs} < ${Class.BigHealHP} && !${Target.Buff[${Class.BigHeal}](exists)} && ${Aggros.Count} == 0 && ${This.Usable[${Class.BigHeal},${Class.FBigHeal}]}
{
Toon:CastSpell[${Class.BigHeal}]
HealTarget:Set[${Party.AssistTarget}]
This:RDebug["Heal Routine - Casting ${Class.BigHeal}",2]
This:RWait[3]
}
This:HotRoutine
if !${Target.Buff[${Class.SmallHeal}](exists)} && ${This.Usable[${Class.SmallHeal},${Class.FSmallHeal}]}
{
Toon:CastSpell[${Class.SmallHeal}]
HealTarget:Set[${Party.AssistTarget}]
This:RDebug["Heal Routine - Casting ${Class.SmallHeal}",2]
This:RWait[3]
}
if !${Target.Buff[${Class.CheapHeal}](exists)} && ${This.Usable[${Class.CheapHeal},${Class.FCheapHeal}]}
{
Toon:CastSpell[${Class.CheapHeal}]
HealTarget:Set[${Party.AssistTarget}]
This:RDebug["Heal Routine - Casting ${Class.CheapHeal}",2]
This:RWait[3]
}
}
/*
=====================================================================
Buff Routine
=====================================================================
*/
method BuffRoutine()
{
This:CheckCurrentForm
if ${Me.Sitting}
{
wowpress jump
}
if ${Target.Distance} > 30
{
Navigator:MoveToMob[${Target.GUID}]
return
}
if ${Movement.Speed}
{
move -stop
}
This:RDebug["RCore - Buff Routine on ${Group.Member[${Party.AssistTarget}].Name}",4]
if !${Me.Buff[Shadowguard](exists)} && ${This.Usable["Shadowguard",${Class.FShadowguard}]}
{
Toon:CastSpell[Shadowguard]
return
}
if !${Me.Buff[Touch of Weakness](exists)} && ${This.Usable["Touch of Weakness",${Class.FTouchofWeakness}]}
{
Toon:CastSpell[Touch of Weakness]
return
}
if !${Group.Member[${Party.AssistTarget}].Buff[Fear Ward](exists)} && ${This.Usable["Fear Ward",${Class.FFearWard}]}
{
Toon:CastSpell[Fear Ward]
return
}
if !${Me.Buff[${Class.SelfBuff1}](exists)} && ${This.Usable[${Class.SelfBuff1},${Class.FSelfBuff1}]}
{
Toon:CastSpell[${Class.SelfBuff1}]
return
}
if !${Me.Buff[${Class.SelfBuff2}](exists)} && ${This.Usable[${Class.SelfBuff2},${Class.FSelfBuff2}]}
{
Toon:CastSpell[${Class.SelfBuff2}]
return
}
target ${Group.Member[${Party.AssistTarget}]}
if ${CurrentForm} != ${Class.FBuff1}
{
This:RShift[${Class.FBuff1}]
}
if !${Group.Member[${Party.AssistTarget}](exists)} || ${Me.InCombat} || ${Me.Target.GUID.NotEqual[${Group.Member[${Party.AssistTarget}].GUID}]}
{
return
}
if !${Group.Member[${Party.AssistTarget}].Buff[${Class.Buff1}](exists)} && ${This.Usable[${Class.Buff1},${Class.FBuff1}]}
{
Toon:CastSpell[${Class.Buff1}]
return
}
if !${Group.Member[${Party.AssistTarget}].Buff[${Class.Buff2}](exists)} && ${This.Usable[${Class.Buff2},${Class.FBuff2}]}
{
Toon:CastSpell[${Class.Buff2}]
return
}
if !${Group.Member[${Party.AssistTarget}].Buff[${Class.Buff3}](exists)} && ${This.Usable[${Class.Buff3},${Class.FBuff3}]}
{
Toon:CastSpell[${Class.Buff3}]
return
}
}
/*
=====================================================================
Correct Form
=====================================================================
*/
member CorrectForm(int ReqForm)
{
if ${CurrentForm} == 0 && (${ReqForm} == 0 || ${ReqForm} == 3 || ${ReqForm} == 4 || ${ReqForm} == 5)
{
return TRUE
}
if ${CurrentForm} == ${This.DPSForm} && (${ReqForm} == 2 || ${ReqForm} == 3 || ${ReqForm} == 5 || ${ReqForm} == 6)
{
return TRUE
}
if ${CurrentForm} == ${This.SurvForm} && (${ReqForm} == 1 || ${ReqForm} == 3 || ${ReqForm} == 4 || ${ReqForm} == 6)
{
return TRUE
}
return FALSE
}
/*
=====================================================================
Mana Routine
=====================================================================
*/
method ManaRoutine()
{
if ${Target.InCombat} && ${This.Usable[${Class.ManaRegen}]}
{
This:RShift[${Class.FManaRegen}]
Party:PartyCast[${Class.InnervateMod}, 100, 30, ${Class.ManaRegen}, FALSE, FALSE]
}
}
/*
=====================================================================
Pot Routine
=====================================================================
*/
method PotRoutine()
{
if ${Me.PctMana} < ${Class.PotMana} && ${Consumable.HasMPot} && !${Me.Buff[${Class.ManaRegen}](exists)}
{
This:RShift[${Class.FPotion}]
Consumable:useMPot()
return
}
if ${Me.PctHPs} < ${Class.PotHP} && ${Consumable.HasMPot}
{
This:RShift[${Class.FPotion}]
Consumable:useHPot()
return
}
}
/*
=====================================================================
Hot Routine
=====================================================================
*/
method HotRoutine()
{
if ${Me.Target.PctHPs} < ${This.HoTHealHP}
{
if !${Me.Target.Buff[${Class.HoTHeal}](exists)} && ${This.Usable[${Class.HoTHeal},${Class.FHoTHeal}]}
{
Toon:CastSpell[${Class.HoTHeal}]
This:RDebug["Heal Routine - Casting ${Class.HoTHeal}",2]
return
}
}
}
/*
=====================================================================
Sort Forms
=====================================================================
*/
method SortForms()
{
This.TravelingForm:Set[0]
This.DPSForm:Set[0]
This.SurvForm:Set[0]
for (i:Set[1]; ${i}<=${WoWScript[GetNumShapeshiftForms()]}; i:Inc)
{
if ${WoWScript[GetShapeshiftFormInfo(${i}),2](exists)}
{
if ${WoWScript[GetShapeshiftFormInfo(${i}),2].Find[${Class.FormForTraveling}]}
{
This.TravelingForm:Set[${i}]
}
if ${WoWScript[GetShapeshiftFormInfo(${i}),2].Find[${Class.FormForDPS}]}
{
This.DPSForm:Set[${i}]
}
if ${WoWScript[GetShapeshiftFormInfo(${i}),2].Find[${Class.FormForSurv}]}
{
This.SurvForm:Set[${i}]
}
}
}
if ${This.DPSForm} == 0 && ${Spell[${Class.FormForDPS}](exists)}
{
This:RDebug["DPS Form: ${Class.FormForDPS}",0]
This.DPSForm:Set[1]
}
else
{
This:RDebug["DPS Form: ${WoWScript[GetShapeshiftFormInfo(${DPSForm}),2]} (Slot ${DPSForm})",0]
}
if ${This.SurvForm} == 0 && ${Spell[${Class.FormForSurv}](exists)}
{
This:RDebug["Surv Form: ${Class.FormForSurv}",0]
This.SurvForm:Set[1]
}
else
{
This:RDebug["Surv Form: ${WoWScript[GetShapeshiftFormInfo(${SurvForm}),2]} (Slot ${SurvForm})",0]
}
if ${This.TravelingForm} == 0 && ${Spell[${Class.FormForTraveling}](exists)}
{
This:RDebug["Traveling Form: ${Class.FormForTraveling}",0]
This.TravelingForm:Set[1]
}
else
{
This:RDebug["Traveling Form: ${WoWScript[GetShapeshiftFormInfo(${TravelingForm}),2]} (Slot ${TravelingForm})",0]
}
}
/*
=====================================================================
Check Current Form
=====================================================================
*/
method CheckCurrentForm()
{
CurrentForm:Set[${WoWScript[GetShapeshiftForm()]}]
This:RDebug["Current Form: ${CurrentForm}",3]
}
/*
=====================================================================
Usable
=====================================================================
*/
member Usable(string thisSpell, int ReqForm, int SpellSchool)
{
if !${thisSpell.Equal["Nothing"]}
{
This:RDebug["Trying to cast ${CurrentSpell} - School ${CurrentSpellSchool}",3]
if ${Spell[${thisSpell}](exists)} && !${Spell[${thisSpell}].Cooldown} && (${Me.CurrentPower} > (${Spell[${thisSpell}].Mana}*${CostMulti}) || ${Me.Buff[Clearcasting](exists)} || ${Me.Buff[Inner Focus](exists)}) && (${Immunity} != ${SpellSchool} || ${Immunity} == 0) && ${This.CorrectForm[${ReqForm}]} && ${Me.Action[${thisSpell}].Usable} && !${Target.Buff["Banish"](exists)}
{
CurrentSpell:Set[${thisSpell}]
CurrentSpellSchool:Set[${SpellSchool}]
return TRUE
}
}
return FALSE
}
/*
=====================================================================
Check behind
=====================================================================
*/
method CheckBehind()
{
if ${Me.Target.Distance} < 10
{
if ${Math.Abs[${Target.Heading} - ${Me.HeadingTo[${Target.X},${Target.Y}]}]} < 90
{
This.Behind:Set[TRUE]
}
else
{
This.Behind:Set[FALSE]
}
}
}
/*
=====================================================================
Set Danger
=====================================================================
*/
method SetDanger()
{
if !${Me.InCombat}
{
CombatStart:Set[${LavishScript.RunningTime}]
This:RDebug["${CombatStart}"]
}
variable guidlist Aggros
This.DangerLevel:Set[${DangerLevel} * 0.5]
if ${Party.Tanking}
{
Aggros:Search[-units,-nearest,-aggro,-alive,-range 0-40]
This.DangerLevel:Set[${DangerLevel} + ${Aggros.Count}*6.5]
}
else
{
Aggros:Search[-units,-nearest,-targettingme,-alive,-range 0-40]
This.DangerLevel:Set[${DangerLevel} + ${Aggros.Count}*6.5]
}
if ${Me.PctMana} > 0 && !${Party.Tanking}
{
This.DangerLevel:Set[${DangerLevel} + ((100 - ${Me.PctMana})*0.1)]
}
This.CombatTime:Set[${Math.Calc[(${LavishScript.RunningTime} - ${CombatStart})/1000]}]
This.DangerLevel:Set[${DangerLevel} + (${CombatTime}/5)]
if ${Math.Calc[${CombatTime}%5]} == 0
{
This:RDebug["I've been in combat for ${CombatTime} seconds increasing the danger by ${Math.Calc[${CombatTime}/5]}.",3]
}
if ${Target.Level} > ${Me.Level}
{
This.DangerLevel:Set[${DangerLevel} + ((${Target.Level} - ${Me.Level})*2)]
}
elseif ${Me.Level} > ${Target.Level}
{
This.DangerLevel:Set[${DangerLevel} + ((${Target.Level} - ${Me.Level})*1)]
}
if ${Target.Classification.Equal[Elite]} || ${Target.Classification.Equal[RareElite]}
{
This.DangerLevel:Set[${DangerLevel} + 20]
}
if ${Target.Player(exists)} && ${Target.Attackable}
{
This.DangerLevel:Set[${DangerLevel} + 20]
}
if ${DangerLevel} < 0
{
This.DangerLevel:Set[0]
}
UIElement[lblDangerLvl@ClassGUI]:SetText[Danger Level: ${DangerLevel}]
UIElement[sldDangerLvl@ClassGUI]:SetValue[${Math.Calc[(${DangerLevel}/(${Class.DangerVeryHigh}*2.5))*100]}]
if ${DangerLevel} > (${Class.DangerVeryHigh}*2.5)
{
This:RDebug["Danger - Very High ${DangerLevel}",0]
This.Dangerlvl:Set[3]
return
}
if ${DangerLevel} > ${Class.DangerHigh}
{
This:RDebug["Danger - High ${DangerLevel}",1]
This.Dangerlvl:Set[2]
return
}
if ${DangerLevel} > ${Class.DangerMedium}
{
This:RDebug["Danger - Medium ${DangerLevel}",2]
This.Dangerlvl:Set[1]
return
}
This:RDebug["Danger - Low ${DangerLevel}",3]
This.Dangerlvl:Set[0]
return
}
/*
=====================================================================
RDebug
=====================================================================
*/
method RDebug(string RMsg, int MsgType = 0)
{
if ${Class.DebugLevel} >= ${MsgType}
{
This:Output[${RMsg}]
}
}
/*
=====================================================================
Cancel All Forms
=====================================================================
*/
method CancelAllForms()
{
if ${WoWScript[GetShapeshiftForm()]} != 0
{
if ${WoWScript[GetShapeshiftFormInfo(${WoWScript[GetShapeshiftForm()]}),2](exists)}
{
WoWScript CastShapeshiftForm(${WoWScript[GetShapeshiftForm()]})
}
else
{
Me.Buff[${Class.FormForDPS}]:Remove
}
}
}
/*
=====================================================================
RWait
=====================================================================
*/
method RWait(int WaitTime)
{
if ${CurrentWait} == 0
{
This.CurrentWait:Set[${WaitTime}]
return
}
elseif ${CurrentWait} > 0
{
if ${Toon.Casting}
{
return
}
else
{
CurrentWait:Dec
This:RDebug["Waiting... ${CurrentWait} Pulse left.",3]
}
}
}
/*
=====================================================================
Immune
=====================================================================
*/
method CombatEvent()
{
This:RDebug["Immune! (${CurrentSpell}) - Stopping same-school spells",1]
Immunity:Set[${CurrentSpellSchool}]
}
/*
=====================================================================
UI Error Message
=====================================================================
*/
method UIErrorMessage()
{
This:RDebug["UI Error! ${Msg}",1]
if ${Msg.Equal[You are facing the wrong way!]} && !${Toon.Casting}
{
if ${Me.Target(exists)}&& !${Me.Target.Name.Equal[${Me.Name}]}
{
Navigator:MoveToMob[${Target.GUID}]
}
Navigator:MoveBackward[2000]
return
}
if ${Msg.Equal[You can't take a taxi while shapeshifted!]} || ${Msg.Equal[Can't use items while shapeshifted.]}
{
This:CancelAllForms
return
}
if ${Msg.Equal[You are in shapeshift form]}
{
;This:CancelAllForms
return
}
if ${Msg.Equal[Target not in line of sight]}
{
if !${Movement.Speed}
{
Random:Set[${Math.Rand[100]}]
if ${Random} < 50
{
move Left 1000 Forward 500
}
else
{
move Right 1000 Forward 500
}
}
return
}
if ${Msg.Equal[You must be behind your target]}
{
if !${Movement.Speed}
{
Random:Set[${Math.Rand[100]}]
if ${Random} < 50
{
move Left 1000 Backward 500
}
else
{
move Right 1000 Backward 500
}
}
return
}
if ${Msg.Equal[Can only use outside]}
{
Immunity:Set[${CurrentSpellSchool}]
return
}
if ${Msg.Equal[Invalid Target]}
{
WoWScript ClearTarget()
return
}
}
/*
=====================================================================
Check for Scrolls
=====================================================================
*/
member checkForScrolls()
{
if ${Consumable.HasScroll[Strength]} && !${Me.Buff[Strength](exists)}
{
This:RDebug["Scroll Pulse: Using Scroll of Strength",1]
return "Strength"
}
if ${Consumable.HasScroll[Agility]} && !${Me.Buff[Agility](exists)}
{
This:RDebug["Scroll Pulse: Using Scroll of Agility",1]
return "Agility"
}
if ${Consumable.HasScroll[Stamina]} && !${Me.Buff[Stamina](exists)} && !${Me.Buff[Power Word: Fortitude](exists)}
{
This:RDebug["Scroll Pulse: Using Scroll of Stamina",1]
return "Stamina"
}
if ${Consumable.HasScroll[Protection]} && !${Me.Buff[Armor](exists)}
{
This:RDebug["Scroll Pulse: Using Scroll of Protection",1]
return "Protection"
}
if ${Consumable.HasScroll[Spirit]} && !${Me.Buff[Spirit](exists)} && !${Me.Buff[Divine Spirit](exists)}
{
This:RDebug["Scroll Pulse: Using Scroll of Spirit",1]
return "Spirit"
}
if ${Consumable.HasScroll[Intellect]} && !${Me.Buff[Intellect](exists)} && !${Me.Buff[Arcane Intellect](exists)}
{
This:RDebug["Scroll Pulse: Using Scroll of Intellect",1]
return "Intellect"
}
return "NONE"
}
/*
=====================================================================
IsRooted
=====================================================================
*/
member IsRooted()
{
if ${Target.Buff[Entangling Roots](exists)} || ${Target.Buff[Frost Nova](exists)}
{
return TRUE
}
return FALSE
}
/*
=====================================================================
Need Self Buff
=====================================================================
*/
member NeedSelfBuff()
{
variable guidlist PVPAggro
PVPAggro:Search[-players, -pvp, -units, -alive, -attackable, -range 0-30]
if ${PVPAggro.Count} == 0 && !${Me.Buff[${Class.SelfBuff1}](exists)} && ${Spell[${Class.SelfBuff1}](exists)}
{
This:RDebug["I needs Buffing",2]
return TRUE
}
if ${PVPAggro.Count} == 0 && !${Me.Buff[${Class.SelfBuff2}](exists)} && ${Spell[${Class.SelfBuff2}](exists)}
{
This:RDebug["I needs Buffing",2]
return TRUE
}
return FALSE
}
/*
=====================================================================
RTarget
=====================================================================
*/
method RTarget(string NewTargetID, int TargetType)
{
if !${NewTargetID(exists)} || ${NewTargetID.Equal[${Me.Target.GUID}]}
{
return
}
if ${TargetCD} > 0
{
if ${TargetType} == 0
{
if ${Me.Power.Equal["Energy"]} && ${Me.ComboPoints} > 0 && ${Me.Target(exists)}
{
if ${This.Usable[${Class.KBFinish},${Class.FKBFinish},${Class.SKBFinish}]} && ${Target.PctHPs} < (${Me.ComboPoints}*8)
{
This:RDebug["Targetting Routine - Using ${Class.KBFinish}",2]
Toon:CastSpell[${Class.KBFinish}]
return
}
elseif ${This.Usable[${Class.DoTFinish},${Class.FDoTFinish},${Class.SDoTFinish}]}
{
This:RDebug["Targetting Routine - Using ${Class.KDoTinish}",2]
Toon:CastSpell[${Class.KDoTinish}]
return
}
}
This:RDebug["(Normal) Target Switch Cooldown - ${TargetCD} Left",3]
if ${Group.Member[${Party.AssistTarget}].Target.ReactionLevel} < 4 && !${Group.Member[${Party.AssistTarget}].Target.Dead} && ${Group.Member[${Party.AssistTarget}].Target.InCombat}
{
NewTargetID:Set[${Group.Member[${Party.AssistTarget}].Target.GUID}]
}
elseif ${Targeting.TargetCollection.Get[1].GUID(exists)}
{
NewTargetID:Set[${Targeting.TargetCollection.Get[1].GUID}]
}
else
{
NewTargetID:Set[${Group.Member[${Party.AssistTarget}].GUID}]
}
}
if ${TargetType} == 1
{
This:RDebug["(Fast) Target Switch Cooldown - ${TargetCD} Left",3]
TargetCD:Dec
return
}
if ${TargetType} == 2
{
This:RDebug["(Very Fast) Target Switch Cooldown - ${TargetCD} Left",3]
TargetCD:Dec[3]
}
if ${TargetType} == 3
{
This:RDebug["(Instant) Target Switch Cooldown - ${TargetCD} Left",3]
TargetCD:Set[0]
}
if ${TargetCD} > 0
{
TargetCD:Dec
return
}
}
This:RDebug["Switching Targets: ${Me.Target.Name} -> ${Object[${NewTargetID}].Name}",1]
target ${NewTargetID}
TargetCD:Set[${Class.TargetLimit}]
return
}
/*
=====================================================================
Flee Pulse
=====================================================================
*/
method FleePulse()
{
This:SetDanger
This:CheckCurrentForm
This:RDebug["Danger: ${DangerLevel}",0]
if ${Currentform} != ${TravelingForm}
{
This:RShift[${TravelingForm}]
This:RDebug["Flee - Shifting to Travel Form",1]
}
else
{
if ${This.Usable[${Class.SpeedBoost},${Class.FSpeedBoost}]}
{
Toon:CastSpell[${Class.SpeedBoost}]
}
variable guidlist PVEAggro
PVEAggro:Search[-units, -alive, -range 0-8]
if ${PVEAggro.Count} > 0 && ${This.Usable[${Class.PanicSpell},${Class.FPanicSpell}]}
{
Toon:CastSpell[${Class.PanicSpell}]
}
if ${PVEAggro.Count} > 0 && ${This.Usable[${Class.MeleeBuffSpell},${Class.FMeleeBuffSpell}]}
{
Toon:CastSpell[${Class.MeleeBuffSpell}]
}
if ${This.Usable[${Class.ProtectSpell},${Class.FProtectSpell}]}
{
Toon:CastSpell[${Class.Protectpell}]
}
if ${This.Usable[${Class.RagePanic},${Class.RagePanic}]}
{
Toon:CastSpell[${Class.RagePanic}]
}
}
}
/*
=====================================================================
Check Target
=====================================================================
*/
method CheckTarget()
{
if ${Target.GUID.NotEqual[${Targeting.TargetCollection.Get[1]}]} && ${Unit[${Targeting.TargetCollection.Get[1]}](exists)}
{
This:RDebug["CheckTarget",3]
This:RTarget[${Targeting.TargetCollection.Get[1].GUID},0]
return
}
}
/*
=====================================================================
Healing
=====================================================================
*/
member Healing()
{
if !${Toon.Casting}
{
return FALSE
}
if (${Me(unit).Casting.Name.Find[Heal]} || ${Me(unit).Casting.Name.Find[Holy]} || ${Me(unit).Casting.Name.Find[Regrowth]} ||${Me(unit).Casting.Name.Find[Naaru]}) && !${Me(unit).Casting.Name.Find[Holy Fire]}
{
return TRUE
}
else
{
return FALSE
}
}
/*
=====================================================================
RTrain
=====================================================================
*/
method RTrain()
{
if ${RTraining} == 0 || ${Toon.Casting}
{
return
}
if ${RTraining} == 1
{
move -stop
Toon:Standup
if ${CurrentForm} == 0
{
Toon:CastSpell["Teleport: Moonglade",1]
if ${Toon.Casting}
{
RTraining:Set[2]
}
This.TargetLoc:Set[7992,-2680,512]
This:RDebug["Stage 1 - Teleporting to Moonglade",1]
}
else
{
This:RShift[0]
}
return
}
if ${RTraining} == 2
{
if ${Math.Distance[${Me.X},${Me.Y},${TargetLoc.X},${TargetLoc.Y}]} > 3
{
Navigator:MoveToLoc[${TargetLoc}]
This:RDebug["Stage 2 - Checking I've arived (${RTraining})",2]
return
}
else
{
RTraining:Set[3]
This.TargetLoc:Set[8006,-2655,512]
This:RDebug["Stage 3 - Walking to Trainer",1]
return
}
return
}
if ${RTraining} == 3
{
if ${Math.Distance[${Me.X},${Me.Y},${TargetLoc.X},${TargetLoc.Y}]} > 3
{
Navigator:MoveToLoc[${TargetLoc}]
This:RDebug["Stage 2 - Checking I've arived (${RTraining})",2]
return
}
else
{
RTraining:Set[4]
This.TargetLoc:Set[8014,-2648,512]
This:RDebug["Stage 3 - Walking to Trainer",1]
return
}
return
}
if ${RTraining} == 4
{
if ${Math.Distance[${Me.X},${Me.Y},${TargetLoc.X},${TargetLoc.Y}]} > 3
{
Navigator:MoveToLoc[${TargetLoc}]
This:RDebug["Stage 2 - Checking I've arived (${RTraining})",2]
return
}
else
{
RTraining:Set[5]
This.TargetLoc:Set[8012,-2629,508]
This:RDebug["Stage 3 - Walking to Trainer",1]
return
}
return
}
if ${RTraining} == 5
{
if ${Math.Distance[${Me.X},${Me.Y},${TargetLoc.X},${TargetLoc.Y}]} > 3
{
Navigator:MoveToLoc[${TargetLoc}]
This:RDebug["Stage 2 - Checking I've arived (${RTraining})",2]
return
}
else
{
RTraining:Set[6]
This.TargetLoc:Set[8010,-2614,503]
This:RDebug["Stage 3 - Walking to Trainer",1]
return
}
return
}
if ${RTraining} == 6
{
if ${Math.Distance[${Me.X},${Me.Y},${TargetLoc.X},${TargetLoc.Y}]} > 3
{
Navigator:MoveToLoc[${TargetLoc}]
This:RDebug["Stage 2 - Checking I've arived (${RTraining})",2]
return
}
else
{
RTraining:Set[7]
This.TargetLoc:Set[8002,-2600,495]
This:RDebug["Stage 3 - Walking to Trainer",1]
return
}
return
}
if ${RTraining} == 7
{
if ${Math.Distance[${Me.X},${Me.Y},${TargetLoc.X},${TargetLoc.Y}]} > 3
{
Navigator:MoveToLoc[${TargetLoc}]
This:RDebug["Stage 2 - Checking I've arived (${RTraining})",2]
return
}
else
{
RTraining:Set[8]
This.TargetLoc:Set[7976,-2602,491]
This:RDebug["Stage 3 - Walking to Trainer",1]
return
}
return
}
if ${RTraining} == 8
{
if ${Math.Distance[${Me.X},${Me.Y},${TargetLoc.X},${TargetLoc.Y}]} > 3
{
Navigator:MoveToLoc[${TargetLoc}]
This:RDebug["Stage 2 - Checking I've arived (${RTraining})",2]
return
}
else
{
RTraining:Set[9]
This.TargetLoc:Set[7955,-2590,490]
This:RDebug["Stage 3 - Walking to Trainer",1]
return
}
return
}
if ${RTraining} == 9
{
if ${Math.Distance[${Me.X},${Me.Y},${TargetLoc.X},${TargetLoc.Y}]} > 3
{
Navigator:MoveToLoc[${TargetLoc}]
This:RDebug["Stage 2 - Checking I've arived (${RTraining})",2]
return
}
else
{
RTraining:Set[10]
This.TargetLoc:Set[7935,-2577,488]
This:RDebug["Stage 3 - Walking to Trainer",1]
return
}
return
}
if ${RTraining} == 10
{
if ${Math.Distance[${Me.X},${Me.Y},${TargetLoc.X},${TargetLoc.Y}]} > 3
{
Navigator:MoveToLoc[${TargetLoc}]
This:RDebug["Stage 2 - Checking I've arived (${RTraining})",2]
return
}
else
{
RTraining:Set[11]
This.TargetLoc:Set[7910,-2569,488]
This:RDebug["Stage 3 - Walking to Trainer",1]
return
}
return
}
if ${RTraining} == 11
{
if ${Math.Distance[${Me.X},${Me.Y},${TargetLoc.X},${TargetLoc.Y}]} > 3
{
Navigator:MoveToLoc[${TargetLoc}]
This:RDebug["Stage 2 - Checking I've arived (${RTraining})",2]
return
}
else
{
RTraining:Set[12]
This.TargetLoc:Set[7888,-2579,487]
This:RDebug["Stage 3 - Walking to Trainer",1]
return
}
return
}
if ${RTraining} == 12
{
if ${Math.Distance[${Me.X},${Me.Y},${TargetLoc.X},${TargetLoc.Y}]} > 3
{
Navigator:MoveToLoc[${TargetLoc}]
This:RDebug["Stage 2 - Checking I've arived (${RTraining})",2]
return
}
else
{
RTraining:Set[13]
This.TargetLoc:Set[7869,-2590,486]
This:RDebug["Stage 3 - Walking to Trainer",1]
return
}
return
}
if ${RTraining} == 13
{
if ${Math.Distance[${Me.X},${Me.Y},${TargetLoc.X},${TargetLoc.Y}]} > 3
{
Navigator:MoveToLoc[${TargetLoc}]
This:RDebug["Stage 4 - Heading to Trainer",2]
return
}
else
{
RTraining:Set[14]
This:RDebug["Stage 5 - Arrived at Trainer",1]
return
}
return
}
if ${RTraining} == 14
{
move -stop
POI.NeedClassTrainer:Set[TRUE]
This:RDebug["Stage 6 - Training",1]
RTraining:Set[15]
return
}
if ${RTraining} == 15
{
This:TweakConfig
move -stop
if !${POI.NeedClassTrainer}
{
This:RDebug["Stage 8 - Hearthing",1]
Item[Hearthstone]:Use
RTraining:Set[0]
This:RWait[50]
return
}
return
}
}
/*
=====================================================================
Siiiiigh
=====================================================================
*/
method LoadConfig()
{
Class.FormForTraveling:Set[${Config.GetSetting["${RealmChar}","FormForTraveling"]}]
Class.FormForSurv:Set[${Config.GetSetting["${RealmChar}","FormForSurv"]}]
Class.FormForDPS:Set[${Config.GetSetting["${RealmChar}","FormForDPS"]}]
UIElement[TravelForm@ClassGUI]:SetText[${Class.FormForTraveling}]
UIElement[SurvForm@ClassGUI]:SetText[${Class.FormForSurv}]
UIElement[DPSForm@ClassGUI]:SetText[${Class.FormForDPS}]
This:SortForms
}
method SaveConfig()
{
Config:SetSetting["${RealmChar}","FormForTraveling",${UIElement[TravelForm@ClassGUI].Text}]
Config:SetSetting["${RealmChar}","FormForSurv",${UIElement[SurvForm@ClassGUI].Text}]
Config:SetSetting["${RealmChar}","FormForDPS",${UIElement[DPSForm@ClassGUI].Text}]
This:LoadConfig
}
member NeedDead()
{
Party:AssistCheck
if ${Group.Member[${Party.AssistTarget}].InCombat}
{
This.ReleaseTime:Set[100]
return TRUE
}
if !${Group.Member[${Party.AssistTarget}].Dead}
{
This.ReleaseTime:Set[100]
return TRUE
}
if ${This.ReleaseTime} > 0
{
This.ReleaseTime:Dec
return TRUE
}
return FALSE
}
method DeadPulse()
{
WoWScript AcceptResurrect()
WoWScript UseSoulstone()
This:Output[Waiting on ${Group.Member[${Party.AssistTarget}]} (${ReleaseTime})]
}
/*
=====================================================================
END
=====================================================================
*/
}