Hi Echo, thanks for taking over singular. I decided to take a closer look at windwalker monk, since I main that class and the DPS the bot is putting out was a bit low.
I wont focus on AoE DPS in this post, but the current spinning crane kick behavior is not ideal. Anyway
The following issues I'd like to see adressed:
- Use Artifact Ability 'Strike of the Windlord'. Nice to have: Dont use the ability if the damage would be a massive overkill on non-elites
- Make use of the WW Monks Mastery: Combo Strikes. See notes below.
- Minor: Use 'Touch of Karma' if health is getting low and we might need to fight a bit longer
Point 1 should be fairly simple. In fact, I just added it to the Rotation and it works fine - as expected
Point 2 is only possible by changing the Spell Class slighly:
In said class there are 2 properties: LastSpellCast and LastSpellTarget
Due to some unknown reason, LastSpellCast is never written to and only used in the Warlock Routines. To get WW Monk working, I added some code to write the last spell used. I also added a canUse requirement to Blackout Kick and Tiger Palm (single target rotation only though).
Effectivly, you never want to cast Tiger Palm or Blackout Kick twice (or any other ability), even if you have the resources to do so. This can cause problems though if Tiger Palm gets parried/dodged. To counter any dead-locks, I added a simple DateTime property "LastSpellTimestamp". If the routine didnt use a spell for more than 5 seconds (add this to config?), allow the use of spells that have been used before. Better would be some form of detection if said spells missed the target - but I dont know how we could accomplish that easily.
There only one issue with my changes: I dont have a level check in place. The mastery is only available at level 80+ (added)
Here is some code on how I did it. Feel free to use this or discard it.
Thanks!
Spell.cs Changes @ line ~90:
Code:
public static bool CastPrimative(string spellName)
{
LastSpellTimestamp = DateTime.Now;
LastSpellCast = spellName;
LastSpellTarget = WoWGuid.Empty;
return SpellManager.Cast(spellName);
}
public static bool CastPrimative(int id)
{
LastSpellTimestamp = DateTime.Now;
LastSpellCast = WoWSpell.FromId(id)?.Name;
LastSpellTarget = WoWGuid.Empty;
return SpellManager.Cast(id);
}
public static bool CastPrimative(WoWSpell spell)
{
LastSpellTimestamp = DateTime.Now;
LastSpellCast = spell.Name;
LastSpellTarget = WoWGuid.Empty;
return SpellManager.Cast(spell);
}
public static bool CastPrimative(string spellName, WoWUnit unit)
{
LastSpellTimestamp = DateTime.Now;
LastSpellCast = spellName;
LastSpellTarget = unit == null ? WoWGuid.Empty : unit.Guid;
return SpellManager.Cast(spellName, unit);
}
public static bool CastPrimative(int id, WoWUnit unit)
{
LastSpellTimestamp = DateTime.Now;
LastSpellCast = WoWSpell.FromId(id)?.Name;
LastSpellTarget = unit == null ? WoWGuid.Empty : unit.Guid;
return SpellManager.Cast(id, unit);
}
public static bool CastPrimative(WoWSpell spell, WoWUnit unit)
{
LastSpellTimestamp = DateTime.Now;
LastSpellCast = spell.Name;
LastSpellTarget = unit == null ? WoWGuid.Empty : unit.Guid;
return SpellManager.Cast(spell, unit);
}
Windwalker.cs changes
Code:
/// <summary>
/// Checks if said spell would be affected by the ww mastery
/// </summary>
/// <param name="spellName"></param>
/// <returns>True if below level 80 or if different spell was used last, false otherwise</returns>
private static bool DamageIncreasedByMastery(string spellName)
{
// If we are below level 80, we want to spam abilities since we dont benefit from our mastery yet
return Me.Level < 80 || Spell.LastSpellCast != spellName || (DateTime.Now - Spell.LastSpellTimestamp).TotalMilliseconds >= 5000;
}
[...] @ line ~112
Spell.BuffSelf("Serenity", req => Me.CurrentTarget.IsStressful()),
Spell.Cast("Touch of Death", req => Me.CurrentTarget.TimeToDeath() > 8),
Spell.Cast("Storm, Earth, and Fire", req => MonkSettings.UseSef && !Me.HasActiveAura("Storm, Earth, and Fire") && Me.CurrentTarget.IsStressful()),
[... AOE CODE ...]
Spell.Cast("Fists of Fury"),
Spell.Cast("Whirling Dragon Punch"),
Spell.Cast("Tiger Palm", req => Me.CurrentChi < 4 && EnergyDeficit < 10 && DamageIncreasedByMastery("Tiger Palm")),
Spell.Cast("Strike of the Windlord"),
Spell.Cast("Rising Sun Kick"),
Spell.Cast("Chi Wave"),
Spell.Cast("Blackout Kick", req => DamageIncreasedByMastery("Blackout Kick")),
Spell.Cast("Tiger Palm", req => DamageIncreasedByMastery("Tiger Palm"))
[...]