• 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

Request - Holy/Down Help

Gillybear

Member
Joined
Jun 26, 2016
RedCents
1,053¢
Looking to optimize my setup a bit better can someone help me understand how to write holies/downs? I have a very, very vague understanding as it currently stands, would like to have a much better understanding. From my experience, they make toons so much more efficient than trying to run everything via Kiss.
 
I'll throw my hat out for a more specific example.

I'm having trouble getting a specific downshit to work.

downshit14=/if (!${Me.CombatState.Equal[COMBAT]} && !${Me.Buff[Revival Sickness]} && ${Me.PctMana}<60 && ${Me.SpellReady[Bucolic Harvest]}) /cast 10

It will attempt to spam bucolic harvest even when the spell gem is not ready. I'm sure it's just formating or I'm missing something. I have noticed in some holy/downs I've seen people using Bool alot. What does the Bool function do to assist in holy/downs.
 
Easiest way to troubleshoot this is to use /echo ${Me.SpellReady[Bucolic Harvest]} and see what it outputs to MQ window. Then cast Harvest and do the same echo, and see what it outputs to MQ window.
 
I have noticed in some holy/downs I've seen people using Bool alot. What does the Bool function do to assist in holy/downs.

http://www.redguides.com/docs/projects/macroquest/reference/top-level-objects/tlo-bool/

Bool makes it a TRUE/FALSE statement. If the condition inside the brackets [ ] is met, it is true, else it is false, IE ${Bool[${Plugin[MQ2CEcho]}]} if you have the plugin loaded, returns true, otherwise false.

Most of your if statement will take number values to be true/false as well. As in "/if (${SpawnCount[npc targetable radius ${NPCRadius} zradius ${NPCZRadius} noalert 1 playerstate 4]}) /dosomething" Spawncount will give a number based on the condition placed inside the [ ], if there is any number other then 0, the if statement will see it as TRUE. If it is 0 it will see it as FALSE.

- - - Updated - - -

The trick to writing holy/down shits it understanding the format.

Rich (BB code):
holyshit1=/if (conditions are all true) /do something

You need to have a general idea on what you want to have happen, and what sort of condition you want to have before it happens. Then it takes a little research to find out how to tell MQ the conditions you want met.

You will be using MQ2 script language to set the conditions. This involves using TLO, or Top Level Objects. Here is a link to MQ2's source provided TLOs (some plugins provide addtional TLO's, like MQ2Melee and MQ2Cast)

http://www.redguides.com/docs/tlos/

Unfortunately, this is sort of like.... lets say playing with legos. You have to build your "/if () /" statement, and sometimes the blocks you want to use wont always fit right. So there is a lot of researching and testing. It helps to look at what others have posted, as long as you can grasp what it is they were trying to accomplish and how they went about doing it. It can be hard finding examples that someone has taken the trouble to explain, so that others can grasp what was going on (one of the reasons I don't mind expanding on my posts, I know the struggle! =p)

In this caase you are looking to farther utilize a plugin. It always pays to look up what you can about that plugin. Up top RG has a "Plugin List", or you can click:
http://www.redguides.com/community/showthread.php/24833-Redguides-MQ2-Compile-Plugin-List

down that list you will see MQ2Melee, click it or click here:
http://www.redguides.com/community/showthread.php/24780-MQ2Melee

That will give you a general idea on how the plugin works, answer some FAQ's, and provide links to various class specific MQ2Melee INI's that other folks have written and graciously posted to help others out. You may find what you are looking for already there, or something similar enough you can adapt it to fit your needs. If nothing else though, it will give you a plethora of examples to look at.

If you want a deeper understanding, pick out any INI there and try to piece out what the author was trying to accomplish, and research the TLO's they used to accomplish it enough you can grasp what is going on in "plain language" , for instance:

Rich (BB code):
downshit1=/if (${Me.PctEndurance}<25 && ${Me.CombatAbilityReady[${Spell[Breather].RankName}]} && ${Me.CurrentEndurance}>100 && (${Zone.ID}!=344)) /disc ${Spell[Breather].RankName}

This is from my paladin, what is it saying is "if my endurance percentage is below 25%, and my discipline "Breather" (of which ever rank I have) is ready to use, and my current endurance points are over 100, and I am not in the lobby, then activate the discipline "breather" (in what ever rank of the spell I have)

Rich (BB code):
holyshit12=/if (!${Target.Slowed.ID} && ${Me.Inventory[mainhand].ID}!=133167  && !${SpawnCount[pc slower group]} && ${Target.Body.Name.NotEqual[Undead]}) /Bandolier Activate Slow

This one is saying "if the target is not slowed (the ! at the front of a TLO makes the return the opposite, so in this case, if the target has a slow spell, it returns the spell ID number of the spell. As mentioned earlier, in an IF statement any number not a 0 returns TRUE... the ! changes it. The intent here is... if there is no slowed spell ID, the TLO is changed to a TRUE) and my primary hand weapons is not me slow procing hammer, and there is not a slower in my group, and the target is not undead, then use the Bandolier to change to my slow procing weapon.

-----------------

Remember that when you are making a holy/down, you will need to think out your conditions. The plugin will try to fire everything it can constantly, so depending on what you are trying to accomplish, some "common sense" conditions may need to be put in.

Once you have an idea on what you want to try, you can test the TLO segments ingame using /echo, as in "/echo ${SpawnCount[pc slower group]}" and have a slower join your group, see if it returns 1 or not, to know if you wrote the condition correctly.

Give it a few tries... if you can't figure out whats wrong, come post it and I am sure someone will be happy to help. I highly recommend trying to figure it out yourself though, it will open doors to new possibilities later on as you gain a better understanding of what you can and can not do with MQ =)
 
Last edited:

That's the piece I was missing. Thanks

Only thing that is really left are the various variables, but I think I've got a good grasp for what I need. Usually I can just read the code to figure it out, but for whatever reason holies/downs were confusing me writing wise from reading. It made sense on how they worked, but not so much on when to use X variable. Knowing it's just that flexible makes it considerably easier.
 
Great info in here! Warlock mentioned difficulty finding shits with descriptions, so I guess I can throw this into the mix.

This is just a little writeup I did for some Monk shits where I describe what each of them does in plain english. Could be helpful as examples.

Rich (BB code):
holyshit1=/if (${Target.Named} && ${Melee.DiscID}==35063) /stopdisc
holyshit2=/if (${Me.CombatAbilityReady[Shadewalker's Synergy Rk. II]} && ${Target.PctHPs}<99 && ${Target.PctHPs}>20 && ${Me.CombatState.Equal[COMBAT]}) /disc shadewalker
holyshit3=/if (${Select[${Melee.DiscID},4691,35087]} && ${Me.AltAbilityReady[Infusion of Thunder]} && ${Me.CombatState.Equal[COMBAT]}) /alt act 945
holyshit4=/if (${Target.Named} && ${Me.CombatState.Equal[COMBAT]} && ${Me.CombatAbilityReady[Heel of Zagali Rk. II]}) /disc Heel of Zagali Rk. II
holyshit5=/if (${SpawnCount[npc radius 30 zradius 10]}<2 && ${Target.Named} && ${Me.CombatState.Equal[COMBAT]} && ${Me.AltAbilityReady[Destructive Force]}) /alt act 276
holyshit6=/if (${Target.Named} && ${Me.CombatState.Equal[COMBAT]} && !${Melee.DiscID}==35087 && !${Me.CombatAbilityReady[Heel of Zagali Rk. II]}) /multiline ; /disc speedfocus ; /disc terrorpalm ; /disc ironfist
holyshit7=/if (${Target.Buff[Shadewalker's Synergy Effect].ID} && ${Select[${Melee.DiscID},25924,35087,25924]} && ${Me.CombatAbilityReady[Crane Stance Rk. II]} && ${Target.PctHPs}<99 && ${Target.PctHPs}>40 && ${Me.CombatState.Equal[COMBAT]}) /disc crane stance rk. ii
holyshit8=/if (${Target.Named} && ${Me.CombatState.Equal[COMBAT]} && ${Me.AltAbilityReady[Five Point Palm]}) /alt act 1012
holyshit9=/if (${Select[${Melee.DiscID},4691,25924,35072]} && ${Me.CombatAbilityReady[Tiger's Balance]} && ${Target.PctHPs}<99 && ${Target.PctHPs}>80 && ${Me.CombatState.Equal[COMBAT]}) /disc tiger's

holyshit1=Stop Eye of the Storm Rk. II disc if it's running when a named comes into camp. Make sure to change the disc ID if you have a different rank.
holyshit2=Hit synergy if mob is between 99 and 20% life - this prevents those last second synergy attacks at 5% life that waste the timer and reduce your DPS on the next mob. Adjust this %age as needed when you move into a new camp. Optimally, you want to open EVERY fight with a synergy so adjust until this is pretty close to happening.
holyshit3=Cast infusion of thunder if you are using either speedfocus or Heel of Zagali Rk. II. Make sure to change the disc ID if you have a different rank.
holyshit4=If target is named, hit Heel disc.
holyshit5=If target is named and it is the only mob within 30 radius, blow destructive force. This prevents hitting destructive force when there are mobs mezzed nearby causing a wipe.
holyshit6=If target is named and Heel of Zagali is down, try using the other 3 discs. This helps in multiple ways. If the fight goes longer than the duration of Heel disc, it will start another disc. If heel was down from a previous fight, it will burn with a different disc. This way we always blow something on a named unless NOTHING is up.
holyshit7=If mob is debuffed by synergy, over 40% hp and you have palm, ironfist, or heel up - cast Crane stance. This makes sure we maximize the burst damage from Crane without wasting it.
holyshit8=If target is named blow FPP
holyshit9=If you're using speedfocus, ironfist, or heel disc use tiger's balance.
 
I'll throw my hat out for a more specific example.

I'm having trouble getting a specific downshit to work.

downshit14=/if (!${Me.CombatState.Equal[COMBAT]} && !${Me.Buff[Revival Sickness]} && ${Me.PctMana}<60 && ${Me.SpellReady[Bucolic Harvest]}) /cast 10

It will attempt to spam bucolic harvest even when the spell gem is not ready. I'm sure it's just formating or I'm missing something. I have noticed in some holy/downs I've seen people using Bool alot. What does the Bool function do to assist in holy/downs.



After thinking about it, do you have the base spell for Bucolic Harvest or Rk. II? If you have Rk. II, it's possible that MQ is seeing Bucolic Harvest (base spell) as ready to cast since you have Rk. II and the Rk. II is on cooldown. I highly recommend using .RankName for your spells/discs when doing holies, so they're able to be copy/pasted and will last through upgrading to different ranks. You could try out:
Rich (BB code):
downshit14=/if (!${Me.CombatState.Equal[COMBAT]} && !${Me.Buff[Revival Sickness]} && ${Me.PctMana}<60 && ${Me.SpellReady[${Spell[Bucolic Harvest].RankName}]}) /cast 10
 
need to either use .RankName or put the rank in the spell name, last I knew.

You may be thinking of buff icons, where a partial spelling allows you to not need rank name (since rank one will be the partial spelling of rank 2 and 3)

But then.. I just tinker with stuff and spend way to much time posting =)
 
Ok, I'm thinking of KissAssist; iirc KA now auto-handles ranks in [BUFFS] and [DPS]. A quick search does not bring up anything that allows me to verify...

Rich (BB code):
01 Oct 2015 by EqMule
- Please don't use MQ2 for unattended gameplay (afk botting)
- Fixed a bunch of POSIX stuff
- Made sure Target.Buff and Target.BuffDuration now works on spells without having to specify Rank

So yep on Buff/BuffDuraion.

But I was mistaken on shits.

When checking if its ready, and because the ID numbers for discs/abilities are different for each rank, we still need to specify rank both in the various checks, as well as account for rank for the firing:
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})
holyshit1=/if ((${Me.CombatAbilityReady[Phantom Aggressor]} || ${Me.CombatAbilityReady[Phantom Aggressor RK. II]}) && !${Me.ActiveDisc.ID} && ${Target.PctHPs}<100) /multiline ; /disc 40013 ; /disc 40012 ; /echo * SHITS Phantom Aggressor Fired *

I only did that so both da Man and I could both use the same shit. I have not deigned to get the rank II on all my tanks...
 
You can use RankName to simplify that in the future:

Rich (BB code):
/if (${Me.CombatAbilityReady[${Spell[Phantom Aggressor].RankName}]} && !${Me.ActiveDisc.ID} && ${Target.PctHPs}<100) /multiline ; /disc ${Spell[Phantom Aggressor].RankName}) ; /echo * SHITS Phantom Aggressor Fired *

Not a huge deal, but can make things easier if you're trying to make holies that are compatible across toons.
 
Super, I will use that, thx!

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.

RankName is definitely a game changer.

[EDIT]

And a quick search thru KissAssist.mac reveals yes, that is how it now handles the various ranks without the need to specify.

Not sure how I missed that, da Man and I have spent considerable effort in getting our tanks optimized.
 
I thought the need to isolate ranks had been eliminated, even in shits.

That would be awesome if it's the case for shits. I only found out about Kiss doing that a few days ago haha.

edit: nvm I didn't keep reading... derp. .Rankname is still awesome.
 
Request - Holy/Down Help

Users who are viewing this thread

Back
Top
Cart