Thanks
GrimJack
Edit: Added say, group, and tell commands. 9 word max.
Edit: Added sn command and fixed targeting mobs with multiple names.
example: /tell charname sn Ice comet
and
/tell charname moveto orc pawn
Edit: Added duck command for interupting spells.
Edit: Added stop command. Stop will cancel movement and spells being cast. Also added autoheal on and off command.
/tell botname autoheal on turns group watching and auto heal on
/tell botname autoheal off turns group watching and auto heal off
/tell botname autoheal reports autoheal setting
Edit: Added a ton of melee commands and fixed tell
Edit: Fixed say group and tell bug. Max is now 9 words.
Edit: Updated sn command. Will now use SpellSub.
Edit: Added Kagonis' Array Counter sub.
Edit: Fixed a minor enrage bug.
Code: Select all
|genbot.mac
|Generic bot for casters and melee.
|Make sure you edit this macro to add the commands you want.
|Use the generic spell1 and spell2 commands and subs as examples.
|for the most part you can copy/paste those and change the name of the spell
|you want it to cast. Also update IsHealer to 1 if you want it to do heals, and
|update the spells used for Tankheal and Casterheal subs at the bottom.
|I hope this explains enough.
|Version 2.06
|Grimjack
#turbo 75
#Event Enraged "has become ENRAGED"
#Event Offrage "is no longer enraged"
#event Collapse "Your gate is too unstable, and collapses."
#event FollowOff "You are no longer auto-following"
#event RootOff "Your Immobilize spell has worn off."
#event NoLOS "You cannot see your target."
#Event CastStart "You begin casting"
#Event CastFizzle "Your spell fizzles!"
#Event CastInterrupt "Your spell is interrupted."
#Event CastNoMana "Insufficient Mana to cast this spell"
#Event CastTooFar "Your target is out of range, get closer!"
#Event Recovered "You haven't recovered yet..."
#Event CastResist "Your target resisted "
#Event Distracted "You are too distracted to cast a spell now!"
#Event NoTarget "You must first select a target for this spell!"
#Event Sitting "You must be standing to cast a spell."
#Event NoMem "You do not seem to have that spell memorized."
#Event Stunned "You can't cast spells while stunned!"
#define MasterName v50
#define CmdArrayNum v51
#define CmdArraySize v52
#define GroupMember v53
#define GroupMax v54
#define ChatInput1 v55
#define ChatInput2 v56
#define ChatInput3 v57
#define SitAfterCast v58
#define MyXLoc v59
#define MyYLoc v60
#define IsHealer v61
#define countdown v62
#define CmdList v63
#define RangeMin v70
#define RangeMax v71
#define FastRange v72
#define Combatstatus v73
#define Fail v94
#define DoAgain v95
#define StartCast v96
#define SpellSlot v97
#define SpellName v98
#define CastTime v99
#define CTimer t39
#chat tell
Sub Main
/if n $strlen("$p0")<=0 {
/echo Usage: /macro generic <Master Name>
/endmacro
}
/varset MasterName $p0
/varset IsHealer 0
/varset RangeMin 10
/varset RangeMax 12
/varset FastRange 15
/varset Combatstatus 0
/varset a(1,0) afk
/varset a(1,1) accept
/varset a(1,2) reject
/varset a(1,3) invite
/varset a(1,4) mana
/varset a(1,5) follow
/varset a(1,6) stop
/varset a(1,7) evac
/varset a(1,8) moveto
/varset a(1,9) sit
/varset a(1,10) stand
/varset a(1,11) sn
/varset a(1,12) camp
/varset a(1,13) duck
/varset a(1,14) run
/varset a(1,15) say
/varset a(1,16) tell
/varset a(1,17) group
/varset a(1,18) cmds
/varset a(1,19) autoheal
/varset a(1,20) target
/varset a(1,21) notarget
/varset a(1,22) assist
/varset a(1,23) saytarget
/varset a(1,24) attack
/varset a(1,25) noattack
|||||||||||||||||||||||Personal Commands|||||||||||||||||||||||||||||||||
|||||||||||||||||||||||Personal Commands|||||||||||||||||||||||||||||||||
/call CountArraySize 1
/varset CmdArraySize $int($return)
/varset CmdList "$a(1,0), $a(1,1), $a(1,2), $a(1,3), $a(1,4), $a(1,5) $a(1,6), $a(1,7), $a(1,8), $a(1,9), $a(1,10), $a(1,11), $a(1,12), $a(1,13), $a(1,14), $a(1,15), $a(1,16), $a(1,17), $a(1,18), $a(1,19), $a(1,20) $a(1,21), $a(1,22), $a(1,23), $a(1,24), $a(1,25), $a(1,26), $a(1,27), $a(1,28), $a(1,29), $a(1,30), $a(1,31), $a(1,32), $a(1,33), "$a(1,34), $a(1,35), $a(1,36), $a(1,37), $a(1,38), $a(1,39), $a(1,40)"
/varset CmdArrayNum 0
:MainLoop
/call CheckGrpHealth
/call Combatcheck
/if $Combatstatus=="1" /call RangeSub
|||||||||||||||||||||||Personal Commands|||||||||||||||||||||||||||||||||
|||||||||||||||||||||||Personal Commands|||||||||||||||||||||||||||||||||
/doevents
/varset CmdArrayNum 0
/goto :MainLoop
/return
sub CountArraySize
/varset l0 0
:CountArrayLoop
/if n $strlen("$a($p0,$l0)")<=0 {
/goto :CountArrayEnd
}
/varadd l0 1
/goto :CountArrayLoop
:CountArrayEnd
/return $l0
Sub CheckGrpHealth
/varset GroupMember 0
/varcalc GroupMax $group(count)-1
/if n "$IsHealer"==0 /return
:GroupLoop
/doevents
/if n $spawn($group($GroupMember),hp,pct)<41 {
/if n $spawn($group($GroupMember),hp,pct)>=1 {
/if "$spawn($group($GroupMember),class)"=="Warrior" /call Tankheal
/if "$spawn($group($GroupMember),class)"=="Paladin" /call Tankheal
/if "$spawn($group($GroupMember),class)"=="Shadow Knight" /call Tankheal
/if "$spawn($group($GroupMember),class)"=="Monk" /call Tankheal
/if "$spawn($group($GroupMember),class)"=="Ranger" /call Tankheal
}
}
/if n $spawn($group($GroupMember),hp,pct)>=1 {
/if n $spawn($group($GroupMember),hp,pct)<41 {
/call CasterHeal
}
}
/if n $GroupMember>=$GroupMax /return
/varadd GroupMember 1
/doevents
/goto :GroupLoop
/return
Sub Combatcheck
/if $EnrageVar=="1" {
/if $target()=="TRUE" {
/return
} else {
/varset EnrageVar 0
/varset Combatstatus 0
}
}
/if $target()=="FALSE" {
/varset Combatstatus 0
/if $combat=="TRUE" {
/attack off
}
/return
}
/if $target()=="TRUE" {
/if $combat=="TRUE" {
/varset Combatstatus 1
/return
}
}
/varset Combatstatus 0
/return
Sub Rangesub
/face fast nopredict
/if n $target(distance)>=$FastRange /call Fastmove
/if n $target(distance)>$RangeMax {
/press up
}
/if n $target(distance)<$RangeMin {
/press down
}
/return
Sub Fastmove
:fastmoveloop
/doevents
/if $target()=="FALSE" {
/varset Combatstatus 0
/sendkey up up
/if $combat=="TRUE" {
/attack off
/return
}
}
/face fast nopredict
/if n $target(distance)>$FastRange {
/sendkey down up
}
/if n $target(distance)<=$FastRange {
/if $Combatstatus=="1" {
/if $EnrageVar=="0" {
}
}
/sendkey up up
/return
}
/goto :fastmoveloop
/return
Sub Event_Chat
/varset CmdArrayNum 0
/if "$MasterName"=="$p1" {
:ArrayTime
/if "$arg(1,"$p2")"=="$a(1,$CmdArrayNum)" {
/call Do-$a(1,$CmdArrayNum) $p2
/return
}
/varadd CmdArrayNum 1
/if n $CmdArrayNum>=$CmdArraySize /return
/goto :ArrayTime
} else {
/tell $MasterName $p1 told me: $p2
}
/return
Sub Do-target
/if n $strlen("$p1")<=0 {
/return
} else /if n $strlen("$p2")<=0 {
/target "$p1"
} else /if n $strlen("$p3")<=0 {
/target "$p1 $p2"
} else /if n $strlen("$p4)<=0 {
/target "$p1 $p2 $p3"
} else /target "$p1 $p2 $p3 $p4"
/tell $MasterName my target is %t
/return
Sub Do-saytarget
/tell $MasterName my target is %t
/return
Sub Do-assist
/if n $strlen("$p1")<=0 {
/assist $MasterName
/delay 3
} else /if n $strlen("$p2")<=0 {
/assist "$p1"
} else /if n $strlen("$p3")<=0 {
/assist "$p1 $p2"
} else /if n $strlen("$p4)<=0 {
/assist "$p1 $p2 $p3"
} else /assist "$p1 $p2 $p3 $p4"
/tell $MasterName my target is %t
/return
Sub Do-attack
/sit off
/if n $strlen("$p1")<=0 {
/assist $MasterName
/delay 5
} else /if n $strlen("$p2")<=0 {
/target "$p1"
} else /if n $strlen("$p3")<=0 {
/target "$p1 $p2"
} else /if n $strlen("$p4)<=0 {
/target "$p1 $p2 $p3"
} else /target "$p1 $p2 $p3 $p4"
/tell $MasterName Attacking %t
/attack on
/return
Sub Do-noattack
/attack off
/return
Sub Do-sit
/sit off
/sit
/return
Sub Do-stand
/sit off
/return
Sub Do-notarget
/press esc
/press esc
/press esc
/return
Sub Do-sn
/assist $MasterName
/if n $strlen("$p1")<=0 {
/return
} else /if n $strlen("$p2")<=0 {
/tell "$MasterName" Casting $p1 on %T
/call SpellSub $p1
} else /if n $strlen("$p3")<=0 {
/tell "$MasterName" Casting $p1 $p2 on %T
/call SpellSub "$p1 $p2"
} else /if n $strlen("$p4)<=0 {
/tell "$MasterName" Casting $p1 $p2 $p3 on %T
/call SpellSub "$p1 $p2 $p3"
} else {
/tell "$MasterName" Casting $p1 $p2 $p3 $p4 on %T
/call SpellSub "$p1 $p2 $p3 $p4"
/stand
/if "$SitAfterCast"=="1" /sit on
/press esc
/return
Sub Do-afk
/varset CmdArrayNum 0
/if n $strlen("$p1")<=0 {
/afk
} else /if n $strlen("$p2")<=0 {
/afk $p1
} else /if n $strlen("$p3")<=0 {
/afk $p1 $p2
} else /if n $strlen("$p4")<=0 {
/afk $p1 $p2 $p3
} else /if n $strlen("$p5")<=0 {
/afk $p1 $p2 $p3 $p4
} else /if n $strlen("$p6")<=0 {
/afk $p1 $p2 $p3 $p4 $p5
} else /if n $strlen("$p7")<=0 {
/afk $p1 $p2 $p3 $p4 $p5 $p6
} else /if n $strlen("$p8")<=0 {
/afk $p1 $p2 $p3 $p4 $p5 $p6 $p7
} else /if n $strlen("$p9")<=0 {
/afk $p1 $p2 $p3 $p4 $p5 $p6 $p7 $p8
} else {
/afk $p1 $p2 $p3 $p4 $p5 $p6 $p7 $p8 $p9
}
/afk
/return
Sub Do-say
/varset CmdArrayNum 0
/if n $strlen("$p1")<=0 {
/return
} else /if n $strlen("$p2")<=0 {
/say $p1
} else /if n $strlen("$p3")<=0 {
/say $p1 $p2
} else /if n $strlen("$p4")<=0 {
/say $p1 $p2 $p3
} else /if n $strlen("$p5")<=0 {
/say $p1 $p2 $p3 $p4
} else /if n $strlen("$p6")<=0 {
/say $p1 $p2 $p3 $p4 $p5
} else /if n $strlen("$p7")<=0 {
/say $p1 $p2 $p3 $p4 $p5 $p6
} else /if n $strlen("$p8")<=0 {
/say $p1 $p2 $p3 $p4 $p5 $p6 $p7
} else /if n $strlen("$p9")<=0 {
/say $p1 $p2 $p3 $p4 $p5 $p6 $p7 $p8
} else /if n $strlen("$p10")<=0 {
} else {
/say $p1 $p2 $p3 $p4 $p5 $p6 $p7 $p8 $p9
}
/return
Sub Do-group
/varset CmdArrayNum 0
/if n $strlen("$p1")<=0 {
/return
} else /if n $strlen("$p2")<=0 {
/g $p1
} else /if n $strlen("$p3")<=0 {
/g $p1 $p2
} else /if n $strlen("$p4")<=0 {
/g $p1 $p2 $p3
} else /if n $strlen("$p5")<=0 {
/g $p1 $p2 $p3 $p4
} else /if n $strlen("$p6")<=0 {
/g $p1 $p2 $p3 $p4 $p5
} else /if n $strlen("$p7")<=0 {
/g $p1 $p2 $p3 $p4 $p5 $p6
} else /if n $strlen("$p8")<=0 {
/g $p1 $p2 $p3 $p4 $p5 $p6 $p7
} else /if n $strlen("$p9")<=0 {
/g $p1 $p2 $p3 $p4 $p5 $p6 $p7 $p8
} else /if n $strlen("$p10")<=0 {
} else {
/g "$p1 $p2 $p3 $p4 $p5 $p6 $p7 $p8 $p9
}
/return
Sub Do-tell
/varset CmdArrayNum 0
/if n $strlen("$p1")<=0 {
/return
} else /if n $strlen("$p2")<=0 {
/return
} else /if n $strlen("$p3")<=0 {
/tell $p1 $p2
} else /if n $strlen("$p4")<=0 {
/t $p1 $p2 $p3
} else /if n $strlen("$p5")<=0 {
/t $p1 $p2 $p3 $p4
} else /if n $strlen("$p6")<=0 {
/t $p1 $p2 $p3 $p4 $p5
} else /if n $strlen("$p7")<=0 {
/t $p1 $p2 $p3 $p4 $p5 $p6
} else /if n $strlen("$p8")<=0 {
/t $p1 $p2 $p3 $p4 $p5 $p6 $p7
} else /if n $strlen("$p9")<=0 {
/t $p1 $p2 $p3 $p4 $p5 $p6 $p7 $p8
} else {
/t $p1 $p2 $p3 $p4 $p5 $p6 $p7 $p8 $p9
}
/return
Sub Do-accept
/press esc
/press esc
/invite
/return
Sub Do-reject
/press esc
/press esc
/disband
/return
Sub Do-invite
/if n $strlen("$p1")<=0 {
/assist $MasterName
/delay 3
} else /if n $strlen("$p2")<=0 {
/target "$p1"
} else /if n $strlen("$p3")<=0 {
/target "$p1 $p2"
} else /if n $strlen("$p4)<=0 {
/target "$p1 $p2 $p3"
} else /target "$p1 $p2 $p3 $p4"
/tell $MasterName Inviting %t
/invite
/return
Sub Do-mana
/dismount
/press F1
/tell $MasterName $char(mana,pct)m
/press esc
/return
Sub Do-follow
/target $MasterName
/face
/follow
/tell $MasterName Autofollow on %t.
/return
Sub Do-stop
/tell $MasterName Stoping.
/sendkey up up
/varset Fail 1
/press d
/press d
/press esc
/press esc
/press esc
/press right
/return
Sub Do-evac
/tell $MasterName Moving to you and casting Evac!
/call Do-moveto evac $MasterName
/delay 2s
/call SpellSub "Evacuate"
/return
Sub Do-sit
/stand
/sit on
/return
Sub Do-stand
/stand
/return
Sub Do-camp
/tell $MasterName Camping out.
/stand
/sit
/camp
/return
Sub Do-duck
/press d
/varset Fail 1
/varset CTimer 0
/press d
/return
Sub Do-autoheal
/if n $strlen("$p1")<=0 {
/tell $MasterName Autoheal=$IsHealer
/return
}
/if $p1=="off" /varset IsHealer 0
/if $p1=="on" /varset IsHealer 1
/tell $MasterName Autoheal=$IsHealer
/return
Sub Do-cmds
/tell "$MasterName" Commands: "$CmdList"
/return
Sub Do-moveto
/sit off
/varset countdown 0
/varset MyXLoc $char(x)
/varset MyYLoc $char(y)
/if n $strlen("$p1")<=0 {
/assist $MasterName
/delay 3
} else /if n $strlen("$p2")<=0 {
/target "$p1"
} else /if n $strlen("$p3")<=0 {
/target "$p1 $p2"
} else /if n $strlen("$p4)<=0 {
/target "$p1 $p2 $p3"
} else /target "$p1 $p2 $p3 $p4"
/if $p1=="me" /target $MasterName
/tell $MasterName Moving to %t.
:gotopointloop
/doevents
/if $target()==FALSE {
/sendkey up up
/return
}
/face fast nopredict
/if n $target(distance)>15 /sendkey down up
/if n $target(distance)<=15 {
/sendkey up up
/return
}
/face fast nopredict
/if n $countdown>=3 {
/call Detectobst
/varset countdown 0
}
/varadd countdown 1
/doevents
/goto :gotopointloop
}
/sendkey up up
/face
/return
Sub Detectobst
/if n $MyXLoc==$char(x) /if $MyYLoc==$char(y) /call Hitobst 5
/varset MyXLoc $char(x)
/varset MyYLoc $char(y)
/return
sub Hitobst
/sendkey up up
/sendkey down down
/if n $rand(99)>50 {
/delay 2s
/sendkey up down
/sendkey down Right
/delay $p0
/sendkey up Right
/sendkey down up
/delay 2s
/sendkey up up
} else {
/delay 2s
/sendkey up down
/sendkey down left
/delay $p0
/sendkey up left
/sendkey down up
/delay 2s
/sendkey up up
}
/sendkey up down
/sendkey up Right
/sendkey up Left
/sendkey down up
/return
Sub SpellSub
/sendkey up up
/if n Combatstatus==1 /delay 3s
/varset Fail 0
/varset SpellName "$p0"
/varset SpellSlot "$char(gem,"$SpellName")"
/varset CastTime "$spell("$SpellName",casttime)"
:BeginCast
/varset DoAgain 0
/varset StartCast 0
/call WaitForStart
:TimerLoop
/doevents
/if n $DoAgain==1 /goto :BeginCast
/if n $Fail==1 /return
/doevents
/if n $DoAgain==1 /goto :BeginCast
/if n $Fail==1 /return
/if n $CTimer>0 /goto :TimerLoop
/delay 2
/doevents
/if n $DoAgain==1 /goto :BeginCast
/return
Sub WaitForStart
/cast $SpellSlot
:StartLoop
/doevents
/if n $Fail==1 /return
/if n $DoAgain==1 /return
/if n $StartCast==0 {
/goto :StartLoop
}
/varset CTimer "$CastTime"s
/return
Sub Event_Enraged
/if $target()=="TRUE" {
/if n $Combatstatus==1 {
/varset EnrageVar 1
/attack off
}
/varset EnrageVar 1
}
/return
Sub Event_Offrage
/if $target()=="TRUE" {
/if n $Combatstatus==1 {
/varset EnrageVar 0
/attack
}
/varset EnrageVar 0
}
/return
Sub Event_CastStart
/varset StartCast 1
/return
Sub Event_CastFizzle
/delay 2
/varset DoAgain 1
/return
Sub Event_CastInterrupt
/delay 2
/varset DoAgain 1
/return
Sub Event_FollowOff
/press esc
/press esc
/delay 5
/tell $MasterName Auto Follow Off.
/return
Sub Event_Sitting
/stand
/delay 2
/varset DoAgain 1
/return
Sub Event_CastTooFar
/varset Fail 1
/tell $MasterName Too far away.
/varset CTimer 0
/return
Sub Event_Distracted
/tell $MasterName I can't cast. I'm too distracted.
/varset Fail 1
/varset CTimer 0
/return
Sub Event_NoTarget
/varset Fail 1
/tell $MasterName I have no target to cast on.
/varset CTimer 0
/return
Sub Event_NoMem
/tell $MasterName That spell is not memed.
/varset Fail 1
/varset CTimer 0
/return
Sub Event_RootOff
/tell $MasterName Root has worn off.
/return
Sub Event_CastNoMana
/tell $MasterName OOM. Medding 16 seconds and trying again.
/sit off
/sit on
/delay 16s
/sit off
/varset DoAgain 1
/return
Sub Event_Stunned
/tell $MasterName Stunned waiting 3 seconds to try again.
/delay 3s
/varset DoAgain 1
/return
Sub Event_Recovered
/delay 2s
/varset DoAgain 1
/return
Sub Event_CastResist
/tell $MasterName Resisted. Trying again.
/varset DoAgain 1
/return
Sub Event_Collapse
/varset DoAgain 1
/return
Sub Event_NoLOS
/tell $MasterName I can't see my target.
/varset Fail 1
/varset CTimer 0
/return
Sub Tankheal
/if n $group($GroupMember)==$char(id) /press F1
/if n $group($GroupMember)!=$char(id) /target id $group($GroupMember)
/stand
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
||| Edit Edit heal message
||| Edit Spell to auto cast on Melee
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/g COMPLETE HEAL on %T in 10seconds
/call SpellSub "Complete Heal"
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/if "$SitAfterCast"=="1" /sit on
/press esc
/return
Sub Casterheal
/if n $group($GroupMember)==$char(id) /press F1
/if n $group($GroupMember)!=$char(id) /target id $group($GroupMember)
/stand
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
||| Edit Edit heal message
||| Edit Spell to auto cast on Non Melee
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/g Healing %T
/call SpellSub "Supernal Remedy"
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/if "$SitAfterCast"=="1" /sit on
/press esc
/return
|||||||||||||||||||||||Personal Commands|||||||||||||||||||||||||||||||||



