AmericanNero
Seasoned veteran member
- Joined
- Oct 13, 2020
- RedCents
- 4,709¢
- Version of KissAssist.mac?
- 12
- When did your problem start?
- Day 1
- Character Role?
- Assist
- What class is having this issue?
- Cleric
- How often does this issue occur?
- Often
I propose an enhancement to KA which informs the MA / offtank (which is undocumented, use /mac kissassist offtank) to go get mobs running loose. This complements the current AGGRO routine, not replace. If a character is being hit by a mob, it broadcasts the ID of the mob, and then the MA / offtank(s) engage it. Currently this behavior does not occur. Note that if the MA is on a named, it ignores the request. It is a good idea to have an offtank in such situations, even the lowliest pet is helpful. The code:
1) Add a new bind:
#bind GetLooseMob /getloosemob
2) At the end of Sub Event_GotHit, find the final } and replace only that with (dont overwrite the last two lines):
} else {
/varset MyTargetID 0
/varset MyTargetName
/if (${Target.ID}) /squelch /target clear
/varset WaitTimer 0s
/varset AttackingMobID ${NearestSpawn[npc radius 39 targetable "${AttackingMob}"].ID}
/if (${Spawn[${AttackingMobID}].ID}) {
/moveto dist 10
/call Broadcast y "Mob >>${AttackingMob}<< (${AttackingMobID}) attacking me! "
/bca //getloosemob ${AttackingMobID}
}
}
3) And finally, add sub:
| ----------------------------------------------------------------------------
| SUB: Event GetLooseMob - Written by American Nero
| Considerations 1: MA changes target, unless on a named
| 2: MA changes target and stays on target
| Not implemented 3: MA changes target and then after an interval goes back to previous target
| 4: OT changes target and stays on target
| Not implemented 5: OT changes target and then after an interval goes back to previous target
| ----------------------------------------------------------------------------
Sub Bind_GetLooseMob(AttackingMobID)
/if (!${AttackingMobID}) /return
/if (!${IAmMA} || !${Role.NotEqual[offtank]}) /return
/if (${Target.ID}==${AttackingMobID}) /return
/if (${Target.Named} && ${IAmMA}) /return
/declare PrevTargetID int local
/declare PrevTargetName string local
/declare PrevAggroTargetID2 int local
/varset PrevTargetID ${MyTargetID}
/varset PrevTargetName ${MyTargetName}
/varset PrevAggroTargetID2 ${AggroTargetID2}
/varset AggroTargetID2 ${AttackingMobID}
/squelch /target id ${AttackingMobID}
/delay 10 ${Target.ID}==${AttackingMobID}
/varset MyTargetID ${Target.ID}
/varset MyTargetName ${Target.CleanName}
/if (${Me.Pet.ID} && ${Math.Distance[${Target.Y},${Target.X}:${Me.Pet.Y},${Me.Pet.X}]}<=${PetAttackRange}) /pet attack
|Sanity check... should I go back to previous target?
/if (${Target.Mezzed.ID} || (${Spawn[${MyTargetID}].Type.Equal[Corpse]} || !${Spawn[${MyTargetID}].ID})) {
/varset AggroTargetID2 ${PrevAggroTargetID2}
/squelch /target id ${PrevTargetID}
/delay 10 ${Target.ID}==${PrevTargetID}
/varset MyTargetID ${Target.ID}
/varset MyTargetName ${Target.CleanName}
/if (${Me.Pet.ID} && ${Math.Distance[${Target.Y},${Target.X}:${Me.Pet.Y},${Me.Pet.X}]}<=${PetAttackRange}) /pet attack
/return
}
/call BroadCast y "Grabbed mob >>${Spawn[${AttackingMobID}].Name}<< (${Spawn[${AttackingMobID}].ID}) "
/return
1) Add a new bind:
#bind GetLooseMob /getloosemob
2) At the end of Sub Event_GotHit, find the final } and replace only that with (dont overwrite the last two lines):
} else {
/varset MyTargetID 0
/varset MyTargetName
/if (${Target.ID}) /squelch /target clear
/varset WaitTimer 0s
/varset AttackingMobID ${NearestSpawn[npc radius 39 targetable "${AttackingMob}"].ID}
/if (${Spawn[${AttackingMobID}].ID}) {
/moveto dist 10
/call Broadcast y "Mob >>${AttackingMob}<< (${AttackingMobID}) attacking me! "
/bca //getloosemob ${AttackingMobID}
}
}
3) And finally, add sub:
| ----------------------------------------------------------------------------
| SUB: Event GetLooseMob - Written by American Nero
| Considerations 1: MA changes target, unless on a named
| 2: MA changes target and stays on target
| Not implemented 3: MA changes target and then after an interval goes back to previous target
| 4: OT changes target and stays on target
| Not implemented 5: OT changes target and then after an interval goes back to previous target
| ----------------------------------------------------------------------------
Sub Bind_GetLooseMob(AttackingMobID)
/if (!${AttackingMobID}) /return
/if (!${IAmMA} || !${Role.NotEqual[offtank]}) /return
/if (${Target.ID}==${AttackingMobID}) /return
/if (${Target.Named} && ${IAmMA}) /return
/declare PrevTargetID int local
/declare PrevTargetName string local
/declare PrevAggroTargetID2 int local
/varset PrevTargetID ${MyTargetID}
/varset PrevTargetName ${MyTargetName}
/varset PrevAggroTargetID2 ${AggroTargetID2}
/varset AggroTargetID2 ${AttackingMobID}
/squelch /target id ${AttackingMobID}
/delay 10 ${Target.ID}==${AttackingMobID}
/varset MyTargetID ${Target.ID}
/varset MyTargetName ${Target.CleanName}
/if (${Me.Pet.ID} && ${Math.Distance[${Target.Y},${Target.X}:${Me.Pet.Y},${Me.Pet.X}]}<=${PetAttackRange}) /pet attack
|Sanity check... should I go back to previous target?
/if (${Target.Mezzed.ID} || (${Spawn[${MyTargetID}].Type.Equal[Corpse]} || !${Spawn[${MyTargetID}].ID})) {
/varset AggroTargetID2 ${PrevAggroTargetID2}
/squelch /target id ${PrevTargetID}
/delay 10 ${Target.ID}==${PrevTargetID}
/varset MyTargetID ${Target.ID}
/varset MyTargetName ${Target.CleanName}
/if (${Me.Pet.ID} && ${Math.Distance[${Target.Y},${Target.X}:${Me.Pet.Y},${Me.Pet.X}]}<=${PetAttackRange}) /pet attack
/return
}
/call BroadCast y "Grabbed mob >>${Spawn[${AttackingMobID}].Name}<< (${Spawn[${AttackingMobID}].ID}) "
/return
Last edited:

