Lil help modding this mac please.

Slaymore

New member
Joined
Feb 10, 2013
Messages
40
Reaction score
0
Points
0
Hi Guys!,

New member here .. great site and really cool!.

Here is what i do currently and what I would like to do.

I am 3 boxing a shaman(meleedps merc)/bard(tank merc)/mage(healer merc).

I currently control everything from the shaman with eqbc and one key press.

I am in an instance that has no kos and in that instance I am in a small room full of non social mobs. I target the first one hit my eqbc button and everything goes down. repeat. loot. and wait about 30 seconds for mobs to respawn... do it all again.

What I would like to do is automate the targeting, hit the already make eqbc hotbutton then loot .. repeat. then a pause for mobs to respawn and repeat.

I was playing with a mac from the class list called shambuff that i have casting haste and Spirit of the Leopard on tank. this works nice and simple for my needs.

I would like to add to this make the targeting of the mobs in the room (rats). hit the eqbc hotbutton. loot everything.

I am sure this would just be a couple of snippets inserted into this shambuff.mac file and i have looked through a number of macs to find what I am looking for but most use arrays read from an ini file and i get lost there.

Also in the shambuff macro i would like to specify that the tank merc is the tank and gets the buffs cast on him (do i just list the mercs full name in the shambuff file?). Things die fast so I am not worried about total efficiancy and my shaman will be getting the group versions soon enough so that will take care of that anyway.

Thanks for any help/suggestions.

Code:
#Event SetTank "#1# tells you, 'settank #2# #3#'"

|################################################
Sub Main
	| Define your MainTank... this is changeable while the macro is running by having new main tank /tell you: secretphrase (see below)
	/declare MainTank string outer WANT_TANK_MERC_NAME_HERE
	/declare SecretPhrase string outer changetank

	| Define your Spells...
	/declare Spell_LANGUOR string outer	"Languor"
	/declare Spell_COUGAR string outer	"Spirit of the Leopard"
	/declare Spell_CHAMPION string outer	"Champion"
	/declare Spell_HASTE string outer	"Celerity"
	/declare Spell_GROWTH string outer	"Wild Growth Rk. II"
	/declare Spell_CANNI string outer	"Cannibalize IV"
	/declare Spell_HOT string outer		"Halcyon Zephyr Rk. II"
	/declare Spell_PATCH string outer	"Dannal's Mending Rk. II"
	/declare Spell_SLOW string outer	"Balance of Discord"
	/declare AA_Malo string outer		"Malosinete"
	/declare ITEM_Epic string outer		"Crafted Talisman of Fates"

	| Define what % mana you feel you should canni.
	/declare MinMana int outer 90

	| Define if you want to HoT (heal over time) or not. Also define what % health you want to HoT the MT.
	/declare DoHOT bool outer FALSE
	/declare DoHOTPercent int outer 85

	| Define if you want to PATCH heal or not. Also define what % health you want to heal the MT.
	/declare DoPATCH bool outer FALSE
	/declare DoPATCHPercent int outer 70

	| Define if you want to auto-slow mobs or not. Also define what % health you want to slow the mob.
	/declare DoSLOW bool outer FALSE
	/declare DoSLOWPercent int outer 97

	| Define if we want to malo mobs or not.
	/declare DoAAMalo bool outer FALSE

	|
	| Don't need to edit below this line!
	|

	| Lets see if a MT was passed as an argument to the macro.
	/if (${Defined[Param0]}) {
		| We have a MT passed, lets use that instead of our default!
		/varset MainTank ${Param0}
	}

	/echo Loaded Short Duration Buffs v1.0 by memset
	/echo MAIN TANK: ${MainTank}
	/echo CANNI AT %: ${MinMana}% Mana
	
	/if (${DoHOT}) {
		/echo HOT AT %: ${DoHOTPercent}%
	}

	/if (${DoPATCH}) {
		/echo PATCH AT %: ${DoPATCHPercent}%
	}

	| Check if MQ2Cast plugin is loaded, if it isn't... load it automatically. Thanks VillageIdiot & Unity!
	/if (!${Plugin[MQ2Cast].Name.Equal[mq2cast]}) /squelch /plugin MQ2Cast nocheck


	|################################################
	| START OF LOOP
	:start
	/doevents

	/call GMCheck
		
	|################################################
	| Target our MT.
	/target pc ${MainTank}
	/delay 1s

	|################################################
	| Make sure we have a target before continuing.
	/if (!${Target.ID}) {
		/goto :start
	}

	|################################################
	| Next, make sure we aren't invisible... if we ARE, don't cast anything.
	/if (${Me.Invis}) {
		/goto :start
	}

	|################################################
	| Also, if we are MOVING... we don't need to cast anything. Will be pointless.
	/if (${Me.Moving}) {
		/goto :start
	}

	|################################################
	| Finally, see if we're casting or not. This was added LATER... so it's slightly redundant below. Clean up later.
|	/if (${Me.Casting.ID}) /goto :start

	|################################################
	| Lets first make sure we don't need to heal the MT.
	| Do we need to PATCH heal the MT?
	/if (${Target.PctHPs} <= ${DoPATCHPercent} && ${DoPATCH}) {
		| It seems so. Better heal! Is the spell ready? Make sure we're not casting already...
		/if (!${Me.Casting.ID} && ${Me.SpellReady[${Spell_PATCH}]} && ${Target.Distance} < 100) {
			/echo Healing ${MainTank} with ${Spell_PATCH}!
			/casting ${Spell_PATCH}
			/delay 2.5
		}
	}

	| Do we need to HoT the MT?
	/if (${Target.PctHPs} <= ${DoHOTPercent} && ${DoHOT}) {
		| It seems so. Better heal! Is the spell ready? Make sure we're not casting already...
		/if (!${Me.Casting.ID} && ${Me.SpellReady[${Spell_HOT}]} && ${Target.Distance} < 100 && !${Target.Buff[${Spell_HOT}].Duration}) {
			/echo Healing ${MainTank} with ${Spell_HOT}!
			/casting ${Spell_HOT}
			/delay 2.5
		}
	}

	| There's a possibility that the shaman running this macro could be in need of a heal from canni... check now!
	/if (${Me.PctHPs} <= 80) {
		/target ${Me.CleanName}
		/delay 1s
		/casting ${Spell_PATCH}
		/delay 2.5
		/target pc ${MainTank}
		/delay 1s
	}

	|################################################
	| Lets see if the mob is malo'd... if not, and we're supposed to, then malo it.
	/if (${DoAAMalo} && ${Me.AltAbilityReady[${AA_Malo}]}) {
		| Yes... see if mob is malo'd already.
		/assist ${MainTank}
		/delay 1s
		/if (${Target.Buff[${AA_Malo}].Duration.Ticks} < 1 && ${Target.Type.Equal[NPC]} && ${Target.Distance} < 100 && ${Target.PctHPs} <= ${DoSLOWPercent}) {
			| Ok... malo the mob!
			/echo Malo'ing ${Target.CleanName} with ${AA_Malo}
			/aa act Malosinete
			/delay 4s
		}
	}

	|################################################
	| Now lets check if we need to slow a mob!
	/if (${DoSLOW}) {
		| Ok, we need to slow....maybe. Assist MT, check if it has been slowed already with our spell. Also verify it's an NPC.
		/assist ${MainTank}
		/delay 1s
		/if (${Target.Type.Equal[NPC]}) {
			| Verified this IS an NPC.
			| Check HP's... and if we've slowed already or not.
			/if (${Target.PctHPs} <= ${DoSLOWPercent} && !${Target.BuffDuration[${Spell_SLOW}]} && !${Me.Casting.ID} && ${Target.Distance} < 100 && ${Me.SpellReady[${Spell_SLOW}]}) {
				| HP's match and the mob isn't slow and I'm not casting... AND it's within range. lets slow this mob.
				/echo Slowing ${Target.CleanName} with ${Spell_SLOW}!
				/casting ${Spell_SLOW}
				/delay 1.5s
				/target pc ${MainTank}
				/delay 1s
			}
		}
		/target pc ${MainTank}
		/delay 1s
	}

	|################################################
	| Check if we need to rebuff LANGUOR:
	/if (${Target.BuffDuration[${Spell_LANGUOR}]} < 15 && ${Target.Distance}<100) {
		| Am I currently casting a spell? And is the spell ready?
		/if (!${Me.Casting.ID} && ${Me.SpellReady[${Spell_LANGUOR}]}) {
			| Good to go! Cast!
			| /casting uses plugin mq2cast.
			/echo Casting ${Spell_LANGUOR} on ${Target.CleanName}!
			/casting ${Spell_LANGUOR}
			/delay 2s
		}
	}

	|################################################
	| Check if we need to rebuff CHAMPION:
	/if (${Target.BuffDuration[${Spell_CHAMPION}]} < 15 && ${Target.Distance}<100) {
		| Am I currently casting a spell? And is the spell ready?
		/if (!${Me.Casting.ID} && ${Me.SpellReady[${Spell_CHAMPION}]}) {
			| Good to go! Cast!
			| /casting uses plugin mq2cast.
			/echo Casting ${Spell_CHAMPION} on ${Target.CleanName}!
			/casting ${Spell_CHAMPION}
			/delay 2s
		}
	}

	|################################################
	| Check if we need to rebuff COUGAR:
	/if (!${Target.BuffDuration[${Spell_COUGAR}]} && ${Target.Distance} < 50) {
		| Am I currently casting a spell? And is the spell ready?
		/if (!${Me.Casting.ID} && ${Me.SpellReady[${Spell_COUGAR}]}) {
			| Before we cast, lets make it so it only casts if MT has a mob targeted and the mob is closeby..
			/assist ${MainTank}
			/delay 1s

			/if (${Target.Distance} < 100 && ${Target.CleanName.NotEqual[${MainTank}]}) {
				| Good to go! Cast!
				/target pc ${MainTank}
				/delay 1s
				/echo Casting ${Spell_COUGAR} on ${Target.CleanName}!
				/casting ${Spell_COUGAR}
				/delay 4s
			}
		}
	}

	|################################################
	| Check if we need to CLICK EPIC:
	/if (${FindItem[${ITEM_Epic}].Timer} == 0) {
		| Epic clicky is ready... do we need to click it?
		/assist ${MainTank}
		/delay 8
		/if (${Target.Distance} < 100 && ${Target.Type.Equal[NPC]}) {
			| Yep. Lets click it!
			/casting ${ITEM_Epic}
			/delay 1s
		}
	}

	|################################################
	| Check if we need to rebuff HASTE:
	/if (!${Target.BuffDuration[${Spell_HASTE}]} && ${Target.Distance}<100) {
		| Am I currently casting a spell? And is the spell ready?
		/if (!${Me.Casting.ID} && ${Me.SpellReady[${Spell_HASTE}]}) {
			| Good to go! Cast!
			| /casting uses plugin mq2cast.
			/echo Casting ${Spell_HASTE} on ${Target.CleanName}!
			/casting ${Spell_HASTE}
			/delay 4s
		}
	}

	|################################################
	| Check if we need to rebuff GROWTH:
	/if (${Target.BuffDuration[${Spell_GROWTH}]} <= 15 && ${Target.Distance}<100) {
		| Am I currently casting a spell? And is the spell ready?
		/if (!${Me.Casting.ID} && ${Me.SpellReady[${Spell_GROWTH}]}) {
			| Good to go! Cast!
			| /casting uses plugin mq2cast.
			/echo Casting ${Spell_GROWTH} on ${Target.CleanName}!
			/casting ${Spell_GROWTH}
			/delay 2s
		}
	}

	|################################################
	| Check if we need to cannibilize:
	/if (${Me.PctMana} <= ${MinMana} && ${Me.SpellReady[${Spell_CANNI}]}) {
		| Less than or equal to minimum percent of mana... lets canni.
		/echo Casting ${Spell_CANNI}!
		/casting ${Spell_CANNI}
		/delay 1s
	}


	/delay 1s
	/goto :start
/return


|################################################
Sub Event_SetTank(line, sender, new_tank, secretphrase)
	/if (${secretphrase.Equal[${SecretPhrase}]}) {
		/echo ${sender} sent secret phrase, setting ${new_tank} as tank!
		/varset MainTank ${new_tank}
		/target pc ${MainTank}
		/delay 1s
	}
/return

|################################################
Sub GMCheck 
   /if (${Spawn[gm].ID}) { 
      /beep 
      /beep 
      /beep 
      /echo GM has entered the zone! 
      /echo FUCK HIM but ending the macro... 
      /keypress forward 
      /keypress back 
      /quit 
      /endmacro 
   } 
/return
 
I hope fhalls works out well for you! In the past it has been watched by GMs.

The way I did this when I macro'd fhalls was using the logic:

if mana && hp were above 80% and i was out of combat, /target los rat, /bcaa //target id ${Target.ID}, cast slow, /bcaa //kill this

My Shaman wouldn't buff the group individually. He would only use group versions. He would check for the existence of the buffs on himself and if it was missing, he would cast it.

It kept it pretty simple, but effective. I leveled to 71 or so I think there.
 
will "/target los rat" work just like that? do I need some kind of wildcard like *_rat?

If its that easy i can insert that and /keypress 6 right after the gm check and just forget looting at this point.

For mana the time between sapwns is more than enough to regen to full (mage and shaman are mounted).

Added:
I dont slow at all in there .. I want the bard/mage ds to work to its fullest and no one ever goes below 95% health.
 
Last edited:
I think /target los rat will work. Though, you could probably make it a bit more accurate like:

/target los npc rat radius 250

That will target a mob with rat in its name that you can see that is within 250, uh, feet? of you.

You'd want to incorporate some logic, though.
 
Super ! Thanks .. its running away right now lol

I just added this and a delay of 30 to make sure I didnt target a new rat and its perfect.. perfectly sloppy lol but working like a charm.



|################################################
| START OF LOOP
:start
/delay 30s
/doevents

/call GMCheck

|################################################
| GET TARGET AND ATTACK
/target los npc rat radius 100
/keypress 8
/pet attack
/delay 1s
 
That's a good place to start. Now try to expand it and make it better! At some point you should be able to move on to other, not so safe zones!