I recently got a monk up to 110 and reasonably geared to use him as a puller for grinding. I was getting tired of my warrior getting whaled on with bad pulls. So here's a little "pull" routine that I use with a modified "Kissassist" (basically, I have it call this routine in a few different places). I am happy to share that Kissassist if people want or the places where to insert the call to this routine.
This routine currently calls a modified routine for MQ2Nav. I will explain that in a second posting.
My lifetime playing time for a Monk is about 3 weeks, so helpful suggestions welcome. Basically right now it:
Joojoobee
- - - Updated - - -
Oh, I also add this call right before pulling... adds some protection for the puller
This routine currently calls a modified routine for MQ2Nav. I will explain that in a second posting.
My lifetime playing time for a Monk is about 3 weeks, so helpful suggestions welcome. Basically right now it:
- Tries to pull 2 or fewer.
- If more than 2 and they are close (worried you might get hit), it feigns or feigns on some other conditions... (again, I welcome ideas)
- If more than 4 on a pull, it feigns or imitates death.
- It tries to Mend as needed.
Joojoobee
Rich (BB code):
|: --------------------------------------------------------------------------------------------
|: SUB: MonkFeignSplit
|: --------------------------------------------------------------------------------------------
sub MonkFeignSplit(string FromRoutine)
/declare HoldingPatternCount int local 2
/declare closeToCampFeigned int local 1
/declare SplitTimer timer local 0
/if (!${Select[${Me.Class.ShortName},MNK]}) /return
:waitforSplit
/call miniRadar
/if (${XTargCount} <= 1 && ${XTargClosestDist} > 10 && ${SplitTimer}==0) /goto :LeaveLoop |: If only 1 on Xtarget, and it's far enough away... leave the loop and go back to pull routine
|: if it's going to be a messy pull, easier to just imitate death out of the situation and run back to camp and go find another.
/if ((${Me.PctHPs}<15 && ${Me.AltAbilityReady[Imitate Death]} && !${Me.Feigning} ) || ${XTargCount} > 4) {
/alt act ${Me.AltAbility[Imitate Death].ID}
/echo I am Imitating Death
/delay 1s
/if (${Me.PctHPs}<60 && ${Me.Feigning}) /doability "Mend"
/delay 10s
/goto :waitforSplit
}
|: Feign if I pulled too many and the Mobs are too close, or HPs are low, o r my HPs are a little low and the closest NPC is standing right over me, or there are 5 or more on Xtarget
/if ((${XTargCount}> ${HoldingPatternCount} && ${XTargClosestDist} < 15 && ${XTargClosestDist} > 0.1) || ${Me.PctHPs}<50 || (${Me.PctHPs}<80 && ${XTargClosestDist} < 10 && ${XTargClosestDist} > 0.1) || ${XTargCount}>4) {
/if (!${Me.Feigning}) {
/doability "Feign Death"
/echo I am feigning to split or the NPC is too close ${XTargCount}
/doability "Mend"
/delay 1s
/varset SplitTimer 10s
}
/if (${Math.Distance[${CampYLoc},${CampXLoc}]}<=15) {
/if (${closeToCampFeigned} > 2 && ${XTargClosestDist} > 20) /goto :LeaveLoop |: Mob now far enough away, leave the loop
/varset closeToCampFeigned ${Math.Calc[${closeToCampFeigned}+1]} |: Increment the counter-- might want to just make this a timer at some point.
}
/if (${SplitTimer}==0 && ${XTargClosestDist} > 15) {
/stand
/echo Stand from Split 1, then nav
/call MQ2NavFix ${XposCamp} ${YposCamp} ${ZposCamp} |: My fix for MQ2Nav not finding endpoint or startpoint
}
/goto :waitforSplit
}
:LeaveLoop
/if (${Me.Feigning}) {
/stand
/echo Stand from Split 2 ${Math.Distance[${YposCamp},${XposCamp}]}>10, then nav
/delay 500
/call MQ2NavFix ${XposCamp} ${YposCamp} ${ZposCamp} |: My fix for MQ2Nav not finding endpoint or startpoint
}
/if (${FromRoutine.NotEqual[PullWithCast]} && ${Math.Distance[${YposCamp},${XposCamp}]}>10) {
/call MQ2NavFix ${XposCamp} ${YposCamp} ${ZposCamp} |: My fix for MQ2Nav not finding endpoint or startpoint
}
/return
|: --------------------------------------------------------------------------------------------
|: SUB: miniRadar
|: --------------------------------------------------------------------------------------------
sub miniRadar
/declare firstCheck int local 0
/declare ilist int local 0
/varset XTargCount 0
/varset XTargClosestID 0
/varset XTargClosestDist 0
/for ilist 1 to ${Me.XTarget}
/if (${Spawn[${Me.XTarget[${ilist}].ID}].Type.Equal[NPC]}) {
/varset XTargCount ${Math.Calc[${XTargCount} + 1]}
/if (${firstCheck}==0) {
/varset XTargClosestID ${Spawn[${Me.XTarget[${ilist}].ID}
/varset XTargClosestDist ${Spawn[${XTargClosestID}].Distance}
/varset firstCheck 1
}
/if (${XTargClosestDist}>${Spawn[${Me.XTarget[${ilist}].ID}].Distance}) {
/varset XTargClosestID ${Spawn[${Me.XTarget[${ilist}].ID}
/varset XTargClosestDist ${Spawn[${XTargClosestID}].Distance}
}
}
/next ilist
/return
- - - Updated - - -
Oh, I also add this call right before pulling... adds some protection for the puller
Rich (BB code):
|: --------------------------------------------------------------------------------------------
|: SUB: MonkProtectionSpells
|: --------------------------------------------------------------------------------------------
sub MonkProtectionSpells(int MobTargetID)
/declare PathDistanceToMob
/if (!${Select[${Me.Class.ShortName},MNK]}) /return
/varset PathDistanceToMob ${Navigation.PathLength[id ${MobTargetID}]}
/if (${PathDistanceToMob} < 30) /return
/if (${Me.CombatAbilityReady[${Spell[Shaded Step].RankName}]}) {
/call CastWhat "Shaded Step Rk. II"
} else /if (${Me.CombatAbilityReady[${Spell[Earthforce Discipline].RankName}]}) {
/call CastWhat "Earthforce Discipline Rk. II"
}
/delay 1s
/return

