I started using these macros a few weeks back, and I wasn't impressed by their stability, hehe. I decided to see if I could figure out how I could improve them. After a LOT of research and even more trial and error, these are my offerings. These are my first major projects on macros, so please don't burn me down too bad, lol.
I found a different buy routine that EqMule wrote that works very well. You do not have to set the number of bone chips. It will buy as many as you have open inventory slots for. There is also a variable for you to set free slots if you desire. It is in the BuyChips subroutine, I couldn't get it to work at the top of the macro.
I added zone checks to the porting routines so when a gate collapses it doesn't go brain dead. It will keep trying until it zones. As you can see, I reorganized the whole thing. I had a lot of trouble following it the way it was before.
None of these use MQ2Navigation, they all use MQ2MoveUtils. I also added a required plugin check that will load any missing plugins. This was shamelessly stolen from KissAssist.
I integrated Wizard and Druid settings in the porter and solo versions of the macro. You set the proper spells/AAs at the top of the macro. the Fellowship version also has its spell/AA settings at the top of the macro.
Please feel free to improve this set of macros. It would be great if you do if you could explain it to me so I can continue to learn. I've actually had a lot of fun doing this, lol, and have leaned a ton.
I want to clean up the EmptyBags routine, but haven't figured out how to do it yet, it's a little (read WAAAY) over my abilities yet.
This shows the path and where I set up the campfire, it's in the weeds and very hard to see, hehe. With a character that has FD they basically disappear .

Porter Version:
Fellowship Version:
This is set up for the campfire to be on the same side of the hill as Marie. There a lines of code that are commented out to travel to and from the port in area.
Solo Version:
I hope everyone enjoys this work.
Update!!!
Updated Autobones just in time for more extra EXP. Much faster Turnin and CleanInventory routines, and Merc support.
I found a different buy routine that EqMule wrote that works very well. You do not have to set the number of bone chips. It will buy as many as you have open inventory slots for. There is also a variable for you to set free slots if you desire. It is in the BuyChips subroutine, I couldn't get it to work at the top of the macro.
I added zone checks to the porting routines so when a gate collapses it doesn't go brain dead. It will keep trying until it zones. As you can see, I reorganized the whole thing. I had a lot of trouble following it the way it was before.
None of these use MQ2Navigation, they all use MQ2MoveUtils. I also added a required plugin check that will load any missing plugins. This was shamelessly stolen from KissAssist.
I integrated Wizard and Druid settings in the porter and solo versions of the macro. You set the proper spells/AAs at the top of the macro. the Fellowship version also has its spell/AA settings at the top of the macro.
Please feel free to improve this set of macros. It would be great if you do if you could explain it to me so I can continue to learn. I've actually had a lot of fun doing this, lol, and have leaned a ton.
I want to clean up the EmptyBags routine, but haven't figured out how to do it yet, it's a little (read WAAAY) over my abilities yet.
This shows the path and where I set up the campfire, it's in the weeds and very hard to see, hehe. With a character that has FD they basically disappear .

Porter Version:
Rich (BB code):
|AutoBonesV2.mac
| tradin.mac, by amml
| modified by tms
| full automation added by fuzzymelon
| Buy function courtesy of RedGuides.com
| Modified EmptyBags routine by Randyleo
Sub Main
| *** Change Taxi to Porter's name ***
/declare Porter string outer Taxi
| **** Change Group_Port_to_Brells's_Rest to the correct spell.
| **** Quotation marks are required!
| **** Wizard Brell's Rest Portal
| **** Druid Circle of Brell's Rest
/declare BrellsSpell string outer "Group_Port_to_Brells's_Rest"
| **** Change Group_Port_to_Bind to correct AA number. Wizard 456 Druid 7009
/declare PortToBind int outer Group_Port_to_Bind
| *** You need to rem this out if the name is already in your autoaccept list ***
/autoaccept add ${Porter}
/declare destroydelay int outer 1
| -------------------------------------------------------------------------------------
| Check if required plugins are loaded Stolen from KissAssist
| -------------------------------------------------------------------------------------
/echo Checking Plugins
/call CheckPlugin MQ2Cast
/call CheckPlugin MQ2Moveutils
/call CheckPlugin MQ2EQBC
/echo Starting
| Port to Bind if macro not started in North Kaladim, Porter must be bound in Gunlok's room!!!
/if (${Zone.ShortName.NotEqual[KaladimB]}) /call Bind
:MainLoop
/delay 5s
/call MoveToGunlok
/delay 5
/call GiveChips
/call EmptyBags
/call Done
/call PortToBrellsRest
/call Marie
/call MoveToPorter
/call Bind
/goto :MainLoop
/return
| ----------------------------------------------------------------------------
| SUB: Check Plugin Stolen from KissAssist
| ----------------------------------------------------------------------------
Sub CheckPlugin(string pluginname)
/if (!${Bool[${Plugin[${pluginname}]}]}) {
/squelch /plugin ${pluginname}
/echo ${pluginname} not detected! This macro requires it! Loading ...
}
/return
| ----------------------------------------------------------------------------
| SUB: MoveToGunlok
| ----------------------------------------------------------------------------
Sub MoveToGunlok
/squelch /target clear
/target "Gunlok Jure"
/delay 2s
:recheck
/moveto loc 1315.70 138.35
/delay 5
/if (${Me.Moving}) {
/delay 5
/goto :recheck
} else {
/delay 1
}
/if (${Target.Distance}>15) /moveto id
/delay 150 ${MoveTo.Stopped}
/face fast
/if (${Target.Type.Equal[npc]}) {
/if (${Me.Grouped}) {
/echo You are grouped - Disbanding
/keypress ctrl+d
/echo Opening Bags
/keypress OPEN_INV_BAGS
/delay 5
}
/return
| ----------------------------------------------------------------------------
| SUB: GiveChips
| ----------------------------------------------------------------------------
Sub GiveChips
/declare chips int local
/echo Handing in Chips.
:Loop
/if (!${FindItem[=Bone Chips].InvSlot}) {
/echo backpacks empty go get more stuff
/call EmptyBags
}
/if (!${FindItem[=Bone Chips].InvSlot}) /return
/for chips 1 to 4
/squelch /shift /itemnotify ${FindItem[=Bone Chips].InvSlot} leftmouseup
/delay 5
/click left target
/click left target
/delay 5
/next chips
/delay 8
/notify GiveWnd GVW_Give_Button leftmouseup
/delay 2s
|/echo Clearing Cursor
:cursorclear
/if (${Cursor.ID} && ${Cursor.ID} != 13073) {
/destroy
/delay ${destroydelay}
/goto :cursorclear
}
/if (!${FindItem[=Bone Chips].InvSlot}) /call EmptyBags
/goto :Loop
/return
| ----------------------------------------------------------------------------
| SUB: CursorClear
| ----------------------------------------------------------------------------
Sub CursorClear
:cursorclear
/if (${Cursor.ID} && ${Cursor.ID} != 13073) {
/destroy
/delay ${destroydelay}
/goto :cursorclear
}
/return
| ----------------------------------------------------------------------------
| SUB: EmptyBags
| ----------------------------------------------------------------------------
Sub EmptyBags
/declare done int local 0
:cursorclear
/if (${Cursor.ID} && ${Cursor.ID} != 13073) {
/destroy
/delay ${destroydelay}
/goto :cursorclear
}
/if (!${done}) {
/varset done 1
/goto :cursorclear
}
/delay 8
/declare i int local
/declare Junk[12] string local
/declare DestArraySize int local
/varset Junk[1] "Rusty Axe"
/varset Junk[2] "Rusty Broad Sword"
/varset Junk[3] "Rusty Mace"
/varset Junk[4] "Rusty Short Sword"
/varset Junk[5] "Rusty Two Handed Sword"
/varset Junk[6] "Small Lantern"
/varset Junk[7] "Small Tattered Gloves"
/varset Junk[8] "Torch"
/varset Junk[9] "Small Patchwork Tunic"
/varset Junk[10] "Small Tattered Skullcap"
/varset Junk[11] "Small Patchwork Sleeves"
/varset Junk[12] "Small Patchwork Pants"
/varset DestArraySize 12
/for i 1 to 12
/while (${FindItem[${Junk[${i}]}].InvSlot}) {
/nomodkey /itemnotify ${FindItem[${Junk[${i}]}].InvSlot} leftmouseup
/delay 5
/if (${Cursor.ID} && ${Cursor.ID} != 13073) /destroy
/delay ${destroydelay}
}
/next i
/return
| ----------------------------------------------------------------------------
| SUB: Done
| ----------------------------------------------------------------------------
Sub Done
/delay 8
/notify GiveWnd GVW_Give_Button leftmouseup
/delay 8
/echo Closing Bags
/keypress CLOSE_INV_BAGS
/echo Done .. Have fun..
/delay 5s
/return
| ----------------------------------------------------------------------------
| SUB: PortToBrellsRest
| ----------------------------------------------------------------------------
Sub PortToBrellsRest
/squelch /target clear
/delay 5s
/target ${Porter}
/if (${Target.Type.Equal[pc]}) {
/bct ${Porter} //invite ${Me.Name}
/delay 5s
/moveto id
/delay 5s
:oncemore
/echo Porting!
/bct ${Porter} //cast ${BrellsSpell} -maxtries|5
/delay 15s
/if (${Zone.ShortName.NotEqual[brellsrest]}) {
/echo Casting Brell's Rest Gate again
/goto :oncemore
} else {
/return
}
/return
| ----------------------------------------------------------------------------
| SUB: Marie
| ----------------------------------------------------------------------------
Sub Marie
/squelch /target clear
/target "Marie Fay"
/delay 5s
/call MoveToMarie
/delay 5s
| /face fast
| /delay 3s
/call npc "Marie Fay"
/call BuyChips
/delay 3s
/return
| ----------------------------------------------------------------------------
| SUB: Bind
| ----------------------------------------------------------------------------
Sub Bind
/squelch /target clear
/if (${Merchant.Open}) {
/notify MerchantWnd MW_Done_Button leftmouseup
/delay 1s !${Merchant.Open}
}
/delay 5s
:again
/bct ${Porter} //alt activate ${PortToBind} -maxtries|5
/delay 15s
/if (!${Zone.ShortName.Equal[KaladimB]}) {
/echo casting Gate again
/goto :again
} else {
/return
}
/return
| ----------------------------------------------------------------------------
| SUB: NPC(NPCName)
| ----------------------------------------------------------------------------
Sub NPC(NPCName)
|/declare NPCName "Marie Fay" local
|/target npc ${NPCName}
|/delay 1s
|/if (!${Select[${Target.Type},npc,pet]} || !${Target.ID} || ${Target.Type.Equal[pet]} &&
|!${Target.CleanName.Find[familiar]}) {
| /echo Please target a vendor or guildbanker
| /return
| }
/echo Doing business with ${NPCName}
/target id ${Spawn[${NPCName}].ID}
/delay 3s ${Target.ID}==${Spawn[${NPCName}].ID}
/if (${Target.Distance}>15) {
/moveto id ${Spawn[${NPCName}].ID}
/delay 250 ${MoveTo.Stopped}
}
/face nolook
/delay 1s
/echo Opening Bags
/keypress OPEN_INV_BAGS
/delay 2s
/echo Opening merchant/guildbank window
/nomodkey /click right target
/echo Waiting 5s for merchant/guildbank window to populate
/delay 5s
/return
/return
| ----------------------------------------------------------------------------
| SUB: BuyChips Written by EqMule
| ----------------------------------------------------------------------------
Sub BuyChips
| This is to adjust number of free lots to be left open while buying Bone Chips.
| I suggest leaving a couple of slots open in case of severe lag.
/declare FreeSlots int local 3
/notify MerchantWnd ItemList listselect ${Window[MerchantWnd].Child[ItemList].List[=Bone Chips,2]}
/delay 2s
:goagain
/if (${Me.FreeInventory}>${FreeSlots}) {
/Shiftkey /notify merchantwnd MW_Buy_Button leftmouseup
:waitforit
/if (${Window[MerchantWnd].Child[MW_Buy_Button].Enabled}==FALSE) {
/echo button is false
/delay 2
/goto :waitforit
}
/goto :goagain
}
/echo Closing Bags
/keypress CLOSE_INV_BAGS
/delay 2s
/return
| ----------------------------------------------------------------------------
| SUB: MoveToMarie
| ----------------------------------------------------------------------------
Sub MoveToMarie
/echo Moving to Marie
/moveto loc -614.09 119.25
/delay 20
:recheck
/if (${Me.Moving}) {
/delay 5
/goto :recheck
} else {
/moveto loc -664.26 76.11
/delay 5
}
/delay 5s
/if (${Target.Distance}>15) /moveto id
/delay 150 ${MoveTo.Stopped}
/return
| ----------------------------------------------------------------------------
| SUB: MoveToPorter
| ----------------------------------------------------------------------------
Sub MoveToPorter
/echo Moving to ${Porter}
/moveto loc -614.09 119.25
/delay 20
:recheck
/if (${Me.Moving}) {
/delay 5
/goto :recheck
} else {
/moveto loc -617.57 -15.31
/delay 5
}
/delay 5s
/if (${Target.Distance}>15) /moveto id
/delay 150 ${MoveTo.Stopped}
/return
Fellowship Version:
This is set up for the campfire to be on the same side of the hill as Marie. There a lines of code that are commented out to travel to and from the port in area.
Rich (BB code):
|AutoBones-Fellowship2.mac
| tradin.mac, by amml
| modified by tms
| full automation added by fuzzymelon
| Buy function courtesy of RedGuides.com
| Modified EmptyBags routine by Randyleo
Sub Main
| *** Change Friend to the of the Fellowship member you want to target
/declare fellow string outer Friend
| *** Increase the destroydelay ONE by ONE until every item on your cursor gets destroyed. ***
/declare destroydelay int outer 1
| *** Change Transport to spell/potion/AA you plan to use to get back to Bind.
| **** Quotation marks are required!
/declare BackToBind string outer "Transport"
| -------------------------------------------------------------------------------------
| Check if required plugins are loaded Stolen from KissAssist
| -------------------------------------------------------------------------------------
/echo Checking Plugins
/call CheckPlugin MQ2Cast
/call CheckPlugin MQ2Moveutils
/echo Starting
| Port to Bind if macro not started in North Kaladim, Character must be bound in Gunlok's room!!!
/if (${Zone.ShortName.NotEqual[KaladimB]}) /call Bind
:MainLoop
/delay 5s
/call MoveToGunlok
/delay 5
/call GiveChips
/call EmptyBags
/call Done
/call PortToCampFire
/call Marie
/call BackToKaladim
/goto :MainLoop
/return
| ----------------------------------------------------------------------------
| SUB: Check Plugin Stolen from KissAssist
| ----------------------------------------------------------------------------
Sub CheckPlugin(string pluginname)
/if (!${Bool[${Plugin[${pluginname}]}]}) {
/squelch /plugin ${pluginname}
/echo ${pluginname} not detected! This macro requires it! Loading ...
}
/return
| ----------------------------------------------------------------------------
| SUB: MoveToGunlok
| ----------------------------------------------------------------------------
Sub MoveToGunlok
/squelch /target clear
/target "Gunlok Jure"
/delay 2s
:recheck
/moveto loc 1315.70 138.35
/delay 5
/if (${Me.Moving}) {
/delay 5
/goto :recheck
} else {
/delay 1
}
/if (${Target.Distance}>15) /moveto id
/delay 150 ${MoveTo.Stopped}
/face fast
/if (${Target.Type.Equal[npc]}) {
/if (${Me.Grouped}) {
/echo You are grouped - Disbanding
/keypress ctrl+d
}
/echo Opening Bags
/keypress OPEN_INV_BAGS
/delay 5
/return
| ----------------------------------------------------------------------------
| SUB: GiveChips
| ----------------------------------------------------------------------------
Sub GiveChips
/declare chips int local
/echo Handing in Chips.
:Loop
/if (!${FindItem[=Bone Chips].InvSlot}) {
/echo backpacks empty go get more stuff
/call EmptyBags
}
/if (!${FindItem[=Bone Chips].InvSlot}) /return
/for chips 0 to 3
/squelch /shift /itemnotify ${FindItem[=Bone Chips].InvSlot} leftmouseup
/delay 5
/click left target
/click left target
/delay 5
/next chips
/delay 8
/notify GiveWnd GVW_Give_Button leftmouseup
/delay 8
|/echo Clearing Cursor
:cursorclear
/if (${Cursor.ID} && ${Cursor.ID} != 13073) {
/destroy
/delay ${destroydelay}
/goto :cursorclear
}
/if (!${FindItem[=Bone Chips].InvSlot}) /call EmptyBags
/goto :Loop
/return
| ----------------------------------------------------------------------------
| SUB: CursorClear
| ----------------------------------------------------------------------------
Sub CursorClear
:cursorclear
/if (${Cursor.ID} && ${Cursor.ID} != 13073) {
/destroy
/delay ${destroydelay}
/goto :cursorclear
}
/return
| ----------------------------------------------------------------------------
| SUB: EmptyBags
| ----------------------------------------------------------------------------
Sub EmptyBags
/declare done int local 0
:cursorclear
/if (${Cursor.ID} && ${Cursor.ID} != 13073) {
/destroy
/delay ${destroydelay}
/goto :cursorclear
}
/if (!${done}) {
/varset done 1
/goto :cursorclear
}
/delay 8
/declare i int local
/declare Junk[12] string local
/declare DestArraySize int local
/varset Junk[1] "Rusty Axe"
/varset Junk[2] "Rusty Broad Sword"
/varset Junk[3] "Rusty Mace"
/varset Junk[4] "Rusty Short Sword"
/varset Junk[5] "Rusty Two Handed Sword"
/varset Junk[6] "Small Lantern"
/varset Junk[7] "Small Tattered Gloves"
/varset Junk[8] "Torch"
/varset Junk[9] "Small Patchwork Tunic"
/varset Junk[10] "Small Tattered Skullcap"
/varset Junk[11] "Small Patchwork Sleeves"
/varset Junk[12] "Small Patchwork Pants"
/varset DestArraySize 12
/for i 1 to 12
/while (${FindItem[${Junk[${i}]}].InvSlot}) {
/nomodkey /itemnotify ${FindItem[${Junk[${i}]}].InvSlot} leftmouseup
/delay 5
/if (${Cursor.ID} && ${Cursor.ID} != 13073) /destroy
/delay ${destroydelay}
}
/next i
/return
| ----------------------------------------------------------------------------
| SUB: Done
| ----------------------------------------------------------------------------
Sub Done
/delay 8
/notify GiveWnd GVW_Give_Button leftmouseup
/delay 8
/echo Closing Bags
/keypress CLOSE_INV_BAGS
/echo Done .. Have fun..
/delay 5s
/return
| ----------------------------------------------------------------------------
| SUB: Marie
| ----------------------------------------------------------------------------
Sub Marie
/squelch /target clear
/target "Marie Fay"
/delay 5s
/call MoveToMarie
/delay 5s
/call npc "Marie Fay"
/call BuyChips
/delay 3s
/return
| ----------------------------------------------------------------------------
| SUB: NPC(NPCName)
| ----------------------------------------------------------------------------
Sub NPC(NPCName)
|/target npc ${NPCName}
|/delay 1s
|/if (!${Select[${Target.Type},npc,pet]} || !${Target.ID} || ${Target.Type.Equal[pet]} &&
|!${Target.CleanName.Find[familiar]}) {
| /echo Please target a vendor or guildbanker
| /return
| }
/echo Doing business with ${NPCName}
/target id ${Spawn[${NPCName}].ID}
/delay 3s ${Target.ID}==${Spawn[${NPCName}].ID}
/if (${Target.Distance}>15) {
/moveto id ${Spawn[${NPCName}].ID}
/delay 250 ${MoveTo.Stopped}
}
/face nolook
/delay 1s
/echo Opening Bags
/keypress OPEN_INV_BAGS
/delay 2s
/echo Opening merchant/guildbank window
/nomodkey /click right target
/echo Waiting 5s for merchant/guildbank window to populate
/delay 5s
/return
/return
| ----------------------------------------------------------------------------
| SUB: BuyChips Written by EqMule
| ----------------------------------------------------------------------------
Sub BuyChips
| This is to adjust number of free lots to be left open while buying Bone Chips.
| I suggest leaving a couple of slots open in case of severe lag.
/declare FreeSlots int local 3
/notify MerchantWnd ItemList listselect ${Window[MerchantWnd].Child[ItemList].List[=Bone Chips,2]}
/delay 2s
:goagain
/if (${Me.FreeInventory}>${FreeSlots}) {
/Shiftkey /notify merchantwnd MW_Buy_Button leftmouseup
:waitforit
/if (${Window[MerchantWnd].Child[MW_Buy_Button].Enabled}==FALSE) {
/echo button is false
/delay 2
/goto :waitforit
}
/goto :goagain
}
/echo Closing Bags
/keypress CLOSE_INV_BAGS
/delay 2s
/return
| ----------------------------------------------------------------------------
| SUB: MoveToMarie
| ----------------------------------------------------------------------------
Sub MoveToMarie
/echo Moving to Marie
| If setting Campfire at Port In area uncomment the following lines.
|/moveto loc -614.09 119.25
| /delay 20
|:recheck
|/if (${Me.Moving}) {
| /delay 5
|/goto :recheck
|} else {
|/moveto loc -664.26 76.11
| /delay 5
|}
| /delay 5s
/if (${Target.Distance}>15) /moveto id
/delay 150 ${MoveTo.Stopped}
/return
| ----------------------------------------------------------------------------
| SUB: PortToCampFire
| ----------------------------------------------------------------------------
Sub PortToCampFire
/echo Off to Brell's Rest5
:port
/squelch /target clear
/delay 15
/if (${Cast.Ready[Fellowship Registration Insignia]}) {
/nomodkey /itemnotify ${FindItem[Fellowship Registration Insignia].InvSlot} rightmouseup
/delay 30s
/return
} else {
/echo Insignia NOT Ready!!!, trying again in 60 seconds.
/delay 60s
/goto :port
}
/return
| ----------------------------------------------------------------------------
| SUB: BackToKaladim
| ----------------------------------------------------------------------------
Sub BackToKaladim
/squelch /target clear
/if (${Merchant.Open}) {
/notify MerchantWnd MW_Done_Button leftmouseup
/delay 1s !${Merchant.Open}
}
/delay 5s
| If setting Campfire at Port In area uncomment the following lines.
|/moveto loc -614.09 119.25
| /delay 20
|:recheck
|/if (${Me.Moving}) {
| /delay 5
|/goto :recheck
|} else {
|/moveto loc -617.57 -15.31
| /delay 5
|}
/target ${fellow}
/moveto id
/delay 10s
/call Campfire
/delay 10s
:again
/echo Back To Kaladim
/casting ${BackToBind} -maxtries|5
/delay 25s
/if (!${Zone.ShortName.Equal[KaladimB]}) {
/echo Trying again
/goto :again
} else {
/return
}
/return
| ----------------------------------------------------------------------------
| SUB: Campfire Section - OriginalCode from toomanynames, wizbomb - slight mods by fuzzymelon
| ----------------------------------------------------------------------------
Sub Campfire
/windowstate FellowshipWnd open
/delay 5
/nomodkey /notify FellowshipWnd FP_Subwindows tabselect 2
/if (${Me.Fellowship.Campfire}) {
/echo Destroying campfire
/nomodkey /notify FellowshipWnd FP_DestroyCampsite leftmouseup
/delay 5s ${Window[ConfirmationDialogBox].Open}
/if (${Window[ConfirmationDialogBox].Open}) {
/nomodkey /notify ConfirmationDialogBox Yes_Button leftmouseup
}
/delay 5s !${Me.Fellowship.Campfire}
}
/delay 1s
/nomodkey /notify FellowshipWnd FP_RefreshList leftmouseup
/delay 1s
/nomodkey /notify FellowshipWnd FP_CampsiteKitList listselect 1
/delay 1s
/nomodkey /notify FellowshipWnd FP_CreateCampsite leftmouseup
/delay 5s ${Me.Fellowship.Campfire}
/windowstate FellowshipWnd close
/if (${Me.Fellowship.Campfire}) /echo Campfire Dropped
/return
| ----------------------------------------------------------------------------
| SUB: Bind
| ----------------------------------------------------------------------------
Sub Bind
/squelch /target clear
/if (${Merchant.Open}) {
/notify MerchantWnd MW_Done_Button leftmouseup
/delay 1s !${Merchant.Open}
/delay 5s
}
:again
/cast ${BackToBind} maxtries|5
/delay 15s
/if (!${Zone.ShortName.Equal[KaladimB]}) {
/echo Trying again
/goto :again
} else {
/return
}
/return
Solo Version:
Rich (BB code):
| AutoBones-SoloV2
| tradin.mac, by amml
| modified by tms
| full automation added by fuzzymelon
| Buy function courtesy of RedGuides.com
| Modified EmptyBags routine by Randyleo
Sub Main
| **** Change Port_to_Brells's_Rest to the correct spell.
| **** Quotation marks are required!
| **** Wizard Brell's Rest Gate
| **** Druid Ring of Brell's Rest
/declare BrellsSpell string outer "Port_to_Brells's_Rest"
| *** Increase the destroydelay ONE by ONE until every item on your cursor gets destroyed. ***
/declare destroydelay int outer 1
| -------------------------------------------------------------------------------------
| Check if required plugins are loaded. Stolen from KissAssist
| -------------------------------------------------------------------------------------
/echo Checking Plugins
/call CheckPlugin MQ2Cast
/call CheckPlugin MQ2Moveutils
/echo Starting
/if (${Zone.ShortName.NotEqual[KaladimB]}) /call Bind
:MainLoop
/delay 5s
/call MoveToGunlok
/delay 5
/call GiveChips
/call EmptyBags
/call Done
/call PortToBrellsRest
/call Marie
/call Bind
/goto :MainLoop
/return
| ----------------------------------------------------------------------------
| SUB: Check Plugin
| ----------------------------------------------------------------------------
Sub CheckPlugin(string pluginname)
/if (!${Bool[${Plugin[${pluginname}]}]}) {
/squelch /plugin ${pluginname}
/echo ${pluginname} not detected! This macro requires it! Loading ...
}
/return
| ----------------------------------------------------------------------------
| SUB: MoveToGunlok Stolen from KissAssist
| ----------------------------------------------------------------------------
Sub MoveToGunlok
/squelch /target clear
/target "Gunlok Jure"
/delay 2s
|/nav ${Math.Calc[${Target.X}-12]} ${Math.Calc[${Target.Y}+25]} ${Target.Z}
:recheck
/moveto loc 1315.70 138.35
/delay 5
/if (${Me.Moving}) {
/delay 5
/goto :recheck
} else {
/delay 1
}
/if (${Target.Distance}>15) /moveto id
/delay 150 ${MoveTo.Stopped}
/face fast
/delay 2s
/echo Opening Bags
/keypress OPEN_INV_BAGS
/return
| ----------------------------------------------------------------------------
| SUB: GiveChips
| ----------------------------------------------------------------------------
Sub GiveChips
/declare chips int local
/echo Handing in Chips.
:Loop
/if (!${FindItem[=Bone Chips].InvSlot}) {
/echo backpacks empty go get more stuff
/call EmptyBags
}
/if (!${FindItem[=Bone Chips].InvSlot}) /return
/for chips 1 to 4
/squelch /shift /itemnotify ${FindItem[=Bone Chips].InvSlot} leftmouseup
/delay 5
/click left target
/click left target
/delay 5
/next chips
/delay 8
/notify GiveWnd GVW_Give_Button leftmouseup
/delay 2s
|/echo Clearing Cursor
:cursorclear
/if (${Cursor.ID} && ${Cursor.ID} != 13073) {
/destroy
/delay ${destroydelay}
/goto :cursorclear
}
/if (!${FindItem[=Bone Chips].InvSlot}) /call EmptyBags
/goto :Loop
/return
| ----------------------------------------------------------------------------
| SUB: CursorClear
| ----------------------------------------------------------------------------
Sub CursorClear
:cursorclear
/if (${Cursor.ID} && ${Cursor.ID} != 13073) {
/destroy
/delay ${destroydelay}
/goto :cursorclear
}
/return
| ----------------------------------------------------------------------------
| SUB: EmptyBags
| ----------------------------------------------------------------------------
Sub EmptyBags
/declare done int local 0
:cursorclear
/if (${Cursor.ID} && ${Cursor.ID} != 13073) {
/destroy
/delay ${destroydelay}
/goto :cursorclear
}
/if (!${done}) {
/varset done 1
/goto :cursorclear
}
/delay 8
/declare i int local
/declare Junk[12] string local
/declare DestArraySize int local
/varset Junk[1] "Rusty Axe"
/varset Junk[2] "Rusty Broad Sword"
/varset Junk[3] "Rusty Mace"
/varset Junk[4] "Rusty Short Sword"
/varset Junk[5] "Rusty Two Handed Sword"
/varset Junk[6] "Small Lantern"
/varset Junk[7] "Small Tattered Gloves"
/varset Junk[8] "Torch"
/varset Junk[9] "Small Patchwork Tunic"
/varset Junk[10] "Small Tattered Skullcap"
/varset Junk[11] "Small Patchwork Sleeves"
/varset Junk[12] "Small Patchwork Pants"
/varset DestArraySize 12
/for i 1 to 12
/while (${FindItem[${Junk[${i}]}].InvSlot}) {
/nomodkey /itemnotify ${FindItem[${Junk[${i}]}].InvSlot} leftmouseup
/delay 5
/if (${Cursor.ID} && ${Cursor.ID} != 13073) /destroy
/delay ${destroydelay}
}
/next i
/return
| ----------------------------------------------------------------------------
| SUB: Done
| ----------------------------------------------------------------------------
Sub Done
/delay 8
/notify GiveWnd GVW_Give_Button leftmouseup
/delay 8
/echo Closing Bags
/keypress CLOSE_INV_BAGS
/echo Done .. Have fun..
/delay 5s
/return
| ----------------------------------------------------------------------------
| SUB: PortToBrellsRest
| ----------------------------------------------------------------------------
Sub PortToBrellsRest
/squelch /target clear
/delay 5s
:oncemore
/echo Porting!
/casting ${BrellsSpell} -maxtries|5
/delay 15s
/if (${Zone.ShortName.NotEqual[brellsrest]}) {
/echo Casting Brell's Rest Gate again
/goto :oncemore
} else {
/return
}
/return
| ----------------------------------------------------------------------------
| SUB: Marie
| ----------------------------------------------------------------------------
Sub Marie
/squelch /target clear
/target "Marie Fay"
/delay 5s
/call MoveToMarie
/delay 5s
/call npc "Marie Fay"
/call BuyChips
/delay 3s
/return
| ----------------------------------------------------------------------------
| SUB: Bind
| ----------------------------------------------------------------------------
Sub Bind
/target clear
/if (${Merchant.Open}) {
/notify MerchantWnd MW_Done_Button leftmouseup
/delay 1s !${Merchant.Open}
}
/delay 5s
:again
/cast "Gate" maxtries|5
/delay 15s
/if (!${Zone.ShortName.Equal[KaladimB]}) {
/echo Trying again
/goto :again
} else {
/return
}
/return
| ----------------------------------------------------------------------------
| SUB: NPC(NPCName)
| ----------------------------------------------------------------------------
Sub NPC(NPCName)
|/declare NPCName "Marie Fay" local
|/target npc ${NPCName}
|/delay 1s
|/if (!${Select[${Target.Type},npc,pet]} || !${Target.ID} || ${Target.Type.Equal[pet]} &&
|!${Target.CleanName.Find[familiar]}) {
| /echo Please target a vendor or guildbanker
| /return
| }
/echo Doing business with ${NPCName}
/target id ${Spawn[${NPCName}].ID}
/delay 3s ${Target.ID}==${Spawn[${NPCName}].ID}
/if (${Target.Distance}>15) {
/moveto id ${Spawn[${NPCName}].ID}
/delay 250 ${MoveTo.Stopped}
}
/face nolook
/delay 1s
/echo Opening Bags
/keypress OPEN_INV_BAGS
/delay 2s
/echo Opening merchant/guildbank window
/nomodkey /click right target
/echo Waiting 5s for merchant/guildbank window to populate
/delay 5s
/return
/return
| ----------------------------------------------------------------------------
| SUB: BuyChips
| ----------------------------------------------------------------------------
Sub BuyChips
| This is to adjust number of free lots to be left open while buying Bone Chips.
/declare FreeSlots int local 3
/notify MerchantWnd ItemList listselect ${Window[MerchantWnd].Child[ItemList].List[=Bone Chips,2]}
/delay 2s
:goagain
/if (${Me.FreeInventory}>${FreeSlots}) {
/Shiftkey /notify merchantwnd MW_Buy_Button leftmouseup
:waitforit
/if (${Window[MerchantWnd].Child[MW_Buy_Button].Enabled}==FALSE) {
/echo button is false
/delay 2
/goto :waitforit
}
/goto :goagain
}
/echo Closing Bags
/keypress CLOSE_INV_BAGS
/delay 2s
/return
| ----------------------------------------------------------------------------
| SUB: MoveToMarie
| ----------------------------------------------------------------------------
Sub MoveToMarie
/echo Moving to Marie
/moveto loc -614.09 119.25
/delay 20
:recheck
/if (${Me.Moving}) {
/delay 5
/goto :recheck
} else {
/moveto loc -664.26 76.11
/delay 5
}
/delay 5s
/return
I hope everyone enjoys this work.
Update!!!
Updated Autobones just in time for more extra EXP. Much faster Turnin and CleanInventory routines, and Merc support.
Rich (BB code):
|AutobonesV3.mac
|TurnIn, ClearCursor, SafeTarget, Events, CleanInventory and BuyChips routines by EqMule
|Merc support written by Redbot
|CheckPlugin written by Maskoi
|Movement routines written by Randyleo
#turbo 120
#Event TSCursor "#*#because only tradeskill items may go in a tradeskill bag.#*#"
#Event NullSlot "#*#Invalid item slot 'null#*#"
Sub Main
| *** Change Taxi to Porter's name ***
/declare Porter string outer Taxi
/declare GunlokTurnY outer 1322
/declare GunlokTurnX outer 135
/declare BrellsturnY outer -618
/declare BrellsturnX outer 90
| **** Change Group_Port_to_Brells's_Rest to the correct spell.
| **** Quotation marks are required!
| **** Wizard Brell's Rest Portal
| **** Druid Circle of Brell's Rest
/declare BrellsSpell string outer "Group_Port_to_Brells's_Rest"
| **** Change #### to correct AA number. Wizard 456 Druid 7009
/declare PortToBind int outer ####
/declare ItemToHandIn string outer Bone Chips
/declare TurnInTarget string outer Gunlok
/declare NullExit int outer 0
| -------------------------------------------------------------------------------------
| Check if required plugins are loaded Stolen from KissAssist
| -------------------------------------------------------------------------------------
/echo Checking Plugins
/call CheckPlugin MQ2Cast
/call CheckPlugin MQ2Moveutils
/call CheckPlugin MQ2EQBC
/call CheckPlugin MQ2Autoaccept
/autoaccept add ${Porter}
/echo Starting
:mainloop
/if (${Zone.ID}==67) {
/call MoveToGunlok
/delay 5
:KaladimLoop
/call SafeTarget ${TurnInTarget}
/call ClearCursor
/call TurnIn
/call ClearCursor
/if (${FindItemCount[${ItemToHandIn}]}>0) {
/goto :KaladimLoop
} else {
/call ClearCursor
/call CleanInventory
/call PortToBrellsRest
/call Marie
/call MoveToPorter
/call Bind
| /goto :mainloop
}
}
/return
| ---------------------------------------------------------------
| Sub: ClearCursor
| ---------------------------------------------------------------
Sub ClearCursor
:redestroy
/if (${Cursor.ID} && ${Cursor.NoDrop}==FALSE) {
/destroy
/delay 0 ${Bool[${Cursor.ID}]}==FALSE
/goto :redestroy
}
/return
| --------------------------------------------------------------
| Sub: SafeTarget
| --------------------------------------------------------------
Sub SafeTarget(string targ)
/declare targid int local 0
:retarget
/if (${Target.ID} && ${Target.ID}==${Spawn[${targ}].ID}) /return
/if (${Spawn[${targ}].ID}) {
/varset targid ${Spawn[${targ}].ID}
/if (${Spawn[${targ}].Distance}<100) {
/echo Targeting ${Spawn[${targ}]}
/target id ${targid}
/delay 30 ${Target.ID}==${targid}
}
}
/if (!${Target.ID}) {
/echo [SafeTarget] couldnt find a target, retrying
/delay 1s
/goto :retarget
}
/return
| ---------------------------------------------------------------
| Sub: TurnIn
| ---------------------------------------------------------------
Sub TurnIn
/declare bonetimer timer local 0
/declare i int local
/if (${Mercenary.State.Equal[SUSPENDED]}) {
/echo summoning mercenary
/if (!${Window[MMGW_ManageWnd].Child[MMGW_SuspendButton].Enabled}) {
/echo waiting 5 minutes for button to enable
/delay 5m
}
/notify MMGW_ManageWnd MMGW_SuspendButton LeftMouseUp
}
/for i 0 to 3
:GetBoneChips
/if (${FindItemCount[${ItemToHandIn}]}>0) {
/itemnotify "${ItemToHandIn}" leftmouseup
/delay 1 ${Cursor.ID}==13073
:retrygive
/if (${Cursor.ID}==13073) {
/click left target
/delay 1 ${Window[GiveWnd].Child[GVW_MyItemSlot${i}].Tooltip.NotEqual[${ItemToHandIn}]}==FALSE
/if (${Cursor.ID} && ${Cursor.ID}==13073) {
/goto :retrygive
}
} else {
/goto :GetBoneChips
}
}
/next i
/if (${Window[GiveWnd].Open}) {
/notify GiveWnd GVW_Give_Button leftmouseup
/delay 200 !${Window[GiveWnd].Open}
}
/return
| --------------------------------------------------------------------------
| Sub: Event_TSCursor
| --------------------------------------------------------------------------
Sub Event_TSCursor
/declare ItemToDestroy string local Small Patchwork Sleeves|Small Patchwork Tunic|Small Tattered Gloves|Small Tattered Skullcap|Small Patchwork Pants|Rusty Axe|Rusty Broad Sword|Rusty Mace|Rusty Short Sword|Rusty Two Handed Sword|Small Lantern|Torch
/declare i int local
/for i 1 to 12
:retryclearTSCursor
/if (${Cursor.Name.Equal[${ItemToDestroy.Arg[${i},|]}]}) {
/echo ${ItemToDestroy.Arg[${i},|]} on cursor. Destroying!
/destroy
|might need this:/delay 1
/goto :retryclearTSCursor
}
/next i
/doevents
/return
| ----------------------------------------------------------------------------
| Sub: Event_NullSlot
| ----------------------------------------------------------------------------
Sub Event_NullSlot
/varset NullExit 1
/echo Opening all bags to correct null slot
/keypress OPEN_INV_BAGS
/timed 100 /keypress CLOSE_INV_BAGS
/return
| ----------------------------------------------------------------------------
| SUB: CleanInventory
| ----------------------------------------------------------------------------
Sub CleanInventory
/if (${Mercenary.State.Equal[ACTIVE]}) {
/echo suspending mercenary
/notify MMGW_ManageWnd MMGW_SuspendButton LeftMouseUp
}
/echo Clearing up your bags, this will take a moment.
/declare StuffToDestroy string local Rusty Broad Sword|Torch|Rusty Short Sword|Rusty Mace|Rusty Two Handed Sword|Rusty Axe|Small Patchwork Sleeves|Small Patchwork Tunic|Small Tattered Gloves|Small Lantern|Small Tattered Skullcap|Small Patchwork Pants
/declare i int local
/for i 1 to 12
/echo ${StuffToDestroy.Arg[${i},|]} ${FindItemCount[${StuffToDestroy.Arg[${i},|]}]}
/if (${FindItemCount[${StuffToDestroy.Arg[${i},|]}]}>0) {
:MoreToDestroy
/doevents
/itemnotify "${StuffToDestroy.Arg[${i},|]}" leftmouseup
/delay 10 ${Cursor.Name.Equal[${StuffToDestroy.Arg[${i},|]}]}
/if (${Cursor.Name.Equal[${StuffToDestroy.Arg[${i},|]}]}) {
/destroy
/delay 10 ${Bool[${Cursor.ID}]}==FALSE
}
/if (${FindItemCount[${StuffToDestroy.Arg[${i},|]}]}>0) {
/goto :MoreToDestroy
}
}
/next i
/squelch /target clear
/return
| ----------------------------------------------------------------------------
| SUB: Check Plugin Stolen from KissAssist
| ----------------------------------------------------------------------------
Sub CheckPlugin(string pluginname)
/if (!${Bool[${Plugin[${pluginname}]}]}) {
/squelch /plugin ${pluginname}
/echo ${pluginname} not detected! This macro requires it! Loading ...
}
/return
| ----------------------------------------------------------------------------
| SUB: MoveToGunlok
| ----------------------------------------------------------------------------
Sub MoveToGunlok
/delay 2s
/squelch /target clear
/moveto mdist 10
/moveto loc ${GunlokTurnY} ${GunlokTurnX}
/target "Gunlok Jure"
:StillMoving
{
/delay 1
/if (${MoveTo.Moving} || ${Me.Moving}) /goto :StillMoving
/delay 0 !${Me.Moving}
} else {
/delay 5
}
/if (${Target.Distance}>15) /moveto id
/delay 0 ${MoveTo.Stopped}
/face fast
/if (${Target.Type.Equal[npc]}) {
/if (${Me.Grouped}) {
/echo You are grouped - Disbanding
/disband
}
| /keypress OPEN_INV_BAGS
| /delay 5
| }
/return
| ----------------------------------------------------------------------------
| SUB: PortToBrellsRest
| ----------------------------------------------------------------------------
Sub PortToBrellsRest
/squelch /target clear
/delay 5s
/target ${Porter}
/if (${Target.Type.Equal[pc]}) {
/bct ${Porter} //invite ${Me.Name}
/delay 5s
/moveto loc ${GunlokTurnY} ${GunlokTurnX}
:StillMoving
{
/delay 1
/if (${MoveTo.Moving} || ${Me.Moving}) /goto :StillMoving
/delay 0 !${Me.Moving}
} else {
/delay 5
}
/moveto id
/delay 5s
:oncemore
/echo Porting!
/bct ${Porter} //cast ${BrellsSpell} -maxtries|5
/delay 15s
/if (${Zone.ShortName.NotEqual[brellsrest]}) {
/echo Casting Brell's Rest Gate again
/goto :oncemore
} else {
/return
}
/return
| ----------------------------------------------------------------------------
| SUB: Marie
| ----------------------------------------------------------------------------
Sub Marie
/delay 5
/call MoveToMarie
/face fast
/call npc "Marie Fay"
/call BuyChips
/delay 3s
/return
| ----------------------------------------------------------------------------
| SUB: Bind
| ----------------------------------------------------------------------------
Sub Bind
/squelch /target clear
/if (${Merchant.Open}) {
/notify MerchantWnd MW_Done_Button leftmouseup
/delay 1s !${Merchant.Open}
}
/delay 5s
:again
/bct ${Porter} //alt activate ${PortToBind} -maxtries|5
/delay 15s
/if (!${Zone.ShortName.Equal[KaladimB]}) {
/echo casting Gate again
/goto :again
} else {
/return
}
/return
| ----------------------------------------------------------------------------
| SUB: NPC(NPCName)
| ----------------------------------------------------------------------------
Sub NPC(NPCName)
|/declare NPCName "Marie Fay" local
/target npc ${NPCName}
/delay 1s
/if (!${Select[${Target.Type},npc,pet]} || !${Target.ID} || ${Target.Type.Equal[pet]} && !${Target.CleanName.Find[familiar]}) {
/echo Please target a vendor or guildbanker
}
/echo Doing business with ${NPCName}
/target id ${Spawn[${NPCName}].ID}
/delay 3s ${Target.ID}==${Spawn[${NPCName}].ID}
/if (${Target.Distance}>15) {
/moveto id ${Spawn[${NPCName}].ID}
/delay 250 ${MoveTo.Stopped}
}
/face nolook
/delay 1s
| /echo Opening Bags
| /keypress OPEN_INV_BAGS
| /delay 2s
/echo Opening merchant/guildbank window
/nomodkey /click right target
/echo Waiting 5s for merchant/guildbank window to populate
/delay 5s
/return
/return
| ----------------------------------------------------------------------------
| SUB: BuyChips Written by EqMule
| ----------------------------------------------------------------------------
Sub BuyChips
| This is to adjust number of free lots to be left open while buying Bone Chips.
| I suggest leaving a couple of slots open in case of severe lag.
/declare FreeSlots int local 3
/notify MerchantWnd ItemList listselect ${Window[MerchantWnd].Child[ItemList].List[=Bone Chips,2]}
/delay 2s
:goagain
/if (${Me.FreeInventory}>${FreeSlots}) {
/Shiftkey /notify merchantwnd MW_Buy_Button leftmouseup
:waitforit
/if (${Window[MerchantWnd].Child[MW_Buy_Button].Enabled}==FALSE) {
/echo button is false
/delay 2
/goto :waitforit
}
/goto :goagain
}
/delay 2s
/return
| ----------------------------------------------------------------------------
| SUB: MoveToMarie
| ----------------------------------------------------------------------------
Sub MoveToMarie
/squelch /target clear
/echo Moving to Marie
/moveto mdist 10
/moveto loc ${BrellsturnY} ${BrellsturnX}
:StillMoving
{
/delay 1
/if (${MoveTo.Moving} || ${Me.Moving}) /goto :StillMoving
/delay 0 !${Me.Moving}
}
/target "Marie Fay"
/if (${Target.Distance}>15) /moveto id
/delay 1 ${MoveTo.Stopped}
/return
| ----------------------------------------------------------------------------
| SUB: MoveToPorter
| ----------------------------------------------------------------------------
Sub MoveToPorter
/echo Moving to ${Porter}
/squelch /target clear
/if (${Merchant.Open}) {
/notify MerchantWnd MW_Done_Button leftmouseup
/delay 1s !${Merchant.Open}
}
/moveto mdist 10
/moveto loc ${BrellsturnY} ${BrellsturnX}
:StillMoving2
{
/delay 1
/if (${MoveTo.Moving} || ${Me.Moving}) /goto :StillMoving2
/delay 0 !${Me.Moving}
}
/squelch /target ${Porter}
/if (${Target.Distance}>15) /moveto id
/delay 10 ${MoveTo.Stopped}
/return
Last edited:


