Code: Select all
|pal-bot.mac By MacroToon. Ripped from Grimjacks 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 AssHealer 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 AssHealer v61
#define countdown v62
#define CmdList v63
#define MainTank v64
#define RangeMin v70
#define RangeMax v71
#define FastRange v72
#define Combatstatus v73
#define LowHealthCheck v74
|** LowHealthCheck keeps a tally of the number of members in a group
below a %. Then does Group Heal when needed. **|
#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 AssHealer 0
/varset RangeMin 10
/varset RangeMax 12
/varset FastRange 15
/varset Combatstatus 0
/varset IsMT 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
/varset a(1,26) mtank
|||||||||||||||||||||||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
/if $MainTank=="1" /call KeepAgro
}
|||||||||||||||||||||||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
/varset LowHealthCheck 0
/varcalc GroupMax $group(count)-1
/if n "$AssHealer"==0 /return
:GroupLoop
/doevents
/if n $spawn($group($GroupMember),hp,pct)<5 {
/call LOH
/delay 2s
}
/if n $spawn($group($GroupMember),hp,pct)<81 {
/if n $spawn($group($GroupMember),hp,pct)>=1 {
/varadd LowHealthCheck 1
/varset a(2,$LowHealthCheck) $spawn(group($GroupMember))
/if n $LowHealthCheck>=3 /call Groupheal
}
}
/if n $GroupMember>=$GroupMax {
/if n $LowHealthCheck>=1 {
/for v80 1 $LowHealthCheck
/if n $spawn($group($a(2,$v80),hp,pct))<81 {
/if n $spawn($group($a(2,$v80),hp,pct))>=1 {
/call PallyHeal }
/next v80
}
}
/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 GetAgro
/if n $char(ability,"taunt")==1 /doability "taunt"
/if n $target(hp,pct)<5 /return
/delay 25
/call spellsub "cease"
/delay 2s
/call spellsub "desist"
/delay 5
/if n $char(ability,"taunt")==1 /doability "taunt"
/return
Sub KeepAgro
|Check Health of mob if less than 5% return
/if n $char(ability,"taunt")==1 /doability "taunt"
/if n $target(hp,pct)<5 /return
/delay 25
| See if you are still the mobs target. Then press tab go to the last target.
/assist
/if $target()!=$char(id) {
/sendkey tab down
/sendkey tab up
/delay 5
/call spellsub "cease"
/delay 2s
/call spellsub "desist"
/delay 5
/if n $char(ability,"taunt")==1 /doability "taunt"
}
/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
/if "$MainTank"=="1" /call GetAgro
/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-mtank
/if n $strlen("$p1")<=0 /tell $MasterName Specify MT ON or OFF
/if "$p1"=="on" /varset $maintank 1
/if "$p1"=="off" /varset $maintank 0
/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=$AssHealer
/return
}
/if $p1=="off" /varset AssHealer 0
/if $p1=="on" /varset AssHealer 1
/tell $MasterName Autoheal=$AssHealer
/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 Groupheal
/stand
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
||| Edit Edit heal message
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/if n $Combatstatus==1 /g Attempting GROUP HEAL for 660 Pt heal
/if n $Combatstatus==0 /g GROUP HEAL COMING
/call SpellSub "Healing Wave of Prexus"
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/if "$SitAfterCast"=="1" /sit on
/press esc
/return
Sub PallyHeal
/if n $Combatstatus==1 /return
/if n $group($a(2,$v80))==$char(id) /press F1
/if n $group($a(2,$v80))!=$char(id) /target id $group($a(2,$v80))
/stand
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
||| Edit Edit heal message
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/if n $Combatstatus==0 /g Celestial Cleansing on %t
/call SpellSub "Celestial Cleansing"
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/if "$SitAfterCast"=="1" /sit on
/press esc
/return
Sub LOH
/if n $Combatstatus==0 /return
/if n $char(ability,"Lay On Hands")==0 {
/g "LOH DOWN 8("
/return
}
/if n $group($GroupMember)==$char(id) /press F1
/if n $group($GroupMember)!=$char(id) /target id $group($GroupMember)
/stand
/g Tunare has given me the ability to Lay Hands On %t NOW I hope %S doesnt splat!
/doability "Lay On Hands"
/sendkey tab down
/sendkey tab up
/return
|||||||||||||||||||||||Personal Commands|||||||||||||||||||||||||||||||||
Ive added some things like casting Group heals. Casting CC when down time is there. Also added get agro and keep agro subs. These will cast stun and taunt when needed, I hope. The idea is to check the mobs target. IF it isnt you then use stun. Taunt goes on all the time.
I havnt tested it yet, but hope to see it in action soon. Im waiting on getting my 2nd box up and going.
If anyone sees some mistakes(im sure theres plenty.) Please let me know.
Thanks,
MacroToon


