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.