• 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

Snippet - KissAssist - Heals+ (CA's|NEC Orbs|BestowDivineAura|etc)

Status
Not open for further replies.

redraj

New member
Joined
Feb 1, 2015
RedCents
571¢
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:
Rich (BB code):
/if (${Select[${Me.Class.ShortName},BST,CLR,SHM,DRU,RNG,PAL]}) {
to:
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
 

Attachments

Is this code added by default in your enchanter charming version of KISS, or would I still need to add this?
 
Snippet - KissAssist - Heals+ (CA's|NEC Orbs|BestowDivineAura|etc)
Status
Not open for further replies.

Users who are viewing this thread

Back
Top
Cart