objectdef oClass inherits oBase
{
variable int RestHP = 75
variable int RestMP = 0
variable int StopCastingMP = 60
variable int PotMP = 10
variable int PotHP = 10
variable int BandHP = 0
variable int StandHP = 80
variable int StandMP = 95
variable bool RestHeal = TRUE
;----------------------
;--- Range Settings ---
;----------------------
variable int PullRange = 30
variable int MaxRanged = 30
variable int MinRanged = 15
variable int MaxMelee = 8
variable int MinMelee = 2
;----------------------
;--- Buff Variables ---
;----------------------
variable string WeaponProc = "Windfury Weapon"
variable string WeaponBuffName = "Windfury"
variable string ShieldBuff = "Water Shield"
variable string PrimaryHealingSpell = "Lesser Healing Wave"
; Heal / Mana stuff
; Percentage of life before a heal is cast
variable int CombatHealHP = 65
;----------------------
;--- Init and Shutdown ---
;----------------------
method Initialize()
{
}
method Shutdown()
{
}
;------------------
;--- Rest SetUp ---
;------------------
member NeedRest()
{
if ${Me.InCombat}
{
; dont rest in combat
return FALSE
}
if ${Me.Buff[Resurrection Sickness](exists)}
{
; wait in rest if you have rez sickness
return TRUE
}
if ${Me.PctHPs} < ${RestHP}
{
; we are below our rest threshold for health
return TRUE
}
if ${Me.PctHPs} < ${StandHP} && ${Me.Sitting}
{
; stay stitting until full health
return TRUE
}
if ${Me.PctMana} < ${RestMP}
{
; we are below our rest threshold for Mana
return TRUE
}
if ${Me.PctMana} < ${StandMP} && ${Me.Sitting}
{
; stay stitting until full health
return TRUE
}
; otherwise FALSE when we dont need rest
return FALSE
}
method RestPulse()
{
if ${Movement.Speed} || ${Movement.Forward} || ${Movement.Backward}
{
; ensure we arent moving
move -stop
}
if ${Me.Buff[Resurrection Sickness](exists)}
{
; stupid rez sickness
Toon:Sitdown
return
}
; If I am full of mana and not eating and I am sitting stand up
if ${Me.PctMana} >= ${StandMP} && !${Me.Buff[Food](exists)} && ${Me.Sitting}
{
Toon:Standup
}
if ${Me.PctMana} > ${RestMP} && ${Me.PctHPs} < ${RestHP} && ${RestHeal}
{
; rest heal
Toon:CastSpell[Lesser Healing Wave]
return
}
elseif ${Consumable.HasFood} && ${Me.PctHPs} < ${RestHP} && !${Me.Buff[Food](exists)}
{
; eat
Consumable:useFood
return
}
elseif ${Me.PctHPs} < ${RestHP}
{
; sit down if we need HP
Toon:Sitdown
return
}
if ${Consumable.HasDrink} && ${Me.PctMana} < ${RestMP} && !${Me.Buff[Drink](exists)}
{
; eat
Consumable:useDrink
return
}
elseif ${Me.PctMana} < ${RestMP}
{
; sit down if we need MANA
Toon:Sitdown
return
}
; NOTE-- Casters will want to add this to the next line--
/* && ${Me.PctMana} >= ${Config:GetSlider[sldStandMana]} */
if ${Me.PctHPs} >= ${StandHP} && ${Me.PctMana} >= ${StandMP} && ${Me.Sitting}
{
; stand up when we are done resting
Toon:Standup
return
}
}
;------------------
;--- Buff SetUp ---
;------------------
member NeedBuff()
{
if (${Me.Equip[mainhand].PctDurability} > 1)
{
if !${Me.Casting} && (${This.WeaponProc.NotEqual[NONE]} && (!${Me.Equip[mainhand].Enchantment[${This.WeaponBuffName}](exists)} || ((${Me.Equip[offhand].SubType.NotEqual[Shield]} && ${Me.Equip[offhand].SubType.NotEqual[Miscellaneous]}) && !${Me.Equip[offhand].Enchantment[${This.WeaponBuffName}](exists)}))
{
This:Output["Im missing my weapon buff, do I even own it yet? -- ${This.WeaponBuffName} -- ${This.WeaponProc}"]
return TRUE
}
return FALSE
}
return FALSE
}
method BuffPulse()
{
Toon:Standup
if ${Spell[${This.WeaponProc}](exists)}
{
if !${Me.Equip[mainhand].Enchantment[${This.WeaponBuffName}](exists)} || ((${Me.Equip[offhand].SubType.NotEqual[Shield]} && ${Me.Equip[offhand].SubType.NotEqual[Miscellaneous]}) && !${Me.Equip[offhand].Enchantment[${This.WeaponBuffName}](exists)})
{
Toon:CastSpell[${This.WeaponProc}]
return
}
}
return
}
;------------------
;--- Pull SetUp ---
;------------------
member NeedPullBuff()
{
return FALSE
}
method PullBuffPulse()
{
}
;------------------------
;--- CombatBuff SetUp ---
;------------------------
member NeedCombatBuff()
{
return FALSE
}
method CombatBuffPulse()
{
}
;------------------
;--- Pull SetUp ---
;------------------
variable int PullTimeDelay = ${LavishScript.RunningTime}
variable int RandomPull = 99
method PullPulse()
{
if ${PullTimeDelay}>${LavishScript.RunningTime}
{
; We shouldnt do anything
Navigator:FaceXYZ[${Target.X},${Target.Y},${Target.Z}]
return
}
if !${Toon.ValidTarget[${Target.GUID}]}
{
; ensure we target is valid
This:Output["I need a target"]
Toon:NeedTarget[1]
return
}
if !${Toon.TargetIsBestTarget}
{
; ensure our target is the best target
This:Output["Target is no longer best target, aquire new target."]
Toon:BestTarget
return
}
; If I am currently casting or have global cooldown return
if ${Me.Casting} || ${Me.GlobalCooldown}
{
return
}
if !${Toon.withinRanged[TRUE]}
{
Toon:ToRanged
return
}
if ${Movement.Speed}
{
move -stop
return
}
; Bust Blood Fury if we got it and we can
if ${Spell[Blood Fury](exists)} && !${Spell[Blood Fury].Cooldown}
{
Toon:CastSpell["Blood Fury"]
return
}
; Pull with Lightning Bolt
Navigator:FaceXYZ[${Target.X},${Target.Y},${Target.Z}]
Toon:CastSpell["Lightning Bolt"]
PullTimeDelay:Set[${Math.Calc[ ${LavishScript.RunningTime} + ${Spell[Lightning Bolt].CastTime} + 1000 ]}]
}
;--------------------
;--- Combat SetUp ---
;--------------------
method AttackPulse()
{
if !${Toon.ValidTarget[${Target.GUID}]}
{
; ensure we target is valid
This:Output["I need a target"]
Toon:NeedTarget[1]
if ${Movement.Speed}
{
This:Debug["Needed a target and was still moving?"]
move -stop
}
return
}
if ${PullTimeDelay}>${LavishScript.RunningTime}
{
; We shouldnt do anything
return
}
if !${Me.Attacking}
{
WoWScript AttackTarget()
}
Navigator:FaceXYZ[${Target.X},${Target.Y},${Target.Z}]
if ${Me.Casting} || ${Me.GlobalCooldown}
{
; Dont need to do anything we are casting
return
}
; We need to get to melee the bastard
Toon:ToMelee
if ${Target.Distance}<=${MaxMelee} && ${Movement.Speed}
{
move -stop
}
; Do we have our shield buff on, if it's lightning shield, check mana level too
if !${Me.Buff[${This.ShieldBuff}](exists)} && ${Spell[${This.ShieldBuff}](exists)} && ${This.ShieldBuff.Equal[Lightning Shield]} && ${Me.PctMana} > 50
{
This:Output["Attempting to cast ${This.ShieldBuff}"]
Toon:CastSpell[${This.ShieldBuff}]
}
; If it's water shield, put it on always
if !${Me.Buff[${This.ShieldBuff}](exists)} && ${Spell[${This.ShieldBuff}](exists)} && ${This.ShieldBuff.Equal[Water Shield]}
{
This:Output["Attempting to cast ${This.ShieldBuff}"]
Toon:CastSpell[${This.ShieldBuff}]
}
; If we have stormstrike use it
if ${Spell[Stormstrike](exists)} && !${Spell[Stormstrike].Cooldown}
{
Toon:CastSpell["Stormstrike"]
}
; If we have alot of mana Earth Shock him for shits and giggles
if ${Me.PctMana} < ${StopCastingMP} && ${Spell[Earth Shock](exists)} && !${Spell[Earth Shock].Cooldown} && ${Me.Buff[Focused](exists)}
{
This:Output["Attempting to cast Earth Shock"]
Toon:CastSpell["Earth Shock"]
}
; If target is casting on us and we can shock it then do that
if ${Spell[Earth Shock](exists)} && !${Spell[Earth Shock].Cooldown} && ${Target.Casting(exists)} && !${Me.Buff[Grounding Totem Effect].exists} && !${Me.Casting}
{
Toon:CastSpell["Earth Shock"]
}
; If target is casting and earth shock is on cooldown but grounding totem is not on cooldown then cast grounding totem
if ${Spell[Grounding Totem](exists)} && !${Spell[Grounding Totem].Cooldown} && !${Me.Buff[Grounding Totem Effect].exists} && ${Target.Casting(exists)}
{
Toon:CastSpell[Grounding Totem]
}
; If we have less than the stop casting mana and the targets hp is greater than 80 percent cast shamanisitic rage
if ${Me.PctMana} <= ${StopCastingMP} && ${Target.PctHPs} > 80 && !${Spell[Shamanistic Rage].Cooldown} && ${Spell[Shamanistic Rage](exists)}
{
Toon:CastSpell["Shamanistic Rage"]
}
; Check Earth Totem Buffs
This:EarthCheck
; Check Fire Totem Buffs
; Check Water Totem Buffs
; Check Air Totem Buffs
if ${Me.PctHPs} < ${CombatHealHP} && ${Me.Action[Lesser Healing Wave].Usable}
{
This:Output["Attempting to cast Healing Wave"]
Toon:CastSpell["Lesser Healing Wave"]
}
}
method EarthCheck()
{
variable guidlist Aggros
/* determine number of adds */
Aggros:Clear
Aggros:Search[-units, -nearest, -targetingme, -alive, -range 0-30]
if ${Aggros.Count}>=2
{
if ${Spell[Stoneclaw Totem](exists)} && !${Unit[${Aggros.GUID[2]}].CreatureType.Equal[Totem]} && !${Spell[Stoneclaw Totem].Cooldown}
{
Toon:CastSpell[Stoneclaw Totem]
}
if ${Aggros.Count}>=3 && !${Spell[Gift of the Naaru].Cooldown}
{
Toon:CastSpell["Gift of the Naaru"]
}
return
}
;If we have shamanistic rage off cooldown cast it now
if ${Toon.CanCast[Shamanistic Rage]} && !${Spell[Shamanistic Rage].Cooldown} && ${Me.PctMana} <= ${StopCastingMP}
{
Toon:CastSpell[Shamanistic Rage]
}
; If we have a cooldown on it.. That means it is out lets not overide that
if ${Spell[Stoneclaw Totem](exists)} && ${Spell[Stoneclaw Totem].Cooldown}
{
return
}
;if !${Me.Buff[Strength of Earth](exists)} && ${Spell[Strength of Earth Totem](exists)}
;{
; Toon:CastSpell[Strength of Earth Totem]
;}
}
;------------------
;--- Assist Mode ---
;------------------
member IsAssistMode()
{
; returns a check that determines if the bot is in party mode
if ${UIElement[chkAssistMode@Overview@Pages@openbot].Checked}
{
return TRUE
}
return FALSE
}
;------------------
;--- Flee SetUp ---
;------------------
variable bool HookFlee = FALSE
method FleePulse()
{
; stuff to do while fleeing
}
;------------------
;--- Dead SetUp ---
;------------------
member NeedDead()
{
return FALSE
}
method DeadPulse()
{
; This is where you would do stuff while Dead before Release
}
;------------------
;--- Idle SetUp ---
;------------------
variable bool NeedCombatIdle = FALSE
method CombatIdle()
{
; stuff to do while Idle in Combat
}
;----------------------
;--- Event Hooking ---
;----------------------
variable bool needUIHook = TRUE
method UIErrorMessage(string Id, string Msg)
{
; check msg and perform action
}
variable bool needCombatHook = TRUE
method CombatEvent(string unitID, string unitAction, string isCrit, string amtDamage, string damageType)
{
; check args and perform action
}
;--------------------
;--- GUI SetUp ---
;--------------------
method SetGUI()
{
variable string uniqueToon = "${Me.Name}:${Me.Class}:${ISXWoW.RealmName.Replace[',REMOVE,.,REMOVE]}"
Config:SetSlider[${uniqueToon},"sldRestHP","sldRestHP@Main@Pages@ClassGUI",60]
Config:SetSlider[${uniqueToon},"sldStandHP","sldStandHP@Main@Pages@ClassGUI",100]
Config:SetSlider[${uniqueToon},"sldPullBailOutTimer","sldPullBailOutTimer@Main@Pages@ClassGUI",60]
}
method SaveGUI()
{
variable string uniqueToon = "${Me.Name}:${Me.Class}:${ISXWoW.RealmName.Replace[',REMOVE,.,REMOVE]}"
Config:SaveSlider[${uniqueToon},"sldRestHP"]
Config:SaveSlider[${uniqueToon},"sldStandHP"]
Config:SaveSlider[${uniqueToon},"sldPullBailOutTimer"]
}
}