I've added a few tags to kissassist healing. They are a little redundant, but it lets things like Necro Orbs and Pal Deflection Disc. trigger. Can set any group heal to use singletarget logic (Hand of Piety is a great quick heal)
Single (heal anyone)
SingleME (heal only me)
Single!ME (heal anyone but ME)
SingleMA (heal only MA)
Single!MA (heal anyone but MA)
When used it lets group heals/combat abilities/items/and others to be used as single target heals.
I found this covers some of the MQ2Melee flags I was using.
Sample:
PAL:
Heals6=Hand of Piety|50|Single
Heals8=Aurora of Dawnlight|70|Single
Heals10=Bestow Divine Aura|29|Single!ME
Heals11=Beacon of the Righteous|45|Single!ME
Heals12=Deflection Discipline|25|SingleME
BST:
Heals3=Friendly Pet|75|SingleMA
Heals4=Protective Spirit Discipline|60|SingleME
NEC:
Heals1=Night Orb|70|Single!MA
Heals2=Night Orb|60|SingleMA
Code changes:
This:
to:
Replace this section:
Replace this section:
Replace this section:
Single (heal anyone)
SingleME (heal only me)
Single!ME (heal anyone but ME)
SingleMA (heal only MA)
Single!MA (heal anyone but MA)
When used it lets group heals/combat abilities/items/and others to be used as single target heals.
I found this covers some of the MQ2Melee flags I was using.
Sample:
PAL:
Heals6=Hand of Piety|50|Single
Heals8=Aurora of Dawnlight|70|Single
Heals10=Bestow Divine Aura|29|Single!ME
Heals11=Beacon of the Righteous|45|Single!ME
Heals12=Deflection Discipline|25|SingleME
BST:
Heals3=Friendly Pet|75|SingleMA
Heals4=Protective Spirit Discipline|60|SingleME
NEC:
Heals1=Night Orb|70|Single!MA
Heals2=Night Orb|60|SingleMA
Code changes:
This:
Rich (BB code):
/if (${Select[${Me.Class.ShortName},BST,CLR,SHM,DRU,RNG,PAL]}) {
Rich (BB code):
/if (${Select[${Me.Class.ShortName},NEC,BST,CLR,SHM,DRU,RNG,PAL]}) {
Replace this section:
Rich (BB code):
|----------------------------------------------------------------------------
| SUB: Single Heals
|----------------------------------------------------------------------------
Sub SingleHeal(SHealName, SHealType, int SHealHPs, int WhoNum)
/if (${DebugHeal}) /echo DEBUGHEALS SingleHeal !${HealsOn} || ${Me.Moving} || ${Window[RespawnWnd]} || !${Spawn[${SHealName} ${SHealType}].ID} || !${Select[${SHealType},PC,Pet,Mercenary]}
/if (!${HealsOn} || ${Me.Moving} || ${Window[RespawnWnd]} || !${Spawn[${SHealName} ${SHealType}].ID} || !${Select[${SHealType},PC,Pet,Mercenary]}) /return
/if (${DebugHeal}) /echo DEBUGHEALS SingleHeal ${SHealName} ${SHealType} ${SHealHPs} ${WhoNum}
/doevents
/declare i int local 0
/declare SHealSpell string local
/declare SHealPct int local
/declare SHealTag string local
/declare SHealThem int local ${Spawn[${SHealName} ${SHealType}].ID}
/declare MainAssistID int local ${Spawn[=${MainAssist}].ID}
/declare SHealRange int local 0
| Set MA Id to 6 to keep spell durations correct
/if (${WhoNum}!=6 && ${SHealThem}==${MainAssistID}) /varset WhoNum 6
/for i 1 to ${SingleHeal.Size}
| If heal is null or off |0 or spell/aa/item not ready skip it
/if (${DebugHeal}) /echo DEBUGHEALS SingleHeal Spell ${i}: ${SingleHeal[${i}]} ${SingleHeal[${i}].Arg[1,|]} ${SingleHeal[${i}].Arg[2,|]} ${SingleHeal[${i}].Arg[3,|]}
/if (${DebugHeal}) /echo DEBUGHEALS SingleHeal SpellSkip: !${SingleHeal[${i}].Length} || ${SingleHeal[${i}].Arg[2,|].Equal[0]}}
/if (!${SingleHeal[${i}].Length} || ${SingleHeal[${i}].Arg[2,|].Equal[0]}) /goto :SNextHeal
/varset SHealSpell ${SingleHeal[${i}].Arg[1,|]}
/varset SHealPct ${SingleHeal[${i}].Arg[2,|]}
/varset SHealTag ${SingleHeal[${i}].Arg[3,|]}
/varset SHealRange ${Spell[${SHealSpell}].Range}
/if (${Spell[SHealSpell].TargetType.Find[Group]}) /varset SHealRange ${Spell[${1stPart}].AERange}
/if (!${SHealRange}) /varset SHealRange 100
| Skip Heal if pet
/if (${SHealTag.Equal[pet]}) /goto :SNextHeal
| If tag MA/Mob and heal target not MA or tag !MA and heal target MA skip
| If tag SingleMA or Single!MA. SingleME or Single!ME. and not right target, skip
/if (${DebugHeal}) /echo DEBUGHEALS SingleHeal TAG: ${SHealTag.Equal[MA]} && ${SHealThem}!=${MainAssistID} || ${SHealTag.Equal[Mob]} && ${SHealThem}!=${MainAssistID} || ${SHealTag.Equal[!MA]} && ${SHealThem}==${MainAssistID}
/if (${SHealTag.Equal[MA]} && ${SHealThem}!=${MainAssistID} || ${SHealTag.Equal[SingleMA]} && ${SHealThem}!=${MainAssistID} || ${SHealTag.Equal[Mob]} && ${SHealThem}!=${MainAssistID} || ${SHealTag.Equal[!MA]} && ${SHealThem}==${MainAssistID} || ${SHealTag.Equal[Single!MA]} && ${SHealThem}==${MainAssistID} || ${SHealTag.Equal[SingleME]} && ${SHealThem}!=${Me.ID} || ${SHealTag.Equal[Single!ME]} && ${SHealThem}==${Me.ID}) /goto :SNextHeal
| Cleric Divine Arbitration and Epics do not work on pets or people out of group
/if (${Spawn[${SHealThem}].Type.Equal[Pet]} && (${HealSpell.Find[Aegis of Superior Divinity]} || ${HealSpell.Find[Harmony of the Soul]} || ${HealSpell.Find[Divine Arbitration]})) /goto :SNextHeal
/if (!${Spawn[${SHealName} ${SHealType} group].ID} && (${HealSpell.Find[Aegis of Superior Divinity]} || ${HealSpell.Find[Harmony of the Soul]} || ${HealSpell.Find[Divine Arbitration]})) /goto :SNextHeal
| Check For Life Taps
/if (${SHealTag.Find[Tap]}) {
/if (!${Pulled} && ${CombatStart} && ${Me.PctHPs}<=${SHealPct} && ${Spawn[${MyTargetID}].ID} && ${Spawn[${MyTargetID}].Distance}<=${SHealRange} && ${Spell${i}GM0}==0) {
/call CastWhat "${SHealSpell}" ${Spawn[${MyTargetID}].ID} Heal
/if (${Macro.Return.Equal[CAST_SUCCESS]}) {
/call BroadCast ${IRCOn} ${EQBCOn} o "${SHealSpell} for >> ${Me.CleanName} <<"
/varcalc Spell${i}GM0 (${Spell[${SHealSpell}].Duration.TotalSeconds}*${DurationMod})*10
/if (${DebugHeal}) /echo DEBUGHEALS SingleHeal Assign Timer:Spell${i}GM0 (${Spell[${SHealSpell}].Duration.TotalSeconds}*${DurationMod}) ${Spell${i}GM0}
/return
}
} else {
/goto :SNextHeal
}
}
| Check For Nuke Heals - contibuted by thenomadman
/if (${SHealTag.Find[Mob]}) {
/if (!${AggroTargetID}) /goto :SNextHeal
/doevents Switch
/if (!${MyTargetID} || ${Spawn[${MyTargetID}].Type.Equal[Corpse]}) /call Assist Heals
/if (${MyTargetID} && ${Spawn[${MainAssist}].PctHPs}<=${SHealPct} && ${Spawn[${MyTargetID}].LineOfSight} && ${Spawn[${MyTargetID}].Distance}<=${SHealRange} && !${Spawn[${MyTargetID}].Type.Equal[Corpse]}) {
/call CastWhat "${SHealSpell}" ${Spawn[${MyTargetID}].ID} Heals
/if (${Macro.Return.Equal[CAST_SUCCESS]}) {
/call BroadCast ${IRCOn} ${EQBCOn} o "${SHealSpell} for >>${Spawn[${SHealName} ${SHealType}].CleanName} << cast on ${Spawn[${MyTargetID}].CleanName}"
/varset HealAgain 1
/return
}
} else {
/goto :SNextHeal
}
}
| Check conditions for heals
/if (${DebugHeal}) /echo DEBUGHEALS SingleHeal ${SHealHPs}<=${SHealPct} && ${Spawn[${SHealName} ${SHealType}].Distance}<=${SHealRange} && ${Spell${i}GM${WhoNum}}==0
/if (${SHealHPs}<=${SHealPct} && ${Spawn[${SHealName} ${SHealType}].Distance}<=${SHealRange} && ${Spell${i}GM${WhoNum}}==0 && ${Cast.Ready[${SHealSpell}]} || ${SHealHPs}<=${SHealPct} && ${Spawn[${SHealName} ${SHealType}].Distance}<=${SHealRange} && ${Spell${i}GM${WhoNum}}==0 && ${Me.CombatAbilityReady[${SHealSpell}]}) {
/if (${Select[${EverQuest.Server},zek]} && ${Select[${Target.Type},PC]} && ${Me.Combat}) {
/attack off
/delay 25 !${Me.Combat}
}
/call CastWhat "${SHealSpell}" ${SHealThem} SingleHeal
/if (${DebugHeal}) /echo DEBUGHEALS SingleHeal MR: ${Macro.Return}
/if (${Macro.Return.Equal[CAST_SUCCESS]}) {
/call BroadCast ${IRCOn} ${EQBCOn} o "${SHealSpell} on >> ${Spawn[${SHealName} ${SHealType}].CleanName} <<"
/varcalc Spell${i}GM${WhoNum} (${Spell[${SHealSpell}].Duration.TotalSeconds}*${DurationMod})*10
/if (${DebugHeal}) /echo DEBUGHEALS SingleHeal Assign Timer:Spell${i}GM${WhoNum} ${Spell[${SHealSpell}].Duration.TotalSeconds}*${DurationMod} ${Spell${i}GM${WhoNum}}
/varset HealAgain 1
/return
}
}
:SNextHeal
/if (${DebugHeal}) /delay 5
/next i
/if (${DebugHeal}) /echo DEBUGHEALS SingleHeal Leave
/return
Replace this section:
Rich (BB code):
| ----------------------------------------------------------------------------
| SUB: Assign single heals - separate single heals from group heals
| ---------------------------------------------------------------------------
Sub FindSingleHeals
/if (${Debug}) /echo Enter FindSingleHeals
/declare i int local
/declare j int local
/declare SHCount int 0
/declare HealSpell string local
/for i 1 to ${Heals.Size}
/varset HealSpell ${Heals[${i}].Arg[1,|]}
/if (${Debug}) /echo ${i} ${HealSpell} ${Spell[${HealSpell}].TargetType} ${Select[${Spell[${HealSpell}].TargetType},SingleHeal,Self]}
/if (${Select[${Heals[${i}].Arg[3,|]},Single,Single!ME,Single!MA,SingleMA,SingleME]}) {
/echo ${HealSpell} set at single heal
/varcalc SHCount ${SHCount}+1
/varset SingleHeal[${SHCount}] ${Heals[${i}]}
/goto :NextSH
}
/if (${HealSpell.Find[Aegis of Superior Divinity]} || ${HealSpell.Find[Harmony of the Soul]} || ${HealSpell.Find[Burst of Life]} || ${HealSpell.Find[Focused Celestial Regeneration]}) {
/varcalc SHCount ${SHCount}+1
/varset SingleHeal[${SHCount}] ${Heals[${i}]}
/goto :NextSH
}
/if (${Select[${Me.Class.Name},Druid,Shaman]} && (${HealSpell.Find[Intervention]} || ${HealSpell.Find[Survival]})) {
/varcalc SHCount ${SHCount}+1
/varset SingleHeal[${SHCount}] ${Heals[${i}]}
/goto :NextSH
}
/if (${Select[${Spell[${HealSpell}].TargetType},Single,Self]} || ${Spell[${FindItem[${HealSpell}].Spell}].TargetType.Find[self]} || ${Heals[${i}].Arg[3,|].Find[tap]} || ${Heals[${i}].Arg[3,|].Find[pet]} || ${Spell[${HealSpell}].TargetType.Find[Targeted AE]} && ${Select[${Heals[${i}].Arg[3,|]},MA,ME,pet]}) {
/varcalc SHCount ${SHCount}+1
/varset SingleHeal[${SHCount}] ${Heals[${i}]}
/goto :NextSH
}
|/if (!${Select[${Spell[${HealSpell}].TargetType},Single]} && ${Select[${Me.Class.Name},Necromancer]}) {
| /varcalc SHCount ${SHCount}+1
| /varset SingleHeal[${SHCount}] ${Heals[${i}]}
| /goto :NextSH
|}
:NextSH
/next i
/if (${SHCount}) /call SortArray SingleHeal 100|100 <
/for j 1 to ${SingleHeal.Size}
/if (${Debug}) /echo ${j} ${SingleHeal[${j}]} ${Spell[${SingleHeal[${j}].Arg[1,|]}].CastTime} ${Spell[${SingleHeal[${j}].Arg[1,|]}].Duration}
/next j
/if (${Debug}) /echo Leave FindSingleHeals
/return
Replace this section:
Rich (BB code):
| ----------------------------------------------------------------------------
| SUB: Assign Group heals
| ---------------------------------------------------------------------------
Sub FindGroupHeals
/if (!${Select[${Me.Class.ShortName},BST,CLR,SHM,DRU,PAL]}) /return
/if (${Debug}) /echo Enter FindGroupHeals
/declare i int local
/declare j int local
/declare GHCount int 0
/declare HealSpell string local
/for i 1 to ${Heals.Size}
/varset HealSpell ${Heals[${i}].Arg[1,|]}
/if (${Debug}) /echo ${HealSpell}
/if (!${HealSpell.Length} || ${HealSpell.Equal[null]} || ${Select[${Spell[${HealSpell}].TargetType},Single,Self]} || ${Spell[${FindItem[${HealSpell}].Spell}].TargetType.Find[self]} || ${HealSpell.Find[Aegis of Superior Divinity]} || ${HealSpell.Find[Harmony of the Soul]}) {
/echo default ignore group ${HealSpell}
/goto :NextGH
}
|Ignore Single Tags
/if (${Select[${Heals[${i}].Arg[3,|]},Single,Single!ME,Single!MA,SingleMA,SingleME]}) {
/echo ${HealSpell} previously set as single target heal
/goto :NextGH
}
/if (${HealSpell.Find[Burst of Life]} || ${HealSpell.Find[Focused Celestial Regeneration]}) /goto :NextGH
/if (${Me.Class.Name.Equal[Shaman]} && ${Spell[${HealSpell}].Name.Find[Intervention]} || ${Me.Class.Name.Equal[Druid]} && ${Spell[${HealSpell}].Name.Find[Survival]}) /goto :NextGH
/if (${Spell[${HealSpell}].TargetType.Find[group]} || ${Spell[${FindItem[${HealSpell}].Spell}].TargetType.Find[group]} || ${Spell[${HealSpell}].TargetType.Find[Targeted AE]} && !${Select[${Heals[${i}].Arg[3,|]},MA,ME]}) {
/varcalc GHCount ${GHCount}+1
/varset GroupHeal[${GHCount}] ${Heals[${i}]}
/goto :NextGH
}
:NextGH
/next i
/if (${Debug}) /echo ${GHCount}
/if (${GHCount}) {
/call SortArray GroupHeal 100|100 <
/for j 1 to ${GroupHeal.Size}
/if (${Debug}) /echo ${j} ${GroupHeal[${j}]} ${Spell[${GroupHeal[${j}].Arg[1,|]}].CastTime} ${Spell[${GroupHeal[${j}].Arg[1,|]}].Duration}
/next j
}
/if (${Debug}) /echo Leave FindGroupHeals
/return

