; -------------------------------------------------------------------------
; Kz Hunter 1.05
;
; Thanks to everyone for the extensive plagiarized code segments and even the framework!
; Also, thanks to all those that helped test and improve Kz Hunter!
;
; -------------------------------------------------------------------------
#ifndef KZ_MSGLVL
; #define KZ_MSGLVL 0
/* status messages: 0: disable, 1: limited, 2: verbose, 3: debug
*/
#define KZ_MSGLVL 1
/* status messages: 0: disable, 1: limited, 2: verbose, 3: debug
*/
; #define KZ_MSGLVL 2
/* status messages: 0: disable, 1: limited, 2: verbose, 3: debug
*/
#endif
; -------------------------------------------------------------------------
#include oMobInfo.iss
/* track mob historical info - runner, immunities, magical damage type */
; -------------------------------------------------------------------------
objectdef oClass inherits oBase
{
; ---------------------------------------------------------------------
; hunter sttings
variable int MeAspect = 2
/* which aspect would you like your hunter to use? 0-None # 1-Monkey # 2-Hawk */
; ---------------------------------------------------------------------
; pet care
variable int MendPetPct = 50
/* percentage pet HP we should you cast Mend Pet */
variable int FeedPetPct = 75
/* percentage pet happiness we should you feed pet */
variable int FeedPetTimer1 = 1000
/* (1000) time to wait after casting feed pet */
variable int FeedPetTimer2 = 3000
/* (3000) time to wait for pet to start eating */
; ---------------------------------------------------------------------
; ---------------------------------------------------------------------
; !!! DO NOT CHANGE VARIABLES BELOW THIS LINE !!!
variable string ReactCast = "None"
/* error message on this attack type */
variable bool OutOfAmmo = FALSE
/* will be set TRUE if we have run out of ammo */
variable bool NoPet = FALSE
/* set when we do not have a pet
*/
variable bool PetModePassive = TRUE
/* TRUE: pet passive mode, FALSE: pet defensive mode */
/* food we are
trying to feed our pet */
variable bool PetFeed = FALSE
variable int LastFeedPetTime = ${LavishScript.RunningTime} /* last time
we tried to feed our pet */
variable bool NeedCallPet = TRUE
/* TRUE: try call pet, FALSE: rez pet */
variable int LastCallPetTime = ${LavishScript.RunningTime} /* last time
we tried to call our pet */
variable int PetAttackTime = ${LavishScript.RunningTime} /* last time
we told pet to attack */
variable int LastFeignDeathTime = ${LavishScript.RunningTime} /* last time we tried
to feign death */
variable bool PlacingFreezingTrap = FALSE
/* true if we are in the process or placing a freezing trap */
variable int RangeAdjustTime = ${LavishScript.RunningTime} /* last time
we adjusted our ranged attack ranges */
variable int Trinket1Time = ${LavishScript.RunningTime} /* last time
we used trinket 1 */
variable int Trinket2Time = ${LavishScript.RunningTime} /* last time
we used trinket 2 */
; ---------------------------------------------------------------------
; --- Init and Shutdown
; ---------------------------------------------------------------------
method Initialize()
{
This:Output[--- Routine: Kz Hunter 1.05]
/* show routine version info. */
MobInfo:Initialize
/* initialzie and load old mob historical information */
This:SetGUI
This:SortAmmo
if ${This.canCast[Track Hidden]} && !${Me.Buff[Track Hidden](exists)}
This:CastSpell[Track Hidden]
This:PetDefensive
Bot:AddPulse["Class","Pulse",100,TRUE,TRUE]
/* call Pulse every 100 OB cycles */
}
method Shutdown()
{
MobInfo:Shutdown
/* cleanup and save mob information
*/
This:SaveGUI
}
; ---------------------------------------------------------------------
; called by OB every 100 cycles
method Pulse()
{
; check to see if we have lost control of our pet via chained targets. pet probally
has a target, but we don't
if ${Me.InCombat} && !${This.chkPulseTarget}
This:PetPassive
/* try to call our pet back
*/
else
This:PetDefensive
/* otherwise, prepare to fight
*/
}
member chkPulseTarget()
{
if !${Target(exists)} || ${Target.Name.Equal[NULL]}
return FALSE
if ${Target.Dead}
return TRUE
/* np if the target is dead
*/
if ${Target.InCombat} && ${Target.AttackingUnit.GUID.NotEqual[${Me.GUID}]} &&
${MobGUID.NotEqual[${Target.GUID}]}
{
if !${Me.Pet(exists)}
return FALSE
elseif ${Target.AttackingUnit.GUID.NotEqual[${Me.Pet.GUID}]}
return FALSE
}
if !${Target.Attackable}
return FALSE
return TRUE
}
; ---------------------------------------------------------------------
; --- Rest SetUp
; ---------------------------------------------------------------------
member NeedRest()
{
Force:CheckVendor
if ${Mount.IsMounted}
/* don't try to rest if mounted
*/
return FALSE
#ifndef PARTY_SUPPORT
if ${Me.InCombat}
return FALSE
/* don't rest in combat
*/
#else
if ${Party.IsInCombat}
return FALSE
/* don't rest in party combat
*/
#endif
if ${Me.Pet(exists)} && ${Me.Pet.InCombat}
return FALSE
/* don't rest in combat
*/
if ${Toon.Casting}
return TRUE
/* reviving pet etc.
*/
if ${Me.Buff[Resurrection Sickness](exists)}
return TRUE
/* wait in rest if you have rez sickness
*/
;if ${Me.Sitting}
;return TRUE
/* wait till health & mana are enough
*/
if ${This.PetDead}&&${This.canCast[Feed Pet]}&&${Force.PetTame}>1
return TRUE
/* revive/call our pet
*/
if ${Me.Pet(exists)}&&!${Item[Taming Rod](exists)}&&${This.canCast[Feed
Pet]}&&${Item["${Force.PetFood}"](exists)}
{
if ${Me.Pet.Buff[Feed Pet Effect](exists)} && ${Me.Pet.PctHappiness} <= 75 &&
!${PetFood.Equal[NULL]}
return TRUE
/* rest while pet is eating
*/
if ${Me.Pet.PctHappiness} <= ${FeedPetPct} && ${Me.Pet.Distance} < 9 &&
!${This.PetPoisoned} && ${Me.Pet.PctHappiness} <= ${FeedPetPct}&& !${PetFood.Equal[NULL]}
{
echo "Have food true"
return TRUE
/* feed pet if he is not happy and we have food
*/
}
if ${Toon:canCast[Mend Pet]} && ${Me.Pet.PctHPs} <= ${MendPetPct}
return TRUE
/* heal pet if he is injured
*/
}
if ${Config.GetSlider[sldUseBandage]} > 0 && !${Me.Buff[Recently Bandaged](exists)} &&
${Tradeskills.CheckNeedBandages}
return TRUE
/* keep at least one bandage
*/
if ${Config.GetCheckbox[chkUseAspectCheetah]} && ${Me.PctMana} > 90 &&
(!${Me.Target(exists)} || ${Me.Target.Dead}) && ${This.canCast[Aspect of the Cheetah]} &&
!${Me.Buff[Aspect of the Cheetah](exists)} && !${Group.Members}
This:CastSpell[Aspect of the Cheetah]
if ${Me.PctHPs} < ${Config.GetSlider[sldRestHP]}
{
return TRUE
}
return FALSE
/* otherwise FALSE when we dont need rest
*/
}
method RestPulse()
{
CMovement:StopMovement
/* ensure we aren't moving
*/
variable string PetFood = ${Force.PetFood}
if ${Toon.Casting}
{
if !${NeedCallPet}
NeedCallPet:Set[TRUE]
/* we will start by trying to call our pet next time */
return
/* allow previous casting to finish
*/
}
if ${This.canCast[Track Hidden]} && !${Me.Buff[Track Hidden](exists)}
This:CastSpell[Track Hidden]
/* select a default tracking */
; --------------------------------------
; call / rez our pet. this is controlled by the received error messages
if ${This.PetDead} && ${LastCallPetTime} < ${LavishScript.RunningTime} - 2000 &&
!${Me.Buff[Drink](exists)}
{
Toon:Standup
if ${NeedCallPet}&&${This.canCast[Feed Pet]}
This:CastSpell[Call Pet]
elseif ${Me.PctMana} > 60 &&${This.canCast[Feed Pet]}
This:CastSpell[Revive Pet]
;!${This.canCast[Call Pet]}
LastCallPetTime:Set[${LavishScript.RunningTime}] /*
last time we tried to call/revive our pet */
return
}
; --------------------------------------
; heal our pet
if !${NoPet} && !${This.PetDead} && ${Me.Pet.PctHPs} < ${MendPetPct} &&
!${Me.Pet.Buff[Mend Pet](exists)} && !${Me.Sitting}
{
This:CastSpell[Mend Pet]
/* take care of our pet healing
*/
return
}
; --------------------------------------
; feed our pet
echo "before feed pet ${This.PetPoisoned} ${Me.Pet.Distance} ${Me.Pet.PctHappiness}
${FeedPetPct} ${LastCallPetTime} ${LavishScript.RunningTime}"
if !${Me.Pet.Buff[Feed Pet Effect](exists)} && ${Me.Pet.Distance} < 9 &&
!${This.PetPoisoned} && ${Me.Pet.PctHappiness} <= ${FeedPetPct} && ${LastCallPetTime} <
${LavishScript.RunningTime} - 2000 && !${PetFood.Equal[NULL]}
{
echo "Trying to feed pet ${PetFeed} ${LastFeedPetTime}
${LavishScript.RunningTime} ${FeedPetTimer2}"
if !${PetFeed} && ${LastFeedPetTime} < ${LavishScript.RunningTime} -
${FeedPetTimer2}
{
echo "made it inside feed pet"
if ${PetFood.Equal[NULL]}
{
echo "We are bugged - GetPetFood"
/* try to find a new food for our pet
*/
}
if ${PetFood.NotEqual[NULL]}
{
echo "FEEDING THE PET casting"
This:Output["Try to feed our pet ${Item[${PetFood}].Name}."]
LastFeedPetTime:Set[${LavishScript.RunningTime}] /*
last time we started trying to feed our pet */
This:CastSpell[Feed Pet]
PetFeed:Set[TRUE]
}
}
if ${PetFeed}&& ${LastFeedPetTime} < ${LavishScript.RunningTime} -
${FeedPetTimer1}
{
echo "USING FOOD ${PetFood}"
Item[${PetFood}]:Use
/* try to feed this item to the pet
*/
PetFeed:Set[FALSE]
}
return
/* wait till we have feed out pet
*/
}
; --------------------------------------
; make our items
if !${Me.Sitting} && ${Spell["First Aid"](exists)} &&
${Config.GetSlider[sldUseBandage]} > 0 && ${Tradeskills.makeableBandage[2].NotEqual["NONE"]}
{
variable guidlist BandList
BandList:Search[-items,-inventory,Bandage]
if !${BandList.Count}
{
Tradeskills:CreateBandages[${Tradeskills.makeableBandage[2]}]
return
}
}
; --------------------------------------
; take care of ourself
if ${Config.GetCheckbox[chkUseScrolls]} && ${Toon.canUseScroll}
Toon:UseScroll
/* use scrolls if we have any
*/
if ${Me.PctHPs} < ${Config.GetSlider[sldRestHP]}
{
if ${Consumable.HasFood} && !${Me.Buff[Food](exists)}
{
Consumable:useFood
/* eat
*/
Bot.RandomPause:Set[14]
return
}
Toon:Sitdown
/* sit down if we need HP
*/
}
if ${Me.PctMana} < ${Config.GetSlider[sldRestMana]}
{
if ${Consumable.HasDrink} && !${Me.Buff[Drink](exists)}
{
Consumable:useDrink
/* drink
*/
Bot.RandomPause:Set[14]
return
}
Toon:Sitdown
/* sit down if we need MANA
*/
}
if ${Me.Buff[Resurrection Sickness](exists)}
{
Toon:Sitdown /* stupid rez
sickness */
return
}
This:SortAmmo
/* sort the ammo if needed
*/
if ${Me.Sitting}
{
if ${This.canCast[Shadowmeld]} && !${Me.Buff[Shadowmeld](exists)}
This:CastSpell[Shadowmeld]
/* try to hide while we rest
*/
if (${Me.Buff[Drink](exists)} && ${Me.PctMana} >=
${Config.GetSlider[sldStandMana]}) || (!${Me.Buff[Drink](exists)} && ${Me.PctMana} >
${Config.GetSlider[sldRestMana]})
{
if (${Me.Buff[Food](exists)} && ${Me.PctHPs} >=
${Config.GetSlider[sldStandHP]}) || (!${Me.Buff[Food](exists)} && ${Me.PctHPs} >
${Config.GetSlider[sldRestHP]})
Toon:Standup
/* stand up when we are done resting
*/
}
}
}
; ---------------------------------------------------------------------
; --- Buff SetUp
; ---------------------------------------------------------------------
member NeedBuff()
{
if ${Mount.IsMounted}
/* don't try to buff if mounted
*/
return FALSE
if ${Me.Buff[Aspect of the Cheetah](exists)} && (!${Me.Target(exists)} ||
${Me.Target.Dead})
return FALSE
if !${Me.Buff[Aspect of the Viper](exists)} && ${This.canCast[Aspect of the Viper]} &&
${This.ConserveMana} && ${Me.PctMana} < ${Config.GetSlider[sldConserveMana]}
return TRUE
if ${Me.Buff[Aspect of the Viper](exists)} && ${Me.PctMana} <
(${Config.GetSlider[sldConserveMana]} + 20)
return FALSE
if ${MeAspect} > 2 || ${MeAspect} < 0
MeAspect:Set[2]
if ${MeAspect} == 2 && !${Me.Buff[Aspect of the Hawk](exists)}
{
if ${Spell[Aspect of the Hawk](exists)}
return TRUE
else
MeAspect:Set[1]
}
if ${MeAspect} == 1 && !${Me.Buff[Aspect of the Monkey](exists)}
{
if ${Spell[Aspect of the Monkey](exists)}
return TRUE
else
MeAspect:Set[0]
}
return FALSE
}
method BuffPulse()
{
; CMovement:StopMovement
/* ensure we aren't moving
*/
Toon:Standup
if !${Me.Pet(exists)} && !${Me.Buff[Aspect of the Monkey](exists)} && !${Spell[Aspect
of the Monkey].Cooldown}
This:CastSpell[Aspect of the Monkey]
/* if no pet, looks like we will melee anyway */
elseif !${Me.Buff[Aspect of the Viper](exists)} && ${Spell[Aspect of the
Viper](exists)} && ${This.ConserveMana} && ${Me.PctMana} < ${Config.GetSlider[sldConserveMana]}
This:CastSpell[Aspect of the Viper]
/* if starting to get low on mana, try to restore */
elseif ${Me.Buff[Aspect of the Viper](exists)} && ${Me.PctMana} <
(${Config.GetSlider[sldConserveMana]} + 20)
return
elseif ${MeAspect} == 1 && !${Me.Buff[Aspect of the Monkey](exists)} &&
!${Spell[Aspect of the Monkey].Cooldown}
This:CastSpell[Aspect of the Monkey]
elseif ${MeAspect} == 2 && !${Me.Buff[Aspect of the Hawk](exists)} && !${Spell[Aspect
of the Hawk].Cooldown}
This:CastSpell[Aspect of the Hawk]
}
; ---------------------------------------------------------------------
; --- Pull SetUp
; ---------------------------------------------------------------------
member NeedPullBuff()
{
Toon:Standup
if !${Me.Buff[Aspect of the Viper](exists)} && ${Spell[Aspect of the Viper](exists)}
&& ${This.ConserveMana} && ${Me.PctMana} < ${Config.GetSlider[sldConserveMana]}
This:CastSpell[Aspect of the Viper]
/* if starting to get low on mana, try to restore */
elseif ${Me.Buff[Aspect of the Viper](exists)} && ${Me.PctMana} <
(${Config.GetSlider[sldConserveMana]} + 20)
return FALSE
elseif ${MeAspect} == 1 && !${Me.Buff[Aspect of the Monkey](exists)} &&
!${Spell[Aspect of the Monkey].Cooldown}
This:CastSpell[Aspect of the Monkey]
elseif ${MeAspect} == 2 && !${Me.Buff[Aspect of the Hawk](exists)} && !${Spell[Aspect
of the Hawk].Cooldown} && ${Me.Pet(exists)}
This:CastSpell[Aspect of the Hawk]
return FALSE
}
method PullBuffPulse()
{
This:BuffPulse
}
; ---------------------------------------------------------------------
; --- CombatBuff SetUp
; ---------------------------------------------------------------------
member NeedCombatBuff()
{
return FALSE
}
method CombatBuffPulse()
{
This:BuffPulse
}
; ---------------------------------------------------------------------
; --- Pull SetUp
; ---------------------------------------------------------------------
variable int PullBailOut = ${LavishScript.RunningTime}
method PullPulse()
{
This:KZDebug[2, ">>>> Hunter Pull Pulse Start <<<<"]
if ${Me.Casting} || ${Me.GlobalCooldown}
return
if ${Me.Level}==10
{
;echo "IN THE LEVEL CORRECTLY NOPET ${NoPet} TARGET NAME MATCH
${Target.Name.Equal[${Force.PetWanted}]} HAVE TAMING ROD ${Item[Taming Rod](exists)}"
if
${Target.Name.Equal[${Force.PetWanted}]}&&!${Me.Pet(exists)}&&(${Item[Taming
Rod](exists)}||${Force.PetTame}<2)
{
if ${Target.Distance} < ${This.MinRanged}
{
Cmovement:ToMelee
}
echo "USING!!!!"
if ${Item[Taming Rod](exists)}
{
move -stop
Use ${Item[Taming Rod].GUID}
}
else
{
move -stop
cast "Tame Beast"
}
return
}
}
if ${Toon.TargetIsNew}
{
; reset the pull timer on new targets
This.PullBailOut:Set[${This.InSeconds[${Config.GetSlider[sldPullBailOutTimer]}]}]
This:KZDebug[2, "Pull Timer started ${Config.GetSlider[sldPullBailOutTimer]}
-> ${LavishScript.RunningTime}..${This.PullBailOut}"]
/* blacklist target if timer exceeded */
}
if ${This.PullBailOut} < ${LavishScript.RunningTime}
{
This:KZDebug[0, "Pull Timer Exceeded."]
/* blacklist target if timer exceeded */
GlobalBlacklist:Insert[${Target.GUID},3600000]
WoWScript ClearTarget()
return
}
if !${Toon.ValidTarget[${Target.GUID}]}
{
; This:Output["I need a valid target"]
/* ensure we have a valid target */
Toon:NeedTarget[1]
return
}
if !${Toon.TargetIsBestTarget}
{
This:KZDebug[1, "Target is no longer best target, aquire new target."] /*
ensure our target is the best target */
Toon:BestTarget
return
}
Toon:Standup
/* make sure we are standing and facing the target */
; --------------------------------------
; move to attack range
if ${This.ForceMelee} || (${Target.Distance} < ${This.MinRanged} &&
${Target.Target.GUID.Equal[${Me.GUID}]}) || ${Target.Distance} < ${This.MaxMelee}
CMovement:ToMelee
/* move to melee range
*/
else
CMovement:ToRanged
/* move to ranged attack range
*/
; if !${NoPet} && ${Config.GetCheckbox[chkSendPet]} && (!${Me.Pet.InCombat} ||
${Me.Pet.Target.GUID.NotEqual[${Me.Target.GUID}]})
if !${NoPet} && ${Config.GetCheckbox[chkSendPet]} && ${PetAttackTime} <
${LavishScript.RunningTime} - 5000
WoWScript PetAttack()
/* keep the pet on my target
*/
; --------------------------------------
; Do the the pull selection.
if !${This.ForceMelee} && ${Target.Distance} > ${This.MinRanged} && ${Target.Distance}
< ${This.MaxRanged}
{
; This:Output["Pull Shot: ${Config.GetCombo[cmbPullShot]}"]
if ${Config.GetCheckbox[chkViperSting]} && ${This.canCast[Viper Sting]} &&
${Me.Target.MaxMana} > 0 && ${Me.Target.PctMana} > 25
This:CastSpell[Viper Sting]
elseif ${MobInfo.chkCast[${Config.GetCombo[cmbPullShot]}]} &&
!${MobInfo.chkBuff[${Config.GetCombo[cmbPullShot]},3]}
This:CastSpell[${Config.GetCombo[cmbPullShot]}]
elseif ${MobInfo.chkCast[Concussive Shot]}
This:CastSpell[Concussive Shot]
move -stop
elseif !${MobInfo.chkBuff[Serpent Sting,3]}
This:CastSpell[Serpent Sting]
move -stop
elseif ${MobInfo.chkCast[Arcane Shot]}
This:CastSpell[Arcane Shot]
move -stop
elseif !${Me.Action[Auto Shot].AutoRepeat}
This:CastSpell[Auto Shot]
move -stop
}
if ${Target.Distance} < ${This.MaxMelee} && !${Me.Attacking}
WoWScript AttackTarget()
; --------------------------------------
; other casts.
if !${This.ForceMelee} && ${Config.GetCheckbox[chkUseHuntersMark]} &&
${Target.Distance} > ${This.MinRanged} && !${Me.Target.Buff["Hunter's Mark"](exists)} &&
${This.canCast[Hunter's Mark]} && ${Me.Target.CreatureType.NotEqual[Totem]}
This:CastSpell["Hunter's Mark"]
if !${This.ForceMelee} && ${This.canCast[Rapid Fire]} && ${Me.Target.PctHPs} > 90
This:CastSpell[Rapid Fire]
}
; ---------------------------------------------------------------------
; --- Combat SetUp
; ---------------------------------------------------------------------
method AttackPulse()
{
variable guidlist Aggro
/* for finding the mobs we have */
variable int MobAdds
/* count of adds
*/
variable int TrinketCooldown
/* check the cooldown of our trinkets */
variable string PotionName
/* name of any potion we are drinking */
This:PetDefensive
/* keep pet in defensive mode during combat
*/
if ${Me.Casting} || ${Me.GlobalCooldown}
return
/* allow previous casting to finish
*/
This:KZDebug[2, ">>>> Hunter Attack Pulse Start <<<<"]
; --------------------------------------
; playing dead?
if ${Me.Buff[Feign Death](exists)} && ${LastFeignDeathTime} <
${LavishScript.RunningTime} - 2000
return
; If swimming, move to the surface.
if ${Me.HoldingBreath} && !${Me.Buff[Unending Breath](exists)}
wowpress jump
; --------------------------------------
; prepare to continue combat and verify we have a good target
Toon:Standup
/* no combat while sitting
*/
if !${NoPet} && !${This.PetDead} && ${Me.Pet.PctHPs} < ${MendPetPct} &&
${This.canCast[Mend Pet]} && !${Me.Pet.Buff[Mend Pet](exists)}
{
This:CastSpell[Mend Pet]
/* take care of our pet healing
*/
return
}
if !${Toon.ValidTarget[${Target.GUID}]}
{
This:KZDebug[2, "AttackPulse: I need a valid target"] /* ensure we
have a vaild target */
Toon:NeedTarget[1]
return
}
if ${Movement.Speed} && ${Target.GUID.NotEqual[${Targeting.TargetCollection.Get[1]}]}
&& ${Unit[${Targeting.TargetCollection.Get[1]}](exists)}
{
This:KZDebug[1, "AttackPulse: Getting a better target"] /* ensure we
have the best target */
Target ${Targeting.TargetCollection.Get[1]}
/* adjust target while moving */
return
/* lock target during most of combat
*/
}
; --------------------------------------
if !${NoPet} && ${Config.GetCheckbox[chkSendPet]} && ${PetAttackTime} <
${LavishScript.RunningTime} - 5000
{
WoWScript PetAttack()
/* keep the pet on our target
*/
PetAttackTime:Set[${LavishScript.RunningTime}]
}
; --------------------------------------
; if we need health try to use bandages and potions.
if ${Me.PctHPs} <= ${Config.GetSlider[sldUseBandage]} && ${Toon.canBandage}
{
MobAdds:Set[${Toon.AggroWithin[30,TRUE]}]
/* get the number of mobs attacking me */
if !${MobAdds}
{
Toon:Bandage
/* use bandag if we will not be interrupted
*/
Bot.RandomPause:Set[24]
WoWScript ClearTarget()
return
}
}
; if we need health, try to drink a potion
if ${Me.PctHPs} <= ${Config.GetSlider[sldUsePot]} && ${Item[-inventory,"Healing
Potion"](exists)}
{
PotionName:Set[${Item[-inventory,"Healing Potion"].Name}]
if ${Item[${PotionName}].Usable} &&
!${WoWScript["GetContainerItemCooldown(${Item[${PotionName}].Bag.Number},
${Item[${PotionName}].Slot})", 2]}
{
This:KZDebug[2, "AttackPulse: Using Health Potion in Combat."]
Item[${PotionName}]:Use
Bot.RandomPause:Set[14]
return
}
}
; try feign death
if ${Me.PctHPs} <= ${Config.GetSlider[sldFeignDeath]} && ${This.canCast[Feign Death]}
{
This:CastSpell[Feign Death]
LastFeignDeathTime:Set[${LavishScript.RunningTime}]
return
}
; --------------------------------------
; use our trinkets
if ${Me.Equip[13](exists)} && ${Trinket1Time} < ${LavishScript.RunningTime} - 5000
{
TrinketCooldown:Set[${WoWScript[GetInventoryItemCooldown("player"\, 13)]}]
if !${TrinketCooldown}
{
Me.Equip[13]:Use
Trinket1Time:Set[${LavishScript.RunningTime}]
return
}
}
if ${Me.Equip[14](exists)} && ${Trinket2Time} < ${LavishScript.RunningTime} - 5000
{
TrinketCooldown:Set[${WoWScript[GetInventoryItemCooldown("player"\, 14)]}]
if !${TrinketCooldown}
{
Me.Equip[14]:Use
Trinket2Time:Set[${LavishScript.RunningTime}]
return
}
}
; --------------------------------------
; Place the freezing trap if we are facing our desired mob
if ${PlacingFreezingTrap}
{
if !${ISXWoW.Facing}
{
This:CastSpell[Freezing Trap]
PlacingFreezingTrap:Set[FALSE]
}
return
}
; ----------------------------------------------------------------------
; face target and move to attack range.
if ${This.ForceMelee}
CMovement:ToMelee
/* move to melee range
*/
elseif ${Target.Distance} < ${This.MinRanged} &&
${Target.Target.GUID.Equal[${Me.GUID}]}
CMovement:ToMelee
/* we will need to melee for a while
*/
else
CMovement:ToRanged
/* move to a good ranged attack location
*/
; -------------------------------------------------
; combat racials
Aggro:Search[-units,-nearest,-aggro,-alive,-range 0-10] /* find number
of near mobs */
if ${This.canCast[Berserking]} && ${Me.PctHPs} < 90 && ${Target.PctHPs} > 50
This:CastSpell[Berserking]
/* trolls
*/
elseif ${This.canCast[Blood Fury]} && ${Me.PctHPs} > 90 && ${Target.PctHPs} > 50 &&
${Aggro.Count} == 1
This:CastSpell[Blood Fury]
/* orcs
*/
; elseif ${This.canCast[Will of the Forsaken]} && ${Me.Buff[Feared](exists)}
; This:CastSpell[Will of the Forsaken]
/* undead
*/
elseif ${This.canCast[Stoneform]} && (${Me.Buff[Poisoned](exists)} ||
${Me.Buff[Diseased](exists)} || ${Me.Buff[Bleeding](exists)})
This:CastSpell[Stoneform]
/* dwarf
*/
; elseif ${This.canCast[Escape Artist]} && (${Me.Buff[Immobilized](exists)} ||
${Me.Buff[Slowed](exists)})
; This:CastSpell[Escape Artist]
/* gnome
*/
elseif ${This.canCast[War Stomp]} && (${Target.Casting(exists)} || ${Aggro.Count} > 1
|| !${Target.MaxMana})
This:CastSpell[War Stomp]
/* tauren
*/
elseif ${Me.Target.PctMana} > 0 && ${Target.Casting(exists)} && ${Target.Distance} <
10 && ${This.canCast[Arcane Torrent]}
This:CastSpell[Arcane Torrent]
/* blood elf
*/
elseif ${Me.Target.PctMana} > 0 && ${This.canCast[Mana Tap]} && ${Me.Target.PctMana} >
0 && ${Me.Buff[Mana Tap].Application} < 3
cast "Mana Tap"
/* blood elf
*/
; ----------------------------------------------------------------------
; try to do a little damage
elseif !${Config.GetCheckbox[chkSaveIntimidation]} && ${This.canCast[Intimidation]} &&
${Me.Target.PctHPs} > 40 && ${Target.Target.GUID.Equal[${Me.GUID}]}
This:CastSpell[Intimidation]
elseif !${Config.GetCheckbox[chkSaveBestialWrath]} && ${This.canCast[Bestial Wrath]}
&& ${Me.Target.PctHPs} > 90
This:CastSpell[Bestial Wrath]
elseif !${This.ForceMelee} && ${Config.GetCheckbox[chkUseHuntersMark]} &&
${Target.Distance} > ${This.MinRanged} && !${Me.Target.Buff["Hunter's Mark"](exists)} &&
${This.canCast[Hunter's Mark]} && ${Me.Target.CreatureType.NotEqual[Totem]}
This:CastSpell["Hunter's Mark"]
elseif ${This.canCast[Kill Command]} && ${Me.Action[Kill Command].Usable}
This:CastSpell[Kill Command]
/* cause your pet to instantly attack for an additional 127 damage. can only be used after the
Hunter lands a critical strike on the target. */
; Ranged Attack.
elseif !${This.ForceMelee} && ${Target.Distance} > ${This.MinRanged} &&
${Target.Distance} < ${This.MaxRanged}
{
This:KZDebug7[2, " Kz Hunter: Ranged Attact Sequence."]
This:BuffPulse
if ${This.canCast[Freezing Trap]}
{
declare MobList guidlist local
MobList:Search[-units,-alive,-nonpvp,-nonfriendly,-nocritters,-aggro,-notflying,-attackable,-nearest,-
range 0-5]
if ${MobList.Count}
{
CMovement:FaceXYZ[${MobList.Object[1].X},${MobList.Object[1].Y},${MobList.Object[1].Z}]
PlacingFreezingTrap:Set[TRUE]
return
}
}
if ${MobInfo.chkBuff[Viper Sting,3]} && ${MobInfo.chkBuff[Serpent Sting,3]} &&
${MobInfo.chkBuff[Scorpid Sting,3]} && ${Me.Target.PctHPs} > 30
{
if ${MobInfo.chkCast[${Config.GetCombo[cmbStingType]}]}
This:CastSpell[${Config.GetCombo[cmbStingType]}]
elseif ${MobInfo.chkCast[Serpent Sting]}
This:CastSpell[Serpent Sting]
move -stop
}
if ${This.HinderRunners} && !${MobInfo.chkBuff[Concussive Shot,3]}
This:CastSpell[Concussive Shot]
move -stop
elseif ${This.canCast[Steady Shot]} && !${This.ConserveMana}
This:CastSpell[Steady Shot]
move -stop
elseif ${MobInfo.chkCast[Arcane Shot]} && !${This.ConserveMana}
This:CastSpell[Arcane Shot]
move -stop
elseif !${Me.Action[Auto Shot].AutoRepeat}
This:CastSpell[Auto Shot]
move -stop
}
; Melee Attack.
elseif ${Target.Distance} < ${This.MaxMelee}
{
This:KZDebug[2, " Kz Hunter: Melee Attact Sequence."]
if ${This.canCast[Aspect of the Monkey]} && !${Me.Buff[Aspect of the
Monkey](exists)}
{
if ${This.ForceMelee} || !${Me.Pet(exists)}
{
This:CastSpell[Aspect of the Monkey]
return
}
else
{
declare MobList guidlist local
MobList:Search[-units,-alive,-nonpvp,-nonfriendly,-nocritters,-aggro,-notflying,-attackable,-nearest,-
range 0-5]
if ${MobList.Count} > 2
{
This:CastSpell[Aspect of the Monkey]
return
}
}
}
if ${MobInfo.chkCast[Immolation Trap]} && ${Me.Target.PctHPs} > 50
{
CMovement:FaceXYZ[${Target.X},${Target.Y},${Target.Z}]
This:CastSpell[Immolation Trap]
}
elseif ${This.canCast[Raptor Strike]} && ${Me.PctMana} >
${Config.GetSlider[sldConserveMana]}
This:CastSpell[Raptor Strike]
elseif ${This.HinderRunners} && ${MobInfo.chkBuff[Wing Clip]}
This:CastSpell[Wing Clip]
elseif ${This.canCast[Disengage]} && ${Target.Target.GUID.Equal[${Me.GUID}]}
This:CastSpell[Disengage]
elseif ${MobInfo.chkCast[Intimidation]} && ${Me.Action[Intimidation].Usable}
This:CastSpell[Intimidation]
elseif ${MobInfo.chkCast[Mongoose Bite]} && ${Me.Action[Mongoose Bite].Usable}
This:CastSpell[Mongoose Bite]
elseif !${Me.Attacking}
WoWScript AttackTarget()
}
}
; ---------------------------------------------------------------------
; --- Support operations
; ---------------------------------------------------------------------
; ---------------------------------------------------------------------
; Display the message if level is low enough
method KZDebug(int Lvl, string Msg)
{
if ${Lvl} <= KZ_MSGLVL
This:Output[${Msg}]
/* show the enabled message
*/
}
; ---------------------------------------------------------------------
; test if we should try to hinder runners
member HinderRunners()
{
if ${MobInfo.chkRunner} && ${Me.Target.PctHPs} <=
${Config.GetSlider[sldHinderRunners]}
return TRUE
return FALSE
}
; ---------------------------------------------------------------------
; test if we should conserve mana
member ConserveMana()
{
if ${Me.PctMana} > ${Config.GetSlider[sldConserveMana]} && (${Me.PctHPs} <
${Config.GetSlider[sldConserveManaHealth]} || ${Me.Pet.PctHPs} <
${Config.GetSlider[sldConserveManaPetHealth]})
return FALSE
/* we should use the spell
*/
return TRUE
/* we should conserve mana
*/
}
; ---------------------------------------------------------------------
; test if we should only do melee combat
member ForceMelee()
{
if ${OutOfAmmo} ||
!${Config.GetCheckbox[chkUseRangedAttacks]}||!${Toon.canCast[Serpent Sting]}
return TRUE
return FALSE
}
; ---------------------------------------------------------------------
; test if ok to cast spell without doubble casting
member canCast(string ASpell)
{
if ${Toon.canCast[${ASpell}]} && (${MobInfo.LastCastTime} <
${LavishScript.RunningTime} - 1000 || ${MobInfo.LastCastSpell.NotEqual[${ASpell}]})
return TRUE
return FALSE
}
; ---------------------------------------------------------------------
; test if ok to cast spell without doubble casting
method CastSpell(string ASpell)
{
This:KZDebug[1, " Kz Hunter: Casting ${ASpell}."]
Toon:CastSpell[${ASpell}]
}
; ---------------------------------------------------------------------
; Set the mode for our pet
method PetPassive()
{
if !${PetModePassive}
WoWScript PetPassiveMode()
/* set our pet to passive mode
*/
PetModePassive:Set[TRUE]
}
method PetDefensive()
{
if ${PetModePassive}
WoWScript PetDefensiveMode()
PetModePassive:Set[FALSE]
}
; ---------------------------------------------------------------------
; test if our pet is dead or missing
member PetDead()
{
if ${NoPet} || !${Spell[Call Pet](exists)}
return FALSE
/* playing without a pet
*/
if (${Me.Pet(exists)} && ${Me.Pet.Dead}) || !${Me.Pet(exists)} || !${Me.Pet.PctHPs}
return TRUE
return FALSE
}
; ---------------------------------------------------------------------
; cast a spell from the pet action bar
method PetCastSpell(string PetSpell)
{
variable int Idx = 1
do
{
if ${WoWScript[GetPetActionInfo(${Idx})].Equal[${PetSpell}]}
WoWScript CastPetAction(${Idx})
}
while ${WoWScript[GetPetActionInfo(${Idx:Inc})](exists)}
}
; ---------------------------------------------------------------------
; test if our pet is poisoned
member PetPoisoned()
{
variable int Index = 1
do
{
if ${Me.Pet.Buff[${Index}].DispelType.Equal[Poison]}
return TRUE
Index:Inc
}
while ${Me.Pet.Buff[${Index}](exists)}
return FALSE
}
; ---------------------------------------------------------------------
; scan each bag item starting with top of rightmost bag to search for pet food.
; ---------------------------------------------------------------------
; try to move spare ammo to quiver or ammo pouch
method SortAmmo()
{
variable int ContainerIndex = 0
variable int Index
variable int SpotIndex
variable int EmptySpot = 0
variable int ApiIndex = 19
; serarch for a quiver or ammo pouch
Index:Set[1]
do
{
if ${Me.Bag[${Index}](exists)} && (${Me.Bag[${Index}].Name.Find["Quiver"]} ||
${Me.Bag[${Index}].Name.Find["Ammo Pouch"]})
ContainerIndex:Set[${Index}]
}
while ${Me.Bag[${Index:Inc}](exists)}
; if we have a quiver or ammo pouch, try to fill it
if ${ContainerIndex} && ${Me.Bag[${ContainerIndex}].EmptySlots} > 0
{
Index:Set[1]
do
{
if !${Me.Bag[${ContainerIndex}].Item[${Index}].Name(exists)}
EmptySpot:Set[${Index}]
}
while ${Index:Inc} <= ${Me.Bag[${ContainerIndex}].Slots}
if ${EmptySpot}
{
Index:Set[0]
do
{
if ${Index} != ${ContainerIndex}
{
SpotIndex:Set[1]
do
{
if
${Me.Bag[${Index}].Item[${SpotIndex}].Name.Find["
Arrow"]}&&!${Me.Bag[${Index}].Item[${SpotIndex}].Name.Find["Steel"]}&&!${Me.Bag[${Index}].Item[${SpotI
ndex}].Name.Find["Stone"]}|| ${Me.Bag[${Index}].Item[${SpotIndex}].Name.Find[" Shot"]} ||
${Me.Bag[${Index}].Item[${SpotIndex}].Name.Find[" Slugs"]}
{
Me.Bag[${Index}].Item[${SpotIndex}]:PickUp
This:Timeout
ApiIndex:Set[${Math.Calc[${ApiIndex} +
${ContainerIndex}]}]
WoWScript "PutItemInBag(${ApiIndex})"
return
}
}
while ${SpotIndex:Inc} <= ${Me.Bag[${Index}].Slots}
}
}
while ${Me.Bag[${Index:Inc}](exists)}
}
}
}
; ---------------------------------------------------------------------
; try to find ammo to use
method UseAmmo()
{
variable int Index = 0
variable int SpotIndex
OutOfAmmo:Set[TRUE]
/* we are out of ammo, switch to melee only
*/
do
{
SpotIndex:Set[1]
do
{
if ${Me.Bag[${Index}].Item[${SpotIndex}].Name.Find[" Arrow"]} ||
${Me.Bag[${Index}].Item[${SpotIndex}].Name.Find[" Shot"]} ||
${Me.Bag[${Index}].Item[${SpotIndex}].Name.Find[" Slugs"]}
{
Me.Bag[${Index}].Item[${SpotIndex}]:Use
/* start using this ammo */
OutOfAmmo:Set[FALSE]
return
}
}
while ${SpotIndex:Inc} <= ${Me.Bag[${Index}].Slots}
}
while ${Me.Bag[${Index:Inc}](exists)}
}
; ---------------------------------------------------------------------
; --- Event and Message Hooking
; ---------------------------------------------------------------------
variable bool needUIHook = TRUE
method UIErrorMessage(string Id, string Msg)
{
; This:Output["UIErrorMessage received" ${Id}:${Msg}]
if ${Msg.Find[You are too far away]} && !${Bot.PauseFlag} && !${Movement.Speed}
CMovement:MoveForward
elseif ${Msg.Find[Out of range]} && !${Bot.PauseFlag} && !${Movement.Speed}
{
if ${Target.Distance} > ${This.MinRanged} && ${This.MaxRanged} > 35 &&
!${CMovement.isFacingAway} && ${RangeAdjustTime} < ${LavishScript.RunningTime} - 5000
{
UIElement[sldMaxRanged@Combat@Pages@ClassGUI]:SetValue[${Math.Calc[(${Target.Distance} - 25 - 0.1) *
10]}]
if ${This.MaxRanged} < 35
UIElement[sldMaxRanged@Combat@Pages@ClassGUI]:SetValue[100]
/* reset max range to 35 */
This:Output["Adjusting the max range setting to ${This.MaxRanged}"]
}
RangeAdjustTime:Set[${LavishScript.RunningTime}]
CMovement:MoveForward
}
elseif ${Msg.Find[Target too close]} && !${Bot.PauseFlag} && !${Movement.Speed}
{
if ${Target.Distance} >= ${This.MinRanged} && ${This.MinRanged} < 20 &&
${RangeAdjustTime} < ${LavishScript.RunningTime} - 5000
{
UIElement[sldMinRanged@Combat@Pages@ClassGUI]:SetValue[${Math.Calc[(${Target.Distance} - 12 + 0.1) *
10]}]
if ${This.MinRanged} > 14
UIElement[sldMinRanged@Combat@Pages@ClassGUI]:SetValue[20]
/* reset min range to 14 */
This:Output["Adjusting the min range setting to ${This.MinRanged}"]
}
RangeAdjustTime:Set[${LavishScript.RunningTime}]
CMovement:MoveBackward
}
elseif ${Msg.Find[You are facing the wrong way]} && !${Bot.PauseFlag} &&
!${Movement.Speed}
CMovement:MoveBackward
elseif ${Msg.Find[You can't mount here]} && !${Bot.PauseFlag} && !${Movement.Speed}
CMovement:MoveForward
elseif ${Msg.Find[Target not in line of sight]} && !${Bot.PauseFlag}
{
if !${Group.Members}
GlobalBlacklist:Insert[${Target.GUID},20000]
else
GlobalBlacklist:Insert[${Target.GUID},5000]
WoWScript ClearTarget()
}
; elseif ${Msg.Find[You must be standing to do that]}
; Toon:Standup
/* we will need to stand up
*/
elseif ${Msg.Find[Can't attack while dead]}
NeedCallPet:Set[FALSE]
/* we will need to use Revive Pet
*/
elseif ${Msg.Find[You already control a summoned creature]}
NeedCallPet:Set[FALSE]
/* we will need to use Revive Pet
*/
elseif ${Msg.Find[Your pet is dead]}
NeedCallPet:Set[FALSE]
/* we will need to use Revive Pet
*/
elseif ${Msg.Find[Your pet is not dead]}
NeedCallPet:Set[TRUE]
/* we need to use Call Pet
*/
elseif ${Msg.Find[You do not have a pet to summon]}
NoPet:Set[TRUE]
elseif ${Msg.Find[Ammo needs to be in]}
This:UseAmmo
/* try to find some ammo to use
*/
}
; 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]}"
; Main Page
Config:SetSlider[${uniqueToon},"sldRestHP","sldRestHP@Main@Pages@ClassGUI",60]
Config:SetSlider[${uniqueToon},"sldRestMana","sldRestMana@Main@Pages@ClassGUI",60]
Config:SetSlider[${uniqueToon},"sldStandHP","sldStandHp@Main@Pages@ClassGUI",90]
Config:SetSlider[${uniqueToon},"sldStandMana","sldStandMana@Main@Pages@ClassGUI",90]
Config:SetSlider[${uniqueToon},"sldUsePot","sldUsePot@Main@Pages@ClassGUI",20]
Config:SetSlider[${uniqueToon},"sldUseBandage","sldUseBandage@Main@Pages@ClassGUI",60]
Config:SetSlider[${uniqueToon},"sldFeignDeath","sldFeignDeath@Main@Pages@ClassGUI",50]
Config:SetCheckBox[${uniqueToon},"chkUseScrolls","chkUseScrolls@Main@Pages@ClassGUI",TRUE]
Config:SetCheckBox[${uniqueToon},"chkUseAspectCheetah","chkUseAspectCheetah@Main@Pages@ClassGUI",TRUE]
; Pull Page
Config:SetSlider[${uniqueToon},"sldPullBailOutTimer","sldPullBailOutTimer@Pull@Pages@ClassGUI",60]
Config:SetCheckBox[${uniqueToon},"chkUseRangedAttacks","chkUseRangedAttacks@Pull@Pages@ClassGUI",TRUE]
Config:SetCheckBox[${uniqueToon},"chkUseHuntersMark","chkUseHuntersMark@Pull@Pages@ClassGUI",TRUE]
Config:SetCheckBox[${uniqueToon},"chkSendPet","chkSendPet@Pull@Pages@ClassGUI",TRUE]
Config:SetCheckBox[${uniqueToon},"chkViperSting","chkViperSting@Pull@Pages@ClassGUI",TRUE]
Config:SetCombo[${uniqueToon},"cmbPullShot","cmbPullShot@Pull@Pages@ClassGUI"]
; Combat Page
Config:SetSlider[${uniqueToon},"sldConserveMana","sldConserveMana@Combat@Pages@ClassGUI",60]
Config:SetSlider[${uniqueToon},"sldConserveManaHealth","sldConserveManaHealth@Combat@Pages@ClassGUI",5
0]
Config:SetSlider[${uniqueToon},"sldConserveManaPetHealth","sldConserveManaPetHealth@Combat@Pages@Class
GUI",30]
Config:SetCombo[${uniqueToon},"cmbStingType","cmbStingType@Combat@Pages@ClassGUI"]
Config:SetSlider[${uniqueToon},"sldHinderRunners","sldHinderRunners@Combat@Pages@ClassGUI",15]
Config:SetCheckBox[${uniqueToon},"chkSaveIntimidation","chkSaveIntimidation@Combat@Pages@ClassGUI",FAL
SE]
Config:SetCheckBox[${uniqueToon},"chkSaveBestialWrath","chkSaveBestialWrath@Combat@Pages@ClassGUI",FAL
SE]
Config:SetSlider[${uniqueToon},"sldMinMelee","sldMinMelee@Combat@Pages@ClassGUI",9]
Config:SetSlider[${uniqueToon},"sldMaxMelee","sldMaxMelee@Combat@Pages@ClassGUI",29]
Config:SetSlider[${uniqueToon},"sldMinRanged","sldMinRanged@Combat@Pages@ClassGUI",5]
Config:SetSlider[${uniqueToon},"sldMaxRanged","sldMaxRanged@Combat@Pages@ClassGUI",150]
; Party Page
Config:SetSlider[${uniqueToon},"sldFollowDistance","sldFollowDistance@Party@Pages@ClassGUI",10]
}
method SaveGUI()
{
variable string uniqueToon =
"${Me.Name}:${Me.Class}:${ISXWoW.RealmName.Replace[',REMOVE,.,REMOVE]}"
; Main Page
Config:SaveSlider[${uniqueToon},"sldRestHP"]
Config:SaveSlider[${uniqueToon},"sldRestMana"]
Config:SaveSlider[${uniqueToon},"sldStandHP"]
Config:SaveSlider[${uniqueToon},"sldStandMana"]
Config:SaveSlider[${uniqueToon},"sldUsePot"]
Config:SaveSlider[${uniqueToon},"sldUseBandage"]
Config:SaveSlider[${uniqueToon},"sldFeignDeath"]
Config:SaveCheckBox[${uniqueToon},"chkUseScrolls"]
Config:SaveCheckBox[${uniqueToon},"chkUseAspectCheetah"]
; Pull Page
Config:SaveSlider[${uniqueToon},"sldPullBailOutTimer"]
Config:SaveCheckBox[${uniqueToon},"chkUseRangedAttacks"]
Config:SaveCheckBox[${uniqueToon},"chkUseHuntersMark"]
Config:SaveCheckBox[${uniqueToon},"chkSendPet"]
Config:SaveCheckBox[${uniqueToon},"chkViperSting"]
Config:SaveCombo[${uniqueToon},"cmbPullShot"]
; Combat Page
Config:SaveSlider[${uniqueToon},"sldConserveMana"]
Config:SaveSlider[${uniqueToon},"sldConserveManaHealth"]
Config:SaveSlider[${uniqueToon},"sldConserveManaPetHealth"]
Config:SaveCombo[${uniqueToon},"cmbStingType"]
Config:SaveSlider[${uniqueToon},"sldHinderRunners"]
Config:SaveCheckBox[${uniqueToon},"chkSaveIntimidation"]
Config:SaveCheckBox[${uniqueToon},"chkSaveBestialWrath"]
Config:SaveSlider[${uniqueToon},"sldMinMelee"]
Config:SaveSlider[${uniqueToon},"sldMaxMelee"]
Config:SaveSlider[${uniqueToon},"sldMinRanged"]
Config:SaveSlider[${uniqueToon},"sldMaxRanged"]
; Party Page
Config:SaveSlider[${uniqueToon},"sldFollowDistance"]
}
; ---------------------------------------------------------------------
; ---------------------------------------------------------------------
; Range Settings
member MinMelee()
{
return ${Math.Calc[${Config.GetSlider[sldMinMelee]} / 10 + 0]} /* range of
0.0 to 2.0 */
}
member MaxMelee()
{
if ${Movement.Speed} && (${CMovement.isFacingAway} || ${MobInfo.chkRunner})
return ${Math.Calc[${This.MinMelee} + 1]}
/* mob may be running, stay close */
return ${Math.Calc[${Config.GetSlider[sldMaxMelee]} / 10 + 3]} /* range of
3.0 to 5.0 */
}
member MinRanged()
{
return ${Math.Calc[ ${Config.GetSlider[sldMinRanged]} / 10 + 12]} /* range of
12.0 to 20.0 */
}
member MaxRanged()
{
if ${Movement.Speed} && ${CMovement.isFacingAway} && ${MobInfo.chkRunner} &&
${Target.PctHPs} < 20
return ${Math.Calc[${Config.GetSlider[sldMaxRanged]} / 10 + 15]}/* range of
15.0 to 35.0 */
if ${Movement.Speed} && ${CMovement.isFacingAway}
return ${Math.Calc[${Config.GetSlider[sldMaxRanged]} / 10 + 20]}/* range of
20.0 to 40.0 */
return ${Math.Calc[${Config.GetSlider[sldMaxRanged]} / 10 + 25]} /* range of
25.0 to 45.0 */
}
}
; -------------------------------------------------------------------------
; -------------------------------------------------------------------------