again this is for P999 server and not live
I'm not sure if you got a resolution for this. On my bard I simply play selo's in the twist and 3 DoT's, for the actual circle I simply grabbed up the critters and then pressed Forward and Right keys (W and D) and hit enter. which causes them to be held down. The auto target bit should do the rest. Places like Dulak harbor was pretty good for my bard to DoT this way.
If the keyboard mechanics are the same on P99 then pressing enter while holding any directional key should cause it to remain pressed until you hit any of the directional keys. It creates a tight circle, but with Selo's going it keeps you out of range, Typically it kept you in range for AoEDoT songs as well. Which made it epic pre-swarm kiting with charm/invis clicky.
Sometimes Selo's doesn't quite stick when doing a /twist, might consider adding a check for Selo's buff and if it isn't present doing a /twist end, /twist 1 2 3 4 (renumber based on song locations)
Something a bit more complicated than what you got could be.
Code:
turbo
Sub Main
/declare alertTimer timer outer
/declare newHP int outer
/declare startHP int outer
/twist 1 5 6 7 8
:loopstart
/doevents
/call GMCheck
:/call HealthChk
/call TargetNPC
/call InvulnerableCheck
/goto :loopstart
/return
Sub GMCheck
/if (${Spawn[GM].ID}) {
/echo Gm detected
/beep
/beep
/beep
/end
/unload
/q
}
/delay 5
/return
Sub TargetNPC
/if ((!${Target.ID}) || (${Target.Distance}>220)) {
/target npc noalert 1
/varset startHP ${Target.PctHPs}
/varset alertTimer 12s
/delay 5
}
/if (${Target.Level}>100) {
/alert add 1 ${Target.Name}
/keypress esc
}
/if ((!${Target.ID}) || (${Target.Type.Equal[corpse]})) {
/echo Getting a new target
/call TargetNPC
}
}
/return
Sub HealthChk
/if (${Me.PctHPs}<=45) /potionbelt Activate 1
/if (${Me.PctHPs}<=60) /potionbelt Activate 2
/return
Sub WaitKill
:/echo Waiting
/delay 1s
/return
Sub InvulnerableCheck
/if (${alertTimer} > 0) /echo ${alertTimer}
/if (!${alertTimer}) {
/varset newHP ${Target.PctHPs}
/if (${startHP} == ${newHP}) {
/echo Times up, you can't hurt this creature.
/alert add 1 ${Target.Name}
/delay 5
/keypress esc
}
}
/if (${Target.Type.Equal[NPC]}) /call WaitKill
/return
/end
In Theory the /twist could be pulled out of the loop and placed above :loopstart. If you are using the long lasting Selo's then shouldn't be a big issue. /twist repeats casting events and even recasts selo's. Shouldn't be a need to recast every time the loop runs. I broke targeting and health check down into a function/method/sub routine, whatever you want to call it.
The /alert add 1 by target ID will add the NPC's over level 75 to a list of targets to not select from based on that NPC's ID. Then the request for a target /target npc noalert 1 means select an NPC that isn't on the alert list. This eliminates the need to do a /target npc next (This didn't have the radius check and would have likely caused some issues.) I'm not sure about the syntax of the radius request afterwords. This could also be modified to accept parameters from you IE: /mac autotarget 220 75 1 2 3 4 5 6, it's quite lengthy but would be personalized. 220 is the radius, 75 is max level for target. 1 2 3 4 5 6 would be your songs you want to /twist. But I suppose you understand the code you originally posted.