• 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

Bonechips Revised

Lately I have just been running one instance per pc, several older laptops, hehe. Just before a crash I averted last night, the memory usage was over 1.7 gigs of memory for eqgame.exe. I closed that instance and restarted it and the memoty usage was about 970k. Macroquest was only using 1,378KB.
 
I have been trying Disasteroid's update with a solo wizard, but the character ports to Brell's rest and runs into the wall instead of running to the first x,y loc in the bushes. So I used a stone of marking next Marie and unmem'ed Brell's res gate and added in a line to use /alt activate 405.
 
I have been trying Disasteroid's update with a solo wizard, but the character ports to Brell's rest and runs into the wall instead of running to the first x,y loc in the bushes. So I used a stone of marking next Marie and unmem'ed Brell's res gate and added in a line to use /alt activate 405.

weird! I've been using the macro as is without issues--anyone else having these problems?
 
It sounds like it is targetting Marie before starting to move. It will run directly into the wall if it foes that.
 
Oh, yup--I forgot I took out a bunch of /delay lines to speed it up for debug and never put them back in. It's been running fine on my computer but my zone files are also on a RAID 0 SSD array. geEQ, if you add a /delay 10s or something to the end of the PortToBrellsRest routine you shouldn't have any problems if you start using it on another character without the benefits of bind 2 & 3.

- - - Updated - - -

RE: Speed of leveling

So after having leveled a character from 1 to 85 in the same timeframe that a level 54, 58 and 67 reached 78, 78 and 84 I've just realized that mercenaries fucking suck, literally. They are sucking up flops by having to divide and distribute the XP, causing the core to run significantly slower. Just now after suspending mercs on two accounts running turn-in routines, the CPU usage graph in task manager has gone from square-wave--maxing out the core--to a much nicer "sinus rhythm" that still peaks high but isn't flooring the cpu.

tl;dr don't have mercs out if you want to level quickly (use wizard assisted suicide instead! it takes only ~36 hours played to go from 1 to 85. razkle has said earlier he's hitting 90 in 72, which seems pretty reasonable.)
 
different classes level at set exp, so a warrior will hit level 50 when a cleric hits 54 (example from bonechipping a lot) Nothing wrong with your script its just what it takes to level certain classes.

- - - Updated - - -

The current mac suspends the merc before the port and yes the merc sux your exp. That is why I do my exploit then level fast with no merc, but you need merc exp too! and bone chips is a fine way to get merc exp! In essence you are leveling 2 toons at once, you and your merc....
 
different classes level at set exp, so a warrior will hit level 50 when a cleric hits 54 (example from bonechipping a lot) Nothing wrong with your script its just what it takes to level certain classes.

- - - Updated - - -

The current mac suspends the merc before the port and yes the merc sux your exp. That is why I do my exploit then level fast with no merc, but you need merc exp too! and bone chips is a fine way to get merc exp! In essence you are leveling 2 toons at once, you and your merc....

all four of these characters were bards. (same race as well, as I didn't know when I started the racial xp penalty was removed.)
 
Ok, so I'm running this:
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

And I keep getting a message in the MQ2 window that says: Could not find item in slot 33. Any idea why?
 
I believe you'll get that message when you have an item on your cursor and run the cleaninventory routine. It's pretty irrelevant and does not impede function, but if you run this macro
Rich (BB code):
| ----------------------------------------------------------------------------
| SUB: CleanInventory
| ----------------------------------------------------------------------------	
	
Sub Main
	/declare StuffToDestroy string local ${Param0}
	
	/if (!${Defined[Param0]} && ${Cursor.ID}) {
		/varset StuffToDestroy ${Cursor.Name}
	}
	
	/if (${FindItemCount[${StuffToDestroy}]}>0) {
	:MoreToDestroy
	/doevents
	/itemnotify "${StuffToDestroy}" leftmouseup
	/delay 10 ${Cursor.Name.Equal[${StuffToDestroy}]}
	/if (${Cursor.Name.Equal[${StuffToDestroy}]}) {
		/destroy
		/delay 10 ${Bool[${Cursor.ID}]}==FALSE
	}
	/if (${FindItemCount[${StuffToDestroy}]}>0) {
		/goto :MoreToDestroy	 
	 }
	}
/return
with something on your cursor rather than typing /mac macro "item_to_destroy you get that same error message.
 
Damn it, I posted the wrong one up there. I'm running the original one by amml:

Rich (BB code):
| tradin.mac, by amml
| thx to zazoot whos done the strucure
| just open all your packs with the stuff in it , stand facing the npc
| target the npc and have fun!

Sub Main
/declare chips int local

:Loop
/if (!${FindItem[=Bone Chips].InvSlot}) {
  /echo backpacks empty go get more stuff
  /endmacro
}

/for chips 1 to 4
:getbones
   /shift /itemnotify "Bone Chips" leftmouseup 
|   /if (!${FindItem[=Bone Chips].InvSlot}) /goto :Done
   /delay 10 ${Cursor.Name.Equal[Bone Chips]}
   /if (!${Cursor.Name.Equal[Bone Chips]}) {
		/destroy
		/goto :getbones
   }
   
   /click left target
   /click left target
   /delay 4
/next chips
/delay 4
/notify GiveWnd GVW_Give_Button leftmouseup
/delay 4

:cursorclear
/delay 4s
/destroy
/if (${Cursor.ID}) /goto :cursorclear
/goto :Loop

:Done
  /delay 4
  /notify GiveWnd GVW_Give_Button leftmouseup
  /endmacro

I really should get more sleep or something. I haven't tried any of the other ones yet due to not having eqbc setup and not wanting to try something new lol
 
Damn it, I posted the wrong one up there. I'm running the original one by amml:

Rich (BB code):
| tradin.mac, by amml
| thx to zazoot whos done the strucure
| just open all your packs with the stuff in it , stand facing the npc
| target the npc and have fun!

Sub Main
/declare chips int local

:Loop
/if (!${FindItem[=Bone Chips].InvSlot}) {
  /echo backpacks empty go get more stuff
  /endmacro
}

/for chips 1 to 4
:getbones
   /shift /itemnotify "Bone Chips" leftmouseup 
|   /if (!${FindItem[=Bone Chips].InvSlot}) /goto :Done
   /delay 10 ${Cursor.Name.Equal[Bone Chips]}
   /if (!${Cursor.Name.Equal[Bone Chips]}) {
/destroy
/goto :getbones
   }
   
   /click left target
   /click left target
   /delay 4
/next chips
/delay 4
/notify GiveWnd GVW_Give_Button leftmouseup
/delay 4

:cursorclear
/delay 4s
/destroy
/if (${Cursor.ID}) /goto :cursorclear
/goto :Loop

:Done
  /delay 4
  /notify GiveWnd GVW_Give_Button leftmouseup
  /endmacro

I really should get more sleep or something. I haven't tried any of the other ones yet due to not having eqbc setup and not wanting to try something new lol
If you're running a self porter, I made some changes that won't require eqbc for them to run themselves. I've got family coming tomorrow but I'll try and get it posted. That said, eqbc was probably the easiest part for me to get set up--with automatic connections set up after you run it the first time, all you have to do is run the executable before the character logs in.
 
Oh--if you're not using EQBC, you will need to comment out the line that calls CheckPlugin EQBC. Otherwise should be OK--the only parts EQBC was used for ought to be bypassed for a self-porter.

I also bumped up the wait times for teleporting to BR + zoning to 20 seconds to address the issue geEQ was having--I actually encountered it a couple times myself over the course of a few days.
 
Is it possible to use this when your fresh on a server? to make yourself a wizard or druid quickly?
 
As long as you have the bonechips you can level any char... On the live servers I claimed the mark of brell and bought a bag of plat from the loyalty vendor for bonechips and bags... Then either rangergate to bind in pok or get a port then head to bb it's manual so it's slower but can absolutely be done without a dru or wiz might pickup a couple of invis potions in pok as well if evil race and do the hide/trade on gunlok to not agro him or a guard
 
cool thanks i was trying to finger out how it would be automatic but I guess if i gotta move my lazzy ass a bit LOL
 
Oh, if only someone had written one that runs you through all the zones.
 
For my newbie wizard (start right at level 1) I just got all the bags and bonechips on one toon, traded them all to my wizard, did the turnin, at this point they can now bind and gate themsevles.

Now but them in a guild and a fellowship (guild just long enough to use guild hall to port to brell), get enough toons over to start the campfire, then just use the insignia to port back and forth.

I did this to level 66, took a few hours, and at 66 started using secondary recall AA.

I modified the V3 mac to support both using the insignia and secondary recall to get back to brell.

I'll post it if anyone else would like to use it. It was some pretty basic changes to make it work,

*Edit 6/20/15*
Nevermind, here it is:

Please not this does not setup or maintain the campfire for the fellowship, though it could probly be added, I had no intrest in doing so as I used another toon in the fellowship to maintain it, it was just easier for me that way for the short time I needed it for.

*Edit 6/21/15a* Fixed a few minor things so it would recover from a collapsed gate correctly, and fixed a simple typo.
*Edit 6/21/15b* Added in better timing for secondary recall instead of using a hard coded 30 seconds.

Rich (BB code):
|Autobones.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
|Version 3.1  -- 6/20/15 - SteelDragon - Added in secondary recall and fellowship
|Version 3.1a -- 6/21/15 - SteelDragon - Minor fix to recover from a collapsed gate on secondary recall
|Version 3.1b -- 6/21/15 - SteelDragon - Added in better timing for secondary recall instead of using a hard coded 30 seconds.

#turbo 120
#Event TSCursor		"#*#because only tradeskill items may go in a tradeskill bag.#*#"
#Event NullSlot		"#*#Invalid item slot 'null#*#"

Sub Main
| ***	Change XXXX and YYYY to Porter/Translocator's name ***
	/declare Porter			string	outer ${Me}
	/declare Translocator	string	outer YYYY
	/declare SelfPorter		bool	outer 1
	/declare Fellowship     bool    outer 0
	/declare SecondRecall	bool	outer 1
	
	/declare EQBCOn			bool	outer 1
	/declare UseTransloc	bool	outer 0
	
	/declare GunlokTurnY	float 	outer 1316
	/declare GunlokTurnX	float	outer 136
	/declare BrellsTurnY	float	outer -618
	/declare BrellsTurnX	float	outer 90

| ***	If you want to end the macro when character reaches a target level, set the following
|		variable or use /mac macro_name #, where # is the target level.
	/declare HighLevel		int		outer 110

| ***	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_Teleport_Spell_Name"
	
| ***	Change ZZZ to correct AA number. Wizard 456 Druid 7009
	/declare PortToBind int outer 456
	
	/declare ItemToHandIn	string	outer Bone Chips
	/declare TurnInTarget	string	outer Gunlok
	/declare NullExit		int		outer 1
	
| -------------------------------------------------------------------------------------
| Check if required plugins are loaded		Stolen from KissAssist
| -------------------------------------------------------------------------------------
	/echo Checking Plugins...
	/call CheckPlugin MQ2Cast
	/call CheckPlugin MQ2Moveutils
	/call CheckPlugin MQ2EQBC
	/call CheckPlugin MQ2Autoaccept
	/call CheckPlugin MQ2Posse
	/squelch /autoaccept add ${Porter}
	/squelch /autoaccept add ${Translocator}

	/if (${Defined[Param0]}) {
		/if (${Int[${Param0}]}>0) {
			/varset HighLevel ${Param0}
		} else {
			/echo Bad 1st argument, ignoring.
			/varset Param0 NULL
		}
	}
	
	/if (${Me.Level}>=80 && (${Me.Class.Name.Equal[Wizard]} || ${Me.Class.Name.Equal[Druid]})) {
		/if (${Me.Gem[Brell's Rest Gate]} || ${Me.Gem[Brell's Rest Portal]}) {
		/varset UseTransloc 0
		/varset BrellsSpell "Brell's Rest Gate"
		/varset Porter ${Me}
		/varset SelfPorter 1
		
		} else /if (${Me.Gem[Ring of Brell's Rest]} || ${Me.Gem[Circle of Brell's Rest]}) {
		/varset UseTransloc 0
		/varset BrellsSpell "Ring of Brell's Rest"
		/varset Porter ${Me}
		/varset SelfPorter 1
		}
	}
	
	:mainloop
	/call LevelCheck
	/if (${Zone.ID}==67) {
		/call MoveToGunlok
		/call PreTurnIn
		/delay 5
		
		:KaladimLoop
		/call LevelCheck
		/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 Bind
			/goto :mainloop
		}
	} else /if (${Zone.ID}==480) {
		/call ClearCursor
		/call CleanInventory
		/call Marie
		/call Bind
		/goto :mainloop
	} else {
		/echo Get your ass to Mar--err Marie, Quaid!
		/echo (Macro needs to start in Brell's Rest or N. Kaladim.)
		/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 ...
	}
	
	/if (${String[${pluginname}].Equal[MQ2EQBC]}) /varset EQBCOn 1
	
/return


| ----------------------------------------------------------------------------
| SUB: CheckGM
| ----------------------------------------------------------------------------

Sub CheckGM
	/declare GMPCEchoed	bool local 0
	
	:ReCheck
	/doevents
	/if (!${AFKToolsOn}) {
		/squelch /posse load 
		/if (${Bool[${Spawn[gm].ID}]}) { 
			/if (!${GMPCEchoed}) {
				/echo A GM or Guide has been detected in the zone, pausing macro until zone is clear.
				/varset GMPCEchoed 1
			}
			/delay 600s 
			/goto :ReCheck 
		}
		
		/if (${Posse.Strangers}>=1) { 
			/if (!${GMPCEchoed}) {
				/echo Another player is nearby, pausing macro until they leave.
				/varset GMPCEchoed 1
			}
			/delay 60s 
			/goto :ReCheck 
		}
	}
	/varset GMPCEchoed 0
/return


| ----------------------------------------------------------------------------
| SUB: MoveToGunlok
| ----------------------------------------------------------------------------

Sub MoveToGunlok
	/declare LocOffsetX local float 0
	/declare LocOffsetY local float 0
	/declare TurnX local float
	/declare TurnY local float
	
	/varset LocOffsetX ${Math.Calc[${Math.Calc[${Math.Rand[300]}/100].Centi}+${GunlokTurnX}]}
	/varset LocOffsetY ${Math.Calc[${Math.Calc[${Math.Rand[300]}/100].Centi}+${GunlokTurnY}]}

	/squelch /target clear
	/moveto mdist 10
	/squelch /target "Gunlok Jure"
	/delay 2s
	
	:recheck
	/if (${Target.Distance}>15) /moveto loc ${LocOffsetY} ${LocOffsetX}
	/delay 5
	/if (${Me.Moving}) {
		/delay 5
		/goto :recheck
	} else {
		/delay 1
	}
		
	/if (${Target.Distance}>15) /moveto id
	/delay 0 ${MoveTo.Stopped}
	/face fast
	
/return


| --------------------------------------------------------------
| Sub: PreTurnIn
| --------------------------------------------------------------
Sub PreTurnIn
|	/if (${Mercenary.State.Equal[SUSPENDED]}) {
|		/echo Unsuspending mercenary.
|			/if (!${Window[MMGW_ManageWnd].Child[MMGW_SuspendButton].Enabled}) {
|			/echo Waiting for button to enable...
|			/delay 60s 
|			}
|		/notify MMGW_ManageWnd MMGW_SuspendButton LeftMouseUp
|	}

	/if (${Target.Type.Equal[npc]}) {
		/if (${Me.Grouped}) {
			/echo Disbanding group for mad XPs.
			/disband
		}
	}
	/call ClearCursor
	/delay 5
/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

	/doevents
	/call CheckGM
	/call LevelCheck
	/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: CleanInventory
| ----------------------------------------------------------------------------	
	
Sub CleanInventory
|	 /if (${Mercenary.State.Equal[ACTIVE]}) {
|		/echo suspending mercenary
|		/notify MMGW_ManageWnd MMGW_SuspendButton LeftMouseUp
|	}
	/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: PortToBrellsRest
| ----------------------------------------------------------------------------

Sub PortToBrellsRest

	:PortLoop
	/squelch /target ${Porter}
	
	/if (${Target.Type.Equal[PC]}) {
		/if (${UseTransloc}) {
			/squelch /target clear
			/squelch /target ${Porter}
			/squelch /bct ${Porter} //delay 15s
			/squelch /bct ${Porter} //casting "Translocate: Brell's Rest" -targetid|${Me.ID} -maxtries|10
			/echo Bumming a transloc back to Brell's Rest from ${Porter} the Amazing.
			/delay 20s
		} else /if (${SelfPorter}) {
			/if (${Fellowship}) {
				:FellowshipLoop
				/if (${Cast.Ready[Fellowship Registration Insignia]}) {
					/nomodkey /itemnotify ${FindItem[Fellowship Registration Insignia].InvSlot} rightmouseup
					/echo Using Fellowship Registration Insignia to get back to Brell's Rest...
					/delay 30s
				} else {
					/echo Insignia NOT Ready!!!, trying again in 30 seconds.
					/delay 30s
					/goto :FellowshipLoop
				}
			} else /if (${SecondRecall}) {
				:SecondRecallLoop
				/if (${Me.AltAbilityReady[Secondary Recall]} && ${Me.Level}>=66) {
					/casting "Secondary Recall" -maxtries|5
					/echo Using Secondary Recall (AA) to get back to Brell's Rest...
					/delay 30s
				} else {
					/echo Secondary Recall not ready, it should be ready in about ${Math.Calc[${Me.AltAbilityTimer[Secondary Recall]}*6]} seconds.
					/delay ${Math.Calc[${Me.AltAbilityTimer[Secondary Recall]}*6]}s
| Timing isn't exact, but we should be under 6 seconds by now, so we will keep checking every second until it really is ready.
					:SRInner
					/if (${Me.AltAbilityReady[Secondary Recall]}) {
						/goto :SecondRecallLoop
					} else {
						/delay 1s
						/goto :SRInner
					}
				}
			} else {
				/cast ${BrellsSpell} -maxtries|10
				/delay 20s
			}
		} else {
			/bct ${Porter} //invite ${Me.Name}
			/delay 3s
			/notify ConfirmationDialogBox CD_Yes_Button leftmouseup
			/delay 3s
			/echo Porting to Brell's Rest...
			/bct ${Porter} //cast ${BrellsSpell} -maxtries|5
			/delay 20s
		}
	} else {
		/echo My ride to Brell's Rest is missing (${Porter}}, waiting...
		/delay 60s
		/goto :PortLoop
	}

	/if (${Zone.ShortName.NotEqual[brellsrest]}) {
		/echo Recasting teleport...
		/goto :PortLoop
	}
/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
	}

	:PortAgain
	/if (${UseTransloc} || ${SelfPorter}) {
		/if (${Me.AltAbilityReady[Gate]} && ${Me.Level}>=55) {
		/casting Gate -maxtries|5
		/echo Gating (AA) back to turn-in...
		/delay 15s
		
		} else /if (${Me.Gem[Gate]}) {
			/cast ${Me.Gem[Gate]} -maxtries|10
			/echo Gating (spell) back to turn-in...
			/delay 15s
			
		} else /if (${FindItem[Philter of Major Translocation].InvSlot}) {
			/casting "Philter of Major Translocation"
			/echo Gating (potion) back to turn-in... I have ${FindItemCount[${Philter of Major Translocation}]} pots left.
			/delay 15s
			
		} else /if (${Defined[Translocator]}) {
			/squelch /target clear
			/squelch /target ${Translocator}
			/delay 5
			
			/if (${Target.Name.Equal[${Translocator}]}) {
				/squelch /bct ${Translocator} //delay 15s
				/squelch /bct ${Translocator} //casting Translocate -targetid|${Me.ID} -maxtries|10
				/echo Bumming a ride from ${Translocator} the Magnificent.
				/delay 20s
			} else {
				/echo My translocator is missing, waiting...
				/delay 5s
				/goto :PortAgain
			} 
		} else {
			/echo I have no methods of returning to bind! Ending macro.
			/endmacro
		}
	} else {
		/bct ${Porter} //casting "Teleport Bind" -maxtries|5
		/delay 15s
	}
		
	/if (${Zone.ShortName.Equal[brellsrest]}) {
		/echo Trying again.
		/goto :PortAgain
	}
	
/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
	}
	
	/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
	/nomodkey /click right target
	/echo Waiting 5s for merchant/guildbank window to populate
	/delay 5s
	
/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 0

	/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
	/declare LocOffsetX local float 0
	/declare LocOffsetY local float 0
	/declare TurnX local float
	/declare TurnY local float
	
	/varset LocOffsetX ${Math.Calc[${Math.Calc[${Math.Rand[300]}/100].Centi}+${BrellsTurnX}]}
	/varset LocOffsetY ${Math.Calc[${Math.Calc[${Math.Rand[300]}/100].Centi}+${BrellsTurnY}]}

	/squelch /target clear
	/moveto mdist 10
	/squelch /target "Marie Fay"
	/delay 2s
	
	:recheck
	/if (${Target.Distance}>15) /moveto loc ${LocOffsetY} ${LocOffsetX}
	/delay 5
	/if (${Me.Moving}) {
		/delay 5
		/goto :recheck
	} else {
		/delay 1
	}
		
	/if (${Target.Distance}>15) /moveto id
	/delay 0 ${MoveTo.Stopped}
	/face fast

/return

| ----------------------------------------------------------------------------
| SUB: MoveToPorter
| ----------------------------------------------------------------------------

Sub MoveToPorter

	/if (!${UseTransloc}) {
		/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


| ----------------------------------------------------------------------------
| SUB: LevelCheck
| ----------------------------------------------------------------------------

Sub LevelCheck
	/if (${Me.Level}>=${HighLevel}) {
		/echo Reached target level, ending macro.
		/endmacro
	}
/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

- - - Updated - - -

Is there a way to see how much time is left on an item clicky before it can be used again? If someone could tell me how to do that I'd add in better timing for that as well.
I might add in some minor error checking as well, to make sure you have the needed item/AA/Spells for the options you choose, maybe have it try and auto detect self porting options if the Porter is yourself.

Would it perhaps be better to add/save options to and ini file so you would not need to edit the macro for every toon?

If anyone is interested in any of that I'll look into adding it as I have time... Like now as I'm watching it run.
 
Last edited:
For my newbie wizard (start right at level 1) I just got all the bags and bonechips on one toon, traded them all to my wizard, did the turnin, at this point they can now bind and gate themsevles.

Now but them in a guild and a fellowship (guild just long enough to use guild hall to port to brell), get enough toons over to start the campfire, then just use the insignia to port back and forth.

I did this to level 66, took a few hours, and at 66 started using secondary recall AA.

I modified the V3 mac to support both using the insignia and secondary recall to get back to brell.

I'll post it if anyone else would like to use it. It was some pretty basic changes to make it work,

*Edit 6/20/15*
Nevermind, here it is:

Please not this does not setup or maintain the campfire for the fellowship, though it could probly be added, I had no intrest in doing so as I used another toon in the fellowship to maintain it, it was just easier for me that way for the short time I needed it for.

*Edit 6/21/15a* Fixed a few minor things so it would recover from a collapsed gate correctly, and fixed a simple typo.
*Edit 6/21/15b* Added in better timing for secondary recall instead of using a hard coded 30 seconds.

Rich (BB code):
|Autobones.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
|Version 3.1  -- 6/20/15 - SteelDragon - Added in secondary recall and fellowship
|Version 3.1a -- 6/21/15 - SteelDragon - Minor fix to recover from a collapsed gate on secondary recall
|Version 3.1b -- 6/21/15 - SteelDragon - Added in better timing for secondary recall instead of using a hard coded 30 seconds.

#turbo 120
#Event TSCursor"#*#because only tradeskill items may go in a tradeskill bag.#*#"
#Event NullSlot"#*#Invalid item slot 'null#*#"

Sub Main
| ***Change XXXX and YYYY to Porter/Translocator's name ***
/declare Porterstringouter ${Me}
/declare Translocatorstringouter YYYY
/declare SelfPorterboolouter 1
/declare Fellowship     bool    outer 0
/declare SecondRecallboolouter 1

/declare EQBCOnboolouter 1
/declare UseTranslocboolouter 0

/declare GunlokTurnYfloat outer 1316
/declare GunlokTurnXfloatouter 136
/declare BrellsTurnYfloatouter -618
/declare BrellsTurnXfloatouter 90

| ***If you want to end the macro when character reaches a target level, set the following
|variable or use /mac macro_name #, where # is the target level.
/declare HighLevelintouter 110

| ***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_Teleport_Spell_Name"

| ***Change ZZZ to correct AA number. Wizard 456 Druid 7009
/declare PortToBind int outer 456

/declare ItemToHandInstringouter Bone Chips
/declare TurnInTargetstringouter Gunlok
/declare NullExitintouter 1

| -------------------------------------------------------------------------------------
| Check if required plugins are loadedStolen from KissAssist
| -------------------------------------------------------------------------------------
/echo Checking Plugins...
/call CheckPlugin MQ2Cast
/call CheckPlugin MQ2Moveutils
/call CheckPlugin MQ2EQBC
/call CheckPlugin MQ2Autoaccept
/call CheckPlugin MQ2Posse
/squelch /autoaccept add ${Porter}
/squelch /autoaccept add ${Translocator}

/if (${Defined[Param0]}) {
/if (${Int[${Param0}]}>0) {
/varset HighLevel ${Param0}
} else {
/echo Bad 1st argument, ignoring.
/varset Param0 NULL
}
}

/if (${Me.Level}>=80 && (${Me.Class.Name.Equal[Wizard]} || ${Me.Class.Name.Equal[Druid]})) {
/if (${Me.Gem[Brell's Rest Gate]} || ${Me.Gem[Brell's Rest Portal]}) {
/varset UseTransloc 0
/varset BrellsSpell "Brell's Rest Gate"
/varset Porter ${Me}
/varset SelfPorter 1

} else /if (${Me.Gem[Ring of Brell's Rest]} || ${Me.Gem[Circle of Brell's Rest]}) {
/varset UseTransloc 0
/varset BrellsSpell "Ring of Brell's Rest"
/varset Porter ${Me}
/varset SelfPorter 1
}
}

:mainloop
/call LevelCheck
/if (${Zone.ID}==67) {
/call MoveToGunlok
/call PreTurnIn
/delay 5

:KaladimLoop
/call LevelCheck
/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 Bind
/goto :mainloop
}
} else /if (${Zone.ID}==480) {
/call ClearCursor
/call CleanInventory
/call Marie
/call Bind
/goto :mainloop
} else {
/echo Get your ass to Mar--err Marie, Quaid!
/echo (Macro needs to start in Brell's Rest or N. Kaladim.)
/goto :mainloop
}
/return


| ----------------------------------------------------------------------------
| SUB: Check PluginStolen from KissAssist
| ----------------------------------------------------------------------------

Sub CheckPlugin(string pluginname)

/if (!${Bool[${Plugin[${pluginname}]}]}) {
/squelch /plugin ${pluginname}
/echo ${pluginname} not detected! This macro requires it! Loading ...
}

/if (${String[${pluginname}].Equal[MQ2EQBC]}) /varset EQBCOn 1

/return


| ----------------------------------------------------------------------------
| SUB: CheckGM
| ----------------------------------------------------------------------------

Sub CheckGM
/declare GMPCEchoedbool local 0

:ReCheck
/doevents
/if (!${AFKToolsOn}) {
/squelch /posse load 
/if (${Bool[${Spawn[gm].ID}]}) { 
/if (!${GMPCEchoed}) {
/echo A GM or Guide has been detected in the zone, pausing macro until zone is clear.
/varset GMPCEchoed 1
}
/delay 600s 
/goto :ReCheck 
}

/if (${Posse.Strangers}>=1) { 
/if (!${GMPCEchoed}) {
/echo Another player is nearby, pausing macro until they leave.
/varset GMPCEchoed 1
}
/delay 60s 
/goto :ReCheck 
}
}
/varset GMPCEchoed 0
/return


| ----------------------------------------------------------------------------
| SUB: MoveToGunlok
| ----------------------------------------------------------------------------

Sub MoveToGunlok
/declare LocOffsetX local float 0
/declare LocOffsetY local float 0
/declare TurnX local float
/declare TurnY local float

/varset LocOffsetX ${Math.Calc[${Math.Calc[${Math.Rand[300]}/100].Centi}+${GunlokTurnX}]}
/varset LocOffsetY ${Math.Calc[${Math.Calc[${Math.Rand[300]}/100].Centi}+${GunlokTurnY}]}

/squelch /target clear
/moveto mdist 10
/squelch /target "Gunlok Jure"
/delay 2s

:recheck
/if (${Target.Distance}>15) /moveto loc ${LocOffsetY} ${LocOffsetX}
/delay 5
/if (${Me.Moving}) {
/delay 5
/goto :recheck
} else {
/delay 1
}

/if (${Target.Distance}>15) /moveto id
/delay 0 ${MoveTo.Stopped}
/face fast

/return


| --------------------------------------------------------------
| Sub: PreTurnIn
| --------------------------------------------------------------
Sub PreTurnIn
|/if (${Mercenary.State.Equal[SUSPENDED]}) {
|/echo Unsuspending mercenary.
|/if (!${Window[MMGW_ManageWnd].Child[MMGW_SuspendButton].Enabled}) {
|/echo Waiting for button to enable...
|/delay 60s 
|}
|/notify MMGW_ManageWnd MMGW_SuspendButton LeftMouseUp
|}

/if (${Target.Type.Equal[npc]}) {
/if (${Me.Grouped}) {
/echo Disbanding group for mad XPs.
/disband
}
}
/call ClearCursor
/delay 5
/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

/doevents
/call CheckGM
/call LevelCheck
/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: CleanInventory
| ----------------------------------------------------------------------------

Sub CleanInventory
| /if (${Mercenary.State.Equal[ACTIVE]}) {
|/echo suspending mercenary
|/notify MMGW_ManageWnd MMGW_SuspendButton LeftMouseUp
|}
/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: PortToBrellsRest
| ----------------------------------------------------------------------------

Sub PortToBrellsRest

[emoji14]ortLoop
/squelch /target ${Porter}

/if (${Target.Type.Equal[PC]}) {
/if (${UseTransloc}) {
/squelch /target clear
/squelch /target ${Porter}
/squelch /bct ${Porter} //delay 15s
/squelch /bct ${Porter} //casting "Translocate: Brell's Rest" -targetid|${Me.ID} -maxtries|10
/echo Bumming a transloc back to Brell's Rest from ${Porter} the Amazing.
/delay 20s
} else /if (${SelfPorter}) {
/if (${Fellowship}) {
:FellowshipLoop
/if (${Cast.Ready[Fellowship Registration Insignia]}) {
/nomodkey /itemnotify ${FindItem[Fellowship Registration Insignia].InvSlot} rightmouseup
/echo Using Fellowship Registration Insignia to get back to Brell's Rest...
/delay 30s
} else {
/echo Insignia NOT Ready!!!, trying again in 30 seconds.
/delay 30s
/goto :FellowshipLoop
}
} else /if (${SecondRecall}) {
:SecondRecallLoop
/if (${Me.AltAbilityReady[Secondary Recall]} && ${Me.Level}>=66) {
/casting "Secondary Recall" -maxtries|5
/echo Using Secondary Recall (AA) to get back to Brell's Rest...
/delay 30s
} else {
/echo Secondary Recall not ready, it should be ready in about ${Math.Calc[${Me.AltAbilityTimer[Secondary Recall]}*6]} seconds.
/delay ${Math.Calc[${Me.AltAbilityTimer[Secondary Recall]}*6]}s
| Timing isn't exact, but we should be under 6 seconds by now, so we will keep checking every second until it really is ready.
:SRInner
/if (${Me.AltAbilityReady[Secondary Recall]}) {
/goto :SecondRecallLoop
} else {
/delay 1s
/goto :SRInner
}
}
} else {
/cast ${BrellsSpell} -maxtries|10
/delay 20s
}
} else {
/bct ${Porter} //invite ${Me.Name}
/delay 3s
/notify ConfirmationDialogBox CD_Yes_Button leftmouseup
/delay 3s
/echo Porting to Brell's Rest...
/bct ${Porter} //cast ${BrellsSpell} -maxtries|5
/delay 20s
}
} else {
/echo My ride to Brell's Rest is missing (${Porter}}, waiting...
/delay 60s
/goto [emoji14]ortLoop
}

/if (${Zone.ShortName.NotEqual[brellsrest]}) {
/echo Recasting teleport...
/goto [emoji14]ortLoop
}
/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
}

[emoji14]ortAgain
/if (${UseTransloc} || ${SelfPorter}) {
/if (${Me.AltAbilityReady[Gate]} && ${Me.Level}>=55) {
/casting Gate -maxtries|5
/echo Gating (AA) back to turn-in...
/delay 15s

} else /if (${Me.Gem[Gate]}) {
/cast ${Me.Gem[Gate]} -maxtries|10
/echo Gating (spell) back to turn-in...
/delay 15s

} else /if (${FindItem[Philter of Major Translocation].InvSlot}) {
/casting "Philter of Major Translocation"
/echo Gating (potion) back to turn-in... I have ${FindItemCount[${Philter of Major Translocation}]} pots left.
/delay 15s

} else /if (${Defined[Translocator]}) {
/squelch /target clear
/squelch /target ${Translocator}
/delay 5

/if (${Target.Name.Equal[${Translocator}]}) {
/squelch /bct ${Translocator} //delay 15s
/squelch /bct ${Translocator} //casting Translocate -targetid|${Me.ID} -maxtries|10
/echo Bumming a ride from ${Translocator} the Magnificent.
/delay 20s
} else {
/echo My translocator is missing, waiting...
/delay 5s
/goto [emoji14]ortAgain
} 
} else {
/echo I have no methods of returning to bind! Ending macro.
/endmacro
}
} else {
/bct ${Porter} //casting "Teleport Bind" -maxtries|5
/delay 15s
}

/if (${Zone.ShortName.Equal[brellsrest]}) {
/echo Trying again.
/goto [emoji14]ortAgain
}

/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
}

/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
/nomodkey /click right target
/echo Waiting 5s for merchant/guildbank window to populate
/delay 5s

/return


| ----------------------------------------------------------------------------
| SUB: BuyChipsWritten 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 0

/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
/declare LocOffsetX local float 0
/declare LocOffsetY local float 0
/declare TurnX local float
/declare TurnY local float

/varset LocOffsetX ${Math.Calc[${Math.Calc[${Math.Rand[300]}/100].Centi}+${BrellsTurnX}]}
/varset LocOffsetY ${Math.Calc[${Math.Calc[${Math.Rand[300]}/100].Centi}+${BrellsTurnY}]}

/squelch /target clear
/moveto mdist 10
/squelch /target "Marie Fay"
/delay 2s

:recheck
/if (${Target.Distance}>15) /moveto loc ${LocOffsetY} ${LocOffsetX}
/delay 5
/if (${Me.Moving}) {
/delay 5
/goto :recheck
} else {
/delay 1
}

/if (${Target.Distance}>15) /moveto id
/delay 0 ${MoveTo.Stopped}
/face fast

/return

| ----------------------------------------------------------------------------
| SUB: MoveToPorter
| ----------------------------------------------------------------------------

Sub MoveToPorter

/if (!${UseTransloc}) {
/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


| ----------------------------------------------------------------------------
| SUB: LevelCheck
| ----------------------------------------------------------------------------

Sub LevelCheck
/if (${Me.Level}>=${HighLevel}) {
/echo Reached target level, ending macro.
/endmacro
}
/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

- - - Updated - - -

Is there a way to see how much time is left on an item clicky before it can be used again? If someone could tell me how to do that I'd add in better timing for that as well.
I might add in some minor error checking as well, to make sure you have the needed item/AA/Spells for the options you choose, maybe have it try and auto detect self porting options if the Porter is yourself.

Would it perhaps be better to add/save options to and ini file so you would not need to edit the macro for every toon?

If anyone is interested in any of that I'll look into adding it as I have time... Like now as I'm watching it run.
Yes, check the code from the previous fellowship update I posted. On my phone now but the line you're looking for is inside the port to campfire method.
 
Only version I can find is the ones that check if it's ready and if not wait 60 seconds before checking again, this is not what I was looking for because that's the same thing I added into mine.
Though I might take the rest of your campfire code and add it all into this version so we have a nice all in one version of the macro. Was never sure why you didn't do that to begin with.
Nice work by the way, I might not be new to programing, but I am just now learning the MQ scripting, this has been a fun way to learn.
 
These versions have been worked on by many people, lol. Some folks (me especially) knew nothing about scripting and have learned by modifying the mac. It has been fun to watch it evolve.
 
Only version I can find is the ones that check if it's ready and if not wait 60 seconds before checking again, this is not what I was looking for because that's the same thing I added into mine.
Though I might take the rest of your campfire code and add it all into this version so we have a nice all in one version of the macro. Was never sure why you didn't do that to begin with.
Nice work by the way, I might not be new to programing, but I am just now learning the MQ scripting, this has been a fun way to learn.

My last update on fellowship macro found in post 73. Code you're looking for is on line 606
Rich (BB code):
/if (${InvSlot[${FindItem[Fellowship Registration Insignia].InvSlot}].Item.TimerReady}==0) {
If you're interested in doing more work on it I'd recommend poking around PeteSampras's TLO Member Builder, which will give you some insight into what you can use as conditionals.

EDIT: For those using my last port macro I'd recommend editing out the random BrellsTurn components, they seem to be causing a lot of pathing issues. The radius you can safely run to to make the turn to Marie is pretty small, a lot smaller than 3 loc points.

Newest version of the code is here.
 
Last edited:
PeteSampras's TLO Member Builder

PM PeteSampras what ever need turned and he will build it for you.
 
Thanks again to all of the authors who have contributed to the various bone chips macros. They have made it easy to level my mage and wiz minions.

I was wondering if anyone has run into a situation running these macros that I have run into. I don't think it is a problem with any of these macros, but something with my MQ2 setup is causing an odd "freeze-up" to happen. As I said, it is not specific to any bone chips macro, because I have encountered this before with macros like the into the hills macro, but it happens almost all the time on two particular computers I use and not at all on three others. The eqclient seems to lose the ability to click buttons in the UI and then cannot display some dialog windows.

For example, when buying bone chips from Marie, it just stops buying. The dialog is still up. If I try to manually click, nothing happens. I can alt-tab out to desktop and test the mouse buttons and movement. Sometimes, when I alt-tab back to the eqclient, I can get the macro to continue by opening the buy window and selecting the bone chips. It is really odd that it has only happened on a couple of computers but that the others don't have any problems.

Any thoughts on what I can do to narrow down the problem? Anyone else having an issue like this in these macros or any others?
 
I am currently testing the memory leaks in the video card when running a mac and not being the main window, as in more then 1 client. It seems to crash a lot on the minimized client, think its a memory leak issue as it only happens on certain machines/video cards.

test test test, share results=find solution
 
Thanks again to all of the authors who have contributed to the various bone chips macros. They have made it easy to level my mage and wiz minions.

I was wondering if anyone has run into a situation running these macros that I have run into. I don't think it is a problem with any of these macros, but something with my MQ2 setup is causing an odd "freeze-up" to happen. As I said, it is not specific to any bone chips macro, because I have encountered this before with macros like the into the hills macro, but it happens almost all the time on two particular computers I use and not at all on three others. The eqclient seems to lose the ability to click buttons in the UI and then cannot display some dialog windows.

For example, when buying bone chips from Marie, it just stops buying. The dialog is still up. If I try to manually click, nothing happens. I can alt-tab out to desktop and test the mouse buttons and movement. Sometimes, when I alt-tab back to the eqclient, I can get the macro to continue by opening the buy window and selecting the bone chips. It is really odd that it has only happened on a couple of computers but that the others don't have any problems.

Any thoughts on what I can do to narrow down the problem? Anyone else having an issue like this in these macros or any others?
Does /loadskin resolve this?
 
I will try next time and see. Do you think it could be a UI problem? Maybe I can make sure it is using the default ui.
I have no idea, but I have encountered a problem where I can't right click anywhere in my ui. It's a simple test at least; I've never experienced a similar problem running this macro so testing local problems is most logical until others report.
 
Does /loadskin resolve this?

I will try next time and see. Do you think it could be a UI problem? Maybe I can make sure it is using the default ui.

Yep. /loadskin default fixed it. I have no idea why it happens. It was usingthe default UI any way. It seems to only do it on the foreground instance of EQ running. I will test to see if it ever happens in the background.
 
I guess I've went completely retarded. I can't get this to work by itself. No idea what I'm doing wrong. Anyone able to help?
 
Says his ride isn't there and waits. And I do have eqbc on and both accounts are connected on same PC.
 
Bonechips Revised

Users who are viewing this thread

Back
Top
Cart