Macro Bot.mac Updates and Bug Fixes by [40oz]

There is a bug in the pulling string. I haven't been able to solve it yet but the character will run out to pull but as soon as it aggros a mob, the toon turns around as if to run back and then just stands there. If I come up with a fix, I will post it.

Running the new macro code? I've not had a chance to test pulling yet.

Yes, running the last one posted here. I've noticed quite a few minor issues. I usually only run it on my puller.

I have bard rest set to twist 3 5 or switch it to 5 3, either way he only plays song 3.

When I manually bring him back to camp after the failed pull, he plays the rest song (not songs) and as soon as mob is in camp attacks, even though he is set to attack at 97%, only once he starts to attack does he play the combat songs, not a huge big deal but he used to play them right when he came back to camp.

He also doesn't assist at all anymore, just attacks whatever mob he has targetted. Even though assists are all set the same as pre-patch.

I've tried a few fixes but no real success so far.

Also, what is /call interrupt pointing to? I can't find any subroutine with that label.
 
There is a bug in the pulling string. I haven't been able to solve it yet but the character will run out to pull but as soon as it aggros a mob, the toon turns around as if to run back and then just stands there. If I come up with a fix, I will post it.

Running the new macro code? I've not had a chance to test pulling yet.

Yes, running the last one posted here. I've noticed quite a few minor issues. I usually only run it on my puller.

I have bard rest set to twist 3 5 or switch it to 5 3, either way he only plays song 3.

When I manually bring him back to camp after the failed pull, he plays the rest song (not songs) and as soon as mob is in camp attacks, even though he is set to attack at 97%, only once he starts to attack does he play the combat songs, not a huge big deal but he used to play them right when he came back to camp.

He also doesn't assist at all anymore, just attacks whatever mob he has targetted. Even though assists are all set the same as pre-patch.

I've tried a few fixes but no real success so far.

Also, what is /call interrupt pointing to? I can't find any subroutine with that label.

Ah, I've not looked at bard section at all, other than trying to turn it on on my bard and having it spam errors.

Sub interrupt is in spell_routines.inc
 
I am back in action with the old maco thanks to the forked build. However, I have noticed a bug in my shaman macro. It says I don't have the Languid Bite AA, when I absolutely do and it is enabled. Can someone check on this in the process of fixing everything else? Thanks.
 
I am back in action with the old maco thanks to the forked build. However, I have noticed a bug in my shaman macro. It says I don't have the Languid Bite AA, when I absolutely do and it is enabled. Can someone check on this in the process of fixing everything else? Thanks.

Its a passive AA that you turn on or off..... you don't need bot40.mac to use it at all. So there is no need for it to be in your ini.
 
Fixed load section for undeclared variables, tested on 3 toons, will test further later

I am having an issue with Auras, not sure of the fix yet

Code:
[2017/09/29 05:44:53] No such 'string' member 'Name'
[2017/09/29 05:44:53] bot40.mac@4003 (Aura): /if (${Me.Aura[1].Name.Length} && !${Me.AltAbility[Spirit Mastery]} && !${Me.AltAbility[Auroria Mastery]}||${Me.Aura[2].Name.Length}||${AuraDelay}||${NeedLoad}) /return
[2017/09/29 05:44:53] bot40.mac@405 (Rest): /call ${RestRoutines.Arg[${i},|]}
[2017/09/29 05:44:53] bot40.mac@248 (Main(string Param0, string Param1)): /call Rest

Relevant line
Code:
/if (${Me.Aura[1].Name.Length} && !${Me.AltAbility[Spirit Mastery]} && !${Me.AltAbility[Auroria Mastery]}||${Me.Aura[2].Name.Length}||${AuraDelay}||${NeedLoad}) /return

My brain is fried, so I am not sure how to fix this currently. Everything is NULL, even when I have the Warriors aura active on the toon.
 

Attachments

  • bot40.mac
    505.4 KB · Views: 6
Fixed load section for undeclared variables, tested on 3 toons, will test further later

I am having an issue with Auras, not sure of the fix yet

Code:
[2017/09/29 05:44:53] No such 'string' member 'Name'
[2017/09/29 05:44:53] bot40.mac@4003 (Aura): /if (${Me.Aura[1].Name.Length} && !${Me.AltAbility[Spirit Mastery]} && !${Me.AltAbility[Auroria Mastery]}||${Me.Aura[2].Name.Length}||${AuraDelay}||${NeedLoad}) /return
[2017/09/29 05:44:53] bot40.mac@405 (Rest): /call ${RestRoutines.Arg[${i},|]}
[2017/09/29 05:44:53] bot40.mac@248 (Main(string Param0, string Param1)): /call Rest

Relevant line
Code:
/if (${Me.Aura[1].Name.Length} && !${Me.AltAbility[Spirit Mastery]} && !${Me.AltAbility[Auroria Mastery]}||${Me.Aura[2].Name.Length}||${AuraDelay}||${NeedLoad}) /return

My brain is fried, so I am not sure how to fix this currently. Everything is NULL, even when I have the Warriors aura active on the toon.

Yeah. I got that error too. But auras were still working regardless. So i didnt look at them.

Im gonna give mez section a go on the weekend i think.
 
Fixed load section for undeclared variables, tested on 3 toons, will test further later

I am having an issue with Auras, not sure of the fix yet

Code:
[2017/09/29 05:44:53] No such 'string' member 'Name'
[2017/09/29 05:44:53] bot40.mac@4003 (Aura): /if (${Me.Aura[1].Name.Length} && !${Me.AltAbility[Spirit Mastery]} && !${Me.AltAbility[Auroria Mastery]}||${Me.Aura[2].Name.Length}||${AuraDelay}||${NeedLoad}) /return
[2017/09/29 05:44:53] bot40.mac@405 (Rest): /call ${RestRoutines.Arg[${i},|]}
[2017/09/29 05:44:53] bot40.mac@248 (Main(string Param0, string Param1)): /call Rest

Relevant line
Code:
/if (${Me.Aura[1].Name.Length} && !${Me.AltAbility[Spirit Mastery]} && !${Me.AltAbility[Auroria Mastery]}||${Me.Aura[2].Name.Length}||${AuraDelay}||${NeedLoad}) /return

My brain is fried, so I am not sure how to fix this currently. Everything is NULL, even when I have the Warriors aura active on the toon.


Just looked into the Auras (After a bit of debugging the fact that the INI doesn't automatically populate the needed keys!) I do not get an error. It may be related to the INI. But I cannot be certain.

It was tested on a Berserker. If while running the macro I copy and paste the above mentioned lined into a /echo I get

Code:
[2017/09/29 15:15:39] [MQ2] (14 && !NULL && !NULL||NULL||0||FALSE)

Where 14 is the integer length of my Aura (while it's present on me) first and second !NULL is for the random check of two static AltAbilities which are presumed to help with or conflict with Aura's. The NULL is the check for a second Aura which I don't use/have on me, Next is ${AuraDelay} which is hard coded into the macro, and finally a check for ${NeedLoad} which is arbitrarily /declare NeedLoad bool outer FALSE near the start of the macro, making this check quite useless as best I can tell.

Thus the Syntax is correct, everything that should return a value does. The issue must lie in the INI unless I'm missing more information. However I have traced all relevant TLO's and variables and everything comes back good.




The below information is missing INI entries on first start. Found in the log file for bot40. This makes it a PITA for new players to get going.

Additionally, when I tried to use this Macro for the first time I didn't realize that I needed to provide an assist target as a parameter, and as a way of confusing me the app told me to edit the INI entry (which wasn't present) and I added AssistPC=${Me.Name} to get the macro going but it wasn't even being read from the INI. Please consider changing this information.

The below is found on line 600. Which is found in the load sub. Recommend changing to reflect that it is a parameter and not an INI entry.
Code:
No AssistPC identified.  Assign one in Bot_character_server_Berserker.ini, or restart the mac using this template: /mac bot PeteSampras

IE:
Code:
No AssistPC identified. You must supply the PC you wish to assist as a parameter when launching the macro. Example: /mac bot40 Asmallchild


Code:
[09/29/2017 14:57:34] Berserker -  [ClickyNuke] ClickyNukeRecast1= is missing or not filled out correctly
[09/29/2017 14:57:34] Berserker -  [ClickyNuke] ClickyNukeName2= is missing or not filled out correctly
[09/29/2017 14:57:35] Berserker -  Protip: Consider editing [Combat] CombatFrequency5= to boost macro speed
[09/29/2017 15:08:43] Berserker -  You are set to pull but have [Pulling] PullSkillName1=  blank
[09/29/2017 15:08:43] Berserker -  [Aura] AuraSpellName1= is missing or not filled out correctly
[09/29/2017 15:08:43] Berserker -  [Aura] AuraName1= is missing or not filled out correctly
[09/29/2017 15:08:43] Berserker -  [Aura] AuraSpellGem1= is missing or not filled out correctly
[09/29/2017 15:08:43] Berserker -  [Buff] BuffSpellName1= is missing or not filled out correctly
[09/29/2017 15:08:43] Berserker -  [Buff] BuffSpellIcon1= is missing or not filled out correctly
[09/29/2017 15:08:43] Berserker -  [Buff] BuffSpellGem1= is missing or not filled out correctly
[09/29/2017 15:08:43] Berserker -  [Buff] BuffAlias1= is missing or not filled out correctly
[09/29/2017 15:08:43] Berserker -  ClickyNukeTotal=0 -- You wont use this section, consider removing section from [Settings] OptionsCheck=

Note: I changed ClickyNukeTotal to 0 from the initial 2 because it was spam casting my chestpiece (but it never actually fired, so it was ready, but it was failing to produce a command that actually casted it)


Please make note of the follow change needed in Sub Fade on line 6140. This could possibly be throughout this macro.

Code:
/for i 1 to ${FadeTotal}
		/if (!${FadeUse${i}}) /next i [B][I][U]CHANGE TO /CONTINUE or /BREAK[/U][/I][/B]
		/if (${${CurrentSub}Conditions${i}.NotEqual[123456]}) /varset FadeConditions${i} ${Ini[Bot_${Me.CleanName}_${MacroQuest.Server}_${Me.Class}.ini,Fade,FadeConditions${i},123456]}
		/if (${Range.Between[0,${FadeUseAtMyHP${i}}:${Me.PctHPs}]} && ${FadeConditions${i}} && ${Me.AltAbilityReady[${FadeSpellName${i}}]}) {
			/if (${Twisting}) /twist stop
			/attack off
			/if (${${CurrentSub}Announce} && ${AnnounceChannel.NotEqual[NULL]}) /docommand /${AnnounceChannel} ${${CurrentSub}SpellName${i}} --> FADING
			/call ClearTarget
			/call ClearAttack
			/alt act ${Me.AltAbility[${FadeSpellName${i}}].ID}
			/if (${OptionsCheck.Find[FeignDeath]}) /varset FDAggro TRUE
		}
	/next i


Line 6181 - Chang to /continue

Code:
	/if (!${${CurrentSub}Use${i}}) /next i

Line 8228 - Chang to /continue

Code:
		/if (!${${CurrentSub}Use${i}}) /next i


Line 7729 - This is in the Mez section. Also needs to be changed to /continue
Code:
				/if (${MezTimer${MezList.Arg[${m},|]}}>6) /next m


Never mind. I'll just fix this stuff myself...lol - There's 251 instances of /next, but not all have /next issues with the change. I'll make the changes based on what I think it should do. IE: /continue or /break
 
Last edited:
Code:
** 2017-09-29 - Chatwiththisname
 **		- Changed lines 1955, 3366, 5529, and 7740 to /continue from /next var 
 **		  as needed as per fix by eqmule /next mid /for loop does 
 **		  NOT work and will fail to iterate through the loop. 
 **		- Change to when no AssistPC (Param0) is used/defined
 **		  to reflect proper fix instead of referencing INI


Changes as listed. The fix for /next to /continue found itself in various subs. One of them was the Mez sub which may fix an issue chanters were having as it was not iterating through the for loop.

Code:
/for i 1 to ${MezTotal}
 		/if (${mezcnt} && (${Me.SpellReady[${MezSpellName${i}}]} && ${Me.CurrentMana}>${Spell[${MezSpellName${i}}].Mana}||${Me.AltAbilityReady[${MezSpellName${i}}]}) && ${MezUse${i}}) {
			/for m 1 to ${MezList.Count[|]}
				/if (${MezTimer${MezList.Arg[${m},|]}}>6) /continue [B][I][U]WAS NEVER GETTING PAST THIS LINE[/U][/I][/B]
				/if ((!${Defined[MezTimer${MezList.Arg[${m},|]}]}||${Defined[MezTimer${MezList.Arg[${m},|]}]} && !${MezTimer${MezList.Arg[${m},|]}}) && ${MezList.Arg[${m},|]}!=${TarID} && ${MezList.Arg[${m},|]}>0 && ${Spawn[id ${MezList.Arg[${m},|]}].ID} && ${Spawn[id ${MezList.Arg[${m},|]}].Distance}<=${AttackRange}) {
					/squelch /tar id ${MezList.Arg[${m},|]}
					/delay 1s ${Target.ID}==${MezList.Arg[${m},|]}
					/call MezAdd "${MezSpellName${i}}" "${MezSpellGem${i}}" ${MezList.Arg[${m},|]}
					/if (${mezcnt}) /goto :refreshmez
				}
			/next m
		}
	/next i

After reviewing the way the INI entries are all over the place, as opposed to being checked for a value and if not present create it with some default value, I decided I didn't want to mess about with it. I could have hunted down each section and tracked down where it would be best suited to be located based on the current structure but I digress. I figure 40oz would have a better idea as to where to put that information.
 

Attachments

  • bot40.mac
    505.8 KB · Views: 13
Last edited:
Thank you for the post. Your detailed example and explanation are great. I have never seen a /next used like that. I can see why it could be using the old parser.
 
Thank you for the post. Your detailed example and explanation are great. I have never seen a /next used like that. I can see why it could be using the old parser.

There was a lengthy discussion about the way /next is handled being changed a while back. Even the old parser may have issues.

When a /for loop is used it reads the very first /next for that variable.

If you want to bypass that index of the variable you use /continue to skip directly to the next index.
I'm not entirely sure how it handles nested for loops as in this case where you are in a for i loop and a for m loop. Which index is it continuing past? the m or the i? Eitherway, I suppose it's possible that it reaches the end goal all the same, albiet less efficiently. It is possible that in this case the desire is to /break (out of the m loop) and force a /next i. If no change to the mez routine or it seems slow it is likely this is intended as a /break from the m, which would cause a /next i.

If you want to stop checking all together you would use /break to completely break out of the for loop.

So I could say

Code:
/if (!{Defined[WaitingReason]}) /declare Waiting string inner
/if (!{Defined[Waiting]}) /declare Waiting bool inner FALSE
:Waiting
/if (${XTarget[1].ID}) /call CombatSubThatIHaventMadeInThisExample
/for i 0 to ${Group}
	/if (${Group.Member[${i}].PctHps} < 50) {
		/varset WaitingReason "${Group.Member[${i}].Name}'s Health"
		/varset Waiting TRUE
		/break
	} else /varset Waiting FALSE
	/if (${Group.Member[${i}].PctMana} < 50) {
		/varset WaitingReason "${Group.Member[${i}].Name}'s mana."
                /varset Waiting TRUE
		/break
	} else /varset Waiting False
/next i

/if (${Waiting}) {
/echo Waiting for ${WaitingReason}
/delay 6s
/goto :Waiting
}

In this way instead of continuing the evaluate the loop it should immediately exit the for loop and check to see if ${Waiting} is true after any one of those two checks evaluates to true.

Where-as if I use /continue instead of /break it would continue to evaluate everyone in the group and in the end only the last member of the group matters because if they evaluate as FALSE on both health and mana then it would /varset Waiting FALSE and never stop to wait.

With that being said, it -appeared- that those lines needed to be changed to /continue. However it is possible that one of them may needed to be changed to /break for efficiency. Either way, the way it was coded was using /next var as a /continue, the /break option adds some possibilities.
 
Last edited:
13 downloads since my changes, but no feedback on what is still broken. I know that 40oz was traveling so I don't mind looking into fixing things as they are reported if they are within my ability.

Did the change fix chanter mez routines/Fade routines/ etc etc.
 
Im not into coding at all, but gives you some hints from the behaviour of CLE macros.

BUFF = OK
AA= OK
HEALSINGLE = OK
HEALGROUP = broken (not firing) --- Celestial Regenration, Beacon of Life, Syllabe of Convalescence used here
HEALSELF = broken (so far) --- Divine arbitration used here
NUKE = broken (not firing at all) --- Ardent contravention, Word of greater reformation, glorious judgement (i know it sounds weird, but using word as a nuke equals a full security for any named encountered... like spamming healing over and over, while heal single is used at the same time)
REZ= OK --- thx for the fix
XHEAL = OK

I dont use Fade or any others unlisted above so cant tell more.
Thx, Eyeswithoutaface.
Arph
 
The .ini sorry forgot.
XX is the name of the characters.
Arph


[Settings]
OptionsCheck=|Pulling|Merc|AA|Aura|Buff|Fade|Debuff|Dot|FightBuff|HealSingle|HealGroup|HealSelf|HealBalance|HealSplash|HealPet|MainTankBuff|Nuke|Rez|Root|SelfBuff|Snare|Stun|XHeal|Mana|
OptionsCheckRaid=|Pulling|Merc|AA|Aura|Buff|Fade|Debuff|Dot|FightBuff|HealSingle|HealGroup|HealSelf|HealBalance|HealSplash|HealPet|MainTankBuff|Nuke|Rez|Root|SelfBuff|Snare|Stun|XHeal|Mana|ModRod|

GMAction=/end
LootNPCs=FALSE
Verbose=FALSE
AnnounceChannel=bc
AnnounceEvents=TRY|CAST_SUCCESS|CAST_IMMUNE|CAST_RESIST
EQBCAnnounceAdds=FALSE
AutoHideNPCCorpses=FALSE
EmergencySkill=EmergencySkill
ImmunityCheck=FALSE
BotVersion=v2014.0617
UseCamp=FALSE
CampRadius=5
CampRadiusMax=100
RestrictedZones=344,202,151,345
MyChannel=bc

[Assist]
AssistType=3
AssistPC=XX
AssistAt=99
OpeningMove=/stand
AttackRange=100
AttackCommand=/attack on
AmIOffTank=FALSE
UseMelee=FALSE
UseArchery=FALSE
ArcheryMaxDistance=200
ArcheryMinDistance=35
BurnModeAlias=BurnModeAlias

[Follow]
FollowMethod=stick|30 tank
FollowCommand=FollowCommand
StopFollowCommand=StopFollowCommand
MoveUpCommand=MoveUpCommand

[ImHit]
ImHitTotal=0
ImHitAnnounce=FALSE
ImHitUse1=FALSE
ImHitSpellName1=
ImHitRecast1=1s
ImHitUseAtMyHP1=30
ImHitConditions1=
ImHitUse2=FALSE
ImHitSpellName2=
ImHitRecast2=1s
ImHitUseAtMyHP2=30
ImHitConditions2=
ImHitUse3=FALSE
ImHitSpellName3=
ImHitRecast3=1s
ImHitUseAtMyHP3=30
ImHitConditions3=

[Merc]
MercAssistAt=100

[AA]
AATotal=7
AAAnnounce=FALSE

AAUse1=TRUE
AASpellName1=Fundament: Second Spire of Divinity
AAUseAtMobPctHP1=99
AAStopAtMobPctHP1=5
AARecast1=1s
AANamedOnly1=TRUE
AAConditions1=

AAUse2=TRUE
AASpellName2=Healing Frenzy
AAUseAtMobPctHP2=99
AAStopAtMobPctHP2=5
AARecast2=1s
AANamedOnly2=TRUE
AAConditions2=

AAUse3=TRUE
AASpellName3=Flurry of Life
AAUseAtMobPctHP3=99
AAStopAtMobPctHP3=5
AARecast3=1s
AANamedOnly3=TRUE
AAConditions3=

AAUse4=TRUE
AASpellName4=Flurry of Life
AAUseAtMobPctHP4=99
AAStopAtMobPctHP4=5
AARecast4=1s
AANamedOnly4=TRUE
AAConditions4=

AAUse5=TRUE
AASpellName5=Bestow Divine Aura Beza
AAUseAtMobPctHP5=99
AAStopAtMobPctHP5=5
AARecast5=1s
AANamedOnly5=TRUE
AAConditions5=

AAUse6=TRUE
AASpellName6=Healing Frenzy
AAUseAtMobPctHP6=99
AAStopAtMobPctHP6=5
AARecast6=1s
AANamedOnly6=TRUE
AAConditions6=

AAUse7=TRUE
AASpellName7=Channeling the Divine
AAUseAtMobPctHP7=99
AAStopAtMobPctHP7=5
AARecast7=1s
AANamedOnly7=TRUE
AAConditions7=

[Aura]
AuraConditions=(!${Me.Moving} && !${Me.Invis})
AuraTotal=0
AuraAnnounce=FALSE
ForceMemAura=TRUE

AuraUse1=TRUE
AuraSpellName1=Aura of Divinity Rk. II
AuraSpellIcon1=Aura of Divinity Effect
AuraSpellGem1=gem8
AuraName1=Aura of Divinity
AuraConditions1=(!${Me.Moving} && !${Me.Invis})

AuraUse2=TRUE
AuraSpellName2=Aura of the Reverent Rk. II
AuraSpellIcon2=Aura of the Reverent Effect
AuraSpellGem2=gem8
AuraName2= Reverent Aura
AuraConditions2=(!${Me.Moving} && !${Me.Invis})

[Buff]
BuffXTargets=TRUE
BuffPets=FALSE
AutoInvis=FALSE
AutoBreakInvis=FALSE
InvisSpell=
InvisSpellGem=
InvisUndeadSpell=Innate Invis to Undead
InvisUndeadSpellGem=alt
LevitateSpell=
LevitateSpellGem=

BuffTotal=2
BuffAnnounce=FALSE
ForceMemBuff=TRUE
BuffConditions=(!${Me.Moving} && !${Me.Invis})

BuffUse1=TRUE
BuffSpellName1=Divine Guardian
BuffSpellIcon1=Divine Guardian Spirit II
BuffSpellGem1=alt
BuffClasses1=WAR
BuffConditions2=

BuffUse2=TRUE
BuffSpellName2=Unified Hand of Surety Rk. II
BuffSpellIcon2=Surety Rk. II
BuffSpellGem2=gem12
BuffClasses2=WAR, CLE
BuffConditions2=

BuffUse3=FALSE
BuffSpellName3=Shining Bulwark
BuffSpellIcon3=Shining Bulwark Rk. II
BuffSpellGem3=gem9
BuffClasses3=WAR
BuffConditions3=

BuffUse4=FALSE
BuffSpellName4=Anticipated Intercession
BuffSpellIcon4=Anticipated Intercession Rk. II
BuffSpellGem4=gem10
BuffClasses4=WAR
BuffConditions4=

[ClickyMaintenance]
doclickies=0
clickies=0

[ClickyNuke]
ClickyNukeTotal=1
ClickyNukeAnnounce=FALSE

ClickyNukeUse1=TRUE
ClickyNukeName1=Highwater Breastplate of the Light
ClickyNukeConditions1=
ClickyNukeSpellGem1=item
ClickyNukeRecast1=1s
ClickyNukeUseAtMobPctHP1=90
ClickyNukeStopAtMobPctHP1=1
ClickyNukeNamedOnly1=TRUE

[Fade]
FadeTotal=0
FadeAnnounce=FALSE

FadeUse1=FALSE
FadeSpellName1=
FadeUseAtMyHP1=5
FadeConditions1=

[Debuff]
DontDebuffConColor=|GREY|GREEN|
DebuffAdds=FALSE

DebuffTotal=0
DebuffTotalIfNamed=0
DebuffAnnounce=FALSE

DebuffUse1=TRUE
DebuffSpellName1=Mark of the Vicarum Rk. II
DebuffSpellGem1=gem11
DebuffUseAtMobPctHP1=99
DebuffStopAtMobPctHP1=1
DebuffRecast1=1s
DebuffMaxTries1=4
DebuffConditions1=!${Target.Buff[Mark of the Vicarum Rk. II].ID}

[GoM]
GoMTotal=0
GoMTotalIfNamed=0
GoMAnnounce=FALSE

GoMUse1=FALSE
GoMSpellName1=
GoMSpellIcon1=
GoMSpellGem1=

[Dot]
DotTotal=0
DotTotalIfNamed=0
ForceMemDot=FALSE
DotAnnounce=FALSE

DotUse1=FALSE
DotSpellName1=
DotSpellGem1=
DotUseAtMobPctHP1=96
DotStopAtMobPctHP1=30
DotRecast1=1s
DotMaxTries1=2
DotConditions1=

[FightBuff]
FightBuffTotal=0
ForceMemFightBuff=TRUE
FightBuffAnnounce=FALSE

FightBuffUse1=FALSE
FightBuffSpellName1=
FightBuffSpellIcon1=
FightBuffConditions1=
FightBuffSpellGem1=
FightBuffNamedOnly1=FALSE
FightBuffForAggro1=FALSE

FightBuffUse2=FALSE
FightBuffSpellName2=
FightBuffSpellIcon2=
FightBuffConditions2=
FightBuffSpellGem2=alt
FightBuffNamedOnly2=FALSE
FightBuffForAggro2=FALSE

[HealSingle]
HealPullerName=XX
HealPullerDist=50
HealSingleTotal=5
HealSingleAnnounce=FALSE
ForceMemHealSingle=TRUE

HealSingleUse1=TRUE
HealSingleSpellName1=Fifteenth Emblem Rk. II
HealSingleSpellGem1=gem2
HealSingleUseAt1=45
HealSingleStopAt1=50
HealSingleStopAtMobPctHP1=0
HealSingleRecast1=1s
HealSingleConditions1=

HealSingleUse2=TRUE
HealSingleSpellName2=Spiritual Remedy Rk. II
HealSingleSpellGem2=gem3
HealSingleUseAt2=90
HealSingleStopAt2=99
HealSingleStopAtMobPctHP2=0
HealSingleRecast2=1s
HealSingleConditions2=

HealSingleUse3=TRUE
HealSingleSpellName3=Ardent Light Rk. II
HealSingleSpellGem3=gem4
HealSingleUseAt3=90
HealSingleStopAt3=99
HealSingleStopAtMobPctHP3=0
HealSingleRecast3=1s
HealSingleConditions3=

HealSingleUse4=TRUE
HealSingleSpellName4=Focused Celestial Regeneration
HealSingleSpellGem4=alt
HealSingleUseAt4=65
HealSingleStopAt4=100
HealSingleStopAtMobPctHP4=0
HealSingleRecast4=1s
HealSingleConditions4=

HealSingleUse5=TRUE
HealSingleSpellName5=Burst of Life
HealSingleSpellGem5=alt
HealSingleUseAt5=45
HealSingleStopAt5=60
HealSingleRecast5=1s
HealSingleConditions5=

[HealGroup]
HealGroupTotal=3
HealGroupAnnounce=FALSE
ForceMemHealGroup=TRUE

HealGroupUse1=TRUE
HealGroupSpellName1=Celestial Regeneration
HealGroupSpellGem1=alt
HealGroupUseAt1=65
HealGroupStopAt1=69
HealGroupAvgHP1=65
HealGroupConditions1=

HealGroupUse2=TRUE
HealGroupSpellName2=Beacon of Life
HealGroupSpellGem2=alt
HealGroupUseAt2=65
HealGroupStopAt2=69
HealGroupAvgHP2=65
HealGroupConditions2=

HealGroupUse3=TRUE
HealGroupSpellName3=Syllabe of Convalescence Rk. II
HealGroupSpellGem3=gem1
HealGroupUseAt3=50
HealGroupStopAt3=69
HealGroupAvgHP3=60
HealGroupConditions3=

[HealSelf]

[HealBalance]
HealBalanceTotal=1
HealBalanceAnnounce=FALSE

HealBalanceUse1=TRUE
HealBalanceSpellName1=Divine Arbitration
HealBalanceSpellGem1=alt
HealBalanceUseAt1=65
HealBalanceStopAt1=69
HealBalanceConditions1=

[HealSplash]
HealSplashTotal=0
HealSplashAnnounce=FALSE

HealSplashUse1=FALSE
HealSplashSpellName1=
HealSplashSpellGem1=
HealSplashAvgHP1=60

[HealPet]
HealPetTotal=0
HealPetAnnounce=FALSE

HealPetUse1=FALSE
HealPetSpellName1=
HealPetSpellGem1=
HealPetUseAt1=50
HealPetStopAt1=90
HealPetRecast1=1s
HealPetConditions1=

[MainTankBuff]
DesignatedTank=XX
MainTankBuffTotal=3
MainTankBuffAnnounce=FALSE

MainTankBuffUse1=TRUE
MainTankBuffSpellName1=Focused Celestial Regeneration
MainTankBuffSpellGem1=alt
MainTankBuffUseAt1=79
MainTankBuffStopAt1=5
MainTankBuffNamedOnly1=FALSE
MainTankBuffRecast1=6m
MainTankBuffConditions1=

MainTankBuffUse2=TRUE
MainTankBuffSpellName2=Quiet Miracle
MainTankBuffSpellGem2=alt
MainTankBuffUseAt2=79
MainTankBuffStopAt2=5
MainTankBuffNamedOnly2=FALSE
MainTankBuffRecast2=10m
MainTankBuffConditions2=

MainTankBuffUse3=TRUE
MainTankBuffSpellName3=Burst of Life
MainTankBuffSpellGem3=alt
MainTankBuffUseAt3=50
MainTankBuffStopAt3=60
MainTankBuffNamedOnly3=FALSE
MainTankBuffRecast3=2m
MainTankBuffConditions3=

[Nuke]
NukeTotal=5
NukeTotalIfNamed=2
ForceMemNuke=TRUE
NukeAnnounce=FALSE

NukeUse1=TRUE
NukeSpellName1=Ardent Contravention Rk. II
NukeSpellGem1=gem7
NukeUseAtMobPctHP1=95
NukeStopAtMobPctHP1=1
NukeRecast1=1s
NukeConditions1=

NukeUse2=TRUE
NukeSpellName2=Word of Greater Reformation Rk. II
NukeSpellGem2=gem11
NukeUseAtMobPctHP2=85
NukeStopAtMobPctHP2=1
NukeRecast2=10s
NukeConditions2=

NukeUse3=TRUE
NukeSpellName3=Glorious Judgment Rk. II
NukeSpellGem3=gem6
NukeUseAtMobPctHP3=95
NukeStopAtMobPctHP3=1
NukeRecast3=1s
NukeConditions3=

NukeUse4=FALSE
NukeSpellName4=Sound of Thunder Rk. II
NukeSpellGem4=gem11
NukeUseAtMobPctHP4=95
NukeStopAtMobPctHP4=1
NukeRecast4=1s
NukeConditions4=

NukeUse5=FALSE
NukeSpellName5=Eradicate the Undead Rk. II
NukeSpellGem5=gem11
NukeUseAtMobPctHP5=65
NukeStopAtMobPctHP5=1
NukeRecast5=1s
NukeConditions5=

[Rez]
GrabCorpse=TRUE
RezTotal=2
ForceMemRez=FALSE
RezAnnounce=FALSE

RezUse1=TRUE
RezSpellName1=Blessing of Resurrection
RezConditions1=
RezSpellGem1=alt
RezDuringCombat1=TRUE

RezUse2=TRUE
RezSpellName2=Divine Resurrection
RezConditions2=
RezSpellGem2=alt
RezDuringCombat2=TRUE

RezTrustedTotal=10
RezTrusted1=XX
RezTrusted2=XX
RezTrusted3=XX
RezTrusted4=XX
RezTrusted5=XX
RezTrusted6=XX
RezTrusted7=XX
RezTrusted8=XX
RezTrusted9=XX
RezTrusted10=XX

RezRaidTimer=5m
RezGroupTimer=1m

[Root]
DontRootConColor=|GREY|GREEN|
RootPrimaryTarget=FALSE
RootAdds=TRUE
FaceNPCToRoot=FALSE
RootTotal=0
RootTotalIfNamed=2
RootAnnounce=FALSE

RootUse1=FALSE
RootSpellName1=
RootSpellGem1=
RootUseAtMobPctHP1=96
RootStopAtMobPctHP1=1
RootRecast1=2m
RootMaxTries1=2
RootConditions1=

[SelfBuff]
SelfBuffTotal=1
SelfBuffAnnounce=FALSE
ForceMemSelfBuff=TRUE

SelfBuffUse1=TRUE
SelfBuffSpellName1=Rallied Greater Ward of Vie Rk. II
SelfBuffSpellIcon1=Rallied Greater Ward of Vie Rk. II
SelfBuffSpellGem1=gem8
SelfBuffConditions1=!${Self.Buff[Rallied Greater Ward of Vie Rk. II].ID}
SelfBuffConditions=(!${Me.Moving} && !${Me.Invis})

[Snare]
SnareTotal=0
ForceMemSnare=FALSE
SnareAnnounce=FALSE

SnareUse1=FALSE
SnareSpellName1=
SnareSpellGem1=
SnareUseAtMobPctHP1=15
SnareMaxTries1=2

[Stun]
StunTotal=0
StunTotalIfNamed=0
ForceMemStun=FALSE
StunAnnounce=FALSE

StunUse1=FALSE
StunSpellName1=
StunSpellGem1=
StunUseAtMobPctHP1=100
StunStopAtMobPctHP1=1
StunRecast1=9s
StunConditions1=

[XHeal]
XHealPullerName=XX
XHealPullerDist=100
XHealTotal=4
XHealAnnounce=FALSE

XHealUse1=TRUE
XHealSpellName1=Burst of Life
XHealSpellGem1=alt
XHealUseAt1=50
XHealStopAt1=60

XHealUse2=TRUE
XHealSpellName2=Fifteenth Emblem Rk. II
XHealSpellGem2=gem2
XHealUseAt2=45
XHealStopAt2=50

XHealUse3=TRUE
XHealSpellName3=Spiritual Remedy Rk. II
XHealSpellGem3=gem3
XHealUseAt3=90
XHealStopAt3=99

XHealUse4=TRUE
XHealSpellName4=Ardent Light Rk. II
XHealSpellGem4=gem4
XHealUseAt4=90
XHealStopAt4=99

[Mana]
MedAt=1
MedToFull=FALSE
MedEvenIfNotInOOCRegen=FALSE
MedTimer=60m
QuietMiracle_IfManaBelow=50
QuietMiracle_Others_IfManaBelow=50
UseClarityPotions=FALSE

[Combat]
CombatFrequency4=|MainTankBuff|
CombatFrequency5=|XHeal|HealSingle|HealGroup|HealBalance|HealSelf|Disc|AA|Nuke|Rez|Mana|
StandardCombatOptions=Bard|XHeal|HealSingle|HealGroup|HealBalance|HealSelf|HealPet|Disc|MainTankBuff|FightBuff|Lifetap|Stun|AA|Dot|Nuke|Snare|ClickyNuke|Jolt|Rez|ModRod|Mana|Merc

[Roles]
SetRoles=TRUE
GroupLeader=XX
GroupMainTank=XX
GroupMainAssist=XX
GroupPuller=XX
GroupXTarget1=XX
RaidXTarget1=Raid Assist 1 Target

[AAtoBuy]
AABuy=FALSE
AABuyChannel=/echo
AABuyAt=25
AABuyMode=Classic
AABuyPageOrder=Class|Archetype|General|Special
AAActivatedOnly=FALSE
SetAAPctOnLevelTo=0
AACount=0
AA1=Baking Mastery|13|1
AA2=Blacksmithing Mastery|13|1
AA3=Brewing Mastery|13|1
AA4=Enhanced Reformation|44|1
AA5=Fishing Mastery|13|1
AA6=Fletching Mastery|13|1
AA7=Foraging|11|1
AA8=Innate Eminence|25|1
AA9=Item: Expanding Mind XV|31|1
AA10=Item: Form of Defense XIX|26|1
AA11=Item: Form of Endurance XIX|30|1
AA12=Item: Knowledge of the Past XIX|29|1
AA13=Item: Might of Stone IV|14|1
AA14=Item: Myrmidon's Skill VIII|13|1
AA15=Item: Prismatic Ward XIV|28|1
AA16=Item: Taelosian Guard|8|1
AA17=Jewel Craft Mastery|13|1
AA18=Pottery Mastery|13|1
AA19=Tailoring Mastery|13|1
AA20=Hero's Fortitude|40|4
AA21=Hero's Resolution|20|4
AA22=Hero's Vitality|40|4

[Custom]
CustomCombatTotal=0
CustomRestTotal=0
CustomCombat1=
CustomRest1=

[Pulling]
AlertListClear=FALSE
AlertListClearTimer=60m
AmIPuller=FALSE
PullRadius=600
PullZRadius=20
PullCastRange=150
MQ2NavPullRadius=10
MQ2NavPullZRadius=10
ReturnActionTotal=0
ReturnAction1=
PullConColor=LIGHT BLUE,BLUE,WHITE,YELLOW
CourseCorrectionTimer=5
PullingMethod=Standard
PullingAnnounceCMD=NULL
PullingTotal=1
PullAtMyHPs=75
PullSkillName1=
PullSkillRequiresLineOfSight1=TRUE
PullSkillDistance1=
PullSkillSummon1=
PullSkillName2=
PullSkillRequiresLineOfSight2=TRUE
PullSkillDistance2=
PullSkillSummon2=
[Campfire]
CF_Item1=Fellowship Kit:
CF_Item2=Fellowship Lumber Bundle:
 
Im not into coding at all, but gives you some hints from the behaviour of CLE macros.

BUFF = OK
AA= OK
HEALSINGLE = OK
HEALGROUP = broken (not firing) --- Celestial Regenration, Beacon of Life, Syllabe of Convalescence used here
HEALSELF = broken (so far) --- Divine arbitration used here
NUKE = broken (not firing at all) --- Ardent contravention, Word of greater reformation, glorious judgement (i know it sounds weird, but using word as a nuke equals a full security for any named encountered... like spamming healing over and over, while heal single is used at the same time)
REZ= OK --- thx for the fix
XHEAL = OK

I dont use Fade or any others unlisted above so cant tell more.
Thx, Eyeswithoutaface.
Arph

I haven't "Played" the game for some time, so what spells are used is rather irrelevant. As long as they are actual spells I don't see a problem with them working. I'll look into these things and see if I can find issues that I can correct.
 
Im not into coding at all, but gives you some hints from the behaviour of CLE macros.

BUFF = OK
AA= OK
HEALSINGLE = OK
HEALGROUP = broken (not firing) --- Celestial Regenration, Beacon of Life, Syllabe of Convalescence used here
HEALSELF = broken (so far) --- Divine arbitration used here
NUKE = broken (not firing at all) --- Ardent contravention, Word of greater reformation, glorious judgement (i know it sounds weird, but using word as a nuke equals a full security for any named encountered... like spamming healing over and over, while heal single is used at the same time)
REZ= OK --- thx for the fix
XHEAL = OK

I dont use Fade or any others unlisted above so cant tell more.
Thx, Eyeswithoutaface.
Arph

Strange, heal group was working fine for me after i fixed it.
Healself may or may not work, but you are not using it according to your ini?
Also strange with nuke, as its working fine for me on a number of different toons.

Code:
HealB alance
Has a space in it, so you healbalance section wont work. Which is where you actually have Divine Arbitration.
 
For the group heal.

Code:
	/for g 0 to ${Group}
		/for i 1 to ${${CurrentSub}Total}
			/if (!${${CurrentSub}Use${i}}) /continue
			/if (${${CurrentSub}Conditions${i}.NotEqual[123456]}) 		/varset ${CurrentSub}Conditions${i} ${Ini[Bot_${Me.CleanName}_${MacroQuest.Server}_${Me.Class}.ini,${CurrentSub},${CurrentSub}Conditions${i},123456]}
			/if (${${CurrentSub}Conditions${i}} && ${Group.Member[${g}].ID} && (${Range.Between[1,${${CurrentSub}UseAt${i}}:${Group.Member[${g}].PctHPs}]}||${grpavg}<=${${CurrentSub}AvgHP${i}}) && ${Group.Member[${g}].Type.NotEqual[corpse]} && ${Spawn[id ${Group.Member[${g}].ID}].Distance}<50) {
				/if (${CastIsReady}) {
					/delay 3s !${Me.Casting.ID}
					/call ${EchoSub} "${Teal} ${${CurrentSub}SpellName${i}} --> ${White} ${Target}"
    				/if (${Verbose} && ${MyChannel.NotEqual[NULL]}) /docommand /${MyChannel} ${${CurrentSub}SpellName${i}} --> ${Target.CleanName}
    				/if (${${CurrentSub}Announce} && ${AnnounceChannel.NotEqual[NULL]}) /docommand /${AnnounceChannel} ${${CurrentSub}SpellName${i}} --> ${Target.CleanName}
					/call Cast "${${CurrentSub}SpellName${i}}" ${${CurrentSub}SpellGem${i}} 3s CheckGroupHP
					/if (${Spell[${${CurrentSub}SpellName${i}}].TargetType.Equal[Free Target]}) {
						/keypress f10
						/face fast
						/delay 5
						/click left center
						/keypress f10
					}
				}
			}
		/next i
   	/next g

was using a goto command. to get to the next i. While I don't think it is the problem I've changed it to /continue which will make it go to the next i without the /goto command and associated :skip that was in place. The above is the change.

Additionally I don't understand the purpose of the F10 commands.

Beyond that i"m not really seeing anything wrong with this sub. I've check when this sub is called and it is called before HealSingle, which you say is ok. So it is calling the HealGroup sub.

Code:
/if (!${Defined[HealBalanceTotal]}) /declare HealBalanceTotal bool outer FALSE
	/if (${HealBalanceTotal}) /call HealBalance	

	/if (!${Defined[HealSelfTotal]}) /declare HealSelfTotal bool outer FALSE
	/if (${HealSelfTotal}) /call HealSelf
	
	/if (!${Defined[HealGroupTotal]}) /declare HealGroupTotal bool outer FALSE
	/if (${HealGroupTotal}) /call HealGroup
	
	/if (!${Defined[HealSingleTotal]}) /declare HealSingleTotal bool outer FALSE
	/if (${HealSingleTotal}) /call HealSingle
	
	/if (!${Defined[HealSplashTotal]}) /declare HealSplashTotal bool outer FALSE
	/if (${HealSplashTotal}) /call HealSplash
	
	/if (!${Defined[HealPetTotal]}) /declare HealPetTotal bool outer FALSE
	/if (${HealPetTotal}) /call HealPet

This Sub Heal is only called in two places, once in the combat sub provided the following conditions are true.

Code:
/if (${Group.Member[${Group.Min}].PctHPs}<=${InterruptToHealAt} && ${OptionsCheck.Find[|Heal|]}||${Me.PctHPs}<=${InterruptToHealAt} && ${OptionsCheck.Find[Lifetap]}) /call Heal

and additionally in the CheckStuff sub based on the following

Code:
/for z 0 to 5
		/if (${Group.Member[${z}].ID} && ${Range.Between[1,${InterruptToHealAt}:${Group.Member[${z}].PctHPs}]} && ${OptionsCheck.Find[|Heal]}) {
			/for y 1 to 5
				/for t 1 to ${${Heals.Arg[${y},|]}Total}
					/if (!${Defined[${Heals.Arg[${y},|]}Recast${t}]}) /declare ${Heals.Arg[${y},|]}Recast${t} int outer 1
					/if (${${Heals.Arg[${y},|]}Use${t}} && !${${Heals.Arg[${y},|]}Recast${t}} && (${Me.SpellReady[${${Heals.Arg[${y},|]}SpellName${t}}]}||${Me.AltAbilityReady[${${Heals.Arg[${y},|]}SpellName${t}}]}||${FindItem[${${Heals.Arg[${y},|]}SpellName${t}}].ItemSlot} && !${FindItem[${${Heals.Arg[${y},|]}SpellName${t}}].Timer})) {
						/call Interrupt
						/call Heal
						/goto :skipcheck	
					}
				/next t
			/next y
		}
   	/next z

Also, neither of which appear to be an issue.

Let me know if this fixes group healing. In order for this sub to fire the groups avg health needs to be below a certain value.
 

Attachments

  • bot40.mac
    505.8 KB · Views: 2
Additionally, I've just reproduced the Aura error mentioned previously. No such 'string' member "Name".

The odd thing about it is that it can be produced on a shaman, but not on a shadowknight or a berserker.

I literally typed it into the /echo and got the error on the shaman, but type the same thing into the box on a shadowknight and berserker and didn't get it. Interesting :-x

Nightmare and Poly, can you confirm classes that encountered this issue.

Already implemented a fix for Shaman, need any other classes relevant to the bug. In the mean time I'm going to contact EQMule about this issue as his change is what is potentially wrong. This is an MQ2 TLO and datatype structure issue and not the fault of the code here.
 
Last edited:
Additionally, I've just reproduced the Aura error mentioned previously. No such 'string' member "Name".

The odd thing about it is that it can be produced on a shaman, but not on a shadowknight or a berserker.

I literally typed it into the /echo and got the error on the shaman, but type the same thing into the box on a shadowknight and berserker and didn't get it. Interesting :-x

Nightmare and Poly, can you confirm classes that encountered this issue.

Already implemented a fix for Shaman, need any other classes relevant to the bug. In the mean time I'm going to contact EQMule about this issue as his change is what is potentially wrong. This is an MQ2 TLO and datatype structure issue and not the fault of the code here.

Druid, chanter, zerker, cleric have all done it for me, but not always.
 
Additionally, I've just reproduced the Aura error mentioned previously. No such 'string' member "Name".

The odd thing about it is that it can be produced on a shaman, but not on a shadowknight or a berserker.

I literally typed it into the /echo and got the error on the shaman, but type the same thing into the box on a shadowknight and berserker and didn't get it. Interesting :-x

Nightmare and Poly, can you confirm classes that encountered this issue.

Already implemented a fix for Shaman, need any other classes relevant to the bug. In the mean time I'm going to contact EQMule about this issue as his change is what is potentially wrong. This is an MQ2 TLO and datatype structure issue and not the fault of the code here.

Druid, chanter, zerker, cleric have all done it for me, but not always.

That is interesting. I've posted on Macroquest2.com forums about the issue. I hope to hear back from someone.