DriveCrash
Well-known member
- Joined
- Jul 9, 2015
- RedCents
- 993¢
Pullers, no matter what type, have a tendency to hang after a pull, and sit there with a thumb in the butt. Sometimes this hang can last 30 seconds, until the timer expires and returns a no aggro flag
An example follows:
Repeat x 4,000+ lines until:
If the puller is needing to tank, or mez, or whatever else it spells trouble. This happens more often than not, and can often last even longer. Up to 30 seconds. Despite playing with camp radius and melee radius values, I have not found a way to resolve this through the INI.
I noticed once MQ enter's this rapid loop, no commands work until it finally exits the loop.. so I started snooping through the KA macro.
The problem seems to be when dealing with large hit box mobs or wide open area's where distances increase. However things start getting out of sync if you increase the camp radius. Primarily the puller will often stop at the edge of the camp radius, which is too far from mercs to assist, or other PC's with lower camp radius settings to engage, instead of returning to near camp center. Because the Puller flag on / off function currently doesn't work (no idea, it just doesn't) the puller will be outside the 2 foot merc healing range, and likely die.
Puller stops on large camp radius's because:
in the DoIMove routine. But that should stay.
I created a PullMobRadar sub for non-LOS checking to resolve some of the hangs. I also added a "Puller engage distance" so the puller returns all the way to camp, but starts adding mobs to the array at a further distance. I have tested this routine for eight hours now, and have not seen the puller hang after a pull. This includes pettankpuller, pullertank and puller.
and in the pull routine:
And the Puller Radar Sub:
I also got the puller flag on off thing working, but that will be another post.
P.s. At the end of MercsDoWhat debug says enter again, instead of leave =P
I'm not sure if these changes will fit all the needs of KA users, but I thought I would let you know what I personally found. Hope it help.
-Drive
- - - Updated - - -
Doh. I meant to post this as a Bug, sorry.
An example follows:
Rich (BB code):
[2015/07/26 02:43:53] [MQ2] DEBUG DoWeMove:(ReturnToCamp) Distance to camp > 15, MQ2MoveUtils return to camp.
[2015/07/26 02:44:02] [MQ2] Debug ZCheck ZCur: 0.37 ZDiff: 3.10 Enter.
[2015/07/26 02:44:02] [MQ2] Debug ZCheck ZCur: 0.37 ZDiff: 3.10 Exit.
[2015/07/26 02:44:02] [MQ2] DEBUG DoWeMove: Leave
[2015/07/26 02:44:03] [MQ2] DEBUG MobRadar 75 Enter (WaitForMob)
[2015/07/26 02:44:03] [MQ2] AddToArray 1628 enter
[2015/07/26 02:44:03] [MQ2] ARRAY Assign >> a bonestitch golem << to AddsArray1.
[2015/07/26 02:44:03] [MQ2] DEBUG MobRadar leave
[2015/07/26 02:44:03] [MQ2] DEBUG MobRadar 75 Enter (WaitForMob)
[2015/07/26 02:44:03] [MQ2] DEBUG MobRadar leave
[2015/07/26 02:44:03] [MQ2] DEBUG MobRadar 75 Enter (WaitForMob)
[2015/07/26 02:44:03] [MQ2] DEBUG MobRadar leave
Repeat x 4,000+ lines until:
Rich (BB code):
[2015/07/26 02:44:23] [MQ2] DEBUG MobRadar 75 Enter (WaitForMob)
[2015/07/26 02:44:23] [MQ2] DEBUG MobRadar leave
[2015/07/26 02:44:23] [MQ2] DEBUGPULL WaitForMob /return no AggroTargetID
[2015/07/26 02:44:23] [MQ2] DEBUGPULL PullReset enter
[2015/07/26 02:44:23] [MQ2] DEBUGPULL PullReset leave
[2015/07/26 02:44:23] [MQ2] DEBUGPULL Pull leave Mob ID:NULL
[2015/07/26 02:44:23] [MQ2] CheckForCombat Enter SkipCombat: 0 ChainPull: 0 Role: puller MainLoop
[2015/07/26 02:44:24] [MQ2] CheckForCombat: Assist/Combat Begin Normal
[2015/07/26 02:44:24] [MQ2] DEBUGCOMBAT Assist Enter
[2015/07/26 02:44:24] [MQ2] DEBUG MobRadar 120 Enter (Assist)
[2015/07/26 02:44:24] [MQ2] DEBUG MobRadar leave
If the puller is needing to tank, or mez, or whatever else it spells trouble. This happens more often than not, and can often last even longer. Up to 30 seconds. Despite playing with camp radius and melee radius values, I have not found a way to resolve this through the INI.
I noticed once MQ enter's this rapid loop, no commands work until it finally exits the loop.. so I started snooping through the KA macro.
The problem seems to be when dealing with large hit box mobs or wide open area's where distances increase. However things start getting out of sync if you increase the camp radius. Primarily the puller will often stop at the edge of the camp radius, which is too far from mercs to assist, or other PC's with lower camp radius settings to engage, instead of returning to near camp center. Because the Puller flag on / off function currently doesn't work (no idea, it just doesn't) the puller will be outside the 2 foot merc healing range, and likely die.
Puller stops on large camp radius's because:
Rich (BB code):
/if (${Select[${Role},puller,pullertank,pullerpettank]} && ${Math.Distance[${CampYLoc},${CampXLoc}]}<=${CampRadius} && !${Medding}) /return
I created a PullMobRadar sub for non-LOS checking to resolve some of the hangs. I also added a "Puller engage distance" so the puller returns all the way to camp, but starts adding mobs to the array at a further distance. I have tested this routine for eight hours now, and have not seen the puller hang after a pull. This includes pettankpuller, pullertank and puller.
Rich (BB code):
| ************************* Pull ****************************************|
/call LoadIni Pull PullWith string "Melee"
/call LoadIni Pull MaxRadius int 350
/call LoadIni Pull MaxZRange int 50
/call LoadIni Pull EngageRadius int 50
and in the pull routine:
Rich (BB code):
| -------------------------------------------------------------------------------------
| SUB: Wait for Mob
| -------------------------------------------------------------------------------------
Sub WaitForMob
/if (${Select[${Role},hunter,hunterpettank]} || ${DPSPaused}) /return
/if (${DebugPull}) /echo DEBUGPULL WaitForMob enter
/declare WaitTimer timer local 30s
/if (${Pulled}) {
/if (${DebugPull}) /echo DEBUGPULL WaitForMob Waiting for mob
/call DoWeMove
/delay 60s ${Math.Distance[${CampYLoc},${CampXLoc}]} < ${EngageRadius}
/if (${ChainPull}) /varset LastMobPullID ${Target.ID}
/declare FaceTimer timer local 0
/if (${InvSlot[ranged].Item.Name.NotEqual[${OrigRanged}]} && ${OrigRanged.NotEqual[null]}) {
/call CheckCasting 50
/exchange "${OrigRanged}" ranged
}
:WaitForMob
/if (${Target.ID} && ${FaceTimer}==0) /face nolook
/look 0
/doevents
/call PullMobRadar ${EngageRadius} WaitForMob
| If NOT chain pulling and multiple mobs in camp. /return
/if (${MobCount}>=2 && !${ChainPull}) {
/call PullReset
/return
}
| if target lost somehow add to ignore list and continue pulls
/if ((!${AggroTargetID} && !${ChainPull}) || ${WaitTimer}==0) {
/if (${DebugPull}) /echo DEBUGPULL WaitForMob /return no AggroTargetID
/varset PullTempIgnoreList ${Target.ID},${PullTempIgnoreList}
/squelch /alert add 1 id ${Target.ID}
/call PullReset
/return
}
/varset FaceTimer 1s
| I am PULLER or HUNTER with PET TANK
/if (${Select[${Role},pullerpettank,hunterpettank]}) {
|- Make sure pet is returning to camp with me.
/if (${Me.Pet.ID} && ${Math.Distance[${Me.Pet.Y},${Me.Pet.X}:${CampYLoc},${CampXLoc}]}>${CampRadius} && ${Math.Distance[${Me.Pet.Y},${Me.Pet.X}:${Me.Y},${Me.X}]}>20) {
/pet back off
/delay 10
/pet follow
}
| If the mob is within pet attack distance from camp send the pet in to attack
/if (${Math.Distance[${CampYLoc},${CampXLoc}:${Spawn[${MyTargetID}].Y},${Spawn[${MyTargetID}].X}]}>=${PetAttackRange}) /goto :WaitForMob
/if (!${PetAttack}) /call CombatPet
}
| I am PULLER TANK
/if (${Select[${Role},pullertank]}) {
/if (${Math.Distance[${CampYLoc},${CampXLoc}:${Spawn[${MyTargetID}].Y},${Spawn[${MyTargetID}].X}]}>=${EngageRadius} && ${Target.Distance}>40) /goto :WaitForMob
}
| If I am PULLER and NOT chain pulling
/if (${Select[${Role},puller]} && !${ChainPull}) {
/if (${Math.Distance[${CampYLoc},${CampXLoc}:${Spawn[${MyTargetID}].Y},${Spawn[${MyTargetID}].X}]}>=${EngageRadius}) /goto :WaitForMob
/if (${MercOn} && !${MercAssisting} && ${MyTargetID} && ${Mercenary.State.Equal[Active]}) /call MercsDoWhat
}
| If I am PULLER and chain pulling
/if (${Select[${Role},puller]} && ${ChainPull}) {
| leave if multi mobs or no mobs
/if (${MobCount}>=2 || !${MyTargetID} || (${Me.XTarget[${XTSlot}].ID} && ${Me.XTarget[${XTSlot2}].ID})) {
/call PullReset
/return
}
/if (${Math.Distance[${Target.Y},${Target.X}:${Spawn[=${MainAssist}].Y},${Spawn[=${MainAssist}].X}]}>20 && ${Target.ID}==${Spawn[${MyTargetID}].ID} && ${Me.TargetOfTarget.ID}==${Me.ID}) /echo WaitForMob
}
}
|Turn off Puller flag if Soloing with merc
/if (${Group}==1 && ${Select[${Role},puller]} && ${Group.Puller.Name.Equal[${Me}]} && ${Spawn[=${MainAssist}].Type.Equal[Mercenary]} && ${Spawn[${MyTargetID}].Distance}<=${MeleeDistance}) /call AssignGroupRole unset "${Me.CleanName}" 3
/if (${MyTargetID} && (!${AggroTargetID} && !${ChainPull}) || (!${Me.XTarget[${XTSlot2}].ID} && ${Me.XTarget[${XTSlot}].ID}!=${MyTargetID} && ${ChainPull})) /call PullReset
/if (${IAmABard}) /call DoBardStuff
/call MercsDoWhat
/if (${DebugPull}) /echo DEBUGPULL WaitForMob leave
/return
And the Puller Radar Sub:
Rich (BB code):
| -------------------------------------------------------------------------------------
| Sub PullMobRadar
| -------------------------------------------------------------------------------------
Sub PullMobRadar(int CountRadius,atring calledfrom)
/if ((${DMZ} && ${Me.InInstance}==FALSE)) /return
/if (${DebugPull}) /echo DEBUG PullMobRadar ${CountRadius} Enter (${calledfrom})
/declare NMob int local
/declare i int local
/declare k int local
/varset MobCount ${SpawnCount[npc targetable radius ${CountRadius} zradius 50 noalert 3]}
/for i 1 to ${MobCount}
/varset NMob ${NearestSpawn[${i},npc targetable radius ${CountRadius} zradius 50 noalert 3].ID}
/if (${i}>13) /goto :ArrayExceed
/if (${AddsArray[${i},1].NotEqual[NULL]} && (${Spawn[${AddsArray[${i},1]}].Type.Equal[Corpse]} || !${Spawn[${AddsArray[${i},1]}].ID})) /call RemoveFromArray ${i}
/if (${MobCount}>0 && ${Select[${NMob},${AddsArray[1,1]},${AddsArray[2,1]},${AddsArray[3,1]},${AddsArray[4,1]},${AddsArray[5,1]},${AddsArray[6,1]},${AddsArray[7,1]},${AddsArray[8,1]},${AddsArray[9,1]},${AddsArray[10,1]},${AddsArray[11,1]},${AddsArray[12,1]},${AddsArray[13,1]}]}==0) /call AddToArray ${NMob}
:ArrayExceed
/next i
| Check if NPC Pet is on Xtarget
/if (!${MobCount} && ${Me.XTarget[${XTSlot}].ID}) {
/if (${Me.XTarget[${XTSlot}].Type.Equal[pet]}) /varset MobCount 1
}
/if (${DebugPull}) /delay 5
/if (${DebugPull}) /echo DEBUG PullMobRadar leave
/return
I also got the puller flag on off thing working, but that will be another post.
P.s. At the end of MercsDoWhat debug says enter again, instead of leave =P
I'm not sure if these changes will fit all the needs of KA users, but I thought I would let you know what I personally found. Hope it help.
-Drive
- - - Updated - - -
Doh. I meant to post this as a Bug, sorry.


