Resource icon

Combat Assist Puller Macro

Server Type
🏘️ Emu
It's a work in progress. In a world without extended target window and a lack of current plugins we try to make do/ work around weird oddities. This macro will allow you to set up a camp location, a distance to pull mobs from, and set an array of up to eight NPCs to target and pull to you. I'm currently using it with a Warrior, but I will work on adding some other classes functions to it as I get to using them. I am working out the kinks right now, but it works alright so far. Small issue currently is once your tank goes out to pull, once it casts the ammo clicky (currently set) and returns to camp, it'll sit there forever. So working on a timer to reset it. Otherwise it's pretty functional. To use it you'll need to put in a bit of information:

/mac <macro_name>.mac "pull_distance" "number_of_mob_names" "mob_name_1" .....

example:

/mac pull.mac "1000" "4" "bat" "snake" "alligator" "skeleton"

Rich (BB code):
#include Spell_Routines.inc 
#turbo 40

Sub Main
/declare Pulling bool outer
/declare Fighting bool outer
/declare WarSkill timer outer 0
/declare CampY float outer
/declare CampX float outer
/declare CampZ float outer
/declare PullRange int outer
/declare MovetoCampTimer timer outer 0
/declare MobWait timer outer 0
/varset CampY ${Me.Y}
/varset CampX ${Me.X}
/varset CampZ ${Me.Z}
/varset PullRange ${Param0}
/declare NumOfTargets string outer ${Param1}
/declare TargetName1 string outer ${Param2}
/declare TargetName2 string outer ${Param3}
/declare TargetName3 string outer ${Param4}
/declare TargetName4 string outer ${Param5}
/declare TargetName5 string outer ${Param6}
/declare TargetName6 string outer ${Param7}
/declare TargetName7 string outer ${Param8}
/declare TargetName8 string outer ${Param9}

/declare i int outer 1
/echo I am hunting ${NumOfTargets} targets at ${TarDis} range:
/call HuntList
/call MainLoop

Sub HuntList
/for i 1 to ${NumOfTargets}
/echo ${TargetName${i}}

/next i
/return

Sub MainLoop
:loopstart
/call Loot
/call TargetNPC
/call GetMob
/call ReturnWait
/goto :loopstart 
/return

Sub Loot
/If (${Target.Type.Equal[Corpse]}) {
		/stick off
		/face
		/stick 3
		/delay 1s
		/loot
		/delay 3
		/itemnotify loot1 rightmouseup
		/delay 3
		/itemnotify loot2 rightmouseup
		/delay 3
		/itemnotify loot3 rightmouseup
		/delay 3
		/itemnotify loot4 rightmouseup
		/delay 3
		/itemnotify loot5 rightmouseup
		/delay 3
		/itemnotify loot6 rightmouseup
		/Notify ConfirmationDialogBox Yes_button LeftMouseUp
		/delay 1s
		/notify LootWnd DoneButton leftmouseup
		/delay 1s
		}
		/stick off
		/stick off
		/varset i 1
/return

Sub TargetNPC
	/if (!${Target.ID}) {
			/echo Getting a Target
			}
	/for i 1 to ${NumOfTargets}
	/Target ${TargetName${i}}
	/echo Looking for a ${TargetName${i}}!
	/if (${Target.Type.Equal[Corpse]}) {
		/call Loot
		}
	/if (!${Target.ID}) {
		/echo No ${TargetName${i}} found.
		/delay 3
		/next i
		}
	/if (${Target.Distance} > ${PullRange} && ${Target.ID} > 0) {
		/echo All ${TargetName${i}} too far.
		/squelch /target clear
		/delay 1
		/next i
		}
	/return

Sub GetMob
	/if (${Target.Distance} < ${PullRange} && ${Target.ID} > 0 && (${Target.PctHPs} == 100)) {
		/if (${Target.Distance} > 30) {
				/moveto id ${Target.ID}
				/varset Pulling True
				/echo Pulling a ${TargetName${i}}
				:GettingMobMove
				/if (${MoveTo.Moving} && ${Target.ID} && (${Target.Distance} > 30)) {
					/delay 3
					/goto :GettingMobMove
					}
				/if (!${MoveTo.Moving} && ${Target.ID} && (${Target.Distance} < 30)) {
						/face fast
						/nomod /keypress back hold
						/delay 5
						/nomod /keypress back
						/face
						}
				/if (!${Me.Standing}) {
						/stand
						/goto :GettingMobMove
						} else {
						/delay 10
						/casting "PullItem" ammo
						/delay 20
						} 
						/attack off
						/stick off
						/call ReturnWait
						}
					} else /call Attack
				}			
	/return
	
Sub ReturnWait
	/if ((${Target.ID}) && (${Target.PctHPs} > 20) && (${Math.Distance[${Me.Y}, ${Me.X}, ${Me.Z}: ${CampY}, ${CampX}, ${CampZ}]} > 30)) {
		/echo You are ${Math.Distance[${Me.Y}, ${Me.X}, ${Me.Z}: ${CampY}, ${CampX}, ${CampZ}]} from your camp
		/moveto loc ${CampY} ${CampX} ${CampZ}
		/if (${MovetoCampTimer} ==0) {
			/echo Moving to Camp
			/varset MovetoCampTimer 60
			}
		/delay 1s
			:WaitMoveToCamp
			/if ((${MoveTo.Moving}) && (${Target.ID}) && (${Target.Type.NotEqual[corpse]}) || (${Math.Distance[${Me.Y}, ${Me.X}, ${Me.Z}: ${CampY}, ${CampX}, ${CampZ}]} > 30)) {
				/delay 1
				/if (${MovetoCampTimer} ==0) {
					/echo Moving to Camp
					/varset MovetoCampTimer 60
					}
				/if (!${MoveTo.Moving} && (${Math.Distance[${Me.Y}, ${Me.X}, ${Me.Z}: ${CampY}, ${CampX}, ${CampZ}]} > 30)) {
					/if (!${Target.Fleeing}) {
						/stick off
						/attack off
						/moveto loc ${CampY} ${CampX} ${CampZ}
					} else /call Attack
					/moveto loc ${CampY} ${CampX} ${CampZ}
				}
				/goto :WaitMoveToCamp
			}
		/if (${Target.Type.Equal[corpse]}) /squelch /call Loot
		/face
		/echo Waiting for ${TargetName${i}} 
		/varset MobWait 600
		:WaitForMob
		/if (${MobWait} == 0) {
			/echo Waited too long for ${TargetName${i}}. Clearing target.
			/target clear
			/varset Pulling False
			/call MainLoop
			}
		/if (${Target.ID} && ${Target.Type.NotEqual[corpse]} && (${Math.Distance[${Me.Y}, ${Me.X}, ${Me.Z}: ${CampY}, ${CampX}, ${CampZ}]} < 30) && (${Math.Distance[${Me.Y}, ${Me.X}, ${Me.Z}: ${Target.Y}, ${Target.X}, ${Target.Z}]} > 30)) {
			/delay 1
		/if (!${Target.ID}) /squelch /target clear
		/call TargetNPC
		} else {
			/varset Pulling False
			/echo You are done pulling
			/call Attack
		}
	}
/return

Sub Attack
	/if ((${Target.ID}) && (${Target.Type.NotEqual[corpse]})) {
			/attack on
			/varset Fighting true
			/if (${Target.Distance} > 10) /stick 10
			/echo Attacking ${TargetName${i}}
		/if (${Fighting}) {
				/echo Waiting to kill target.
			:WaitToKill
			/if ( ${Target.ID} && ((${Target.PctHPs} >= 0) || ${Target.Type.NotEqual[corpse]})) {
				/delay 5
				/if (!${Me.Combat}) {
					/attack on
				}
				/if (${Me.Class.ShortName.Equal[WAR]} && ${Me.PctEndurance}>50 && ${Warskill}==0) {
					/varset WarSkill 610
					/keypress 1
					/delay 3s
					/keypress 2
					}
				/goto :WaitToKill
			}	
			/varset Fighting False
			/echo No longer Fighting
			/if (${Target.Type.Equal[corpse]}) {
				/echo Target was a corpse, looting.
				/squelch /call Loot
				}
		}
	}
/return

I used This Post for some reference and help. Credit for inspiration where it's due. Thanks Chatwiththisname.

[Edit]
Think i've sorted out the problem I was having with the script thinking I pulled a monster and waiting at camp forever. A 1 minute timer will start once you pull the mob, and after it expires it will clear target and resume the script from the beginning. Gonna let it run for a while, maybe a couple hours, to see if anything pops up.
Author
Slade the Magician
First release
Last update
Rating
0.00 star(s) 0 ratings

More resources from Slade the Magician

Share this resource

Back
Top