Please Convert: necrofarm.mac by Scrime

Got a cool macro idea? Wanna request a macro? Here is the place for you!

Moderator: MacroQuest Developers

Guest

Please Convert: necrofarm.mac by Scrime

Post by Guest » Thu Oct 16, 2003 9:28 am

Can someone please fix this macro? It did everything I wanted to do.

Thanks,

Code: Select all

| 
|  necrofarm.mac - v0.3.0b 10/01/2003 by Scrime 
|  Basic pet hunter script 
|     w/ some ideas borrowed from GrimJack's hunter script. 
| 
|  Usage: 
|   ! Have a pet up. 
|   ! Put the correct spells in the spell names. 
|   ! Use /call AddToMobList to add the mobs that you want to hunt. 
|   ! Use /call AddToLootList to add the items that you want to loot 
|   ! Use /call AddToDontLootList to add the items that you want to destroy 
|       because they accidently get looted due to the wildcard nature of the loot list. 
|  
|  Features: 
|   + Anti-KS code.  Selects targets with no other PCs within a variable radius. 
|      Also checks to make sure the target is undamaged and is not already attacking 
|     someone else before engaging. 
|   + Selective auto-looting.  Only keeps the items that you want it to.  Also has a 
|     destroy list, in the case that you are looting all "lightstones", but still want 
|     to destroy "Burned Out Lightstones" (for example) 
|   + Closest mob selection.  Looks through the whole list of mobs you want to hunt 
|     goes after the closest one. 
|   + Debugging code.  Set DEBUG to "1==1" to show debugging code, set to "0==1" to turn 
|     it off. 
|   + Buff tracking.  Keeps track of buffs up on you and your pet, refreshes as nescessary. 
|   + Heals your pet once it drops below 90% health. 
|      + Obstruction avoidance.  Should back up and try to go around something if it gets stuck. 
| 
|  Known Issues/Limitations/Bugs: 
|      - Does not know when to stop hunting.  $freeinv works for some people, crashes the client for 
|     other people.  Until it is fixed, the script will not know when you bags are full. 
|     - Does not stop to med up, stops casting spells once below 20% mana. 
|   - Obstruction detection needs some tweaking, maybe an "allowance" value for being in the same spot 
|     instead of waiting for the x/y locs to be the same. 
|       
|  Release Notes for v0.3.0b : 
|   * NOTE: This is considered a beta release, it still needs some more testing.  Use at you own risk, 
|     please report any problems.  Enjoy and macro responsibly. 
|      * Hunt distance is now a constant (cHuntDistance) that you can set at the beginning of the script.  This 
|       is the maxiumum distance away from you that the script will look for a new target.  Set to 99999 for no 
|     max distance. 
|      * In the anti-ks code, when looking at our targets assisted target, it will look at the name and if 
|     the name contains the word "corpse" it will disregard the assist and attack anyway. 
|   * In the anti-ks code, if a mob it tries to target becomes invalid because it is not full health or is 
|     currently attacking someone it will not be considered the next time thru the loop. 
|      * Aggro'd mob protection.  If we have a mob aggro'd on us, then the script will select that mob as our next 
|     target to kill AFTER we are done with out current target before doing a normal search for a hunt target. 
|   * Continuous target re-evaluation.  As long as we are moving towards our target, the script will keeping 
|     looking for closer targets.  This makes it so that we wont run past newly spawned valid targets on our way 
|     to our current target (which is farther away). 
|   * Script now backs away from a target if it gets too close to us (too close range defined as cTooCloseRange) 
| 

#turbo 

#define CurrTarget             v1 
#define CurrMana             v2 
#define LastPosX            v4 
#define LastPosY            v5 
#define OldTarget            v6 

#define PetHasteStatus         v30 

#define MobArraySize         v50 
#define LootArraySize         v51 
#define MobArrayIndex         v52 
#define LootArrayIndex         v53 
#define ClosestMobID         v54 
#define ClosestMobDist         v55 
#define HaveTarget            v56 
#define ObstCount            v57 
#define DontLootArraySize      v58 
#define InvalidTargetID         v59 

#define LootSlot            v60 
#define BagsFull            v61 
#define FizzleFlag            v62 

| used to echo debugging messages.  set to 1=1 if you want to see them, 0==1 if you dont 
#define DEBUG               1==1 

| array number defines, dont change 
#define cMobArrayNumber         1 
#define cLootArrayNumber      2 
#define cDontcLootArrayNumber    3 

| distance defines, setting these alters the behavior of the script 
| cAntiKSRadius is the distance from each mob that will exclude it from selecting as a 
| target if there is another PC within this range. 
#define cAntiKSRadius         50 
| cAtkRange is how close we get to the mob before we send in the pet 
#define cAtkRange            50 
| cTooCloseRange is how close we let a mob we are attacking get to us before we start to 
| back away 
#define cTooCloseRange         30 
| cHuntDistance is the maximum distance away that the script will select a new target. 
#define cHuntDistance         99999 

| spell names 
#define SelfShieldSpell      "Major Shielding" 
#define PetBuffSpell      "Intensify Death" 
#define PetHealSpell      "Renew Bones" 

| special events to respond to 
#event PetHasteDown   "Your pet's Intensify Death spell has worn off." 
#event Fizzle      "Your spell fizzles!" 

| MAIN ========================================================= 

Sub Main 
   | clear out all variables. 
   /zapvars 

   | clear target, et al 
   /press esc 
   /press esc 
   /press esc 
   /press shift 
   /press alt 
   /press ctrl 

   | never confirm looting nodrop items 
   /lootn never 

   | macro title 
   /echo Starting NecroFarm v0.3.0a - by Scrime 
   /if DEBUG /echo Debugging messages WILL be shown. 
   /echo Attack range is cAtkRange. 
   /echo AntiKS range is cAntiKSRadius. 
   /echo TooClose range is cTooCloseRange. 
   /echo Hunt range is cHuntDistance. 

   | set up our hunting array 
   /call AddToMobList "willowisp" 
   /call AddToMobList "spider" 
   /call AddToMobList "kodiak" 
   /call AddToMobList "bear" 
    
   | set up the loot array 
   /call AddToLootList "quality" 
   /call AddToLootList "lightstone" 
   /call AddToLootList "silk" 
    
   | set up the dont loot array 
   /call AddToDontLootList "burned out lightstone" 
    
:StartHunting 
   /doevents 
    
   /call CastSpells 
    
   /if n $HaveTarget==0 /call FindAggroTarget 
   /if n $HaveTarget==0iiiiiiiiii /call MoveToTarget 
   /if n $HaveTarget==1 /call KillTarget 
   /if n $HaveTarget==1 /call LootTarget 
       
   /if n $BagsFull==1 /goto :EndMacro 
   /goto :StartHunting 
    
:EndMacro 
   /if n $BagsFull==1 /echo NecroFarm ended: Bags are full, go sell! 
/return 

| SUBS ========================================================= 

Sub AddToMobList 
   /if "$p0"!="" { 
      /varadd MobArraySize 1 
      /varset a(cMobArrayNumber,$MobArraySize) "$p0" 
      /if DEBUG /echo Added $p0 to the MobArray at position $int($MobArraySize). 
   } 
/return 

Sub AddToLootList 
   /if "$p0"!="" { 
      /varadd LootArraySize 1 
      /varset a(cLootArrayNumber,$LootArraySize) "$p0" 
      /if DEBUG /echo Added $p0 to the LootArray at position $int($LootArraySize). 
   } 
/return 

Sub AddToDontLootList 
   /if "$p0"!="" { 
      /varadd DontLootArraySize 1 
      /varset a(cDontcLootArrayNumber,$DontLootArraySize) "$p0" 
      /if DEBUG /echo Added $p0 to the DontLootArray at position $int($DontLootArraySize). 
   } 
/return 

| ============================================================== 

| FindAggroTarget 
| this function targets the closest mob that is not our pet and looks to see if it has us as its 
| target.  If we find a target here, then we put our pet on it and skip normally finding 
| a target. 
Sub FindAggroTarget 
   /if DEBUG /echo Entering FindAggroTarget... 
   | clear our current target 
   /press esc 

   | target the closest mob that is not our pet 
   /target npc notid $char(pet) 

   | if we have a target, then we need to see if it has a target 
   /if $target()=="TRUE" { 
      /if DEBUG /echo Checking closest target ($target(name), id:$target(id)) for aggro. 
      /varset ClosestMobID $target(id) 
      /assist 
       
      | if the closest mob's target is us, then select it as our target to kill. 
      /if n $target(id)==$char(id) { 
         /target id $ClosestMobID 
         /if DEBUG /echo $target(name) ($target(id)) is aggro'd on us, selecting as target to kill. 
         /varset HaveTarget 1 
         /varset ClosestMobID $target(id) 
      } 
   } 
   /if DEBUG /echo Leaving FindAggroTarget... 
/return 

| ============================================================== 

Sub FindTarget 
   /if DEBUG /echo Entering FindTarget... 

   | make sure we have nothing targeted 
   /press esc 
    
   | routine to find the closest, non-engaged mob from our list 
   | returns nothing, but ClosestMobID will be set to the mob to engage. Keeps looking until it finds a target. 
:StartFindTarget 
    
   | reset the distance and ID of closest mob 
   /varset ClosestMobDist cHuntDistance    
   /varset ClosestMobID 0 
   /varset HaveTarget 0 
    
   | go thru the list of mobs we want to hunt and find the closest one that isn't being engaged. 
   /for MobArrayIndex 1 to $MobArraySize 
      /target npc nopcnear cAntiKSRadius notid InvalidTargetID $a(cMobArrayNumber,$MobArrayIndex) 
      /if DEBUG { 
         /if $target()=="TRUE" { 
            /echo Looking for $a(cMobArrayNumber,$MobArrayIndex), found $target(name,clean) (id: $target(id)), Distance: $target(distance,nopredict)          
         } 
      } 
       
      | check to make sure we targeted something 
      /if $target()=="FALSE" /goto :SkipMob 
       
      | if the target is not full life, someone else is probably fighting it, skip it 
      /if n $target(hp,pct)!=100 { 
         /if DEBUG /echo Target is not full life, skipping. 
         /varset InvalidTargetID $target(id) 
         /goto :SkipMob 
      } 
       
      | see if this mob is closer than the last mob we checked 
      /if n $target(distance,nopredict)<$ClosestMobDist { 
         /if DEBUG { 
            /echo $target(name) is closer than our former target, switching. 
         } 
         /varset ClosestMobID $target(id) 
         /varset ClosestMobDist $target(distance,nopredict) 
         /varset InvalidTargetID 0 
         /varset HaveTarget 1 
      } 

:SkipMob 
   /next MobArrayIndex 
    
   | if we didn't find a target, start over    
   /if n $HaveTarget!=1 /goto :StartFindTarget 
    
   | re-target whichever mob was closest 
   /target id $ClosestMobID 
    
:EndFindTarget 
   /if DEBUG /echo Leaving FindTarget... 
/return 

| ============================================================== 

Sub MoveToTarget 

   /if DEBUG /echo Entering MoveToTarget... 
   | moves us to the currently target, stops once we are within our cAtkRange 
    
:KeepMoving 
   | constantly look for a closer target 
   /call FindTarget 
   /call CheckForObst 

   | check to make sure our target is still alive 
   /if $target()=="FALSE" { 
      /if DEBUG /echo Our target died before we got to it, finding a new one. 
      /sendkey up up 
      /varset HaveTarget 0 
      /goto :EndMoveToTarget 
   }    
    
   | check to make sure our target is still full life, if not someone is probably fighting it 
   /if n $target(hp,pct)!=100 { 
      /if DEBUG /echo Our target started losing hp before we got to it, finding a new one. 
      /sendkey up up 
      /varset InvalidTargetID $target(id) 
      /varset HaveTarget 0 
      /goto :EndMoveToTarget 
   } 
    
   /face 
   /sendkey down up 
    
   | check to see if we are close enough yet 
   /if n $target(distance,nopredict)<=cAtkRange { 
      /if DEBUG /echo In range of target, stop moving. 
      /sendkey up up 
      /goto :EndMoveToTarget 
   } 
    
   /goto :KeepMoving 
    
:EndMoveToTarget 
   /if DEBUG /echo Leaving MoveToTarget... 
/return 

| ============================================================== 

Sub KillTarget 
   /if DEBUG /echo Entering KillTarget... 
    
   | check to make sure our target is still alive 
   /if $target()=="FALSE" { 
      /if DEBUG /echo Our target died before we attacked it, finding a new one. 
      /varset InvalidTargetID 0 
      /varset HaveTarget 0 
      /goto :EndKillTarget 
   }    
    
   | check to make sure our target is still full life, if not someone is probably fighting it 
   /if n $target(hp,pct)!=100 { 
      /if DEBUG /echo Our target started losing hp before we attacked it, finding a new one. 
      /varset InvalidTargetID $target(id) 
      /varset HaveTarget 0 
      /goto :EndKillTarget 
   } 
    
   | make sure our target doesnt have a target, if it does then it's attacking someone, skip it 
   /assist 
   /delay 1s 
   /if DEBUG /echo Our target's ID=$ClosestMobID, assisted target's ID=$target(id) 
    
   | check the assisted target's id, then check its name.  if the name contains "corpse", then 
   | our original target should be considered valid. 
   /if n $target(id)!=$ClosestMobID /if n $instr(corpse,$target(name))==-1 { 
      /if DEBUG /echo Our target had a living target, it must've been fighting someone, skip it. 
      /varset InvalidTargetID $target(id) 
      /varset HaveTarget 0 
      /goto :EndKillTarget 
   } 
    
   | send our pet in 
   /pet attack 

   | wait until mob is dead, if it starts to flee, follow it 
:MainCombatLoop 
   /call CastSpells 
:FollowMob 
   | check to see if the mob is getting away from us, if so follow 
   /if n $target(distance,nopredict)>cAtkRange { 
      /if DEBUG /echo Target moved away from us, following. 
      /face 
      /sendkey down up 
   } else { 
      /face 
      /sendkey up up 
   } 
    
   | check to see if the mob is getting too close to us, if so back off 
   /if n $target(distance,nopredict)<cTooCloseRange { 
      /if DEBUG /echo Target getting too close to us, backing away. 
      /face 
      /sendkey down down 
   } else { 
      /face 
      /sendkey up down 
   } 
    
   | if we lose our target while attacking it, then the mob died. 
   /if $target()=="FALSE" /goto :EndKillTarget 
   /goto :MainCombatLoop 

:EndKillTarget 
   | make sure our pet follows us 
   /pet follow 
   | make sure we stop moving 
   /sendkey up up 
   /sendkey up down 
    
   /if DEBUG /echo Leaving KillTarget... 
/return 

| ============================================================== 

Sub LootTarget 
:StartLootTarget 
   /if DEBUG /echo Entering LootTarget... 
    
   | target the corpse of the mob we just killed 
   /target id $ClosestMobID 
    
   | move up to it 
   /face 
:CheckCorpseDistance 
   /call CheckForObst 
   /if n $target(distance)>15 { 
      /face 
      /sendkey down up 
      /goto :CheckCorpseDistance 
   } else { 
      /sendkey up up 
   } 

   | open the loot window 
   /loot 
   /delay 2s 
    
   | check each slot (0-7) to see if its something we want to keep 
   /for LootSlot 0 to 7 
      /click left corpse $LootSlot 
      /delay 1s 

      | if there is nothing on the cursor, then we are out of loots, stop the loop 
      /if "$cursor()"=="NULL" /goto :EndLootTarget 
       
      /if DEBUG /echo Checking loot slot #$LootSlot: $cursor(name) 

      | check whats on our cursor against the list of things we DONT want to keep 
      /for LootArrayIndex 1 to $DontLootArraySize 
         /if "$cursor(name)"=="$a(cDontcLootArrayNumber,$LootArrayIndex)" { 
            /if DEBUG /echo $cursor(name) matches $a(cDontcLootArrayNumber,$LootArrayIndex), destroying. 
               /click left destroy 
               /delay 1s 
             /goto :NextLoot 
         } 
      /next LootArrayIndex 

      | check whats on our cursor against the list of things we want to keep 
      /for LootArrayIndex 1 to $LootArraySize 
         /if "$cursor(name)"~~"$a(cLootArrayNumber,$LootArrayIndex)" { 
            /if DEBUG /echo $cursor(name) matches $a(cLootArrayNumber,$LootArrayIndex), keeping. 
               /click left auto 
               /delay 1s 
             /goto :NextLoot 
         } 
      /next LootArrayIndex 
       
      | if we make it to here, it means that the loot didnt match anything in our list 
      | so, we destroy the object. 
      /if DEBUG /echo $cursor(name) doesn't match anything in our list, destroying. 
      /click left destroy 
      /delay 1s 
       
:NextLoot 
   /next LootSlot 

:EndLootTarget 
   /press esc 
   /varset HaveTarget 0 
    
   | if our bags are full, its time to stop hunting and go sell.  For now, end the macro. 
   | /if n $freeinv(space)==0 /varset BagsFull 1 
   | /if DEBUG /echo Inventory space remaining: $freeinv(space) slots. 
    
   /if DEBUG /echo Leaving LootTarget... 
/return 


| ============================================================== 

Sub CastSpells 
   /if DEBUG /echo Entering CastSpells... 
:StartSpells 

   | see if we have mana to spare 
   /if n $char(mana,pct)<20 /goto :SkipSpells 
    
   | decide which spell to cast 
   /if   n $char(buff,"SelfShieldSpell")==0 { 
      /if DEBUG /echo Trying to cast "SelfShieldSpell". 
      /call NoFizzleCast "SelfShieldSpell" 
      /if DEBUG /echo Delay time is: $int($calc($spell("SelfShieldSpell",casttime)*10+5)) 
      /delay $int($calc($spell("SelfShieldSpell",casttime)*10+5)) 
      /goto :StartSpells 
   } 
    
   | check to see if we have a pet up 
   /if n $char(pet)!=0 { 

      | check to see if we need to heal our pet. 
      /if n $spawn($char(pet),hp,pct)<50 { 
         /if DEBUG /echo Trying to cast "PetHealSpell".       
         /target id $char(pet) 
         /call NoFizzleCast "PetHealSpell" 
         /if DEBUG /echo Delay time is: $int($calc($spell("PetHealSpell",casttime)*10+5)) 
         /delay $int($calc($spell("PetHealSpell",casttime)*10+5)) 
         /goto :StartSpells 
      } 

      | check to see if we need to buff our pet 
      /if n $PetHasteStatus==0 { 
         /if DEBUG /echo Trying to cast "PetBuffSpell". 
         /target id $char(pet) 
         /call NoFizzleCast "PetBuffSpell" 
         /if DEBUG /echo Delay time is: $int($calc($spell("PetBuffSpell",casttime)*10+5)) 
         /delay $int($calc($spell("PetBuffSpell",casttime)*10+5)) 
         /varset PetHasteStatus 1 
         /goto :StartSpells 
      } 
   } 
:SkipSpells    
   /target id $ClosestMobID 
   /if DEBUG /echo Leaving CastSpells... 
/return 

| ============================================================== 

Sub NoFizzleCast 
   | make sure we dont get passed a null spell name 
   /if "$p0"!="" { 
:NoFizzleCastStart 
      /varset FizzleFlag 0 
      | check to make sure we have mana to cast this spell 
      /if n $char(mana,cur)<$spell("$p0",mana) /goto :NoFizzleCastEnd 
       
      /cast "$p0" 
      /doevents Fizzle 
       
      | if we fizzled, try to cast again 
      /if n $FizzleFlag==1 /goto :NoFizzleCastStart 
   } 
:NoFizzleCastEnd 
/return 

| ============================================================== 

Sub CheckForObst 
   /if n $char(x)==$LastPosX /if n $char(y)==$LastPosY { 
      /varadd ObstCount 1 
   } else { 
      /varset ObstCount 0 
   } 
    
   /varset LastPosX $char(x) 
   /varset LastPosY $char(y) 
    
   /if n $ObstCount>3 { 
      /call GoAroundObst 
   } 
/return 

| ============================================================== 

Sub GoAroundObst 
   /if DEBUG /echo Entering GoAroundObst... 
   | back up some 
   /sendkey up up 
   /sendkey down down 
   /delay 1s 
   /sendkey up down 
    
   | go left or right a bit, randomly 
   /if n $rand(2)==1 { 
      /sendkey down left 
      /delay 5 
      /sendkey up left 
   } else { 
      /sendkey down right 
      /delay 5 
      /sendkey up right 
   } 
    
   | move forward a bit 
   /sendkey down up 
   /delay 1s 
   /sendkey up up 
    
   /if DEBUG /echo Leaving GoAroundObst...    
/return 

| EVENTS ======================================================= 

Sub Event_PetHasteDown 
   /varset PetHasteStatus 0 
/return 

Sub Event_Fizzle 
   /varset FizzleFlag 1 
/return 

User avatar
ap50
a snow griffon
a snow griffon
Posts: 425
Joined: Sun Aug 18, 2002 2:29 pm

Post by ap50 » Thu Oct 16, 2003 10:27 am

Well, other than the line with loads of iiiiiiiiiiiiiiiii's in it, it's just a simple conversion, though I'll be damned if I'll convert it for you, learn how it's done, and don't be so lazy that you can't even be arsed to create a user account.

On that note, since when did we allow "Guest" posts anyways, they seem to have grown in number this last week?
[color=yellow][size=92][b]Just because you're paranoid, it doesn't mean everyone isn't out to get you![/b][/size][/color]

Tuffy
a lesser mummy
a lesser mummy
Posts: 33
Joined: Thu Oct 02, 2003 9:20 am

Request

Post by Tuffy » Thu Oct 16, 2003 10:43 am

This is the request form and I'm tring to learn how some of this works.

So,

I went here: http://macroquest2.com/phpBB2/viewtopic.php?t=3260

I read that post a couple of times. And then went to the old depot and look at the differences from the new depot.

I'm at work an have not tested. Compare what I did with the above post to see the differences.

Note: I take no credit for this macro. Just tring to clean up your post.

Code: Select all

| =============================================================================
|   
| Petfarm.mac - v0.3.0b 10/01/2003 by Scrime 
| Basic pet hunter script 
| w/ some ideas borrowed from GrimJack's hunter script. 
| =============================================================================
| Usage: 
| ! Have a pet up. 
| ! Put the correct spells in the spell names. 
| ! Use /call AddToMobList to add the mobs that you want to hunt. 
| ! Use /call AddToLootList to add the items that you want to loot 
| ! Use /call AddToDontLootList to add the items that you want to destroy 
| because they accidently get looted due to the wildcard nature of the loot list. 
| =============================================================================
| Features: 
| + Anti-KS code. Selects targets with no other PCs within a variable radius. 
| Also checks to make sure the target is undamaged and is not already attacking 
| someone else before engaging. 
| + Selective auto-looting. Only keeps the items that you want it to. Also has a 
| destroy list, in the case that you are looting all "lightstones", but still want 
| to destroy "Burned Out Lightstones" (for example) 
| + Closest mob selection. Looks through the whole list of mobs you want to hunt 
| goes after the closest one. 
| + Debugging code. Set DEBUG to "1==1" to show debugging code, set to "0==1" to turn 
| it off. 
| + Buff tracking. Keeps track of buffs up on you and your pet, refreshes as nescessary. 
| + Heals your pet once it drops below 90% health. 
| + Obstruction avoidance. Should back up and try to go around something if it gets stuck. 
| =============================================================================
| Known Issues/Limitations/Bugs: 
| - Does not know when to stop hunting. $freeinv works for some people, crashes the client for 
| other people. Until it is fixed, the script will not know when you bags are full. 
| - Does not stop to med up, stops casting spells once below 20% mana. 
| - Obstruction detection needs some tweaking, maybe an "allowance" value for being in the same spot 
| instead of waiting for the x/y locs to be the same. 
| =============================================================================
| Release Notes for v0.3.0b : 
| * NOTE: This is considered a beta release, it still needs some more testing. Use at you own risk, 
| please report any problems. Enjoy and macro responsibly. 
| * Hunt distance is now a constant (cHuntDistance) that you can set at the beginning of the script. This 
| is the maxiumum distance away from you that the script will look for a new target. Set to 99999 for no 
| max distance. 
| * In the anti-ks code, when looking at our targets assisted target, it will look at the name and if 
| the name contains the word "corpse" it will disregard the assist and attack anyway. 
| * In the anti-ks code, if a mob it tries to target becomes invalid because it is not full health or is 
| currently attacking someone it will not be considered the next time thru the loop. 
| * Aggro'd mob protection. If we have a mob aggro'd on us, then the script will select that mob as our next 
| target to kill AFTER we are done with out current target before doing a normal search for a hunt target. 
| * Continuous target re-evaluation. As long as we are moving towards our target, the script will keeping 
| looking for closer targets. This makes it so that we wont run past newly spawned valid targets on our way 
| to our current target (which is farther away). 
| * Script now backs away from a target if it gets too close to us (too close range defined as cTooCloseRange) 
| =============================================================================

#turbo 

/declare CurrTarget Global 
/declare CurrMana Global
/declare LastPosX Global
/declare LastPosY Global
/declare OldTarget Global

/declare PetHasteStatus Global 

/declare MobArraySize Global
/declare LootArraySize Global
/declare MobArrayIndex Global
/declare LootArrayIndex Global
/declare ClosestMobID Global
/declare ClosestMobDist Global
/declare HaveTarget Global
/declare ObstCount Global
/declare DontLootArraySize Global 
/declare InvalidTargetID Global

/declare LootSlot Global
/declare BagsFull Global
/declare FizzleFlag Global

| used to echo debugging messages. set to 1=1 if you want to see them, 0==1 if you dont 
/declare DEBUG 1==1 

| array number defines, dont change 
/declare cMobArrayNumber 1 
/declare cLootArrayNumber 2 
/declare cDontcLootArrayNumber 3 

| distance defines, setting these alters the behavior of the script 
| cAntiKSRadius is the distance from each mob that will exclude it from selecting as a 
| target if there is another PC within this range. 

/declare cAntiKSRadius 50 

| cAtkRange is how close we get to the mob before we send in the pet 

/declare cAtkRange 50 

| cTooCloseRange is how close we let a mob we are attacking get to us before we start to 
| back away 

/declare cTooCloseRange 30 
| =============================================================================

| cHuntDistance is the maximum distance away that the script will select a new target. 
/declare cHuntDistance 1500 

| =============================================================================

| spell names 
/declare SelfShieldSpell "Put Highest Self Sheild Here" 
/declare PetBuffSpell "Put Highest Pet Hast Buff Here" 
/declare PetHealSpell "Put Highest Pet Heal Here" 
| =============================================================================

| special events to respond to 
#event PetHasteDown "Your pet's Intensify Death spell has worn off." 
#event Fizzle "Your spell fizzles!" 

| MAIN ========================================================= 

Sub Main 
| clear out all variables. 
/zapvars 

| clear target, et al 
/press esc 
/press esc 
/press esc 
/press shift 
/press alt 
/press ctrl 

| never confirm looting nodrop items 
/lootn never 

| =============================================================================
| macro title 
|/echo Starting NecroFarm v0.3.0a - by Scrime 
|/if DEBUG /echo Debugging messages WILL be shown. 
|/echo Attack range is cAtkRange. 
|/echo AntiKS range is cAntiKSRadius. 
|/echo TooClose range is cTooCloseRange. 
|/echo Hunt range is cHuntDistance. 
| =============================================================================

| set up our hunting array 
/call AddToMobList "spider" 

| set up the loot array 
/call AddToLootList "silk" 

| set up the dont loot array 

:StartHunting 
/doevents 

/call CastSpells 

/if n $HaveTarget==0 /call FindAggroTarget 
/if n $HaveTarget==0 /call MoveToTarget 
/if n $HaveTarget==1 /call KillTarget 
/if n $HaveTarget==1 /call LootTarget 

/if n $BagsFull==1 /goto :EndMacro 
/goto :StartHunting 

:EndMacro 
/if n $BagsFull==1 /echo NecroFarm ended: Bags are full, go sell! 
/return 

| SUBS ========================================================= 

Sub AddToMobList 
/if "@Param0"!="" { 
/varadd MobArraySize 1 
/varset a(cMobArrayNumber,$MobArraySize) "@Param0" 
} 
/return 

Sub AddToLootList 
/if "@Param0"!="" { 
/varadd LootArraySize 1 
/varset a(cLootArrayNumber,$LootArraySize) "@Param0" 
} 
/return 

Sub AddToDontLootList 
/if "@Param0"!="" { 
/varadd DontLootArraySize 1 
/varset a(cDontcLootArrayNumber,$DontLootArraySize) "@Param0" 
} 
/return 

| ============================================================== 

| FindAggroTarget 
| this function targets the closest mob that is not our pet and looks to see if it has us as its 
| target. If we find a target here, then we put our pet on it and skip normally finding 
| a target. 
Sub FindAggroTarget 
| clear our current target 
/press esc 
/press esc 
/press esc 
/press esc 
/press esc 
/press esc 

| target the closest mob that is not our pet 
/target npc notid $char(pet) 

| if we have a target, then we need to see if it has a target 
/if $target()=="TRUE" { 
/varset ClosestMobID $target(id) 
/assist 

| if the closest mob's target is us, then select it as our target to kill. 
/if n $target(id)==$char(id) { 
/target id $ClosestMobID 
/varset HaveTarget 1 
/varset ClosestMobID $target(id) 
} 
} 
/return 

| ============================================================== 

Sub FindTarget 

| make sure we have nothing targeted 
/press esc 

| routine to find the closest, non-engaged mob from our list 
| returns nothing, but ClosestMobID will be set to the mob to engage. Keeps looking until it finds a target. 
:StartFindTarget 

| reset the distance and ID of closest mob 
/varset ClosestMobDist cHuntDistance 
/varset ClosestMobID 0 
/varset HaveTarget 0 

| go thru the list of mobs we want to hunt and find the closest one that isn't being engaged. 
/for MobArrayIndex 1 to $MobArraySize 
/target npc nopcnear cAntiKSRadius notid InvalidTargetID $a(cMobArrayNumber,$MobArrayIndex) 
/if $target()=="TRUE" { 
} 
} 

| check to make sure we targeted something 
/if $target()=="FALSE" /goto :SkipMob 

| if the target is not full life, someone else is probably fighting it, skip it 
/if n $target(hp,pct)!=100 { 
/if DEBUG /echo Target is not full life, skipping. 
/varset InvalidTargetID $target(id) 
/goto :SkipMob 
} 

| see if this mob is closer than the last mob we checked 
/if n $target(distance,nopredict)<$ClosestMobDist { 
/if DEBUG { 
/echo $target(name) is closer than our former target, switching. 
} 
/varset ClosestMobID $target(id) 
/varset ClosestMobDist $target(distance,nopredict) 
/varset InvalidTargetID 0 
/varset HaveTarget 1 
} 

:SkipMob 
/next MobArrayIndex 

| if we didn't find a target, start over 
/if n $HaveTarget!=1 /goto :StartFindTarget 

| re-target whichever mob was closest 
/target id $ClosestMobID 

:EndFindTarget 
/if DEBUG /echo Leaving FindTarget... 
/return 

| ============================================================== 

Sub MoveToTarget 

| moves us to the currently target, stops once we are within our cAtkRange 

:KeepMoving 
| constantly look for a closer target 
/call FindTarget 
/call CheckForObst 

| check to make sure our target is still alive 
/if $target()=="FALSE" { 
/sendkey up up 
/varset HaveTarget 0 
/goto :EndMoveToTarget 
} 

| check to make sure our target is still full life, if not someone is probably fighting it 
/if n $target(hp,pct)!=100 { 
/sendkey up up 
/varset InvalidTargetID $target(id) 
/varset HaveTarget 0 
/goto :EndMoveToTarget 
} 

/face 
/sendkey down up 

| check to see if we are close enough yet 
/if n $target(distance,nopredict)<=cAtkRange { 
/sendkey up up 
/goto :EndMoveToTarget 
} 

/goto :KeepMoving 

:EndMoveToTarget 
/return 

| ============================================================== 

Sub KillTarget 

| check to make sure our target is still alive 
/if $target()=="FALSE" { 
/varset InvalidTargetID 0 
/varset HaveTarget 0 
/goto :EndKillTarget 
} 

| check to make sure our target is still full life, if not someone is probably fighting it 
/if n $target(hp,pct)!=100 { 
/varset InvalidTargetID $target(id) 
/varset HaveTarget 0 
/goto :EndKillTarget 
} 

| make sure our target doesnt have a target, if it does then it's attacking someone, skip it 
/assist 
/delay 1s 

| check the assisted target's id, then check its name. if the name contains "corpse", then 
| our original target should be considered valid. 
/if n $target(id)!=$ClosestMobID /if n $instr(corpse,$target(name))==-1 { 
/varset InvalidTargetID $target(id) 
/varset HaveTarget 0 
/goto :EndKillTarget 
} 

| send our pet in 
/pet attack 

| wait until mob is dead, if it starts to flee, follow it 
:MainCombatLoop 
/call CastSpells 
:FollowMob 
| check to see if the mob is getting away from us, if so follow 
/if n $target(distance,nopredict)>cAtkRange { 
/face 
/sendkey down up 
} else { 
/face 
/sendkey up up 
} 

| check to see if the mob is getting too close to us, if so back off 
/if n $target(distance,nopredict)<cTooCloseRange { 
/face 
/sendkey down down 
} else { 
/face 
/sendkey up down 
} 

| if we lose our target while attacking it, then the mob died. 
/if $target()=="FALSE" /goto :EndKillTarget 
/goto :MainCombatLoop 

:EndKillTarget 
| make sure our pet follows us 
/pet follow 
| make sure we stop moving 
/sendkey up up 
/sendkey up down 

/return 

| ============================================================== 

Sub LootTarget 
:StartLootTarget 

| target the corpse of the mob we just killed 
/target id $ClosestMobID 

| move up to it 
/face 
:CheckCorpseDistance 
/call CheckForObst 
/if n $target(distance)>15 { 
/face 
/sendkey down up 
/goto :CheckCorpseDistance 
} else { 
/sendkey up up 
} 

| open the loot window 
/loot 
/delay 2s 

| check each slot (0-7) to see if its something we want to keep 
/for LootSlot 0 to 7 
/click left corpse $LootSlot 
/delay 1s 

| if there is nothing on the cursor, then we are out of loots, stop the loop 
/if "$cursor()"=="NULL" /goto :EndLootTarget 


| check whats on our cursor against the list of things we DONT want to keep 
/for LootArrayIndex 1 to $DontLootArraySize 
/if "$cursor(name)"=="$a(cDontcLootArrayNumber,$LootArrayIndex)" { 
/click left destroy 
/delay 1s 
/goto :NextLoot 
} 
/next LootArrayIndex 

| check whats on our cursor against the list of things we want to keep 
/for LootArrayIndex 1 to $LootArraySize 
/if "$cursor(name)"~~"$a(cLootArrayNumber,$LootArrayIndex)" { 
/click left auto 
/delay 1s 
/goto :NextLoot 
} 
/next LootArrayIndex 

| if we make it to here, it means that the loot didnt match anything in our list 
| so, we destroy the object. 
/click left destroy 
/delay 1s 

:NextLoot 
/next LootSlot 

:EndLootTarget 
/press esc 
/varset HaveTarget 0 


/return 


| ============================================================== 

Sub CastSpells 
:StartSpells 

| see if we have mana to spare 
/if n $char(mana,pct)<20 /goto :SkipSpells 

| decide which spell to cast 
/if n $char(buff,"SelfShieldSpell")==0 { 
/call NoFizzleCast "SelfShieldSpell" 
/delay $int($calc($spell("SelfShieldSpell",casttime)*10+5)) 
/goto :StartSpells 
} 

| check to see if we have a pet up 
/if n $char(pet)!=0 { 

| check to see if we need to heal our pet. 
/if n $spawn($char(pet),hp,pct)<50 { 
/target id $char(pet) 
/call NoFizzleCast "PetHealSpell" 
/delay $int($calc($spell("PetHealSpell",casttime)*10+5)) 
/goto :StartSpells 
} 

| check to see if we need to buff our pet 
/if n $PetHasteStatus==0 { 
/target id $char(pet) 
/call NoFizzleCast "PetBuffSpell" 
/delay $int($calc($spell("PetBuffSpell",casttime)*10+5)) 
/varset PetHasteStatus 1 
/goto :StartSpells 
} 
} 
:SkipSpells 
/target id $ClosestMobID 
/return 

| ============================================================== 

Sub NoFizzleCast 
| make sure we dont get passed a null spell name 
/if "@Param0"!="" { 
:NoFizzleCastStart 
/varset FizzleFlag 0 
| check to make sure we have mana to cast this spell 
/if n $char(mana,cur)<$spell("@Param0",mana) /goto :NoFizzleCastEnd 

/cast "@Param0" 
/doevents Fizzle 

| if we fizzled, try to cast again 
/if n $FizzleFlag==1 /goto :NoFizzleCastStart 
} 
:NoFizzleCastEnd 
/return 

| ============================================================== 

Sub CheckForObst 
/if n $char(x)==$LastPosX /if n $char(y)==$LastPosY { 
/varadd ObstCount 1 
} else { 
/varset ObstCount 0 
} 

/varset LastPosX $char(x) 
/varset LastPosY $char(y) 

/if n $ObstCount>3 { 
/call GoAroundObst 
} 
/return 

| ============================================================== 

Sub GoAroundObst 
/if DEBUG /echo Entering GoAroundObst... 
| back up some 
/sendkey up up 
/sendkey down down 
/delay 1s 
/sendkey up down 

| go left or right a bit, randomly 
/if n $rand(2)==1 { 
/sendkey down left 
/delay 5 
/sendkey up left 
} else { 
/sendkey down right 
/delay 5 
/sendkey up right 
} 

| move forward a bit 
/sendkey down up 
/delay 1s 
/sendkey up up 

/return 

| EVENTS ======================================================= 

Sub Event_PetHasteDown 
/varset PetHasteStatus 0 
/return 

Sub Event_Fizzle 
/varset FizzleFlag 1 
/return 

Tuffy
a lesser mummy
a lesser mummy
Posts: 33
Joined: Thu Oct 02, 2003 9:20 am

Don't Work

Post by Tuffy » Fri Oct 17, 2003 9:34 am

I tried this last night and it didn't work.

Can someone else help fix this macro please.

nbjeter3
a lesser mummy
a lesser mummy
Posts: 39
Joined: Wed Jan 21, 2004 12:18 am

What i did...

Post by nbjeter3 » Wed Jan 21, 2004 2:03 am

Code: Select all

| ============================================================================= 
|    
| Petfarm.mac - v0.3.0b 10/01/2003 by Scrime 
| Basic pet hunter script 
| w/ some ideas borrowed from GrimJack's hunter script. 
| ============================================================================= 
| Usage: 
| ! Have a pet up. 
| ! Put the correct spells in the spell names. 
| ! Use /call AddToMobList to add the mobs that you want to hunt. 
| ! Use /call AddToLootList to add the items that you want to loot 
| ! Use /call AddToDontLootList to add the items that you want to destroy 
| because they accidently get looted due to the wildcard nature of the loot list. 
| ============================================================================= 
| Features: 
| + Anti-KS code. Selects targets with no other PCs within a variable radius. 
| Also checks to make sure the target is undamaged and is not already attacking 
| someone else before engaging. 
| + Selective auto-looting. Only keeps the items that you want it to. Also has a 
| destroy list, in the case that you are looting all "lightstones", but still want 
| to destroy "Burned Out Lightstones" (for example) 
| + Closest mob selection. Looks through the whole list of mobs you want to hunt 
| goes after the closest one. 
| + Debugging code. Set DEBUG to "1==1" to show debugging code, set to "0==1" to turn 
| it off. 
| + Buff tracking. Keeps track of buffs up on you and your pet, refreshes as nescessary. 
| + Heals your pet once it drops below 90% health. 
| + Obstruction avoidance. Should back up and try to go around something if it gets stuck. 
| ============================================================================= 
| Known Issues/Limitations/Bugs: 
| - Does not know when to stop hunting. $freeinv works for some people, crashes the client for 
| other people. Until it is fixed, the script will not know when you bags are full. 
| - Does not stop to med up, stops casting spells once below 20% mana. 
| - Obstruction detection needs some tweaking, maybe an "allowance" value for being in the same spot 
| instead of waiting for the x/y locs to be the same. 
| ============================================================================= 
| Release Notes for v0.3.0b : 
| * NOTE: This is considered a beta release, it still needs some more testing. Use at you own risk, 
| please report any problems. Enjoy and macro responsibly. 
| * Hunt distance is now a constant (cHuntDistance) that you can set at the beginning of the script. This 
| is the maxiumum distance away from you that the script will look for a new target. Set to 99999 for no 
| max distance. 
| * In the anti-ks code, when looking at our targets assisted target, it will look at the name and if 
| the name contains the word "corpse" it will disregard the assist and attack anyway. 
| * In the anti-ks code, if a mob it tries to target becomes invalid because it is not full health or is 
| currently attacking someone it will not be considered the next time thru the loop. 
| * Aggro'd mob protection. If we have a mob aggro'd on us, then the script will select that mob as our next 
| target to kill AFTER we are done with out current target before doing a normal search for a hunt target. 
| * Continuous target re-evaluation. As long as we are moving towards our target, the script will keeping 
| looking for closer targets. This makes it so that we wont run past newly spawned valid targets on our way 
| to our current target (which is farther away). 
| * Script now backs away from a target if it gets too close to us (too close range defined as cTooCloseRange) 
| ============================================================================= 

#turbo 

/declare CurrTarget Global 
/declare CurrMana Global 
/declare LastPosX Global 
/declare LastPosY Global 
/declare OldTarget Global 

/declare PetHasteStatus Global 

/declare MobArraySize Global 
/declare LootArraySize Global 
/declare MobArrayIndex Global 
/declare LootArrayIndex Global 
/declare ClosestMobID Global 
/declare ClosestMobDist Global 
/declare HaveTarget Global 
/declare ObstCount Global 
/declare DontLootArraySize Global 
/declare InvalidTargetID Global 

/declare LootSlot Global 
/declare BagsFull Global 
/declare FizzleFlag Global 

| used to echo debugging messages. set to 1=1 if you want to see them, 0==1 if you dont 
/declare DEBUG 1==1 

| array number defines, dont change 
/declare cMobArrayNumber 1 
/declare cLootArrayNumber 2 
/declare cDontcLootArrayNumber 3 

| distance defines, setting these alters the behavior of the script 
| cAntiKSRadius is the distance from each mob that will exclude it from selecting as a 
| target if there is another PC within this range. 

/declare cAntiKSRadius 50 

| cAtkRange is how close we get to the mob before we send in the pet 

/declare cAtkRange 50 

| cTooCloseRange is how close we let a mob we are attacking get to us before we start to 
| back away 

/declare cTooCloseRange 30 
| ============================================================================= 

| cHuntDistance is the maximum distance away that the script will select a new target. 
/declare cHuntDistance 1500 

| ============================================================================= 

| spell names 
/declare SelfShieldSpell "Put Highest Self Sheild Here" 
/declare PetBuffSpell "Put Highest Pet Hast Buff Here" 
/declare PetHealSpell "Put Highest Pet Heal Here" 
| ============================================================================= 

| special events to respond to 
#event PetHasteDown "Your pet's Intensify Death spell has worn off." 
#event Fizzle "Your spell fizzles!" 

| MAIN ========================================================= 

Sub Main 
| clear out all variables. 
/zapvars 

| clear target, et al 
/press esc 
/press esc 
/press esc 
/press shift 
/press alt 
/press ctrl 

| never confirm looting nodrop items 
/lootn never 

| ============================================================================= 
| macro title 
|/echo Starting NecroFarm v0.3.0a - by Scrime 
|/if DEBUG /echo Debugging messages WILL be shown. 
|/echo Attack range is cAtkRange. 
|/echo AntiKS range is cAntiKSRadius. 
|/echo TooClose range is cTooCloseRange. 
|/echo Hunt range is cHuntDistance. 
| ============================================================================= 

| set up our hunting array 
/call AddToMobList "spider" 

| set up the loot array 
/call AddToLootList "silk" 

| set up the dont loot array 

:StartHunting 
/doevents 

/call CastSpells 

/if n $HaveTarget==0 /call FindAggroTarget 
/if n $HaveTarget==0 /call MoveToTarget 
/if n $HaveTarget==1 /call KillTarget 
/if n $HaveTarget==1 /call LootTarget 

/if n $BagsFull==1 /goto :EndMacro 
/goto :StartHunting 

:EndMacro 
/if n $BagsFull==1 /echo NecroFarm ended: Bags are full, go sell! 
/return 

| SUBS ========================================================= 

Sub AddToMobList 
/if "@Param0"!="" { 
/varadd MobArraySize 1 
/varset a(cMobArrayNumber,$MobArraySize) "@Param0" 
} 
/return 

Sub AddToLootList 
/if "@Param0"!="" { 
/varadd LootArraySize 1 
/varset a(cLootArrayNumber,$LootArraySize) "@Param0" 
} 
/return 

Sub AddToDontLootList 
/if "@Param0"!="" { 
/varadd DontLootArraySize 1 
/varset a(cDontcLootArrayNumber,$DontLootArraySize) "@Param0" 
} 
/return 

| ============================================================== 

| FindAggroTarget 
| this function targets the closest mob that is not our pet and looks to see if it has us as its 
| target. If we find a target here, then we put our pet on it and skip normally finding 
| a target. 
Sub FindAggroTarget 
| clear our current target 
/press esc 
/press esc 
/press esc 
/press esc 
/press esc 
/press esc 

| target the closest mob that is not our pet 
/target npc notid $char(pet) 

| if we have a target, then we need to see if it has a target 
/if $target()=="TRUE" { 
/varset ClosestMobID $target(id) 
/assist 

| if the closest mob's target is us, then select it as our target to kill. 
/if n $target(id)==$char(id) { 
/target id $ClosestMobID 
/varset HaveTarget 1 
/varset ClosestMobID $target(id) 
} 
} 
/return 

| ============================================================== 

Sub FindTarget 

| make sure we have nothing targeted 
/press esc 

| routine to find the closest, non-engaged mob from our list 
| returns nothing, but ClosestMobID will be set to the mob to engage. Keeps looking until it finds a target. 
:StartFindTarget 

| reset the distance and ID of closest mob 
/varset ClosestMobDist cHuntDistance 
/varset ClosestMobID 0 
/varset HaveTarget 0 

| go thru the list of mobs we want to hunt and find the closest one that isn't being engaged. 
/for MobArrayIndex 1 to $MobArraySize 
/target npc nopcnear cAntiKSRadius notid InvalidTargetID $a(cMobArrayNumber,$MobArrayIndex) 
/if $target()=="TRUE" { 
} 
} 

| check to make sure we targeted something 
/if $target()=="FALSE" /goto :SkipMob 

| if the target is not full life, someone else is probably fighting it, skip it 
/if n $target(hp,pct)!=100 { 
/if DEBUG /echo Target is not full life, skipping. 
/varset InvalidTargetID $target(id) 
/goto :SkipMob 
} 

| see if this mob is closer than the last mob we checked 
/if n $target(distance,)<$ClosestMobDist { 
/if DEBUG { 
/echo $target(name) is closer than our former target, switching. 
} 
/varset ClosestMobID $target(id) 
/varset ClosestMobDist $target(distance) 
/varset InvalidTargetID 0 
/varset HaveTarget 1 
} 

:SkipMob 
/next MobArrayIndex 

| if we didn't find a target, start over 
/if n $HaveTarget!=1 /goto :StartFindTarget 

| re-target whichever mob was closest 
/target id $ClosestMobID 

:EndFindTarget 
/if DEBUG /echo Leaving FindTarget... 
/return 

| ============================================================== 

Sub MoveToTarget 

| moves us to the currently target, stops once we are within our cAtkRange 

:KeepMoving 
| constantly look for a closer target 
/call FindTarget 
/call CheckForObst 

| check to make sure our target is still alive 
/if $target()=="FALSE" { 
/sendkey up up 
/varset HaveTarget 0 
/goto :EndMoveToTarget 
} 

| check to make sure our target is still full life, if not someone is probably fighting it 
/if n $target(hp,pct)!=100 { 
/sendkey up up 
/varset InvalidTargetID $target(id) 
/varset HaveTarget 0 
/goto :EndMoveToTarget 
} 

/face 
/sendkey down up 

| check to see if we are close enough yet 
/if n $target(distance)<=cAtkRange { 
/sendkey up up 
/goto :EndMoveToTarget 
} 

/goto :KeepMoving 

:EndMoveToTarget 
/return 

| ============================================================== 

Sub KillTarget 

| check to make sure our target is still alive 
/if $target()=="FALSE" { 
/varset InvalidTargetID 0 
/varset HaveTarget 0 
/goto :EndKillTarget 
} 

| check to make sure our target is still full life, if not someone is probably fighting it 
/if n $target(hp,pct)!=100 { 
/varset InvalidTargetID $target(id) 
/varset HaveTarget 0 
/goto :EndKillTarget 
} 

| make sure our target doesnt have a target, if it does then it's attacking someone, skip it 
/assist 
/delay 1s 

| check the assisted target's id, then check its name. if the name contains "corpse", then 
| our original target should be considered valid. 
/if n $target(id)!=$ClosestMobID /if n $instr(corpse,$target(name))==-1 { 
/varset InvalidTargetID $target(id) 
/varset HaveTarget 0 
/goto :EndKillTarget 
} 

| send our pet in 
/pet attack 

| wait until mob is dead, if it starts to flee, follow it 
:MainCombatLoop 
/call CastSpells 
:FollowMob 
| check to see if the mob is getting away from us, if so follow 
/if n $target(distance)>cAtkRange { 
/face 
/sendkey down up 
} else { 
/face 
/sendkey up up 
} 

| check to see if the mob is getting too close to us, if so back off 
/if n $target(distance)<cTooCloseRange { 
/face 
/sendkey down down 
} else { 
/face 
/sendkey up down 
} 

| if we lose our target while attacking it, then the mob died. 
/if $target()=="FALSE" /goto :EndKillTarget 
/goto :MainCombatLoop 

:EndKillTarget 
| make sure our pet follows us 
/pet follow 
| make sure we stop moving 
/sendkey up up 
/sendkey up down 

/return 

| ============================================================== 

Sub LootTarget 
:StartLootTarget 

| target the corpse of the mob we just killed 
/target id $ClosestMobID 

| move up to it 
/face 
:CheckCorpseDistance 
/call CheckForObst 
/if n $target(distance)>15 { 
/face 
/sendkey down up 
/goto :CheckCorpseDistance 
} else { 
/sendkey up up 
} 

| open the loot window 
/loot 
/delay 2s 

| check each slot (0-7) to see if its something we want to keep 
/for LootSlot 0 to 7 
/click left corpse $LootSlot 
/delay 1s 

| if there is nothing on the cursor, then we are out of loots, stop the loop 
/if "$cursor()"=="NULL" /goto :EndLootTarget 


| check whats on our cursor against the list of things we DONT want to keep 
/for LootArrayIndex 1 to $DontLootArraySize 
/if "$cursor(name)"=="$a(cDontcLootArrayNumber,$LootArrayIndex)" { 
/click left destroy 
/delay 1s 
/goto :NextLoot 
} 
/next LootArrayIndex 

| check whats on our cursor against the list of things we want to keep 
/for LootArrayIndex 1 to $LootArraySize 
/if "$cursor(name)"~~"$a(cLootArrayNumber,$LootArrayIndex)" { 
/click left auto 
/delay 1s 
/goto :NextLoot 
} 
/next LootArrayIndex 

| if we make it to here, it means that the loot didnt match anything in our list 
| so, we destroy the object. 
/click left destroy 
/delay 1s 

:NextLoot 
/next LootSlot 

:EndLootTarget 
/press esc 
/varset HaveTarget 0 


/return 


| ============================================================== 

Sub CastSpells 
:StartSpells 

| see if we have mana to spare 
/if n $char(mana,pct)<20 /goto :SkipSpells 

| decide which spell to cast 
/if n $char(buff,"SelfShieldSpell")==0 { 
/call NoFizzleCast "SelfShieldSpell" 
/delay $int($calc($spell("SelfShieldSpell",casttime)*10+5)) 
/goto :StartSpells 
} 

| check to see if we have a pet up 
/if n $char(pet)!=0 { 

| check to see if we need to heal our pet. 
/if n $spawn($char(pet),hp,pct)<50 { 
/target id $char(pet) 
/call NoFizzleCast "PetHealSpell" 
/delay $int($calc($spell("PetHealSpell",casttime)*10+5)) 
/goto :StartSpells 
} 

| check to see if we need to buff our pet 
/if n $PetHasteStatus==0 { 
/target id $char(pet) 
/call NoFizzleCast "PetBuffSpell" 
/delay $int($calc($spell("PetBuffSpell",casttime)*10+5)) 
/varset PetHasteStatus 1 
/goto :StartSpells 
} 
} 
:SkipSpells 
/target id $ClosestMobID 
/return 

| ============================================================== 

Sub NoFizzleCast 
| make sure we dont get passed a null spell name 
/if "@Param0"!="" { 
:NoFizzleCastStart 
/varset FizzleFlag 0 
| check to make sure we have mana to cast this spell 
/if n $char(mana,cur)<$spell("@Param0",mana) /goto :NoFizzleCastEnd 

/cast "@Param0" 
/doevents Fizzle 

| if we fizzled, try to cast again 
/if n $FizzleFlag==1 /goto :NoFizzleCastStart 
} 
:NoFizzleCastEnd 
/return 

| ============================================================== 

Sub CheckForObst 
/if n $char(x)==$LastPosX /if n $char(y)==$LastPosY { 
/varadd ObstCount 1 
} else { 
/varset ObstCount 0 
} 

/varset LastPosX $char(x) 
/varset LastPosY $char(y) 

/if n $ObstCount>3 { 
/call GoAroundObst 
} 
/return 

| ============================================================== 

Sub GoAroundObst 
/if DEBUG /echo Entering GoAroundObst... 
| back up some 
/sendkey up up 
/sendkey down down 
/delay 1s 
/sendkey up down 

| go left or right a bit, randomly 
/if n $rand(2)==1 { 
/sendkey down left 
/delay 5 
/sendkey up left 
} else { 
/sendkey down right 
/delay 5 
/sendkey up right 
} 

| move forward a bit 
/sendkey down up 
/delay 1s 
/sendkey up up 

/return 

| EVENTS ======================================================= 

Sub Event_PetHasteDown 
/varset PetHasteStatus 0 
/return 

Sub Event_Fizzle 
/varset FizzleFlag 1 
/return 
Basically i Had A Problem Where i would Start The Macro And it Would get stuck in An endless Loop of Targeting A Mob then Taking 2 Steps And Stopping getting Stuck looping The entering Cast mode leaving Cast mode Subroutine.. I removed All The nopredicts And it Started Werking for Me.. But if you'd look in The Macro depot You'll find There is A Much more up To Date and Feature Added Version of This macro by The Man who wrote it originally..
Don't hate Me cuz I'm beautiful.. I Can give you MUCH better reasons Than That....

Noone Likes A necro... till Mid-battle And They're OOM..

Tuffy
a lesser mummy
a lesser mummy
Posts: 33
Joined: Thu Oct 02, 2003 9:20 am

Post by Tuffy » Wed Jan 21, 2004 1:14 pm

This post was from Oct of last year.

Thanks for the suggestion but its about 3 months late.