Public Macros Help with Shammy
Reply
Help with Shammy
So I have a shammy, I want to casts about 5 or 6 spells when I call for it. Is there a way to do this with EQBC or would it be better with macro?
Fri Oct 12, 2012 3:56 am
Both
If it is something for a circumstantial situation, say for one boss battle, then you may want to use an EQBCS call with a series of socials macros. If you want to loop them you could set it up like this:

Socials buttons:
A.
Line 1: /pause 3, /target "Main Tank or Assist name here" Kurzesblatt
Line 2: /pause 3, /stick OFF
Line 3: /pause 3, /assist
Line 4: /pause 3, /attack OFF
Line 5: /pause 3, /keypress 2

Button 2;
Line 1: /cast 1
Line 2: /cast 1
Line 3: /cast 1
Line 4: /pause [sum of cast time+recast in tenths] 50, /bct [Shaman's Name] Shissarscale //keypress 3

Button 3;
Line 1: /cast 2
Line 2: /cast 2
Line 3: /cast 2
Line 4: /pause 50, /bct Shissarscale //keypress 4

Button 4;
Line 1: /cast 3
Line 2: /cast 3
Line 3: /cast 3
Line 4: /pause 50, /bct Shissarscale //keypress 5

Button 5;
Line 1: /cast 4
Line 2: /cast 4
Line 3: /cast 4
Line 4: /pause 50, /bct Shissarscale //keypress 6

Button 6;
Line 1: /cast 5
Line 2: /cast 5
Line 3: /cast 5
Line 4: /pause 50, /bct Shissarscale //keypress 7

Button 7;
Line 1: /cast 6
Line 2: /cast 6
Line 3: /cast 6
Line 4: /pause 50, /bct Shissarscale //keypress 2

::The final line pauses are so that the spell has enough time to execute before the program tells it to cast again. The reason for 3 casts is to avoid fizzles/interrupts, if you fizzle more than three times commonly practice your spell on a friend's pet, or your own, in a duel. Obviously your skills are too low.

:: Of course here you will want to have your socials buttons set to the main hotbar buttons corresponding to keybinds 1, 2, 3, 4, 5, 6, 7 (#1 being where the default melee attack button is). [You can alter the keybinds to whatever you want of course] This will create an infinitely looping cycle, on main tank/assist setup a social button that looks like this:

SHMcyc
Line 1: /bct Shissarscale //keypress 1

You can like wise setup all caster classes like this, then just make a sit button to stop [Line 1 /bct Shissarscale //sit] or a return stick function:

Follow
Line 1: /pause 3, /bca //sit
Line 2: /pause 3, /bca //stand
Line 3: /pause 3, /bca //attack OFF
Line 4: /pause 3, /bca //target [main tank-assist]
Line 5: /bca //stick uw [or a distance in feet 1-600]

Now if you want an infinitely running automation to completely control your box toon then you want a bot plugin or macro which will be much more in depth on the control but a tad more complicated to setup. However, don't let this discourage you because the world of macro's is nice too once you begin getting the hang of it. I ran a macro the other day and made about 200,000pp tradeskilling while cooking my son's dinner and getting him ready for bed... lol.

I'm not to good with macros yet, but I am sure another will respond with that, but don't give up and explore all your possibilities. I have realized with MQ that the limits of this program is your imagination. What you can't do with bot automation plugins, you can achieve with macros, and what you can't achieve with macros/plugins you can manually setup the small things through alternate controls in socials and broadcast with EQBCS, so the control is limitless depending on patience and willingness to invest the time.

Good luck!
_________________
Is all that we see or seem but a dream within a dream?
Fri Oct 12, 2012 3:39 pm
So I have a shammy, I want to casts about 5 or 6 spells when I call for it. Is there a way to do this with EQBC or would it be better with macro?


It can be done with EQBC and with a macro. Which one is better depends on what spells you want to cast and which targets you want to cast them on. Which one is easier to setup depends on if someone else has already written a macro for the same purpose.

More details?
Sat Oct 13, 2012 2:41 am
Senior Project Member
Macro
More +
Button 3;
Line 1: /cast 2
Line 2: /cast 2
Line 3: /cast 2
Line 4: /pause 50, /bct Shissarscale //keypress 4

Button 4;
Line 1: /cast 3
Line 2: /cast 3
Line 3: /cast 3
Line 4: /pause 50, /bct Shissarscale //keypress 5

| and so on...
| and so on...


This type of looping is not a good implementation. For one, it repeats infinitely and the only way to stop the loop is to shut down EQ.

The following should do all the casting bits yet is a single line long:

Macro
More +
/bct <charactername> //multiline ; /casting "Spell1Name" gem1 -maxtries|5; /timed 50 /casting "Spell2Name" gem2 -maxtries|5; /timed 100 /casting "Spell3Name" gem3 -maxtries|5; /timed 150 /casting "Spell4Name" gem4 -maxtries|5; /timed 200 /casting "Spell5Name" gem5 -maxtries|5; /timed 250 /casting "Spell6Name" gem6 -maxtries|5;


It might not fit into a EQ social hotkey, but there are several tricks to shrink it down.

::The final line pauses are so that the spell has enough time to execute before the program tells it to cast again. The reason for 3 casts is to avoid fizzles/interrupts, if you fizzle more than three times commonly practice your spell on a friend's pet, or your own, in a duel. Obviously your skills are too low.

The number of casts to eliminate fizzles might vary by server, so pay attention and change your own setup if needed. On PEQTGC, 5 casts are needed to alleviate fizzles even with maxed spell casting. That's why I have -maxtries|5 above. A fizzle with 4 casts is pretty rare but I might see a couple over the course of a night. Fizzles with only 3 casts are surprisingly common (though on live, it was essentially a guaranteed cast).
Sat Oct 13, 2012 3:10 am
Senior Project Member
This is something I wrote like 2 years ago. It worked fairly well until I went full automation.
Macro
More +
| slow.mac
| usage /mac slow ${Target.ID} slow dot puma canni malo nuke curse
| This is a simple macro that runs and then ends. It does not handle changing targets.
| Call it each time you enter combat or to retarget the shaman to a new target.


#define CHAN_RESP "/bc"

Sub Main

        | going to add a check for watching group members for emergency heals eventually
        | /declare SpellHEAL string local Daluda's Mending
        | /declare GemHeal int local 1
        | /declare SpellSLOW string local Cloud of Grummus
        /declare SpellSLOW string local Balance of the Nihil
        /declare GemSLOW int local 2
        /declare SpellMALO string local Malos
        /declare GemMALO int local 3
        /declare SpellDOT string local Blood of Saryn
        /declare GemDOT int local 4
        /declare SpellCURSE string local Bane
        /declare GemCURSE int local 5
        /declare SpellNUKE string local Velium Strike
        /declare GemNUKE int local 6
        /declare SpellPUMA string local Spirit of the Jaguar
        /declare GemPUMA int local 7
        /declare SpellCANNI string local Cannibalize IV
        /declare GemCANNI int local 8
        /declare StopCanniHP int local 50
        /declare StopCanniMP int local 70
        /declare MaxCast int local 10


        /declare AssistID int local
        /declare Params[6] string local
        /declare slow bool local FALSE
        /declare malo bool local FALSE
        /declare puma bool local FALSE
        /declare canni bool local FALSE
        /declare dot bool local FALSE
        /declare nuke bool local FALSE
        /declare curse bool local FALSE
        /declare tarID int local 0
        /declare i int local 0

        /if (${Defined[Param0]}) {
                /varset tarID ${Param0}
        }
        /if (${Defined[Param1]}) {
                /varset Params[1] ${Param1}
        }
        /if (${Defined[Param2]}) {
                /varset Params[2] ${Param2}
        }
        /if (${Defined[Param3]}) {
                /varset Params[3] ${Param3}
        }
        /if (${Defined[Param4]}) {
                /varset Params[4] ${Param4}
        }
        /if (${Defined[Param5]}) {
                /varset Params[5] ${Param5}
        }
        /if (${Defined[Param6]}) {
                /varset Params[6] ${Param6}
        }
        /if (${Defined[Param7]}) {
                CHAN_RESP Too many arguments passed for ${Macro.Name} to handle, exiting.
                /return
        }

        /if ( ${tarID}==0 ) {
                CHAN_RESP bad target specified for ${Macro.Name}
                /return
        }
        /for i 1 to 6
                /if (${Params[${i}].Equal[dot]}) /varset dot TRUE
                /if (${Params[${i}].Equal[slow]}) /varset slow TRUE
                /if (${Params[${i}].Equal[nuke]}) /varset nuke TRUE
                /if (${Params[${i}].Equal[puma]}) /varset puma TRUE
                /if (${Params[${i}].Equal[malo]}) /varset malo TRUE
                /if (${Params[${i}].Equal[canni]}) /varset canni TRUE
                /if (${Params[${i}].Equal[curse]}) /varset curse TRUE
        /next i
       
        /if (${Me.PctMana}<=5) {
                CHAN_RESP OOM and unable to SLOW
                /if (${canni}) {
                        /goto :CANNI
                } else {
                        /return
                }
        }

        /if (!${Spawn[${tarID}].Type.Equal[npc]}) /if (!${Spawn[${tarID}].Type.Equal[pet]}) {
                CHAN_RESP ${Spawn[${tarID}].CleanName} is not a valid target
                /return
        }
       
        |if the ton is already cating something when the macro starts, wiat for that to finish.
:WaitOnPriorSpell
        /if (!${Cast.Ready}) {
                /goto :WaitOnPriorSpell
        }

:MALO
        /if ( ${malo} ) {
                /if (${Spawn[${tarID}].Distance3D}>${Spell[${SpellMALO}].MyRange}) {
                        CHAN_RESP MALO failed because the mob was out of range
                } else /if (!${Cast.Ready[${SpellMALO}]}) {
                        /if (!${Me.Gem[${SpellMALO}) {
                                CHAN_RESP ${SpellMALO} not memorized, putting it in gem ${GemMALO}.
                                /memorize "${SpellMALO}" ${GemMALO}
                                /delay 3s ${Cast.Ready[${SpellMALO}]}
                                /goto :MALO
                        } else {
                                CHAN_RESP ${SpellMALO} not ready to cast, skipping.
                        }
                } else {
                        CHAN_RESP Now casting ${SpellMALO} on ${Spawn[id ${tarID}].CleanName}
                        /casting "${SpellMALO}" ${GemMALO} -maxtries|3 -targetid|${tarID}
                        /delay ${MaxCast}s ${Cast.Ready}
                        /if (!${Cast.Result.Equal[CAST_SUCCESS]}) {
                                CHAN_RESP MALO failed due to ${Cast.Result}
                        } else {
                                CHAN_RESP ${Spawn[id ${tarID}].CleanName} has been MALO'd
                        }
                }
        }
:SLOW
        /if ( ${slow} ) {
                |CHAN_RESP Now casting ${SpellSLOW} on ${Spawn[id ${tarID}].CleanName}
                /casting "${SpellSLOW}" 2 -maxtries|3 -targetid|${tarID}
                /delay 30s ${Cast.Ready}
                /if (${Cast.Result.Equal[CAST_IMMUNE]}) {
                        CHAN_RESP ${Target.CleanName} is IMMUNE to slow.
                } else /if (${Cast.Result.Equal[CAST_SUCCESS]}) {
                        CHAN_RESP ${Target.CleanName} has been slowed
                        /goto :SLOW_SUCCESS
                } else /if (${Cast.Result.Equal[CAST_RESIST]}) {
                        CHAN_RESP SLOW was resisted by ${Target.CleanName}
                } else /if (${Cast.Result.Equal[CAST_OUTOFMANA]}) {
                        CHAN_RESP not enough mana to slow
                        /goto :CANNI
                } else {
                        CHAN_RESP SLOW failed due to ${Cast.Result}
                }
                |CHAN_RESP ${Cast.Result}      
        }

:SLOW_SUCCESS
        /if ( ${dot} ) {
                |CHAN_RESP Now casting ${SpellDOT} on ${Spawn[id ${tarID}].CleanName}
                /casting "${SpellDOT}" 4 -maxtries|3 -targetid|${tarID}
                /delay 30s ${Cast.Ready}
                /if (${Cast.Result.Equal[CAST_OUTOFMANA]}) {
                        /goto :CANNI
                } else /if (!${Cast.Result.Equal[CAST_SUCCESS]}) {
                        CHAN_RESP DOT failed due to ${Cast.Result}
                }
                |CHAN_RESP ${Cast.Result}
        }

        /if ( ${curse} ) {
                |CHAN_RESP Now casting ${SpellDOT} on ${Spawn[id ${tarID}].CleanName}
                /casting "${SpellCURSE}" 6 -maxtries|3 -targetid|${tarID}
                /delay 30s ${Cast.Ready}
                /if (${Cast.Result.Equal[CAST_OUTOFMANA]}) {
                        /goto :CANNI
                } else /if (!${Cast.Result.Equal[CAST_SUCCESS]}) {
                        CHAN_RESP DOT failed due to ${Cast.Result}
                }
                |CHAN_RESP ${Cast.Result}
        }

       
:PUMA
        /if ( ${puma} ) {
                /varset i 0
                /for i 0 to ${Group.Members}
                        /if (${Group.Member[${i}].Distance}<=${Spell[${SpellPUMA}].MyRange}) {
                                /if ((${Group.Member[${i}].Class.ShortName.Equal[WAR]})||(${Group.Member[${i}].Class.ShortName.Equal[BRD]})||(${Group.Member[${i}].Class.ShortName.Equal[SHD]})||(${Group.Member[${i}].Class.ShortName.Equal[RNG]})||(${Group.Member[${i}].Class.ShortName.Equal[PAL]})) {
                                        |CHAN_RESP Now casting ${SpellPUMA} on ${Group.Member[${i}].CleanName}
                                        /casting "${SpellPUMA}" 7 -maxtries|3 -targetid|${Group.Member[${i}].ID}
                                        /delay 30s ${Cast.Ready[${SpellPUMA}]}
                                        |CHAN_RESP ${Cast.Result}
                                }
                        }
                /next i
        }

        /if ( ${nuke} ) {
                |CHAN_RESP Now casting ${SpellNUKE} on ${Spawn[id ${tarID}].CleanName}
                /casting "${SpellNUKE}" 5 -maxtries|3 -targetid|${tarID}
                /delay 30s ${Cast.Ready}
                /if (${Cast.Result.Equal[CAST_OUTOFMANA]}) {
                        /goto :CANNI
                } else /if (!${Cast.Result.Equal[CAST_SUCCESS]}) {
                        CHAN_RESP NUKE failed due to ${Cast.Result}
                }
                |CHAN_RESP ${Cast.Result}
        }

:CANNI
        /if ( ${canni} && !${Me.Moving} ) {
                /if ( ${GameState.Equal[CHARSELECT]} ) /end
                /if ( (${Me.PctMana}<=${StopCanniMP}) && (${Me.PctHPs}>=${StopCanniHP}) ) {
                        /if (${Me.AltAbilityReady[47]} && !${Me.Casting.ID}) {
                                /delay 1s
                                /casting 47 alt
                                /delay 30s ${Cast.Ready}
                        } else {
                                /casting "${SpellCANNI}" 8 -maxtries|3
                                /delay 3s !${Me.Casting.ID}
                                /if ( ${Me.Standing} && !${Me.Casting.ID} && !${Me.Mount.ID} ) /sit
                                /delay 30s ${Cast.Ready[${SpellCANNI}]}
                        }
                        /goto :CANNI
                }
        }
        /if ( ${Me.Standing} && !${Me.Casting.ID} && !${Me.Mount.ID} ) /sit
/return

_________________
Sorvani
Sat Oct 13, 2012 9:04 am
Senior Project Member
To grumble
That series of lines I wrote were for in game hotbuttons that you'd cue with a message from main window. You can easily end the loop by telling the character to /sit. I didn't mean to enter it into a .mac file.
_________________
Is all that we see or seem but a dream within a dream?
Sat Oct 13, 2012 3:37 pm
I don't think sitting will stop the chain. At best, no casts will occur while sitting but the /keypress into the next hotkey will still fire: the chain continues. At worst, auto-stand on cast will cause casts anyway.
Sat Oct 13, 2012 7:09 pm
Senior Project Member
posted my shammy macro in the special members section if interested.
http://mqemulator.net/forum2/viewtopic.php?p=4246#4246
Thu Oct 18, 2012 2:12 pm
Listen to This Guy
Public Macros Help with Shammy
Reply