Hunter Macro (v1.3 UPDATED 06-07-2004 12:51pm PST)

Post your completed (working) macros here. Only for macros using MQ2Data syntax!

Moderator: MacroQuest Developers

Foggrey
orc pawn
orc pawn
Posts: 15
Joined: Fri Jun 11, 2004 7:03 am

Post by Foggrey » Fri Jun 11, 2004 7:07 am

maybe I'm stupid and looked over something but I changed what they said in the other posts and im still getting error loading huntermob.ini. heres my script, make fun of me if you want =(

huntermob.ini

[mob]
Mob1=Spider
Mob2=Lion
Mob3=Griffawn
Mob4=Spiderling
Mob5=Spider
Mob6=berzerker
Mob7=sarnak

hunter.mac

| Hunter Macro
| Hunter.mac
| Author : robdawg
| Version : v1.2 2004-05-13 10:06pm PST
| Useage : /macro Hunter
| Description : This macro will run your character around killing any mobs in your
| RV_MobArray. Then it will attempt to loot all items in your
| RV_LootArray. This is definitely a work in progress and I am sure
| someone can think of plenty of upgrades for this.
|------------------------------------------------------------------------------------

#turbo 10

Sub Main

|------------------------------------------------------------
|How many times should aquire target fail before delaying?
|------------------------------------------------------------
/declare RV_FailMax int outer 3
|------------------------------------------------------------
|How far would you like to target a mob?
|------------------------------------------------------------
/declare RV_MaxRadius int outer 3000
|------------------------------------------------------------
|How far is the combat range?
|------------------------------------------------------------
/declare RV_Range int outer 10
|------------------------------------------------------------
|What is the minimum Z Value of mobs I should target?
|------------------------------------------------------------
/declare RV_MinZRange int outer -1000
|------------------------------------------------------------
|What is the maximum Z Value of mobs I should target?
|------------------------------------------------------------
/declare RV_MaxZRange int outer 1000
|------------------------------------------------------------
|Should I loot all items?
|------------------------------------------------------------
/declare RV_LootAllItems int outer 0
|------------------------------------------------------------
|Should I display stats?
|------------------------------------------------------------
/declare RV_DisplayStats int outer 1

|------------------------------------------------------------
|Loot Array Information.
|------------------------------------------------------------
/call ReadINI HunterMob.ini "mob" Mob
/if (!${Defined[RV_MobArray]}) {
/echo Mob Array Creation Error, ending macro...
/endmacro
}

|------------------------------------------------------------
|Mob Array Information.
|------------------------------------------------------------
/call ReadINI HunterLoot.ini "mob" Loot
/if (!${Defined[RV_LootArray]}) {
/echo No Loot Array Created...
}

|------------------------------------------------------------
|Variables that you don't need to worry about.
|------------------------------------------------------------
/declare RV_FailCounter int outer 0
/declare RV_MyTargetID int outer 0
/declare RV_MyTargetName string outer
/declare RV_MyTargetDead int outer 0
/declare RV_InvalidTargetID int outer 0
/declare RV_HasTarget int outer 0
/declare RV_RandomWait int outer 0
/declare RV_LootSlot int outer 0
/declare RV_CheckLook int outer 0
/declare RV_Fighting int outer 0
/declare RV_TargetDead int outer 0
/declare RV_MyXLOC int outer 0
/declare RV_MyYLOC int outer 0

/declare RV_FastRange int outer
/declare RV_RangeMax int outer
/declare RV_RangeMin int outer
/varcalc RV_FastRange ${RV_Range}+3
/varcalc RV_RangeMax ${RV_Range}+1
/varcalc RV_RangeMin ${RV_Range}-1

:Start
/doevents
/call GMCheck
/call GetTarget

:KillAdds
/if (${RV_HasTarget}) /call MoveToMob
/if (${RV_HasTarget}) /call CombatSub
/if (${RV_HasTarget}) /call MoveToMob
/if (${RV_HasTarget} && (${Defined[RV_LootArray]} || ${RV_LootAllItems})) /call LootMob
/if (${RV_DisplayStats}) /call DisplayStats
/call ResetSub

/varset RV_RandomWait ${Math.Rand[5]}
/varcalc RV_RandomWait ${RV_RandomWait}+1
/echo Paranoia - Waiting ${RV_RandomWait} seconds before resuming
/delay ${RV_RandomWait}s

/if (${Target.ID}) {
/echo Looks like something is attacking us, killing it...
/delay 1s
/varset RV_HasTarget 1
/varset RV_Fighting 1
/goto :KillAdds
}

/goto :Start

/return

|--------------------------------------------------------------------------------
|SUB: Aquire Target
|--------------------------------------------------------------------------------
Sub GetTarget

/declare RV_CurrentRadius int local
/declare RV_TargetSub int local
:Acquire
/for RV_CurrentRadius 100 to ${RV_MaxRadius} step 100
/for RV_TargetSub 1 to ${RV_MobArray.Size}
/squelch /target radius ${RV_CurrentRadius} nopcnear notid ${RV_InvalidTargetID} npc "${RV_MobArray[${RV_TargetSub}]}"
/varset RV_MyTargetID ${Target.ID}
/varset RV_MyTargetDead 0
/if (${Target.ID}) {
/if (${Int[${Target.PctHPs}]}<100) {
/echo Mob NOT a Full Health, picking another...
/varset RV_InvalidTargetID ${Target.ID}
/call ResetSub
/goto :Acquire
}
/if (${Int[${Target.Z}]}<${RV_MinZRange}) {
/echo Mob is BELOW Min Z Range, picking another...
/varset RV_InvalidTargetID ${Target.ID}
/call ResetSub
/goto :Acquire
}
/if (${Int[${Target.Z}]}>${RV_MaxZRange}) {
/echo Mob is ABOVE Max Z Range, picking another...
/varset RV_InvalidTargetID ${Target.ID}
/call ResetSub
/goto :Acquire
}
/varset RV_HasTarget 1
/varset RV_MyTargetName ${Target.CleanName}
/echo Acquired ${Target.CleanName} at range ${Int[${Target.Distance}]}
/return
}
/next RV_TargetSub
/delay 2
/next RV_CurrentRadius

/if (!${Target.ID}) {
/delay 2s
/varcalc RV_FailCounter ${RV_FailCounter}+1
/echo Failed to Acquire Target in Range ${RV_MaxRadius} ${RV_FailCounter} Time(s)
/if (${RV_FailCounter}>=${RV_FailMax}) {
/echo Waiting for Respawns, Resetting Failure Counter...
/delay 60s
/varset RV_FailCounter 0
}
/goto :Acquire
}
/return

|--------------------------------------------------------------------------------
|SUB: Moving
|--------------------------------------------------------------------------------
Sub MoveToMob

/varset RV_MyXLOC ${Int[${Me.X}]}
/varset RV_MyYLOC ${Int[${Me.Y}]}
/declare RV_DistanceTimer timer 15

/doevents

:MovementLoop

/if ((!${RV_Fighting})&&(!${RV_TargetDead})&&(${Target.PctHPs}<100)) {
/echo Mob not at full health, picking another...
/varset RV_InvalidTargetID ${Target.ID}
/varset RV_HasTarget 0
/call ResetSub
/return
}

/if (${Target.ID}) {
/face fast
}
/if (${Int[${Target.Distance}]}>${RV_FastRange}) {
/keypress forward hold
}
/if (${Int[${Target.Distance}]}<${RV_FastRange}&&${Int[${Target.Distance}]}>${RV_RangeMax}) {
/keypress forward
}
/if (${Int[${Target.Distance}]}<${RV_RangeMin}) {
/keypress back
}
/if (!${RV_DistanceTimer}) {
/if ((${RV_MyXLOC}==${Int[${Me.X}]})&&(${RV_MyYLOC}==${Int[${Me.Y}]})) /call HitObstacle
/varset RV_MyXLOC ${Int[${Me.X}]}
/varset RV_MyYLOC ${Int[${Me.Y}]}
/varset RV_DistanceTimer 15
/goto :Movementloop
}
/if (${Int[${Target.Distance}]}>${RV_FastRange}) /goto :MovementLoop

/return

|--------------------------------------------------------------------------------
|SUB: Combat
|--------------------------------------------------------------------------------
Sub CombatSub

/echo Attacking Mob NOW!
/varset RV_Fighting 1
/varset RV_TargetDead 0

:CombatLoop
/doevents
/attack on

/call MoveToMob
/call SpecialIT

/if (!${Target.ID}) {
/attack off
/keypress forward
/keypress back

/varset RV_TargetDead 1
/varset RV_Fighting 0
/delay 1s
/target radius 30 corpse
/delay 1s
/if (!${Target.ID}) {
/call ResetSub
/return
}
/face fast
}
/if (!${RV_TargetDead}) {
/goto :CombatLoop
}

/return

|--------------------------------------------------------------------------------
|SUB: Special Combat
|--------------------------------------------------------------------------------
Sub SpecialIt

/declare TempID int inner 0

/if ((${Target.Distance}<11)&&(${Me.AbilityReady["Bash"]})) /doability "Bash"

/if ((${Int[${Me.PctHPs}]}<50)&&(${Me.Gem["Light of Nife"]})&&(${Me.SpellReady["Light of Nife"]})) {
/varset TempID ${Target.ID}
/keypress forward
/keypress back
/keypress F1
/echo Casting Heal Spell because of low health...
/cast "Light of Nife"
/delay 3s
/target id ${TempID}
}

/return

|--------------------------------------------------------------------------------
|SUB: Looting
|--------------------------------------------------------------------------------
Sub LootMob

/declare LootSlot int inner 0
/declare LootCheck int inner 0
/declare LootTotal int inner 0

/face fast

/keypress forward
/keypress back

/fastdrop on
/lootn never
/delay 2s
/loot
/delay 2s
/if (!${Corpse.Items}) {
/echo NO LOOT! Cheap Bastard!
/return
}

/varset LootTotal ${Corpse.Items}
/for LootSlot 1 to ${LootTotal}
/itemnotify loot${LootSlot} leftmouseup
/delay 1s
/if (${RV_LootAllItems}) {
/echo Keeping a ${Cursor.Name}... WOOT!
/autoinventory
/delay 1s
} else {
/for LootCheck 1 to ${RV_LootArray.Size}
/if (${Cursor.Name.Find[${RV_LootArray[${LootCheck}]}]}) {
/echo Keeping a ${Cursor.Name}... WOOT!
/varcalc RV_LootStats[${LootCheck}] ${RV_LootStats[${LootCheck}]}+1
/autoinventory
/delay 1s
}
/next LootCheck
}
/if (${Cursor.ID}) {
/echo Destroying a ${Cursor.Name}...
/destroy
/delay 1s
}
/next LootSlot

/notify LootWnd DoneButton leftmouseup
/delay 2

/return

|--------------------------------------------------------------------------------
|SUB: Reset
|--------------------------------------------------------------------------------
Sub ResetSub

/keypress esc
/keypress esc
/keypress esc
/keypress esc

/varset RV_HasTarget 0
/varset RV_TargetDead 0
/varset RV_Fighting 0

/return

|--------------------------------------------------------------------------------
|SUB: Obstacle Avoidance
|--------------------------------------------------------------------------------
Sub HitObstacle

/echo Obstacle hit, moving around it...
/keypress forward
/keypress back hold
/delay 3
/keypress back
/if (${Math.Rand[100]}+1>50) {
/keypress strafe_right hold
} else {
/keypress strafe_left hold
}
/delay 5
/keypress strafe_right
/keypress strafe_left
/keypress forward hold

/return

|--------------------------------------------------------------------------------
|SUB: GM Check
|--------------------------------------------------------------------------------
Sub GMCheck

/if (${Spawn[gm].ID}) {
/beep
/beep
/beep

/echo GM has entered the zone!
/echo FUCK HIM but ending the macro...

/keypress forward
/keypress back

/quit
/endmacro
}

/return

|--------------------------------------------------------------------------------
|SUB: Reading from an INI File
|--------------------------------------------------------------------------------
Sub ReadINI(FileName,SectionName,ArrayType)

/echo Attempting to Read Section "${SectionName}" Zone Information from ${FileName}...
/delay 1s

/if (${Ini[${FileName},${SectionName},-1,NO].Equal[NO]}) {
/echo "${SectionName}" is not a Valid Section for FILE:${FileName}, ending macro...
/delay 1s
/return
}
/declare nValues int local 1
/declare nArray int local 0
/declare KeySet string local ${Ini[${FileName},${SectionName}]}

:CounterLoop
/if (${String[${Ini[${FileName},${SectionName},${ArrayType}${nValues}]}].Equal[null]}) {
/varcalc nValues ${nValues}-1
/goto :MakeArray
}
/varcalc nValues ${nValues}+1
/goto :CounterLoop

:MakeArray
/if (!${nValues}) /return
/if (${FileName.Equal["HunterMob.ini"]}&&${nValues}>0) {
/echo Declaring Mob Array...
/declare RV_MobArray[${nValues}] string outer
/declare RV_MobStats[${nValues}] string outer
}
/if (${FileName.Equal["HunterLoot.ini"]}&&${nValues}>0) {
/echo Declaring Loot Array...
/declare RV_LootArray[${nValues}] string outer
/declare RV_LootStats[${nValues}] string outer
}
/for nArray 1 to ${nValues}
/if (${FileName.Equal["HunterMob.ini"]}) {
/varset RV_MobArray[${nArray}] ${Ini[${FileName},${SectionName},${ArrayType}${nArray}]}
/varset RV_MobStats[${nArray}] 0
}
/if (${FileName.Equal["HunterLoot.ini"]}) {
/varset RV_LootArray[${nArray}] ${Ini[${FileName},${SectionName},${ArrayType}${nArray}]}
/varset RV_LootStats[${nArray}] 0
}
/next nArray

/echo "${SectionName}" Zone Information Read Successfully from ${FileName}...
/delay 1s

/return

|--------------------------------------------------------------------------------
|SUB: Display Stats
|--------------------------------------------------------------------------------
Sub DisplayStats

/declare nArray int local

/if (${Defined[RV_LootArray]}) {
/for nArray 1 to ${RV_LootArray.Size}
/echo ${Int[${RV_LootStats[${nArray}]}]} ${RV_LootArray[${nArray}]}'s
/next nArray
}

/return

funmonkey
orc pawn
orc pawn
Posts: 16
Joined: Wed Mar 19, 2003 12:24 am

Post by funmonkey » Fri Jun 11, 2004 7:14 am

robodog,

thanks for your continued work on this script.

what i would love to see is an optional anchor point with an option pull feature.

hit a mob, bring it to your anchor. Would make life a lot easier when pling my newbie friends characters when they are offline.

Thanks again

ab2304
orc pawn
orc pawn
Posts: 20
Joined: Tue Jun 01, 2004 3:19 pm

Post by ab2304 » Fri Jun 11, 2004 8:27 am

funmonkey - check out the bsthunter.mac. It has an anchor point stuff in it (it currently doesnt pull mob back to your anchor. But rearranging it wouldnt be that hard. Or just copy the MoveToAnchor code and the call for it. Remove the avoid mob stuff. Very easy!

Mister Peepers
a lesser mummy
a lesser mummy
Posts: 46
Joined: Mon Apr 19, 2004 8:10 pm

Post by Mister Peepers » Fri Jun 11, 2004 8:54 am

funmonkey, there seems to have been a change in ini useage just cp the first post again and you should be good as that had the fix.

robdawg
a ghoul
a ghoul
Posts: 114
Joined: Tue Mar 23, 2004 11:54 am
Contact:

Post by robdawg » Fri Jun 11, 2004 12:31 pm

Foggrey wrote:huntermob.ini

[mob]
Mob1=Spider
Mob2=Lion
Mob3=Griffawn
Mob4=Spiderling
Mob5=Spider
Mob6=berzerker
Mob7=sarnak
I am not going to make fun of you, but you seriously need to follow directions. Instead of [Mob] it need to be [Zone Name], for example, [Eastern Plains of Karana] or [East Commonlands].

To get the FULL ZONE NAME, simply type /echo ${Zone.Name} and it will output to your MQ2 window. You can then update the ini's accordingly. You will need to make a section for each zone you wish to "hunt" in.

Furthermore, you will need to make a section for each zone you want to "loot" in as well.
ROBDAWG

[url=http://www.seathound.com]Seat Hound[/url]
[url=http://www.sportsrumormill.com]Sports Rumor Mill[/url]
[url=http://www.packerforum.com]Packer Forum[/url]

Mister Peepers
a lesser mummy
a lesser mummy
Posts: 46
Joined: Mon Apr 19, 2004 8:10 pm

Post by Mister Peepers » Fri Jun 11, 2004 2:04 pm

robdawg wrote:
Foggrey wrote:huntermob.ini

[mob]
Mob1=Spider
Mob2=Lion
Mob3=Griffawn
Mob4=Spiderling
Mob5=Spider
Mob6=berzerker
Mob7=sarnak
I am not going to make fun of you, but you seriously need to follow directions. Instead of [Mob] it need to be [Zone Name], for example, [Eastern Plains of Karana] or [East Commonlands].

To get the FULL ZONE NAME, simply type /echo ${Zone.Name} and it will output to your MQ2 window. You can then update the ini's accordingly. You will need to make a section for each zone you wish to "hunt" in.

Furthermore, you will need to make a section for each zone you want to "loot" in as well.
I posted some code to change if you wanted to make it just generic so you didn't have to set it up for every zone.

Foggrey
orc pawn
orc pawn
Posts: 15
Joined: Fri Jun 11, 2004 7:03 am

Post by Foggrey » Fri Jun 11, 2004 6:25 pm

n/m I fixed it last night.

Thanx mister Peepers for the generic yet simple smack in the face =)

I use this and a cleric bot for pling AA's at 65, im up to 2 an hour with a rogue and a cleric =) buha

Locke
decaying skeleton
decaying skeleton
Posts: 1
Joined: Sun Jun 13, 2004 2:31 pm

Post by Locke » Sun Jun 13, 2004 2:41 pm

This is a really great macro, I'm going to use it as a basis for the script I'm going to use to level my guy from 1-50 :). One quick thing, I was having problems with it saying no mobs were around in the newbie areas that were packed with mobs and other players. After a few minutes of looking at the targetting code (your code was beautifully laid out which made finding what I was looking for a breeze!) I found the line

Code: Select all

/squelch /target radius ${RV_CurrentRadius} [color=red]nopcnear[/color] notid ${RV_InvalidTargetID} npc "${RV_MobArray[${RV_TargetSub}]}"

I removed the nopcnear part, since there was already code in place to prevent me KSing, and it worked fine. Hope this helps someone!

colt45
orc pawn
orc pawn
Posts: 16
Joined: Thu Jun 10, 2004 5:29 am

Not working. . .

Post by colt45 » Sun Jun 13, 2004 7:42 pm

When i try to loot a mob using this script it bends down and begins to loot, but before it picks up any items it Errors and i get the following:

Code: Select all

 
/declare "lLootSlot" failed. Name already in use.
hunter.mac @279 (lootmob): /declare LootSlot int inner 0
hunter.mac @95 (main) /if (${RV_HasTarget) && (${Defined|RV_LootArray]} || ${RV_LootAllitems }}) /Call LootMob
/for loops must use an int  variable
hunter.mac @299 (LootMob):/for LootSlot 1 to $(LootTotal)
hunter.mac@95 (main) 
if (${RV_HasTarget) && (${Defined|RV_LootArray]} || ${RV_LootAllitems }}) 
Macro has ended 
any help, im still new to scripting, but yeah . . . *shrug*
using 1.3 and i havnt changed anything

bartab
a grimling bloodguard
a grimling bloodguard
Posts: 715
Joined: Wed Oct 15, 2003 8:12 am

Post by bartab » Tue Jun 15, 2004 6:02 am

I found the loot sub pretty slow so I tried to make a few changes, untested atm.
Basically instead of making a right click on every item then checking if the cursor name is in the loot table it checks the name on the corpse and make the right click if it corresponds.
imo, it will also solve the "problem" of having the NO DROP window opened.
hope it works
:roll:

*edit changed a few things, tested it : I think this is quite quicker than other loot sub but not al lot :lol:

Code: Select all

|-------------------------------------------------------------------------------- 
|SUB: Looting 
|-------------------------------------------------------------------------------- 
Sub LootMob 

   /declare LootSlot    int inner  0 
   /declare LootCheck   int inner  0 
   /declare LootTotal   int inner  0 
    
   /face fast 
    
   /keypress forward 
   /keypress back 
    
   /fastdrop on 
   /lootn never 
   /delay 2s 
   /loot 
   /delay 2s 
   /if (!${Corpse.Items}) { 
      /echo NO LOOT! Cheap Bastard! 
      /return 
   } 

   /varset LootTotal ${Corpse.Items} 
   /for LootSlot 1 to ${LootTotal}  
      /delay 1s 
      /if (${RV_LootAllItems}) {
      	 /itemnotify loot${LootSlot} rightmouseup
      } else { 
         /for LootCheck 1 to ${RV_LootArray.Size} 
            /if (${Corpse.Item[${LootSlot}].Name.Find[${RV_LootArray[${LootCheck}]}]}) { 
               /itemnotify loot${LootSlot} rightmouseup 
               /varcalc RV_LootStats[${LootCheck}] ${RV_LootStats[${LootCheck}]}+1
            } 
         /next LootCheck 
      } 
 
   /next LootSlot 
    
   /notify LootWnd DoneButton leftmouseup 
   /delay 2 
    
/return 

Draconis
a lesser mummy
a lesser mummy
Posts: 40
Joined: Tue Mar 23, 2004 4:53 pm

Post by Draconis » Thu Jun 17, 2004 11:07 am

just tried this out today, made all the macro files and ini files ect, and went to shadeweavers thicket, ran it and it seemed to work fine, found all the mob and loot arrays then it targeted what i wanted to hunt, but as soon as i started to move toward what i was hunting I got a CTD. Im looking for a crash log or somthing and when i find it ill post any errors it shows.

Avanos
orc pawn
orc pawn
Posts: 14
Joined: Thu Jun 17, 2004 11:18 am

Post by Avanos » Thu Jun 17, 2004 11:18 am

Happened to me too, glad to see it wasn't just me. Posting my info over in the Bugs forum now.

Draconis
a lesser mummy
a lesser mummy
Posts: 40
Joined: Tue Mar 23, 2004 4:53 pm

Post by Draconis » Thu Jun 17, 2004 11:23 am

well i attached VS 6 to eqgame.exe to debug it but this time when i ran the macro it did not crash, now just testing it to get it to do what i want it to do.

-edit-

NM it still crashes =\
Last edited by Draconis on Thu Jun 17, 2004 11:43 am, edited 1 time in total.

Avanos
orc pawn
orc pawn
Posts: 14
Joined: Thu Jun 17, 2004 11:18 am

Post by Avanos » Thu Jun 17, 2004 11:29 am

Still crashes for me, but the length of time it runs varies wildly from run to run. had it stay steady for a good 5-6 minutes one time, next time it crashed out before I could even close on the first target.

Avanos
orc pawn
orc pawn
Posts: 14
Joined: Thu Jun 17, 2004 11:18 am

Post by Avanos » Thu Jun 17, 2004 11:52 am

ack. probably a malformed calculation in the macro somewhere.
I figured I'd let people learn the hard way for now
So now we just need to find it. I'm a macro-ing newb, so what does a well-formed calculation look like?