• 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

Holyshits Downshits - MQ2Melee Primer

Joined
Jan 14, 2016
RedCents
1,418¢
IdiotsGuideHolys.png

Holyshit/Downshit - MQ2Melee Primer by Incognito

Index

Introduction:
There are myriad of very clever people on this site. Most of which have been working with SHITS a lot longer than I. There is a metric shit-tonne of insight and knowledge scattered across the various forums. It is difficult to piece together a coherent base to start from so I will attempt to combine the most pertinent pieces together here.

MQ2Melee Primer:
During MQ2 installation (RedGuides Compile) you allow or determine the main/parent folder of the install. Most let it default to 'Release'. Since Release makes no sense to me, I forced it into a MQ2 folder:
Rich (BB code):
C:\Users\Public\MQ2

Most would find the base MQ2 folder perhaps somewhere like this:
Rich (BB code):
C:\Users\Public\Release

This main/parent folder contains numerous MQ2 related files; all the Plugin DLL's and related INI's, MQ2 itself (Macroquest2.exe), and RedGuides installer/updater etc. This folder is where your ServerName_ToonName.ini resides. While some Plugins utilize their own INI, the ServerName_ToonName.ini contains settings for various plugins in one file. It is this file that Holyshit/Downshit code goes. That file also contains settings for the following: MQ2Melee, MQ2AAspend, MQ2Rez, MQ2ViewPort, and recently MQ2Twist, and more.

You know you have the correct folder if the folder named Macros is UNDER it (and others like Configs, eqbc, Logs, MQ2AdvPath, MQ2CharacterSheets, MQ2Nav, MySEQ, UIFiles - depending on what options you have installed).

For info on MQ2Melee, various settings for various classes, go to the Mothership.

IF your ServerName_ToonName.ini file does NOT contain MQ2Melee settings, issue a /melee save on that toon to populate it. Simply issuing /melee will dump all of its settings for that toon (which various according to class) to your MQ2Win.

An example of the MQ2Melee settings for a Warrior:
Rich (BB code):
[MQ2Melee]
aggro=1
aggropri=0
aggrosec=0
arrow=0
bash=1
battleleap=0
bow=0
callchallenge=0
commanding=20
disarm=1
defense=0
enrage=1
facing=1
fieldarm=0
forage=1
gutpunch=1
infuriate=1
kick=1
kneestrike=0
melee=1
opportunisticstrike=20
plugin=1
pothealfast=30
provoke0=0
provoke1=0
provokeend=20
provokemax=2
provokeonce=0
range=170
resume=75
slam=0
stickbreak=1
stickrange=75
stunning=1
taunt=1
version=7.090

You will notice some are =0 (off) and others are =1 (on). Some of mine are off because I want the macro I am running to handle them. Others are best to have MQ2Melee handle for a number of reasons. It's trial and error, experimentation, and depends on the capabilities of the macro you running.

Back to Top

Holyshit/Downshit Primer:
Definitions:
Holyshits fire when in auto-attack. Downshits fire when NOT in auto-attack. Realize they can fire numerous times a second if they are without conditons. Holyshit/Downshits are coupled with an associated Holyflag/Downflag to turn them on and off:
Rich (BB code):
downflag1=1
holyflag1=1

The basic structure is:
Rich (BB code):
downflag1=1
holyflag1=1
holyshit1=/if (Some Condition is TRUE or Non-Zero) /command
downshit1=/if (Some Condition is TRUE or Non-Zero) /command

The number of SHITS you can have in your ServerName_ToonName.ini has been increased to 60 iirc.

Know that you can turn them on and off in-game simply by issuing /melee holyflag1=0/1 or /melee downflag1=0/1. You can also have one SHIT turn on or off another SHIT by setting its FLAG 0/1 in the execution portion of the SHIT. This is useful when you want to toggle an ability between fights. One caveat I will point out is that KissAssist PullerTank and Tank (and perhaps Hunter) may not switch combat modes when switching targets in a multiple XTar situation. Let me clarify: If there are multiple mobs on radar, KA will avoid wasting time when addressing the next mob after one dies and therefore never switch between combat and non-combat until all mobs are dead. IF you are using Holy/Down flag toggles to switch abilities between fights, that toggling will be suspended until the XTar list is clear. If that doesn't make sense, it might later when you are attempting to code something more complex.

We'll get into actual SHITS later, but a example of toggling SHITS between kills, which works well with non MA's like the bard:
Rich (BB code):
downflag1=0
downflag2=0
holyflag1=1
holyflag2=0
holyshit1=/multiline ; /melee downflag1=1 ; /melee downflag2=0 ; /melee holyflag1=0 
holyshit2=/multiline ; /melee downflag1=0 ; /melee downflag2=1 ; /melee holyflag2=0
downshit1=/if (${Cast.Ready[Dichotomic Psalm]}) /multiline ; /delay 50 ; /twist once 10 ; /melee downflag1=0 ; /melee holyflag2=1 
downshit2=/if (${Cast.Ready[Silisia's Lively Crescendo]}) /multiline ; /twist once 5 ; /melee downflag2=0 ; /melee holyflag1=1

Now that might be a bit hard to follow. But, take your time and read thru it. After the first kill, it checks if Dicho is ready and fires it (its in Gem10) then resets the flags so it wont fire it again until after Downshit2 fires, and turns on Downshit2. After next kill (remember Downshits fire AFTER combat) Downshit2 checks if Silisia's is ready, fires it (its in Gem5), and resets the flags so it wont fire again until after Downshit1 fires, which is after the next kill. Therefore I have essentially created a toggle between two songs that alternate between kills. That is also an example of using one SHIT to turn on/off another SHIT, and using the Multiline. Of course after the Hugo Dicho nerf, I no longer use these SHITS...

Anyway, back to basics: A good exercise is to create a Holy and a Down and watch what happens and when. It will give you a better understanding of the EQ Client (pulses), MQ2, and notably Holy/Downs:
Rich (BB code):
downflag1=1
holyflag1=1
downshit1=/echo DownShit fired
holyshit1=/echo Holyshit fired

Hit your attack button, wait a moment, then hit it again. You will see how often they fire, and when. Technically you do not HAVE to include /if (Condition) as the above proves. Granted it isn't very useful, but you could simply fire any valid cmd.

Holyshit and Downshit code resides in the ServerName_ToonName.ini file in the MQ2 (Release) parent/main folder as stated above. Holyshit/Downshit code is basically MQ2 Macro code based on a condition that you can use to fire spells, disciplines, AA's, and item clickies. I subscribe to the meme that we should let our macros that we are running do what they do best and if I can have my macro fire something, then I will. I consider Holyshit/Downshit code to be a last resort. Why? Because it can circumvent macro functionality, even collide with your macro, and can fire inadvertently (when you don't want it to).

However there are a lot of Holyshit/Downshit code that folks have used successfully for years, and they do fill an otherwise unoccupied niche.

A good amount of Holy/Down info can be found at the Mothership.

One often overlooked feature of Holyshit/Downshit code is the ability to setup a generic condition that determines when any/all Holy/Down code fires. Call it a pre-condition since the Holy/Downs themselves can (and usually do) contain their own conditions:
Rich (BB code):
holyshitif=/if (!${Select[${Zone.ID},151,202,203,219,344,345,463]} && ${Macro.Name.NotEqual["NULL"]} && !${Macro.Paused} && ${Me.Standing} && !${Me.Invis})

This chunk of code fires before any Holyshit and determines if any subsequent Holyshit fires. It's a one size fits all situation. Not a one of my Holyshits will fire unless that Holyshitif's condition(s) is true. This not only helps keep your code readable and more maintainable, but aids greatly in keeping under the 255 character limit of a Holy/Down. Go over the 255 limit and MQ2 will crash.

I use that holyshitif since I never want any of my Holyshits to fire if I am in one of the listed zones (Bazaar, PoK, PoTranq, PoTimeA, GL, GHall, Void), not running a macro, macro is paused, am sitting, or if I am invis'd. Everyone will have their own ideas and will implement code accordingly. Macroquest could be considered a sandbox, and everyone will grab different tools, and create different things. I like a bucket, a shovel, and will make a castle... that's just me.

Downshits can also be pre-conditioned:
Rich (BB code):
downshitif=/if (!${Select[${Zone.ID},151,202,203,219,344,345,463]} && ${Macro.Name.NotEqual["NULL"]} && !${Macro.Paused} && ${Me.Standing} && !${Me.Invis})

Its the same code (different name) and performs the exact same function.

Another often overlooked feature is the /multiline:
Rich (BB code):
/multiline SomeDelimiter /command SameDelimiter /command etc

This allows you to fire multiple commands upon the success of a single condition:
Example 1:
Rich (BB code):
holyshit2=/if (${Me.AltAbilityReady[Blast of Anger]} && ${Me.CombatAbilityTimer[Phantom Aggressor]}<=6 && ${Me.CombatAbilityTimer[Phantom Aggressor]}>=4) /multiline ; /alt act 3646 ; /echo * SHITS Blast of Anger Fired *

This multiline simply allows me to not only fire an ability, but to report it to MQ2Win. We can use multiline to string together a number of different valid commands (EQ cmds, MQ2 cmds, EQBC cmds, reset another SHITS flag, etc). The delimiter I used in that example was the semicolon.

Back to Top

Holyshits:

Remember that Holyshits fire when in auto-attack(and they are always combined with an associated FLAG).

Using the preceding example (Example 1), I can further consolidate the Holyshit as thus:
Example 2:
Rich (BB code):
holyshit2=/if (${Me.AltAbilityReady[Blast of Anger]} && ${Select[${Me.CombatAbilityTimer[Phantom Aggressor]},4,5,6]}) /multiline ; /alt act 3646 ; /echo * SHITS Blast of Anger Fired *

Its the exact same function, but with less code, less characters. You will find myriad ways of accomplishing a task using SHITS the more you experiment and the more you read others code. Here I used the MQ2 feature ${Select[SomeVariable,PossibleValue1,PossibleValue2,PossibleValue3]}.

Back to Top

Applicable MQ2 Change Notes:
Dealing with Spell/Disc Ranks:

This is something I recently came across when trying to build SHITS that were compatible across toons (even other users, other accts, on other PCs). When using the SHIT above (Example 2) I did not consider that another warrior might have the Rank II ability. It took me awhile to figure out why it didn't work for him. Hihi brought RankName to my attention so I dug up the MQ2 Change Notes (repeated here):
Rich (BB code):
30 Sep 2015 by EqMule (ALERTS AND MORE ALERTS AND STUFF)
- THIS IS A MACROBREAKING PATCH! (so read these notes)
- Please don't use MQ2 for unattended gameplay (afk botting)
- ${Spell[some spell]} now looks through your aa list as well if it cant find a spell
  I did that to take the new ranks into account for example prior to this patch
  /echo ${Spell[Boastful Bellow].Range} would fail because the Boastful Bellow spell
  has been renamed to Boastful Bellow I
  anyway the fix is now in and it also means .RankName will return ranks for these kinds
of alt abilities.

And
Rich (BB code):
17 Jun 2014 by eqmule
- Added RankName to the Spell TLO - Cred: petesampras,htw,maskoi
  it returns a pSpellType rather than a pStringType, but since default is the .Name
  and I think thats how most people will use it, its called "RankName"
  Usage: /echo I have the ${Spell[Certitude].RankName} version of Certitude its ID is: ${Spell[Certitude].RankName.ID}
  Output:
  [MQ2] I have the Certitude Rk. II version of Ceritude its ID is:
  Second example: Lets say you have Vinespur Rk. II in your spellbook (and memmed)
  then doing a /cast "${Spell[Vinespur].RankName}" in your macro will cast it, since its
  going to be resolved as /cast "Vinespur Rk. II"
This should decrease the edititing of inifiles everytime you buy a new rank of a spell.

So, my Blast of Anger SHIT now looks like this:
Example 3:
Rich (BB code):
holyshit2=/if (${Me.AltAbilityReady[Blast of Anger]} && ${Select[${Me.CombatAbilityTimer[${Spell[Phantom Aggressor].RankName}]},4,5,6]}) /multiline ; /alt act 3646 ; /echo * SHITS Blast of Anger Fired *

NOTE: Example 3 is not tested yet.

Now regardless of what Rank a Warrior has for Phantom Aggressor, it will successfully gauge the timer accordingly. I could even put the ${Spell[Name].RankName} on Blast of Anger as well but the other toons in question do not have the Rank II of that ability so I haven't cared. I solve what needs solving and don't get distracted by anything else otherwise I'd get nothing done. Squirrel ...

For giggles, this quick test worked:
Rich (BB code):
/echo ${Me.AltAbilityReady[${Spell[Blast of Anger].RankName}]}

So we combined Rank handling, the Select, Holyshitif, and Multiline to establish a concise function. In case you are wondering, that SHIT (Example 3) only fires Blast of Anger if Phantom Aggressor is about halfway thru its timer. I didn't want to waste endurance having it fire right after Phantom, and certainly not before as I value Phantom over Blast. As always, your mileage may vary.

In the same thread that Hihi showed me .RankName, Warl0ck45 posted a great primer himself.

Back to Top

Downshits:

Remember that Downshits fire when NOT in auto-attack (and they are always combined with an associated FLAG). Here are some Downs I use:
Rich (BB code):
downflag1=0
downflag2=0
downflag14=1
downflag15=1
downshit1=/if (${Cast.Ready[Grant Icebound Paradox]} && ${Me.Standing} && !${Me.Invis} && !${FindItem[Summoned: Icebound Sliver].InvSlot}) /multiline ; /tar myself ; /casting "Grant Icebound Paradox" 12 ; /delay 30 ; /autoinventory
downshit2=/if (${Cast.Ready[Wand of Dark Modulation RK. II]} && ${Me.Standing} && !${Me.Invis} && !${FindItem[Wand of Pelagic Modulation].InvSlot}) /multiline ; /tar myself ; /casting "Wand of Dark Modulation RK. II" 11 ; /delay 30 ; /autoinventory
downshit14=/if (!${Macro.Paused} && !${Me.Buff[Elixir of Clarity XVIII].ID} && ${FindItem[Distillate of Clarity XVIII].ID}) /multiline ; /echo ** MQ2Melee triggered Clarity Pot ** ; /useitem Distillate of Clarity XVIII
downshit15=/if (${Cast.Ready[Cauldron of Countless Goods]}) /multiline ; /keypress 2 ; /delay 11s ; /autoinventory ; /echo ** SHITS Cauldron

This is done so we can provide some utility without sacrificing DPS, thus, out of combat. Notice, as always, the SHITS are paired with respective FLAGS. Most SHITS reside as Holyshits, since combat is the bulk of EQ. Downs are great for buffs, item clickies, obviously summoning items (mounts), etc.

Another thing that is often overlooked is /keypress. I couldn't get a Downshit for the Cauldron directly to work. Each piece worked on its own via the MQ2Win, but combined it did not. So I created a social attached to HotButton 2:
Rich (BB code):
/useitem "Cauldron of Countless Goods"

Keypress can be used for anything you want to put into a HotButton. I have used it for Forage, raising Tracking Skill on a timer, etc. Its just another thing you can add to your toolbelt so when you are trying to solve something you have more options.

Back to Top

Alt Activate - Disciplines:
Disciplines are checked via: ${Me.CombatAbilityReady[DiscName]} and fired via: /disc DiscID. It is advised to do a !${Me.ActiveDisc.ID} as well.

AA's are checked via: ${Me.AltAbilityReady[AAName]} and fired via: /alt act AAID.

**NOTE** If anyone has a TLO etc that accepts the name of a Disc or Ability and returns the ID, please post it!

There are a number of sites to get the ID's:

I'm sure there are others.

Bulk SHITS:
I wanted to include collections of SHITS that are found around the forums. For example, here are the SHITS included in AFNuke2.mac (which may very well come from William12's original AFNuke.mac):
Rich (BB code):
downflag0=1
downflag1=1
downflag2=0
downflag3=1
downflag4=1
downflag5=1
downflag6=1
downflag7=1
downflag8=1
downflag9=1
downflag10=1
downflag11=1
downflag12=1
downflag13=1
downflag14=1
downflag15=1
downshit0=/if (${Me.AltAbilityReady[Banestrike]} && !${BOOL{Target.Mezzed}} && ${Target.PctHPs}>1 && ${Target.PctHPs}<99 && ${Target.Type.Equal[NPC]}) /alt act 15073
downshit1=/if (${Me.AltAbilityReady[Lower Element]} && !${Target.Buff[Lower Element].ID} && ${Target.PctHPs}>1 && ${Target.PctHPs}<99 && ${Target.Type.Equal[NPC]}) /alt act 1262
downshit2=/if (!${Bool[${Me.Song[Mana Reciprocation].ID}]} && !${Bool[${Me.Song[Frostweave Aura Effect II].ID}]} && !${Bool[${Me.Song[Wildspark Aura Effect II].ID}]} && !${Me.Buff[Pyromancy XXIV].ID} && !${Me.Invis}) /alt act 514
downshit3=/if (${Me.AltAbilityReady[Concussive Intuition]} && ${Me.PctAggro}>84) /alt act 577
downshit4=/if (${Me.AltAbilityReady[Call of Xuzl]} && ${Target.PctHPs}>1 && ${Target.PctHPs}<99 && ${Target.Type.Equal[NPC]}) /alt act 208
downshit5=/if (${Me.AltAbilityReady[A Hole in Space]} && ${Me.PctAggro}>95) /alt act 365
downshit6=/if (${Me.AltAbilityReady[Arcane Destruction]} && ${Target.PctHPs}>1 && ${Target.PctHPs}<99 && ${Target.Type.Equal[NPC]}) /alt act 1265
downshit7=/if (${Me.AltAbilityReady[Focus of Arcanum]} && ${Target.PctHPs}>1 && ${Target.PctHPs}<99 && ${Target.Type.Equal[NPC]}) /alt act 1211
downshit8=/if (${Me.AltAbilityReady[Arcane Whisper]} && ${Target.PctHPs}>1 && ${Target.PctHPs}<99 && ${Target.Type.Equal[NPC]}) /alt act 636
downshit9=/if (${Me.AltAbilityReady[Fury of Ro]} && ${Target.PctHPs}>1 && ${Target.PctHPs}<99 && ${Target.Type.Equal[NPC]}) /alt act 1152
downshit10=/if (${Me.AltAbilityReady[Sustained Destruction]} && ${Target.PctHPs}>1 && ${Target.PctHPs}<99 && ${Target.Type.Equal[NPC]}) /alt act 6106
downshit11=/if (${Me.AltAbilityReady[Silent Casting]} && ${Target.PctHPs}>1 && ${Target.PctHPs}<99 && ${Target.Type.Equal[NPC]}) /alt act 500
downshit12=/if (${Me.AltAbilityReady[Improved Twincast]} && ${Target.PctHPs}>1 && ${Target.PctHPs}<75 && ${Target.Type.Equal[NPC]}) /alt act 515
downshit13=/if (!${Me.CombatState.Equal[COMBAT]} && ${Me.PctMana}<90 && !${Me.Sitting} && !${Zone.Outdoor}) /Sit

Those aren't exact; I modified the /sit SHIT (downshit13) to make it easier to summon a mount, I modified Sustained Destruction in downshit10 to reflect recent AA changes.

Rich (BB code):
downshit14=/if (!${Macro.Paused} && !${Me.Buff[Elixir of Clarity XVIII].ID} && ${FindItem[Distillate of Clarity XVIII].ID}) /multiline ; /echo ** MQ2Melee triggered Clarity Pot ** ; /useitem Distillate of Clarity XVIII
downshit15=/if (!${Me.Mount.ID} && !${Me.FeetWet} && ${Zone.Outdoor}) /useitem Battle Armor Worg Saddle

I added 14 and 15 in an effort to do everything I could to help mitigate the Hugo Dicho nerf.

Its a good exercise to read thru other people's SHITS; you can get ideas, and you can discover ways of solving problems you are having. I subscribe to the whole bigger toolbox = more tools = more projects done.

I personally don't have any more BULK SHITS, so go thru the References below and find ones you like. Be prepared, many of the SHITS posted over the years will require tweaking. EQ changes, AA's get consolidated, removed, and renamed. MQ2 is in constant evolution: God Bless you EQMule! So SHITS like everything else need to be maintained. There is no one person slated to do that work so its up to you to make a posted SHIT work. Of course there are a bunch of knowledgeable and helpful folk in this community, why I am loyal to it, so post your questions.

Back to Top

Reference - Further Reading:


Back to Top

- - - Updated - - -

An excellent editor for editing INI files:

Notepadd++ is very popular amongst MQ2 users.

Also, if you are already in-game, you can still edit your ServerName_ToonName.ini file and issue a /melee reload in-game and the changes will take affect.
 
Last edited:
A few things:

Downshits:

Remember that Downshits fire when in combat (and they are always combined with an associated FLAG). Here are some Downs I use:
Pretty sure you meant when NOT in combat.

You may want to clarify also that holy shits only fire when using auto-attack, and downshits fire when not auto-attacking. Some people may think "in battle" means the crossed swords for the aggro/cooldown/rest icon.

Can also add that the conditions must be TRUE or a non-zero number to have them fire.



Otherwise, great post.
 
Heh I see you take the same approach here that I do at work

"Boss I been doing this for a while, and if I had to ask about it, I imagine others will as well. Don't you think that information ought to be be readily available?"

It was to the point I was putting laminated instruction on some of the equipment cause of the amount of times I got asked to show someone for the umpteenth time how to do stuff... just to have the boss take them back down because it "doesn't look professional", bah.
 
Lol

OfficeSpace.jpg

- - - Updated - - -

In the middle of my post, in the /Alt Act and /Disc section, I asked if anyone knew of how to get an AA ID from the name:

Rich (BB code):
/echo ${Me.AltAbility[YourAAName].ID}
/echo ${Me.AltAbility[Flurry].ID}
/echo (${Me.CombatAbility[DiscName].ID}
 
Last edited:
If you have an ID and don't know what it is, EQMule gave me this:
Rich (BB code):
/echo ${Spell[40550]}

So if you are reading thru someone's posted SHITS you can tell what it is.
 
Holyshits Downshits - MQ2Melee Primer

Users who are viewing this thread

Back
Top
Cart