• You've discovered RedGuides, an EverQuest multi-boxing and scripting community 🧙‍♀️⚙️. We want you to play several EQ characters at once, come join us and say hello! 👋

  • A TLP without truebox has thawed (Very Vanilla ready)
    Frostreaver

Macros: Casterfarm.mac, FHCaster.mac, Follow.mac, BAZsale.mac, and GhostArcher.mac

Tradertesla2

Member
Joined
Jun 16, 2008
RedCents
111¢
What I have done is dig up some old DVD backups of macros I used to use. I haven't played EQ in about 18 months. I know a lot has changed, and I just got finished downloading all the expansions (about 3 am) Sat morning in the Legacy promo.

I hope some of these macros help out others. If nothing else, they may have some nice code examples. Unfortunately, I can't say if they still work these days because I, (surprise!) don't have an MQ2 compile to try them on. Catch 22. [Working on that: stay posted]

I have preserved all author credits for prior versions, where available.

First up is CasterFarm.mac, which is at least 50% original--customized for a Wizard but should work for any pure caster on low level mobs and on any hybrid with some kind of damaging spell in Gem slot #1. Hybrids should be able to target slightly higher level mobs, of course, with more emphasis on the melee part. If you are a pure melee class, then you should go find the original farm.mac buried somewhere in these forums.

EDIT: I used this on my Wizard mainly to farm silks and eggs for tradeskills while AFK. My favorite locations were Feerott for silks (North-west area) and Lavastorm (South-Central) for Basilisk eggs. I also used it a little bit on a shroud (any starting city @ level 5) to unlock other forms but then decided other things were more fun.

You will find several comments scattered throughout the macro itself that will help you understand how to use it.

Rich (BB code):
|---------------
| CasterFarm.mac
| Usage: CasterFarm [name of mob to farm]
| Purposes: AFK harvest drops/kills from (green or lower level) mobs within a given area
|  - Tradeskills
|  - Faction
|  - Leveling up shrouds/Leadership points
| original macro was by psychotik
| Heavily modified by BrainDeath Last Update: 10-18-04
| Blugeoned nearly to death on 02-07-06 and then
| Reconstructive surgery performed by tradertesla on 2-27-06
|
| I mainly used this to farm silks and eggs for tradeskills.
|

#turbo
#chat tell
#event Full "#*#There was no place to put that#*#"
#include common.inc

Sub Main

   /call DefineOuters
   /call SetVariables
:Main   
   /if (${GameState.Equal[CHARSELECT]}) /endmacro
   /call ClearCursor
   /call CheckForIntruders
   /call SaveOrigin
   /call Med
   /doevents
   /Start loop X10
   /kill
   /Endloop
   /returntoorigin
   /wait for repops
   /call ResetVariables

/return

| ------------------------------------------------

Sub DefineOuters
   /declare PCTime string outer
   /declare PCMsg string outer
   /declare FarmedCritter string outer
   /declare MaxMobLevel outer
   /declare MinMobLevel outer
/return

| ------------------------------------------------

Sub SetVariables
|-- Valid Language settings are: English, Russian, Portugese, Spanish, Dutch, French, German, Greek, and Italian
|--You might want to set your own AFK message, since for all you know I might be saying, "Utilizo las hazañas, los cortes, y las macros de Everquest. Prohíba mi cuenta, por favor."  Translated as, "I use Everquest exploits, hacks, and macros.  Ban my account, please."
|-- You never know when a GM will know, or find someone who does know, any given language.

    /varset Language French
    /varset MaxMobLevel 50
    /varset MinMobLevel 1
    /varset FarmedCritter #1#
    /varset PCTime 15m

    /varset PCMsg Por favor não me incomode. Eu não compreendo o inglês. Caça boa a você (Portugese)
    /varset PCMsg No me incomode por favor. No entiendo inglés. Buena caza a usted. (Spanish)
    /varset PCMsg Gelieve te hinderen me niet. Ik begrijp het geen Engels. De goede jacht aan u. (Dutch)
    /varset PCMsg Veuillez ne pas me tracasser. Je ne comprends pas l'anglais. Bonne chasse à vous. (French)
    /varset PCMsg Bitte stören Sie mich nicht. Ich verstehe nicht Englisch. Gute Jagd zu Ihnen. (German)
    /varset PCMsg Nonlo importuni prego. Non capisco l'inglese. Buona caccia a voi. (Italian)
    /varset PCMsg Please do not bother me. I do not understand english.  Good hunting to you.
/return

| ------------------------------------------------

sub ClearCursor 

  /if (!${Cursor.ID}) /return

   /declare ItemSetting int local 
   /declare NotFound int local 
   /declare ItemsHave int local 

   /varset NotFound -1  

   | Look up this item in farm.ini 
   /varset ItemSetting ${Ini[farm.ini,LootList,${Cursor.Name},${NotFound}]} 
   /delay 5 

   | If the item isn't in the .ini file then add it. 
   /if (${ItemSetting}==${NotFound}) { 
       /ini "farm.ini" "ForageList" "${Cursor.Name}" "${DefaultMaxSave}" 
       /varset ItemSetting ${DefaultMaxSave} 
   } 

   /varset ItemsHave ${FindItem=${Cursor.Name}} 

   | If we're keeping this item then stash it in our bags. 
   | Otherwise, just destroy it. 
   /if (${ItemSetting}>${ItemsHave}) { 
     /autoinventory 
   } else { 
     /destroy 
   } 

   /delay 5  
/return

| -------------------------------------------------

Sub CheckForIntruder
   /if (!${Spawn[gm].ID} || (${SpawnCount[pc radius 300 loc ${Ground.Y} ${Ground.X}]}=1)) /return
   /beep
   /beep
   /beep
   /echo Entering Intruder Mode...
   /delay 1s
   /afk ${IntruderMsg}
   :waitabit
   /delay ${IntruderTime}
   /if (${Spawn[gm].ID} || (${SpawnCount[pc radius 300 loc ${Ground.Y} ${Ground.X}]}>1)) /goto :waitabit
   /afk off
   /delay 1s
   /call ReturnToOrigin
/return
| -------------------------------------------------

Sub SaveOrigin

| -------------------------------------------------

Med

| -------------------------------------------------
| -------------------------------------------------

Sub Farm
   /notify actionsmainpage AMP_WalkButton leftmouseup
   /afk off
   /delay 1s
   /sit off
   /delay 1s
:HarvestLoop
  /call GetNextTarget
   /if (${Macro.Return.Equal[NOTFOUND]}) /goto :Pause
   /call CheckForPCs
   /doevents
   /call MoveToTarget
   /call KillIt
/goto :HarvestLoop

:Pause
   /notify actionsmainpage AMP_RunButton leftmouseup
   /delay 1s
   /target clear
   /face loc 661,-107
   /keypress CENTERVIEW
   /delay 1s
   /delay 1s
   /afk ${PCMsg}
   /echo Countdown to next Harvest...
   /echo 6 minutes...
   /delay 1m
   /echo 5 minutes...
   /delay 1m
   /echo 4 minutes...
   /delay 1m
   /echo 3 minutes...
   /delay 1m
   /echo 2 minutes...
   /delay 1m
   /echo 1 minute...
   /delay 1m
   /echo Preparing to Harvest...
   /delay ${Math.Rand[300]}
   /call CheckForPCs
   /doevents
   /varset BlueCount 0
   /varset RedCount 0
   /afk off
   /delay 1s
   /delay 1s
   /notify actionsmainpage AMP_WalkButton leftmouseup
   /goto :HarvestLoop
/return

| -------------------------------------------------

Sub MoveToTarget
:KeepMoving1
   /face target
   /delay 1
   /keypress forward hold
   /if (${Target.Distance}>20) /goto :KeepMoving1
:StopMoving1
   /keypress forward
/return

| -------------------------------------------------

Sub MoveToOrigin
:KeepMoving2
   /face loc ${Ground.Y}, ${Ground.X}
   /delay 1
   /keypress forward hold
   /if (${Ground.Distance}>15) /goto :KeepMoving2
:StopMoving2
   /keypress forward
/return

| -------------------------------------------------

Sub CheckForPCs
   /if (${Spawn[gm].ID}) {
      /echo GM in Zone!
      /call PCMode
   }
   /if (${SpawnCount[pc radius 150 loc -140 640]}>1) {
      /echo PC nearby!
      /call PCMode
   }
/return

| ----------------------------------------------------

Sub KillIt
| I use this for a Wiz bearing a mana-steal proccing weapon
| (Dagger of Thought, Voodoo Wand, etc.)
| It should work for any class with minimal modification
| I melee down to 50% to allow for potential proc, then
| I use a modest mana-efficient nuke in slot 1 to finish before it flees.
| If your mana usage is low enough, just go quicker to the nuke
| by increasing the % number (below) above 50.
   /q
:NotDead
   /if (${Target.PctHPs} < 50) /cast 1
   /delay 10s
   /goto notdead
/return

| ---------------------------------------------------

Sub Loot

/declare LootChance int inner 0
/declare LootSlot int inner 0 
/declare LootCheck int inner 0 
/declare LootTotal int inner 0 
 
/face fast nolook 
 
/squelch /stick 5
:Distance
/if (${Target.Distance}<=10) { 
/squelch /stick off
/loot
} else {
/goto :Distance 
}
/squelch /stick off
/loot
/delay 1s 
/if (!${Corpse.Items}) { 
/shift /notify InventoryWindow IW_Money1 leftmouseup
/destroy
/shift /notify InventoryWindow IW_Money2 leftmouseup
/destroy
/shift /notify InventoryWindow IW_Money3 leftmouseup
/destroy
/notify LootWnd DoneButton leftmouseup
/look
/return 
} 
/varset LootTotal ${Corpse.Items} 
/for LootSlot 1 to ${LootTotal} 
/itemnotify loot${LootSlot} rightmouseup 
	/delay 5
/next LootSlot 
/shift /notify InventoryWindow IW_Money1 leftmouseup
/destroy
/shift /notify InventoryWindow IW_Money2 leftmouseup
/destroy
/shift /notify InventoryWindow IW_Money3 leftmouseup
/destroy
/notify LootWnd DoneButton leftmouseup
/look
/cleanup
/return 

| -------------------------------------------------

Sub GetNextTarget

:checktarget
      /tar ${FarmedCritter} radius 220
      /delay 5s
      /varset badtarget 0
      /if (${Target.Distance}>220) /varset badtarget 1   
      /if (${Target.Level} > ${MaxMobLevel}) /varset badtarget 1
      /if (${Target.Level} < ${MinMobLevel}) /varset badtarget 1 
      /if (${Target.ID}==FALSE) /varset badtarget 1
      /if (${badtarget}==1) {
         /call MoveToOrigin
         /goto :checktarget
         }
/return FOUND

| ---------------------------------------------------

Sub GoGetIt

   /face item

   /keypress forward hold
   :move
   /if (${Ground.Distance}<8) {
      /keypress forward
   } else {
      /goto :move
   }
   
   /delay 1s
   /face item
   /delay 1s
   /click left item
   /delay 2s
   /autoinv

/return

| -------------------------------------------------

Sub Event_Chat
   /if (!${Me.AFK}) {
      /reply AFK Message: ${PCMsg}
      /afk ${PCMsg}
   }
   /echo Received a Tell...Ending.
   /beep
   /beep
   /beep
   /endmacro
/return


Sub Event_Full
   /call EndMacro "Your inventory is full...Ending."
/return 

|----------------------------------------------------------
|----------------------------------------------------------
|----------------------------------------------------------

Then a Forgotten Halls helper routine, designed for a (Wizard, and any nuker to a lesser degree) to assist a Bard. It supports several clickies...

[EDIT: I get the FH instance, then position my bard as shown in other posts. Then I zone in with my, actually 2, Wizards and move them into the room with the Bard. Start up the Wizard macro(s) first, because any window-swapping will kill your Bard with lag after you start killing rats. Start your Bard and get some XP! The Wizard macro below also loots the corpses so you don't waste that plat.]

Rich (BB code):
|Macro FHCaster
|Re-created by Armysoldier

|Rewritten extensively By TraderTesla to utilize clickie items such as
|the TFlux staff, Manarobe, Zuzl Amulet, etc. and other code tweaks.
|
|Usage /mac FHCaster "Mastersname"
|
|ASSUMPTIONS:
|        -Position caster manually, no pathing or following supported
|        -Spells/Clickies/Potions are assumed to be present and in their correct locations
|        -Summon your horse manually, if desired
|        -Plugins: MQ2Quit (optional)
|
|SPELL GEMS SUPPORTED: 
|        1 = DD nuke
|        6 = Harvest
|
|CLICKIES SUPPORTED:
|        [HotKey #1, Inventory Slot #1] Staff of Temperate Flux (Debuff: Fire & Cold)
|        [HotKey #5, Inventory Slot #2] Fabled Journeyman's Boots (Buff: Bootstrutter's Blessing)
|        [Neck] Amulet of Xuzl (Pet: Flaming Sword of Xuzl)
|        [Chest] Mana Robe (Buff: Health for Mana)
|
|POTIONS SUPPORTED:
|        [Potion Slot #1] HOT (If the Wizard takes aggro, you are probably dead anyway)
|        [Potion Slot #2] Clarity (edit manacheck sub below with the exact name
|                         of the effect for your level)
|
#Event kill "#*#lunges at you#*#"
#Event loot "You gain party experience!!"
#Event Zoned "#*#You have entered#*#"
#Event Escape "#*#bites YOU for#*#"
#Event Escape "#*#bashes YOU for#*#"
#Event Escape "#*#tries to bite YOU#*#"
#Event Escape "#*#tries to kick YOU#*#"
|
|NOTES:  -In order to minimize aggro problems, spells will not be recast upon fizzle/resists.
|        -HOT's are needed to feed Mana Robe.  If you have a high mana pool, high mana regen,
|         and high HP regen stats, then you will rarely/never need them---low stats = potion usage.

#turbo 10

|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Sub Main 
|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 /deletevar Master 
 /declare Master string Global
 /varset Master ${Param0}
 /echo Starting Caster Assist Macro.
 /echo Master Set to ${Master} 
 :loop
 /sit on
 /call GMcheck
 /call Manacheck
 /call BuffCheck
 /doevents
 /delay 5s
 /goto :loop 
/return 

|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|Sub Event Kill - Targeting and Nuking
|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Sub Event_Kill
 
|--Targeting

 /delay 2s
 /assist ${Master}
 /delay 2s ${Target.ID}
 /if (!${Target.ID}) {
 /echo [${Time}] NO Target...
 /return
 }

/if (${Me.PctHPs}<=50) /potionbelt Activate 1
/delay 1s
/sit on

:CAST_Zuxl
 /delay 1s
 /doevents
 /if (${Target.PctHPs} > 98) /goto :CAST_Zuxl
 |Debuff with your Staff of Temperate Flux
 |(3 times In case it gets resisted)
 /keypress 1
 /delay 1s
 /keypress 1
 /delay 1s
 /keypress 1
 /delay 1s
 |Now cast your Amulet of Zuxl
 /itemnotify neck rightmouseup
 /delay 14s
 /sit on

| -Note that Manarobe is in chest slot and gets clicked twice
|for each nuke attempt
|  while health is above 25%  (Shame on you if you run out
|of healing potions...)
| -You will need to adjust all percentages to your situation.
|I 2-box with a bard, so have to be conservative in my aggro
|management.  With a good tank you can
|  start nuking a lot earlier :)

:CAST_DD
 /delay 1s
 /doevents
 /if (${Target.PctHPs} < 50) {
  /echo Skipping Nuke #1
  /goto :CAST_DD1
 }
| Since most of the waiting is spent in this loop, we Manarobe 
/if (${Me.PctHPs} > 45) /itemnotify chest rightmouseup
 /delay 3s
 /if (${Target.PctHPs} > 60) /goto :CAST_DD
 /echo Casting Nuke #1
 :LOS
 /if (!${Target.LineOfSight}) /goto :LOS
 /cast 1
 /delay 5s
 /if (${Me.PctHPs}<=25) /goto :CAST-DD1
 /delay 1s
 /itemnotify chest rightmouseup
 /delay 4s

:CAST_DD1
 /delay 1s
 /doevents
 /if (${Target.PctHPs} < 40) {
  /echo Skipping Nuke #2
  /goto :CAST_DD2
 }
 /if (${Target.PctHPs} > 50) /goto :CAST_DD1
 /echo Casting Nuke #2
 :LOS1
 /if (!${Target.LineOfSight}) /goto :LOS1
 /cast 1
 /delay 5s
 /if (${Me.PctHPs}<=25) /goto :CAST-DD2
 /delay 1s
 /itemnotify chest rightmouseup
 /delay 4s

:CAST_DD2
 /delay 1s
 /doevents
 /if (${Target.PctHPs} < 30) {
  /echo Skipping Nuke #3
  /goto :CAST_DD3
 }
 /if (${Target.PctHPs} > 45) /goto :CAST_DD2
 /echo Casting Nuke #3
 :LOS2
 /if (!${Target.LineOfSight}) /goto :LOS2
 /cast 1
 /delay 5s
 /if (${Me.PctHPs}<=25) /goto :CAST-DD3
 /delay 1s
 /itemnotify chest rightmouseup
 /delay 4s

:CAST_DD3
 /delay 1s
 /doevents
 /if (${Target.PctHPs} < 20) {
  /echo Skipping Nuke #4
  /goto :CAST_DD4
 }
 /if (${Target.PctHPs} > 40) /goto :CAST_DD3
 /echo Casting Nuke #4
 :LOS3
 /if (!${Target.LineOfSight}) /goto :LOS3
 /cast 1
 /delay 5s
 /if (${Me.PctHPs}<=25) /goto :CAST-DD4
 /delay 1s
 /itemnotify chest rightmouseup
 /delay 4s

:CAST_DD4
 /delay 1s
 /doevents
 /if (${Target.PctHPs} < 10) {
  /echo Skipping Nuke #5
  /goto :CAST_DD5
 }
 /if (${Target.PctHPs} > 30) /goto :CAST_DD4
 /echo Casting Nuke #5
 :LOS4
 /if (!${Target.LineOfSight}) /goto :LOS4
 /cast 1
 /delay 5s
 /if (${Me.PctHPs}<=25) /goto :CAST-DD5
 /delay 1s
 /itemnotify chest rightmouseup
 /delay 4s

:CAST_DD5
 /delay 1s
 /doevents
 /if (${Target.PctHPs} < 10) {
  /echo Skipping Nuke #6
  /goto :CAST_End
 }
 /echo Casting Nuke #6
 :LOS5
 /if (!${Target.LineOfSight}) /goto :LOS5
 /cast 1
 /delay 5s
 /if (${Me.PctHPs}<=25) /goto :CAST-End
 /delay 1s
 /itemnotify chest rightmouseup
 /delay 4s

:Cast_End
| Notifies the group of mana pool after each fight
 /g "${Me.PctMana}" mana
 /sit on
/return

|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|Sub Event Zoned
| Either you died or the instance has booted you
|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub event_Zoned    
 /camp desktop
 /end

|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|GM CHECK - (Need to figure out how to tell if you got a tell)
|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Sub GMCheck  
 /if (${Spawn[gm].ID}) {  
 /echo Gm detected  
 /beep 
 /beep 
 /beep  
 /endmac 
 /unload 
 /q
}
/return

|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|Sub Manacheck - During a fight you will nuke until you can't anymore
|    with a few manarobe hits as time permits
|    but between fights you will notify OOM and go into regen mode
|    until x% is achieved through Mana Robe, Harvest, Clarity Potions,
|    and/or jus' plain medding...
|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 Sub Manacheck
|  /if (!${Me.Buff["Elixir of Clarity VIII"].ID}) /potionbelt Activate 2
  /if (${Me.PctMana}>20) /return
  /g I'm OOM, hun. Gonna regen a bit...
 :Regen
 /if (${Me.PctHPs}<=50) /potionbelt Activate 1
 /if (${Me.SpellReady["Harvest"]}) {
   /cast 6
   /delay 20s
   } 
| If you are out of health potions, gotta use the old fashioned method 
/if (${Me.PctHPs}<=40) {
   /sit on
   /delay 30s
   /call GMcheck
   /goto :regen
   }
 /if (${Me.PctMana}>=50) {
   /g I'm back at 50, pull if ya feel lucky... ;~)
   /return
   }
 /itemnotify chest rightmouseup
 /delay 4s
 /itemnotify chest rightmouseup
 /delay 4s
 /itemnotify chest rightmouseup
 /delay 4s
 /itemnotify chest rightmouseup
 /delay 4s
 /itemnotify chest rightmouseup
 /delay 4s
 /call GMcheck
 /goto :Regen

|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|Sub Event Escape Death (/exit is there in case the Mq2Quit plugin isn't loaded
|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Sub Event_Escape
 
|--Escaping
 /closenow
 /exit
 /end
 }

|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|Sub BuffCheck
|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 Sub Buffcheck

 |/if (!${Me.Buff[Storm Guard].ID})  /call Cast "Stormeye Band" item 1
 |/if (!${Me.Buff[Maelin's Methodical Mind].ID})  /call Cast "Girdle of Efficiency" item 3s
 |/if (!${Me.Buff[Eternal Ward].ID})		  /keypress 5
/return

|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|Sub Event Loot
|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 Sub Event_Loot
 
 /call GMcheck
 /keypress forward
 /delay 1s
 /squelch /declare LootSlot    int inner  0 
 /declare LootCheck   int inner  0 
 /declare LootTotal   int inner  0 
 /target npc corpse radius 200 
 :MovementLoop 
 /face fast nolook 
 /if (${Int[${Target.Distance}]}>13) { 
 /keypress forward hold 
 } 
 /if (${Int[${Target.Distance}]}<13&&${Int[${Target.Distance}]}>11) { 
 /keypress forward 
 } 
 /if (${Int[${Target.Distance}]}<9) { 
 /keypress back 
 } 
 /if (${Int[${Target.Distance}]}>13) { 
 /goto :MovementLoop 
 } 
 /keypress forward 
 /keypress back 
 /delay 5 
 /loot 
 /delay 5 
 /if (!${Corpse.Items}) { 
 /echo NO LOOT!
 /notify LootWnd DoneButton leftmouseup 
/call DestroyCopper
/delay 1s 
 /return 
 } 
 /varset LootTotal ${Corpse.Items} 
 /for LootSlot 1 to ${LootTotal} 
 /itemnotify loot${LootSlot} leftmouseup 
 /delay 5 
 /if (${LootAllItems}) { 
 /echo Keeping a ${Cursor.Name}... WOOT! 
 /autoinventory 
 /autoinventory 
 /delay 5 
 } else { 
 /for LootCheck 1 to ${ItemsToLoot.Size} 
 /if (${Cursor.Name.Find[${ItemsToLoot[${LootCheck}]}]}) { 
 /echo Keeping a ${Cursor.Name}... WOOT! 
 /autoinventory 
 /autoinventory 
 /delay 5 
 } 
 /next LootCheck 
 } 
 /if (${Cursor.ID}) { 
 /echo Destroying a ${Cursor.Name}... 
 /destroy 
 /destroy 
 /delay 5 
 } 
 /next LootSlot 
 /delay 5 
 /notify LootWnd DoneButton leftmouseup 
 /delay 2 
| Now get your butt out of the way because you are probably getting chewed on by a rat!
:FinishLoop 
 /target A Yunjo Groundskeeper
 /face fast nolook 
 /if (${Int[${Target.Distance}]}>30) { 
 /keypress forward hold 
 } 
 /if (${Int[${Target.Distance}]}<30 { 
 /keypress forward 
 } 
 /if (${Int[${Target.Distance}]}>30) { 
 /goto :MovementLoop 
 } 
/return

|----------------------------------------------------------------------------
|SUB: DestroyCopper - Destroy all the copper
|----------------------------------------------------------------------------
Sub DestroyCopper
   /squelch /windowstate InventoryWindow open
   /shift /notify InventoryWindow IW_Money3 leftmouseup
   /delay 1s ${Cursor.ID}>0
   /destroy
   /cleanup
/return

Then a simple "poor-mans" follow routine. It works much better than /follow, but not necessarily a replacement for moveutils. Back when I played a lot, Moveutils kept changing and bouncing around with buggy problems. Anyway, this one you can customize and I found it to be my "old reliable" follow macro that always worked well.

[EDITx2: This was always a good backup whenever /stick got moody. I have no idea how good MQ2MoveUtils is these days, but it was always pretty awesome even when it was buggy. Don't want to insult whoever worked on it. I used it a LOT.]

Rich (BB code):
#turbo
Sub Main
   :Loop
      /if (${Target.Distance}>60) /keypress up hold
      /if (${Target.Distance}<40) /keypress up 
      /face fast
      /delay 1
   /if (${Target.ID}) /goto :Loop
/return

I was always a big Bazaar dweller, and I used this macro on a regular basis. If my inventory has been a bit static for a few days, and not much is selling, it's time to lower my prices!:

Rich (BB code):
 |Update Bazaar Prices 
 |Originally by Sparr

 |Updated by Tradertesla to automatically reduce all prices by (roughly) 10%
 |as a way to keep product moving.  I run this about once or twice a week,
 |depending on how fast/slow items are selling.

Sub Main 
 /declare slot int local 
 /declare dupecheck int local 
 /declare itemname string local 
 /declare result int local 
 /declare stddev int local 
 /declare itemsfound int local 
 /declare pricetotal int local 
 /declare avgprice int local 
 /declare minprice int local 
 /declare avgdev int local 
 /declare devhigh int local 
 /declare quartprice int local 
 /declare maxprice int local 
 /declare price int local 
 /declare fairprice int local 
 /declare targetprice int local 
 /declare newtargetprice int local 
  
 |open the trader window 
 :OpenTraderAgain 
 /trader 
 /delay 10s ${Window[BazaarWnd].Open} 
 /if (!${Window[BazaarWnd].Open}) /goto :OpenTraderAgain 
  
 |open the bazaar search window 
 :OpenBazaarAgain 
 /bazaar 
 /delay 10s ${Window[BazaarSearchWnd].Open} 
 /if (!${Window[BazaarSearchWnd].Open}) /goto :OpenBazaarAgain 
  
 |update traders 
 /delay 1 
 /notify BazaarSearchWnd BZR_UpdatePlayerButton leftmouseup 
 /delay 5s 

 |loop through all 80 slots 
 /varset slot -1 
 :nextslot 
  /varcalc slot ${slot}+1 
  /if (${slot}>79) /goto :donewithslots 

  |click on the current slot 
  /notify BZW_BazaarSlotsWnd BZR_BazaarSlot${slot} leftmouseup 
  |skip the slot if its empty 
  /if (!${Window[BazaarWnd].Child[BZW_SetPrice_Button].Enabled}) /goto :nextslot 
  |skip the slot if it doesnt have a price 
  /if (!${Window[BazaarWnd].Child[BZW_Clear_Button].Enabled}) /goto :nextslot 
  |get the name of the item in the current slot 
  /varset itemname ${Window[BZW_BazaarSlotsWnd].Child[BZR_BazaarSlot${slot}].Tooltip} 

  |dont do the same item twice 
  /if (${slot}) { 
   /for dupecheck 0 to ${Math.Calc[${slot}-1]} 
    /if (${itemname.Equal[${Window[BZW_BazaarSlotsWnd].Child[BZR_BazaarSlot${dupecheck}].Tooltip}]}) /goto :nextslot 
   /next dupecheck 
  } 

  |pick new price
  
  /varcalc targetprice ${Math.Calc[${Bazaar.Item[${result}].Price}/1.1].Int}
    
|  /echo repricing ${itemname} from ${Window[BazaarWnd].Child[BZW_Money0].Text} to ${targetprice} 

  |set new price in pp, only lamers use small coins in /trader 
  :openqtywndagain 
  /notify BazaarWnd BZW_Money0 leftmouseup 
  /delay 5s ${Window[QuantityWnd].Open} 
  /if (!${Window[QuantityWnd].Open}) /goto :openqtywndagain 
  /delay 1 
  /call NullSub ${Window[QuantityWnd].Child[QTYW_SliderInput].NewText[${targetprice}]} 
  /delay 2 
  /notify QuantityWnd QTYW_SliderInput enter 
  /delay 1 
  /notify BazaarWnd BZW_SetPrice_Button leftmouseup 
  /delay 1 
 /goto :nextslot 
 :donewithslots 
/return 

Sub NullSub 
/return

Then here is my ghost macro for Rangers. Wandering mobs were almost impossible until I wrote this one. You must have your own Ghost plugin. This macro just auto-follows a mob over complex terrain while pumping him full of arrows. Titanothon was the main reason for this macro, though I used it elsewhere as well. Titan spawns were always mine, because no other ghosters on my server could keep the critter aggroed long enough to kill him...

Rich (BB code):
| GhostArcher.mac by Tradertesla

| This is for Ranger Ghost Kills of any wandering mob
| If your mob ain't Titanothon, then change the target, Doh!
| Make sure you have lev.  I always use my bard to lev the group...
| If you don't have lev then you eventually kill yourself with falling dmg
| Requires MQ2Moveutils and Warp of some kind with a Z function.
| Adjust commands to match your version of Warp.
| Also requires a Ghostkill plugin, /smack!

#Event Strafe "#*#Your target is too close to use a ranged weapon!!#*#"
#Event Stuck "#*#You can't hit them from here.#*#"
#Event Stuck "#*#You cannot see your target.#*#"

Sub Main

/echo Let's do da Titan...

/ghost on

/tar Titanothon
/warp target


:Loop
/if (${Target.Distance}> 60) {
  /echo Warping to catch up
|    Don't worry.  You are warping while Ghosted, remember?
  /warp target
  /stick behind 40
}
/if (${Target.Distance}< 30) {
  /echo Backing up
  /keypress back hold
  /delay 3
  /keypress back
}
/if (!${Target.ID} || ${Target.Type.NotEqual[NPC]} || ${Target.State.Equal[DEAD]}) { 
  /echo Titanothon died? Ending macro... 
  /end
}
/doevents
/delay 4
/ranged
/goto :Loop
/return
 
sub Event_Strafe
  /echo Strafing Left
  /keypress strafe_left hold
  /delay 1s
  /keypress strafe_left
  /face fast
  /stick behind 40
/return

sub Event_Stuck
  /echo I'm in archery range, but can't see my target.  Resetting my position.
  /echo ZWARP'ing
  /zwarp 40
  /face fast
/return

This one also works well for Ragewind, but I don't suppose anyone really cares for what he drops anymore. They were pretty decent back in the day, lol.

Bottom line is that these are/were some of my most-used macros. yes, some were started by other coders, so I only posted the ones that I either wrote from scratch or modified heavily. The one that is closest to the original is the Baz mac. It has a ton of legacy code that I never bother to delete, but I couldn't find a macro designed for this particular function. Grats to Sparr for the original code, even though I never did get it to work as originally posted. Still, I would never have gotten it to reduce my prices without the example of his work.

TraderTesla

[EDIT: Hopefully, I have explained the macros a little better. I still do Text-Macro-text-Macro, but what else is there to do?]

[EDIT: Fixed a couple of typos and updated a little text. Macros are the same except for a couple of comments.]
 
Last edited:
Re: Submission for Level 2 access

Macros seem to have a fair bit of effort put into them. Even though I feel you could have made the post look a lot nicer, I still vote..

YES
 
Re: Submission for Level 2 access

There are no voting anymore =)

Only way to get in:

RedCents

So if you like these macs please redcent him. I have not looked them over or anything. Please remember that he didnt make them himself he altered them. I like that you keeped the org. writer names in them.

- decker
 
Re: Submission for Level 2 access

Redcent inc from me. Thanks fo posting Trader.
 
Re: Submission for Level 2 access

Oh well. I guess I'll have to wait until the next payday and hope SOE extends the Legacy promotion for another week or two until I can pay for access again. I've been dreaming about a good 6-box for a long time. I have 1 Bard, 2 Wizards, and 3 Rangers, all level 75 with various numbers of AAs. I also have a 54 Cleric that I need to level up a bit for healing support. A 6/7-box without MQ is pretty difficult.

Thanks for your red cents, and I hope to see you around Norrath somewhere...
 
Re: Submission for Level 2 access

You only need 5 Redcents to get level 2 access. I'll see if I can rally you some support when I get home tonight.
 
Re: Submission for Level 2 access

Thought it was 4. Either way, another one from me.

/face fast is not a move utils function it's built into MQ2 base.
 
Re: Submission for Level 2 access

I tried to run the baz trader mac and when I did EQ crashed.

Copy and pasted everything in box the saved with notpad as baz.mac

Loaded EQ to my trader and typed in the micro window /mac baz and next thing I know EQ crashed.

Any Idea what I did wrong?
 
Re: Submission for Level 2 access

Cent from me!

There are never enough people contributing, so each one counts. Hopefully after I get back into the game a bit I can jump back into writing my shitty code. I think it's like riding a bike, you never forget, right? lol
 
Re: Submission for Level 2 access

Ouch!

I know it sounds kinda lame, but all these macros worked great when I stopped playing about 18-19 months ago. Obviously, I need to polish them up again with the latest MQ2 release.

Once I get in, sooner or later, I will work the macros so they function again. Let's face it, MQ2 makes EQ much more fun than it is without. The Baz macro saves Sooo much work.

TraderTesla...
 
Re: Submission for Level 2 access

Cool...
 
Re: Submission for Level 2 access

You got my dime ... so there's two months ....

Welcome back!
 
Re: Submission for Level 2 access

Two Months. Nice. Thanks for the Cents, folks.

Just to clarify, GhostArcher.mac and Follow.mac are 100% original mine.

FHCaster.mac is about 80% my code. I modified it so much I could have just said it was mine. But... I prefer to use code examples. So I start with something similar and tweak the crud out of it until it works the way I want it to... :D Besides, I couldn't bear to delete ArmySoldiers name. I respect him a great deal. Also, I know enough about SW Engineering to know that what I wrote was fairly primitive. But it works (or certainly used to). Later this week I will have the opportunity to try it out again for myself.

The BazSale.mac is the one that I can't claim a whole lot of credit for, since my contribution was mostly to just delete code that I couldn't get to work and fix the rest. From posted accounts, what used to work is now broken, so that's a neg red cent on my part. But... I recall having to dig deep for the code example and I assume that this particular function is still hard to find.

Hopefully I can fix it later this week and redeem myself...

Thanks for the chance.

TraderTesla
 
Macros: Casterfarm.mac, FHCaster.mac, Follow.mac, BAZsale.mac, and GhostArcher.mac

Users who are viewing this thread

Back
Top
Cart