• 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

Automatically use your clicky buffs - works with any macro, including KISS

PeteSampras

Active member
Joined
Mar 18, 2012
RedCents
2,143¢
Slight Caveat, it *will* work with vanilla compile in the coming days. EQMule is going to add in a bunch of cases in the next compile, or soon, once he does, you can take advantage of this routine to automatically use the best available clicky buff on you for each type. You can modify which buffs you want, by class, if you so choose. It is pretty obvious in the code how to do that. You can make this an #include, or toss it into any macro you have.

The cases he needs to add to make this work are Spell[].Base and Spell[].Rank, both of which he said he checked out and was adding. If for some reason he forgets, I will repost them for him to add and it may delay this working until then. I just wanted to post it while I was working on something related to it.

if using as include:
Step 1:
#include name_of_file.inc

Step 2: somewhere before your mainloop (optional, default is FALSE and will ignore clickies in your bags, set to TRUE it checks your bags)
/declare IgnoreClickyBuffsInBags bool outer FALSE


Somewhere in your main loop:
/call CastAutoClickies

Rich (BB code):
Sub CastAutoClickies
/if (${Defined[CurrentSub]}) /varset CurrentSub CastAutoClickies
/if (!${Defined[AutoClickiesLoad]}) /call CastAutoClickiesLoad
/call CastDoClickies
/if (${FindItem[Chalandria's Fang].ItemSlot} && !${FindItem[Chalandria's Fang].Timer}) {
		/if (${Me.HaveExpansion[Veil of Alaris]} && ${Me.Subscription.Equal[GOLD]}) /useitem ${FindItem[=Chalandria's Fang].ItemSlot} ${FindItem[=Chalandria's Fang].ItemSlot2}
		/if (!${Me.HaveExpansion[Veil of Alaris]}) /casting "Chalandria's Fang"|item
		/delay 1s
		/autoinventory
		}
/return


Sub CastAutoClickiesLoad
/if (${Defined[CurrentSub]}) /varset CurrentSub CastAutoClickiesLoad
/if (${AutoClickiesLoaded}) /return
/if (!${Defined[AutoClickiesLoad]}) /declare AutoClickiesLoad int outer 1
/if (!${Defined[IgnoreClickyBuffsInBags]}) /declare IgnoreClickyBuffsInBags bool local TRUE
/declare iBuffTotal int local 17
/declare ClickyArray[${iBuffTotal},4] string outer 0
/declare sBuff1 string local Ancestral Memories
/declare sBuffClass1 string local |BER|BST|BRD|MNK|PAL|RNG|ROG|SHD|WAR|
/declare sBuff2 string local Taelosian Guard
/declare sBuffClass2 string local |BER|BST|BRD|MNK|PAL|RNG|ROG|SHD|WAR|
/declare sBuff3 string local Might of Stone
/declare sBuffClass3 string local |BER|BST|BRD|MNK|PAL|RNG|ROG|SHD|WAR|
/declare sBuff4 string local Form of Defense
/declare sBuffClass4 string local |PAL|SHD|WAR|
/declare sBuff5 string local Prismatic Ward
/declare sBuffClass5 string local |BER|BST|BRD|CLR|DRU|ENC|MAG|MNK|NEC|PAL|RNG|ROG|SHD|SHM|WAR|WIZ|
/declare sBuff6 string local Form of Endurance
/declare sBuffClass6 string local |BER|BST|BRD|CLR|DRU|ENC|MAG|MNK|NEC|PAL|RNG|ROG|SHD|SHM|WAR|WIZ|
/declare sBuff7 string local Myrmidon's Skill
/declare sBuffClass7 string local |BER|BST|BRD|CLR|DRU|ENC|MAG|MNK|NEC|PAL|RNG|ROG|SHD|SHM|WAR|WIZ|
/declare sBuff8 string local Knowledge of the Past
/declare sBuffClass8 string local |BST|CLR|DRU|ENC|MAG|NEC|PAL|RNG|SHD|SHM|WIZ|
/declare sBuff9 string local Soothing Breath
/declare sBuffClass9 string local |BST|CLR|DRU|ENC|MAG|NEC|PAL|RNG|SHD|SHM|WIZ|
/declare sBuff10 string local Illusionary Spikes
/declare sBuffClass10 string local |
/declare sBuff11 string local Geomantra
/declare sBuffClass11 string local |
/declare sBuff12 string local Expanding Mind
/declare sBuffClass12 string local |BST|CLR|DRU|ENC|MAG|NEC|PAL|RNG|SHD|SHM|WIZ|
/declare sBuff13 string local Symphony of Battle
/declare sBuffClass13 string local |BRD|
/declare sBuff14 string local Twitching Speed
/declare sBuffClass14 string local |BER|BST|MNK|PAL|RNG|ROG|SHD|WAR|
/declare sBuff15 string local Aura of Pure Arcanum
/declare sBuffClass15 string local |BER|BST|BRD|CLR|DRU|ENC|MAG|MNK|NEC|PAL|RNG|ROG|SHD|SHM|WAR|WIZ|
/declare sBuff16 string local Aura of Rage
/declare sBuffClass16 string outer |BER|BST|MNK|PAL|RNG|ROG|SHD|WAR|
/declare sBuff17 string outer Ancient Flames
/declare sBuffClass17 string outer |BER|BST|BRD|CLR|DRU|ENC|MAG|MNK|NEC|PAL|RNG|ROG|SHD|SHM|WAR|WIZ|

/declare BuffRank string local , I , II , III , IV , V , VI , VII , VIII , IX , X , XI , XII , XII , XIV , XV , XVI , XVII , XVIII , XIX , XX , XXI , XXII , XXIII , XXIV , XXV , XXVI , XXVII , XXVIII , XXIX , XXX ,
|/call CastGetEquipment

/declare sTempName string local
/declare i int local
/declare iSlot int local
/declare iItemNum int local
/declare sItemName string local
/declare iClickyRank int local
   	/for iSlot 1 to 32
	|top level inventory
	/if (${InvSlot[${iSlot}].Item.Name.NotEqual[NULL]}) {
			/varset sItemName ${InvSlot[${iSlot}].Item.Spell.Name}
			/if (${sItemName.NotEqual[NULL]} && ${InvSlot[${iSlot}].Item.EffectType.Find[Click]} && ${Me.Level}>=${Me.Inventory[${iSlot}].RequiredLevel} && ${Me.Inventory[${iSlot}].Class[${Me.Class}].Name.Equal[${Me.Class}]} && (!${Me.Inventory[${iSlot}].Attuneable}||${Me.Inventory[${iSlot}].Attuneable} && ${Me.Inventory[${iSlot}].NoDrop})) {
			/for i 1 to ${iBuffTotal} {
				
				/if (${Me.Inventory[${iSlot}].Spell.Name.Find[${sBuff${i}}]} && (${Me.Subscription.Equal[GOLD]}||!${Me.Inventory[${iSlot}].Item.Prestige})) {
						/if (${Me.Inventory[${iSlot}].Spell.Name.Equal[${sBuff${i}}]}) {
							/varset iClickyRank 26
							/goto :skipii
							}
						/varcalc iClickyRank ${Me.Inventory[${iSlot}].Spell.Rank}+1
						:skipii	
						/if (${sBuffClass${i}.Find[${Me.Class.ShortName}]} && ${iClickyRank}>${ClickyArray[${i},4]}) {
							/varset ClickyArray[${i},1] 1
							/varset ClickyArray[${i},2] ${Me.Inventory[${iSlot}].Spell}
							/varset ClickyArray[${i},3] ${Me.Inventory[${iSlot}]}
							/varset ClickyArray[${i},4] ${iClickyRank}
						}
					}
				}
			/next i
			}			
		}
	/if (!${IgnoreClickyBuffsInBags}) {
	|Bag inventory
      	/if (${InvSlot[${iSlot}].Item.Container}>0) {
         /for iItemNum 1 to ${InvSlot[${iSlot}].Item.Container}
            /if (${Me.Inventory[${iSlot}].Item[${iItemNum}].ID} && ${Me.Inventory[${iSlot}].Item[${iItemNum}].Spell.ID} && ${Me.Inventory[${iSlot}].Item[${iItemNum}].CastTime} && ${Me.Inventory[${iSlot}].Item[${iItemNum}].WornSlots} && ${Me.Level}>=${Me.Inventory[${iSlot}].Item[${iItemNum}].RequiredLevel} && ${Me.Inventory[${iSlot}].Item[${iItemNum}].Class[${Me.Class}].Name.Equal[${Me.Class}]} && ${Spell[${Me.Inventory[${iSlot}].Item[${iItemNum}].Spell}].Duration}>50 && (!${Me.Inventory[${iSlot}].Item[${iItemNum}].Attuneable}||${Me.Inventory[${iSlot}].Item[${iItemNum}].Attuneable} && ${Me.Inventory[${iSlot}].Item[${iItemNum}].NoDrop}) && (${Me.Subscription.Equal[GOLD]}||!${Me.Inventory[${iSlot}].Item[${iItemNum}].Prestige})) {
			/for i 1 to ${iBuffTotal} {
				/if (${Me.Inventory[${iSlot}].Item[${iItemNum}].Spell.Name.Find[${sBuff${i}}]}) {
						/if (${Me.Inventory[${iSlot}].Item[${iItemNum}].Spell.Name.Equal[${sBuff${i}}]}) {
							/varset iClickyRank 26
							/goto :skipiii
						}
						/varcalc iClickyRank ${Me.Inventory[${iSlot}].Spell.Rank}+1
						:skipiii
						/if (${sBuffClass${i}.Find[${Me.Class.ShortName}]} && ${iClickyRank}>${ClickyArray[${i},4]}) {
							/varset ClickyArray[${i},1] 1
							/varset ClickyArray[${i},2] ${Me.Inventory[${iSlot}].Item[${iItemNum}].Spell}
							/varset ClickyArray[${i},3] ${Me.Inventory[${iSlot}].Item[${iItemNum}].Name}
							/varset ClickyArray[${i},4] ${iClickyRank}
							|/echo ${Me.Inventory[${iSlot}].Item[${iItemNum}].Name} - ${Me.Inventory[${iSlot}].Item[${iItemNum}].Spell}
						}
					}
				}
			/next i
            		}
         	/next iItemNum
	}
	}
	/next iSlot


|/call CastCalculateBest
|Soothing vs KotP

/if (${ClickyArray[9,1]} && ${ClickyArray[8,1]}) {
	/if (${Spell[${ClickyArray[8,2]}].Base[8]}>${Spell[${ClickyArray[9,2]}].Base[8]}) {
		/varset ClickyArray[9,1] 0
		|/echo ${ClickyArray[8,2]} is best
		} else {
		/varset ClickyArray[8,1] 0
		|/echo ${ClickyArray[9,2]} is best
		}
}

|FoD vs Pris Ward

/if (${ClickyArray[4,1]} && ${ClickyArray[5,1]}) {
	/if (${Spell[${ClickyArray[4,2]}].Base[10]}>${Spell[${ClickyArray[5,2]}].Base[10]}) {
		/varset ClickyArray[5,1] 0
		|/echo ${ClickyArray[4,2]} is best
		} else {
		/varset ClickyArray[4,1] 0
		|/echo ${ClickyArray[5,2]} is best
	}
}
|Taelosian vs AM
/if (${ClickyArray[2,1]} && ${ClickyArray[1,1]}) {
	/if (${Spell[${ClickyArray[1,2]}].Base[1]}>${Spell[${ClickyArray[2,2]}].Base[1]}) {
		/varset ClickyArray[2,1] 0
		|/echo ${ClickyArray[1,2]} is best
		} else {
		/varset ClickyArray[1,1] 0
		|/echo ${ClickyArray[2,2]} is best
	}
}
|ACoF
/if (${ClickyArray[17,1]} && ${ClickyArray[1,1]}||${ClickyArray[17,1]} && ${ClickyArray[2,1]}) {
		/varset ClickyArray[2,1] 0
		/varset ClickyArray[1,1] 0
}

/return



Sub CastDoClickies
/if (${Me.Hovering}||!${MMOBugs.FreeBuffs} && ${MMOBugs}||${Me.Casting.ID} && !${Me.Class.ShortName.Equal[BRD]}) /return
/if (${Defined[CurrentSub]}) /varset CurrentSub CastDoClickies
/declare i int local
/for i 1 to ${iBuffTotal}
/if (${ClickyArray[${i},1]} && ${Spell[${ClickyArray[${i},2]}].Stacks} && !${Me.Buff[${ClickyArray[${i},2]}].ID} && (!${Me.Invis}||${AutoBreakInvis} && ${AutoInvis}) && !${Me.Sitting} && (!${Me.Moving}||${Me.Class.ShortName.Equal[BRD]}) && (!${Me.Song[Commanding Voice].ID} && !${Me.Buff[Commanding Voice].ID} && !${Me.Song[Guardian Circle I Effect].ID} && !${Me.Song[Guardian Circle II Effect].ID} && !${Me.Song[Guardian Circle III Effect].ID}||${i}!=7)) {
	/if (${Me.Hovering}||!${MMOBugs.FreeBuffs} && ${MMOBugs}||${Me.Casting.ID} && !${Me.Class.ShortName.Equal[BRD]}) /return
	/if (${Twist.Twisting}) {
		/declare twisttemp bool local
		/twist off
		/delay 2
		}
	/if (${FindItem[${ClickyArray[${i},3]}].EffectType.Equal[Click Inventory]} && ${Me.HaveExpansion[Veil of Alaris]} && (${Me.Subscription.Equal[GOLD]}||${FindItem[=${ClickyArray[${i},3]}].InvSlot}<33)) /useitem ${FindItem[=${ClickyArray[${i},3]}].ItemSlot} ${FindItem[=${ClickyArray[${i},3]}].ItemSlot2}
	/if (${FindItem[${ClickyArray[${i},3]}].EffectType.Equal[Click Worn]}||!${Me.HaveExpansion[Veil of Alaris]}||${Me.Subscription.NotEqual[GOLD]}) /casting "${ClickyArray[${i},3]}"|item
	/delay 1s ${Me.Casting.ID}
	/if (${Plugin[mq2cecho].Name.Equal[mq2cecho]}) /cechob \au${ClickyArray[${i},3]} \aw--> ${ClickyArray[${i},2]}
	/if (!${Plugin[mq2cecho].Name.Equal[mq2cecho]}) /echo ${ClickyArray[${i},3]} --> ${ClickyArray[${i},2]}
	/delay 10s !${Me.Casting.ID}
	/if (${twisttemp}) /twist on
	}
/next i
/return

And tada, you no longer have to add any of those standard buffs to any of your macros ever again. As you can see above, Geomantra and Damage shield click are set off by default due to so many class stacking issues, you can add classes to that if you want to.

I already have been using this daily for year(s) now, but once .Base and .Rank are added to the compile in the near future (thinking this week sometime), it will work for you, until then just patiently wait.
 
Last edited:
oh my maskoi you gonna add this to kiss by default it has awesome sauce written on it lol
 
Still needs to be exorcised um I mean edited .

Rich (BB code):
!${MMOBugs.FreeBuffs} && ${MMOBugs}||

download.jpg

Thanks for sharing
 
I replied on the thread there, you need to add this function into mq2datatypes.cpp, i wasnt sure which case you were using that had .EndsWith. I am guessing .Rank.

Rich (BB code):
bool EndsWith (std::string const &fullString, std::string const &ending)
{
    if (fullString.length() >= ending.length()) {
        return (0 == fullString.compare (fullString.length() - ending.length(), ending.length(), ending));
    } else {
        return false;
    }
}

The Otherguys TLO can stay in, as it returns FALSE if you dont have it and completes the cycle. That check ensures those that are using it dont try to chain cast a buff they cant possibly land. I wanted to add that buff check straight into .Stacks but didnt. If the compile here has a similar functionality to see if you have free buffs, i can write that into the line of code. This script is almost 2 years old now so I am sure it is a bit rougher than it needs to be, but it was one of those "if it aint broke dont fix it" deals for me.

- - - Updated - - -

Btw, if you use /plugin mq2cecho, it will announce them in blue, you can change that to whatever color you want. from \ab. I almost always have color echos in my macs and I try to make buffs beneficial stuff blue, pink, white, teal and bad stuff yellow/red/orange for announcing purposes so that I can easily see what is going on without really having to read the lines. Purple gets used on AAs since those can go either way, and green is usually lifetaps or snares. Bunch of red = im nuking something. But of teal = I am healing. Bunch of white = im buffing. WTB more colors. Anyway, just letting you know the option exists.
 
Last edited by a moderator:
Yaaaaaaaaa. We don't have permission to use his stuff. He has a psychotic episode when ever my name is mentioned. Plus if you use any of his plugins he will hack your EQ and WoW accounts. LMAO.

mhword.jpg
 
That would be your arch enemy you would need to thank. It is going in the core code anyway though, so i wouldnt worry about not using it. Actually the new compile is out, it might already be in it if EQMule had the chance to add it. If not it may be in next patch.
 
Rank was not added. Base and Base2 were.

I will gladly use his code. His skills were never in question just his mental stability.
 
Ok, i saw a couple more TLO/members that wouldnt be in vanilla compile (Me.VOA), and a missing "." for overhaste. I changed those to standard vanilla stuff. Maybe that will resolve it not working for you, Maskoi.
 
Automatically use your clicky buffs - works with any macro, including KISS

Users who are viewing this thread

Back
Top
Cart