Sub SingleHeal(SHealName, SHealType, int SHealHPs, int WhoNum, String SHealFlag)
/if (!${HealsOn}) /return
/if (${Me.Moving}) /return
/if (${Me.Hovering}) /return
/if (${Spawn[${SHealName} ${SHealType}].ID}==0 ) /return
/if (${Select[${SHealType},PC,Pet,Mercenary]}==0) /return
/if (${Me.Invis} && !${AggroTargetID}) /return
/if (${DebugHeal}) /echo \amDEBUGHEALS SingleHeal Enter: \ayName: ${SHealName} TType: ${SHealType} Hps%: ${SHealHPs} WhoNum:${WhoNum} \agLine#: ${Macro.CurLine}
/varset GoMByPass 1
/doevents
/varset GoMByPass 0
/declare i int local 0
/declare SHealSpell string 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
/declare HealLoopCount int local 0
/declare HealLoopTimer timer local 10
| Set MA ID to 6 to keep spell durations correct
/if (${WhoNum}!=6 && ${SHealThem}==${MainAssistID}) /varset WhoNum 6
/while (1) {
/if (${SHealType.Equal[corpse]} || !${Spawn[=${SHealName} ${SHealType}].ID} || ${Spawn[=${SHealName}].Type.Equal[corpse]}) /return
/varset HealAgain 0
/varset HealLoopCount 0
/for i 1 to ${SingleHeal.Size}
/if (${DebugHeal}) /delay 2
| If heal is null or off |0 or spell/aa/item not ready skip it
/if (${DebugHeal}) /echo \amDEBUGHEALS SingleHeal \awSpell ${i}: ${SingleHeal[${i}]} ${SingleHeal[${i}].Arg[1,|]} ${SingleHeal[${i}].Arg[2,|]} ${SingleHeal[${i}].Arg[3,|]} \agLine#: ${Macro.CurLine}
/if (${DebugHeal}) /echo \amDEBUGHEALS SingleHeal \awSpellSkip: !${SingleHeal[${i}].Length} || ${SingleHeal[${i}].Arg[2,|].Equal[0]} \agLine#: ${Macro.CurLine}
/if (!${SingleHeal[${i}].Length} || ${SingleHeal[${i}].Arg[2,|].Equal[0]}) /continue
/varset SHealSpell ${SingleHeal[${i}].Arg[1,|]}
/varset SHealPct ${SingleHeal[${i}].Arg[2,|]}
/varset SHealTag ${SingleHeal[${i}].Arg[3,|]}
/varset SHealRange ${Spell[${SHealSpell}].Range}
/call CastReady "${SHealSpell}" singleheal
/if (!${SpellReadyL}) /continue
/if (${Spell[${SHealSpell}].TargetType.Find[Group v]}) /varset SHealRange ${Spell[${SHealSpell}].AERange}
/if (!${SHealRange}) /varset SHealRange 100
| New Conditional Check to Skip spell
/if (${ConditionsOn} && ${HealsCOn} && ${If[${SHCond[${i}]},0,1]}) /continue
| Skip Heal if pet
/if (${Spawn[${SHealThem}].Type.NotEqual[Pet]} && ${SHealTag.Equal[pet]}) /continue
| Skip spells marked for ME and not healing self
/if (${SHealTag.Equal[me]} && ${SHealThem}!=${Me.ID}) /continue
/if (${SHealTag.Equal[class]} && ${Select[${Spawn[id ${SHealThem}].Class.ShortName},${SingleHeal[${i}].Arg[4,|]}]}==0) /continue
/if (${SHealThem}!=${MainAssistID} && (${HealGroupPetsOn} && ${SHealTag.Equal[pet]} && ${Spawn[${SHealThem}].Type.NotEqual[pet]}) || (!${HealGroupPetsOn} && ${SHealTag.Equal[pet]})) /continue
| If tag MA/Mob and heal target not MA or tag !MA and heal target MA skip
/if (${DebugHeal}) /echo \amDEBUGHEALS SingleHeal \awTAG: ${SHealTag.Equal[MA]} && ${SHealThem}!=${MainAssistID} || ${SHealTag.Equal[Mob]} && ${SHealThem}!=${MainAssistID} || ${SHealTag.Equal[!MA]} && ${SHealThem}==${MainAssistID} \agLine#: ${Macro.CurLine}
/if ((${SHealTag.Equal[MA]} && ${SHealThem}!=${MainAssistID}) || (${SHealTag.Equal[Mob]} && ${SHealThem}!=${MainAssistID}) || (${SHealTag.Equal[!MA]} && ${SHealThem}==${MainAssistID})) /continue
| Cleric Divine Arbitration and Epics do not work on pets or people out of group
/if (${Spell[${SHealSpell}].TargetType.Equal[group_v1]} && ${Spawn[id ${SHealThem} group].ID}==0) /continue
/if (${Spawn[${SHealThem}].Type.Equal[Pet]} && (${SHealSpell.Find[Aegis of Superior Divinity]} || ${SHealSpell.Find[Harmony of the Soul]} || ${SHealSpell.Find[Divine Arbitration]})) /continue
/if (!${Spawn[id ${SHealThem} group].ID} && (${SHealSpell.Find[Aegis of Superior Divinity]} || ${SHealSpell.Find[Harmony of the Soul]} || ${SHealSpell.Find[Divine Arbitration]})) /continue
| intervention and survival lines only work on group members
/if (!${Spawn[id ${SHealThem} group].ID} && ${Select[${Me.Class.Name},Druid,Shaman]} && (${SHealSpell.Find[Intervention]} || ${SHealSpell.Find[Survival]})) /continue
| Check For Life Taps
/if (${SHealTag.Find[Tap]}) {
/if (!${Pulled} && ${CombatStart} && ${Me.PctHPs}<=${SHealPct} && ${Target.Type.NotEqual[Corpse]} && ${Spawn[${MyTargetID}].ID} && ${Spawn[${MyTargetID}].Distance}<=${SHealRange} && ${Spell${i}GM0}==0) {
/call CastWhat "${SHealSpell}" ${Spawn[${MyTargetID}].ID} SingleHeal 0
/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 (${Spell[${SHealSpell}].Duration.TotalSeconds}>0) {
/varcalc Spell${i}GM0 (${Spell[${SHealSpell}].Duration.TotalSeconds}*${DurationMod})*10
} else /if (${Spell[${SHealSpell}].RecastTime}>0) {
/varcalc Spell${i}GM0 ${Spell[${SHealSpell}].RecastTime}/100
} else {
/varset Spell${i}GM0 10
}
/if (${DebugHeal}) /echo DEBUGHEALS SingleHeal Assign Timer:Spell${i}GM0 (${Spell[${SHealSpell}].Duration.TotalSeconds}*${DurationMod}) ${Spell${i}GM0} Line#: ${Macro.CurLine}
/return
} else /if (${Macro.Return.Equal[CAST_CANCELLED]}) /return
} else {
/continue
}
}
| Check For Nuke Heals - contibuted by thenomadman
/if (${SHealTag.Find[Mob]}) {
/if (!${AggroTargetID}) /continue
/doevents Switch
/if ((${DPSOn} || ${MeleeOn}) && !${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.NotEqual[Corpse]}) {
/varset HealAgain 2
/call CastWhat "${SHealSpell}" ${Spawn[${MyTargetID}].ID} SingleHeal 0
/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 /if (${Macro.Return.Equal[CAST_CANCELLED]}) /return
} else {
/continue
}
}
| Check conditons for heals
/if (${DebugHeal}) /echo \amDEBUGHEALS SingleHeal \aw${SHealHPs}<=${SHealPct} && ${Spawn[${SHealName} ${SHealType}].Distance}<=${SHealRange} && ${Spell${i}GM${WhoNum}}==0 \agLine#: ${Macro.CurLine}
/if (${SHealHPs}<=${SHealPct} && ${Spawn[${SHealName} ${SHealType}].Distance}<=${SHealRange} && ((${SHealFlag.Equal[G]} && ${Spell${i}GM${WhoNum}}==0) || (${SHealFlag.Equal[X]} && ${Spell${i}XT${WhoNum}}==0))) {
| target has qualified for a heal
/varset HealAgain 2
/if (${Spell[${SHealSpell}].TargetType.Equal[Free Target]}) {
| Check if spalsh heal target is in line of sight
/if (${Target.ID}!=${SHealThem}) {
/target id ${SHealThem}
/delay 2s ${Target.ID}==${SHealThem}
}
/if (!${Target.CanSplashLand}) {
/echo Splash Spell will NOT land on target. Skipping.
/continue
}
}
/if (${Select[${EverQuest.Server},zek]} && ${Select[${Target.Type},PC]} && ${Me.Combat}) {
/attack off
/delay 25 !${Me.Combat}
}
/if (${SHealThem}==${MainAssistID} && ${Spawn[${MainAssist} ${MainAssistType}].ID}) /removebuff "Divine Barrier"
/call CastWhat "${SHealSpell}" ${SHealThem} SingleHeal 0
/if (${DebugHeal}) /echo \amDEBUGHEALS SingleHeal \awMR: ${Macro.Return} \agLine#: ${Macro.CurLine}
/if (${Macro.Return.Equal[CAST_SUCCESS]}) {
/call BroadCast ${IRCOn} ${EQBCOn} o "${SHealSpell} on >> ${Spawn[${SHealName} ${SHealType}].CleanName} <<"
/if (${SHealSpell.Find[Promised]}) {
/if (${SHealFlag.Equal[G]}) {
/varset Spell${i}GM${WhoNum} 215
} else {
/varset Spell${i}XT${WhoNum} 215
}
} else {
/if (${SHealFlag.Equal[G]}) {
/if (${Spell[${SHealSpell}].Duration.TotalSeconds}>0) {
/varcalc Spell${i}GM${WhoNum} (${Spell[${SHealSpell}].Duration.TotalSeconds}*${DurationMod})*10
} else /if (${Spell[${SHealSpell}].RecastTime}>0) {
/varcalc Spell${i}GM${WhoNum} ${Spell[${SHealSpell}].RecastTime}/100
} else {
/varset Spell${i}GM${WhoNum} 10
}
} else {
|/varcalc Spell${i}XT${WhoNum} (${Spell[${SHealSpell}].Duration.TotalSeconds}*${DurationMod})*10
/if (${Spell[${SHealSpell}].Duration.TotalSeconds}>0) {
/varcalc Spell${i}XT${WhoNum} (${Spell[${SHealSpell}].Duration.TotalSeconds}*${DurationMod})*10
} else /if (${Spell[${SHealSpell}].RecastTime}>0) {
/varcalc Spell${i}XT${WhoNum} ${Spell[${SHealSpell}].RecastTime}/100
} else {
/varset Spell${i}XT${WhoNum} 10
}
}
}
/if (${DebugHeal}) /echo DEBUGHEALS SingleHeal Assign Timer:Spell${i}${If[${SHealFlag.Equal[G]},GM,XT]}${WhoNum} ${Spell[${SHealSpell}].Duration.TotalSeconds}*${DurationMod} ${Spell${i}${If[${SHealFlag.Equal[G]},GM,XT]}${WhoNum}} Line#: ${Macro.CurLine}
| Prioritize heals by setting flag to check Health again
/varset HealAgain 1
/return
} else /if (${Macro.Return.Equal[CAST_CANCELLED]}) /return
| Check if target still needs a heal. spell might not be ready or timer not zero.
} else /if (${SHealHPs}<=${SHealPct} && ${Spawn[${SHealName} ${SHealType}].Distance}<=${SHealRange}) {
/varset HealAgain 2
}
/next i
/if (${HealAgain}!=2 || !${HealLoopTimer}) /break
}
/if (${DebugHeal}) /echo \amDEBUGHEALS \aySingleHeal Leave \agLine#: ${Macro.CurLine}
/varset HealAgain 0
/return