Forgot I commented out armor crush to test something. If you could delete the // in front of //await HutonRefresh(); it will cast armor crush.
Monk rotation doesn't seem to be working at all for me. Targets a mob, runs to it, does nothing. Is MNK implemented yet?
Ah my bad, I just saw the file in YRB with some data that looked like a rotation to me. I'll get the most optimal rotation put up here so it can be of use to anyone with the skills to code it. Side note though Xcesius: Would a monk rotation be capable of moving to targets back and flank for certain skills?
For anyone using the Warrior routine I am still polishing but It's great for situational tanking. Default Rotation - Storm's Eye, Storm's Path, Butcher's Block in Defiance (I use this rotation for when I have full hate on my targets and stack debuffs) Standard single target tanking rotation. Specialhotkey - Heavy Swing, Skull Sunder, Butcher's Block in Defiance (Enmity Rotation) Specialhotkey 1- Fracture, Fell Cleave, Storm's Path, 2x Butcher's Block Deliverance dps rotation. (Swaps Defiance to Deliverance for maximum dps. Great for off tank situations or high level farming) MutliTargert - Steel Cyclone, Overpower, Flash in Defiance (I suggest some practice to get used to this. I activate this hotkey after I have my mobs set in place, takes some getting used to, but very effective for Aoe tanking) Uses light cds Bloodbath, Featherfoot, etc. Major tanking cds are not implemented as I like to use those at my own discretion. Make sure once you activate a certain rotation. You turn it off before activating another rotation. have to ask xcesius how to fix this. feel free to comment of leave any suggestions for improvement. Dont forget to Rep if you Like
Is the ninja skill death blossom not in the spell list of YRB? Trying to add AoE into the mix and it never casts Death Blossom even if that's the only spell i put in the rotation. Also how do I add new ninjitsu? I added Doton to be casted when 3+ enemies are around which it does but when ninjutsu goes on cooldown it tires to spam jin.
Dark Knight Profile, Remove all pulling logic. It's unreliable. It's a raiding buddy not a zombie. You can change the range back to 2.5 if you changed it. Code: // By HeinzSkies using System.Threading.Tasks; using System.Windows.Forms; using ff14bot; using ff14bot.Enums; using ff14bot.Managers; using ff14bot.Objects; using YourRaidingBuddy.Books; using YourRaidingBuddy.Helpers; using HotkeyManager = YourRaidingBuddy.Managers.HotkeyManager; namespace YourRaidingBuddy.Rotations { public class DarkKnight : Root { private static LocalPlayer Me { get { return Core.Player; } } public override ClassJobType[] Class { get { return new[] { ClassJobType.DarkKnight }; } } public override void OnInitialize() { ; } public static async Task<bool> AutoMode() { if (!Me.CurrentTarget.IsViable()) { return false; } Unit.UpdatePriorities(0, 15); return await AutoRotation(); } public static async Task<bool> HotkeyMode() { if (!Me.CurrentTarget.IsViable()) { return false; } Unit.UpdatePriorities(0, 15); return await HotkeyRotation(); } public static async Task<bool> AutoRotation() { if (await Darkside()) return true; if (await Aoe()) return true; if (await DotRotation()) return true; if (await FinishedRotation()) return true; if (HotkeyManager.IsKeyDown(Keys.LShiftKey)) { if (await EnmityRotation()) return true; } else { if (await DpsRotation()) return true; } if (await OffGcdRotation()) return true; if (await MpGeneratorRotation()) return true; return false; } public static async Task<bool> HotkeyRotation() { if (await Darkside()) return true; if (await Aoe()) return true; if (await DotRotation()) return true; if (await FinishedRotation()) return true; if (HotkeyManager.IsKeyDown(Keys.LShiftKey)) { if (await EnmityRotation()) return true; } else { if (await DpsRotation()) return true; } if (await OffGcdRotation()) return true; if (await MpGeneratorRotation()) return true; return false; } public static async Task<bool> Darkside() { if (await Spell.NoneGcdCast("Darkside", Me, () => !Me.HasAura("Darkside") && Me.CurrentManaPercent > 90)) return true; return false; } public static async Task<bool> DpsRotation() { if (await Spell.CastSpell("Syphon Strike", () => Actionmanager.LastSpell.Name == "Hard Slash")) return true; if (await Spell.CastSpell("Hard Slash", () => true)) return true; return false; } // We always want to finished out combo. public static async Task<bool> FinishedRotation() { await DarkArts(); if ( await Spell.CastSpell("Souleater", () => Actionmanager.LastSpell.Name == "Syphon Strike" && (((Me.CurrentTarget.HasAura("Delirium", true, 4000) || Me.CurrentTarget.HasAura("Dragon Kick", true, 4000)) && (Me.CurrentHealthPercent < 70 && Me.HasAura("Grit"))) || Me.HasAura("Dark Arts")))) return true; if ( await Spell.ApplyCast("Delirium", Me.CurrentTarget, () => Actionmanager.LastSpell.Name == "Syphon Strike")) return true; return await Spell.CastSpell("Power Slash", () => Actionmanager.LastSpell.Name == "Spinning Slash"); } public static async Task<bool> DarkArts() { // Using it at Mana > 70% means that we never interrupt more important stuff like Power Slash or Unleash. Which both trigger at 50%. await Spell.NoneGcdCast("Dark Arts", Me, () => Actionmanager.LastSpell.Name == "Syphon Strike" && Me.CurrentManaPercent > 70 && (Me.CurrentTarget.HasAura("Delirium", true, 4000) || Me.CurrentTarget.HasAura("Dragon Kick", true, 4000))); await Spell.NoneGcdCast("Dark Arts", Me, () => Actionmanager.LastSpell.Name == "Spinning Slash" && Me.CurrentManaPercent > 50); return false; } public static async Task<bool> Aoe() { return await Spell.CastSpell("Unleash", Me, () => ((Me.CurrentManaPercent > 50 && VariableBook.HostileUnitsCount > 2) || Me.HasAura("Unleash")) && Actionmanager.LastSpell.Name != "Syphon Strike" && Actionmanager.LastSpell.Name != "Hard Slash" && Actionmanager.LastSpell.Name != "Spinning Slash"); } public static async Task<bool> DotRotation() { if (await Spell.ApplyCast("Scourge", Me.CurrentTarget, () => !Me.CurrentTarget.HasAura("Scourge", true, 4000) && Actionmanager.LastSpell.Name != "Syphon Strike" && Actionmanager.LastSpell.Name != "Hard Slash" && Actionmanager.LastSpell.Name != "Spinning Slash" && Me.CurrentTarget.CurrentHealth > 3000)) return true; return false; } // Currently without a way to detect enmity, we will use hotkey to trigger this. public static async Task<bool> EnmityRotation() { if (await Spell.CastSpell("Spinning Slash", () => Actionmanager.LastSpell.Name == "Hard Slash")) return true; if (await Spell.CastSpell("Hard Slash", () => true)) return true; return false; } public static async Task<bool> OffGcdRotation() { // Offensive await Spell.CastLocation("Salted Earth", Me.CurrentTarget, () => true); await Spell.NoneGcdCast("Reprisal", Me.CurrentTarget, () => true); await Spell.NoneGcdCast("Low Blow", Me.CurrentTarget, () => true); // Need to solve this problem for an increase in dps. // Leaving it like this allow it to be much more flexible. //await Spell.NoneGcdCast("Plunge", Me.CurrentTarget, () => Me.CurrentTarget.Distance(Me) > 10); // Defensive await Spell.NoneGcdCast("Dark Dance", Me, () => Me.CurrentTarget.Distance(Me) < 3); return false; } public static async Task<bool> MpGeneratorRotation() { await Spell.NoneGcdCast("Blood Weapon", Me, () => Me.CurrentManaPercent < 90 && Me.CurrentTarget.Distance(Me) < 3); await Spell.NoneGcdCast("Blood Price", Me, () => Me.CurrentManaPercent < 70 && VariableBook.HostileUnitsTargettingMeCount > 0); await Spell.NoneGcdCast("Carve and Spit", Me.CurrentTarget, () => !Me.HasAura("Dark Arts") && Me.CurrentManaPercent < 50 && Me.CurrentTarget.Distance(Me) < 3); await Spell.NoneGcdCast("Sole Survivor", Me.CurrentTarget, () => (Me.CurrentManaPercent < 70 || Me.CurrentHealthPercent < 70) && Me.CurrentTarget.Distance(Me) < 3 && Me.CurrentTarget.CurrentHealth < 5000); return false; } } }
I just started testing this and grabbed my WAR 50 for it, not real sure what I am doing just as a warning, and if you guys could show me how to make the copy paste go into that scrolling box that would be great too this is what I got everytime I tried to change rotations using hotkeys [18:04:54.960 N] [YourRaidingBuddy] Clearing HeavySwing because EmptySpell this is what I got after finishing a fight, [18:05:43.245 D] Buddy.Coroutines.CoroutineUnhandledException: Exception was thrown by coroutine ---> System.NullReferenceException: Object reference not set to an instance of an object. at YourRaidingBuddy.Rotations.Warrior.<WarriorRotation>b__5a() in c:\Users\Virgil\Desktop\RebornBuddy\Routines\YourRaidingBuddy\Rotations\Jobs\Warrior.cs:line 118 at YourRaidingBuddy.Helpers.Spell.<CastNew>d__25.MoveNext() in c:\Users\Virgil\Desktop\RebornBuddy\Routines\YourRaidingBuddy\Core\Helpers\Spell.cs:line 442 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() at YourRaidingBuddy.Helpers.Spell.<CastSpell>d__1c.MoveNext() in c:\Users\Virgil\Desktop\RebornBuddy\Routines\YourRaidingBuddy\Core\Helpers\Spell.cs:line 387 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() at YourRaidingBuddy.Rotations.Warrior.<WarriorRotation>d__68.MoveNext() in c:\Users\Virgil\Desktop\RebornBuddy\Routines\YourRaidingBuddy\Rotations\Jobs\Warrior.cs:line 118 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() at YourRaidingBuddy.Rotations.Warrior.<HotkeyMode>d__6b.MoveNext() in c:\Users\Virgil\Desktop\RebornBuddy\Routines\YourRaidingBuddy\Rotations\Jobs\Warrior.cs:line 132 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at TreeSharp.ActionRunCoroutine....() --- End of inner exception stack trace --- at Buddy.Coroutines.Coroutine.CheckPostConditions(Boolean shouldBeCanceled) at Buddy.Coroutines.Coroutine.Resume(Boolean forStop) at Buddy.Coroutines.Coroutine.Resume() at TreeSharp.ActionRunCoroutine.Run(Object context) at TreeSharp.Action.RunAction(Object context) at TreeSharp.Action.<Execute>d__0.MoveNext() at TreeSharp.Composite.Tick(Object context) at TreeSharp.PrioritySelector.<Execute>d__0.MoveNext() at TreeSharp.Composite.Tick(Object context) at ff14bot.Behavior.HookExecutor.Run(Object context) at TreeSharp.Action.RunAction(Object context) at TreeSharp.Action.<Execute>d__0.MoveNext() at TreeSharp.Composite.Tick(Object context) at TreeSharp.PrioritySelector.<Execute>d__0.MoveNext() at TreeSharp.Composite.Tick(Object context) at ff14bot.Behavior.HookExecutor.Run(Object context) at TreeSharp.Action.RunAction(Object context) at TreeSharp.Action.<Execute>d__0.MoveNext() at TreeSharp.Composite.Tick(Object context) at TreeSharp.PrioritySelector.<Execute>d__0.MoveNext() at TreeSharp.Composite.Tick(Object context) at TreeSharp.Decorator.<Execute>d__0.MoveNext() at TreeSharp.Composite.Tick(Object context) at TreeSharp.Decorator.<Execute>d__0.MoveNext() at TreeSharp.Composite.Tick(Object context) at ff14bot.TreeRoot.() --> System.NullReferenceException: Object reference not set to an instance of an object. at YourRaidingBuddy.Rotations.Warrior.<WarriorRotation>b__5a() in c:\Users\Virgil\Desktop\RebornBuddy\Routines\YourRaidingBuddy\Rotations\Jobs\Warrior.cs:line 118 at YourRaidingBuddy.Helpers.Spell.<CastNew>d__25.MoveNext() in c:\Users\Virgil\Desktop\RebornBuddy\Routines\YourRaidingBuddy\Core\Helpers\Spell.cs:line 442 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() at YourRaidingBuddy.Helpers.Spell.<CastSpell>d__1c.MoveNext() in c:\Users\Virgil\Desktop\RebornBuddy\Routines\YourRaidingBuddy\Core\Helpers\Spell.cs:line 387 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() at YourRaidingBuddy.Rotations.Warrior.<WarriorRotation>d__68.MoveNext() in c:\Users\Virgil\Desktop\RebornBuddy\Routines\YourRaidingBuddy\Rotations\Jobs\Warrior.cs:line 118 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() at YourRaidingBuddy.Rotations.Warrior.<HotkeyMode>d__6b.MoveNext() in c:\Users\Virgil\Desktop\RebornBuddy\Routines\YourRaidingBuddy\Rotations\Jobs\Warrior.cs:line 132 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at TreeSharp.ActionRunCoroutine....()
} await Spell.CastSpell("Ruin III", () => Me.HasAura("Dreadwyrm Trance")); await Spell.CastSpell("Deathflare", () => Me.HasAura("Dreadwyrm Trance", true, 3000)); return false; } sorry im a noob at this but i am trying to get it to use deathflare when 3 seconds are let on dreadwyrm trance with this code its doing it instantly
VirgiS go back a page it should explain how I set up warrior. Your problem might be that, when you activate a specific rotation through hotkey, you have to press it again to shut it off before selecting another. And if you want to post a proper log, you can click Go Advanced, which will bring up more options, one of them being to attach a file. Once you do that, your log folder is in your Rebornbuddy/Logs Edit: I see what you mean with the errors, but the errors don't seem to affect the performance of the routine, at least not for me
Hi VirgilS I've fixed those null errors in latest version! Hi Mathikk, I'm still working on Summoner, but that's correct. New update out --> Updated DarkKnight Updated Warrior Resolved some null errors on Warrior.cs
New Ninja Update. Added AoE: 1. Load up Reborn Buddy 2. Select YourRaidingBuddy Rotuine 3. Click Combat Settings in RebornBuddy console 4. With YourRaidingBuddy GUI open select Hotkey Settings 5. Next to Hotkey Mode Selection use the drop down list to select Hotkey Mode 6. Next to Modifire Key use the drop down list to select witch ever key you want 7. Next to Multi-Target (AoE) Key select witch ever key you want 8. Press Save and Exit 9. With FFXIV as your active window press your mod+multitarget keys you selected and if the conditions are met you should do the AoE rotation. AoE Conditions: Will Cast Doton if there are 3+ targets in range and the current target you have selected is above 10k hp (The HP number may need to be edited but keeping it like this for now) Will Cast Death Blossom if there are 5+ targets in range. Still need to add Kassatsu support for AoE (Will probably need someone better at this then me to get it to work properly.) Also added Second Wind will use it if you drop below 30% hp. Next Up: Try to optimize armor crush Try to optimize Off GCD Weaving Try to add Kassatsu to AoE Code: using System; using System.Linq; using System.Threading.Tasks; using System.Windows.Media; using Buddy.Coroutines; using ff14bot; using ff14bot.Enums; using ff14bot.Helpers; using ff14bot.Managers; using ff14bot.Objects; using YourRaidingBuddy.Helpers; using YourRaidingBuddy.Settings; using TreeSharp; using System.Collections.Generic; using YourRaidingBuddy.Books; using YourRaidingBuddy.Interfaces.Settings; namespace YourRaidingBuddy.Rotations { public class Ninja : Root { private static LocalPlayer Me { get { return Core.Player; } } //Core.Player.CurrentTarget as BattleCharacter public override ClassJobType[] Class { get { return new[] { ClassJobType.Ninja, ClassJobType.Rogue }; } } private const int MobHp = 3000; private const int BuffHp = 8000; public override void OnInitialize() { ; } #region NewRotation public static async Task<bool> AutoMode() { if (!Me.CurrentTarget.IsViable()) return false; return await NinjaRotation(); } public static async Task<bool> HotkeyMode() { if (!Me.CurrentTarget.IsViable()) return false; if (VariableBook.HkmMultiTarget) await NinjaAoE(); return await NinjaRotation(); } public static async Task<bool> NinjaRotation() { if (Managers.HotkeyManager.IsKeyDown(System.Windows.Forms.Keys.LShiftKey)) { await EmergHuton(); } await DoNinjutsu(); await HutonRefresh(); await DancingEdge(); await Shadow(); await SingleTarget(); await NoneGCD(); return false; } public static async Task<bool> NinjaAoE() { if (VariableBook.HostileUnitsCount >= 3 && Core.Me.CurrentTarget.CurrentHealth >= 10000) { await CastDoton(); } if (VariableBook.HostileUnitsCount >= 5) { await Spell.CastSpell("Death Blossom", Me, () => true); } return false; } public static async Task<bool> EmergHuton() { await Spell.CastSpell("Armor Crush", () => Actionmanager.LastSpell.Name == "Gust Slash"); await Spell.CastSpell("Gust Slash", () => Actionmanager.LastSpell.Name == "Spinning Edge"); await Spell.CastSpell("Spinning Edge", () => true); return false; } public static async Task<bool> HutonRefresh() { if (!Me.HasAura("Duality") && !Core.Me.HasAura("Huton", true, 24000) && Actionmanager.LastSpell.Name == "Gust Slash") { return await Spell.CastSpell("Armor Crush", () => true); } return false; } public static async Task<bool> DancingEdge() { if (!Me.HasAura("Duality") && !Me.CurrentTarget.HasAura("Dancing Edge", true, 4000) && !Me.CurrentTarget.HasAura("Dancing Edge", false, 4000) && !Me.CurrentTarget.HasAura("Storm's Eye", false) && Actionmanager.LastSpell.Name == "Gust Slash") { return await Spell.CastSpell("Dancing Edge", () => true); } return false; } public static async Task<bool> Shadow() { if ((!Me.CurrentTarget.HasAura("Shadow Fang", true, 4000) || !Me.CurrentTarget.HasAura("Shadow Fang", true)) && Me.CurrentTarget.HasAura("Dancing Edge", true) && Actionmanager.LastSpell.Name == "Spinning Edge" && Core.Me.CurrentTarget.CurrentHealth >= MobHp) { return await Spell.CastSpell("Shadow Fang", () => true); } return false; } public static async Task<bool> SingleTarget() { await Spell.CastSpell("Aeolian Edge", () => Me.HasAura("Duality") || Actionmanager.LastSpell.Name == "Gust Slash"); await Spell.CastSpell("Gust Slash", () => Actionmanager.LastSpell.Name == "Spinning Edge"); await Spell.CastSpell("Mutilate", () => Me.CurrentTarget.HasAura(AuraBook.ShadowFang) && (!Me.CurrentTarget.HasAura(AuraBook.Mutilate, true, 4000) || !Me.CurrentTarget.HasAura(AuraBook.Mutilate)) && Core.Me.CurrentTarget.CurrentHealth >= MobHp); await Spell.CastSpell("Spinning Edge", () => true); return false; } public static async Task<bool> NoneGCD() { await Spell.NoneGcdCast("Trick Attack", Me.CurrentTarget, () => Me.HasAura(AuraBook.Suiton) && Me.CurrentTarget.IsBehind); await Spell.NoneGcdCast("Internal Release", Me, () => !Me.HasAura(AuraBook.InternalRelease) && Core.Me.CurrentTarget.CurrentHealth >= BuffHp); await Spell.NoneGcdCast("Blood for Blood", Me, () => !Me.HasAura("Blood for Blood") && Core.Me.CurrentTarget.CurrentHealth >= BuffHp); await Spell.NoneGcdCast("Invigorate", Me, () => Me.CurrentTP < 550); await Spell.NoneGcdCast("Second Wind", Me, () => Me.CurrentHealthPercent <= 30); await Spell.NoneGcdCast("Jugulate", Me.CurrentTarget, () => Me.CurrentTarget.HasAura(AuraBook.Mutilate)); await Spell.NoneGcdCast("Mug", Me.CurrentTarget, () => Me.CurrentTarget.HasAura(AuraBook.ShadowFang)); await Spell.NoneGcdCast("Duality", Me, () => Actionmanager.LastSpell.Name == "Gust Slash" && Me.CurrentTarget.HasAura(AuraBook.ShadowFang, true, 5000) && Me.CurrentTarget.HasAura(AuraBook.DancingEdge, true, 5000)); await Spell.NoneGcdCast("Dream Within a Dream", Me.CurrentTarget, () => Me.CurrentTarget.HasAura("Vulnerability Up")); await Spell.NoneGcdCast("Assassinate", Me.CurrentTarget, () => true); return false; } #endregion #region Ninjatsu Copied From Kupo Credits Masta private static bool HasBleedingDebuff() { return Me.CurrentTarget.HasAura("Storm's Eye", false, 2000) || Me.CurrentTarget.HasAura("Dancing Edge"); } private static readonly SpellData Jin = DataManager.GetSpellData(2263); private static readonly SpellData Chi = DataManager.GetSpellData(2261); private static readonly SpellData Ten = DataManager.GetSpellData(2259); private static readonly SpellData Ninjutsu = DataManager.GetSpellData(2260); private static readonly SpellData Jugulate = DataManager.GetSpellData(2251); private static readonly SpellData Kassatsu = DataManager.GetSpellData(2264); private static readonly SpellData Trick_Attack = DataManager.GetSpellData(2258); private static readonly SpellData Sneak_Attack = DataManager.GetSpellData(2250); public static HashSet<uint> OverrideBackstabIds = new HashSet<uint>() { 3240//Cloud of darkness }; private const int HutonRecast = 8000; internal static async Task<bool> DoNinjutsu() { //Exit early if player was inputting something if (Core.Player.HasAura("Mudra")) return true; if (Actionmanager.CanCastOrQueue(Jin, null)) { if (!Core.Player.HasAura("Huton", true, HutonRecast)) { Logger.Write("YourRaidingBuddy Casting " + "Huton" + "Chi Combo!"); await CastHuton(); return false; } var curTarget = Core.Target as BattleCharacter; if (curTarget == null) return false; // if (curTarget.TimeToDeath() <= 3) // return false; //Suiton var taCD = Trick_Attack.Cooldown; //We can start casting suiton before trick attack is ready cause its going to take some time if (taCD.TotalMilliseconds <= 1300) { if (!await CastSuiton()) return false; if (!(Kassatsu.Cooldown.TotalMilliseconds <= 0) || !Core.Player.HasTarget) return false; if (await Coroutine.Wait(2000, () => Actionmanager.DoAction(Kassatsu, null) && Me.CurrentTarget.HasAura("Shadow Fang") && Me.CurrentTarget.HasAura(492))) { Logger.Write("YourRaidingBuddy Casting " + "Raiton"); if (Me.CurrentTarget.HasAura(492)) await CastRaiton(); } return false; } if (taCD.TotalSeconds >= 5) { await CastRaiton(); } return false; } if (Actionmanager.CanCastOrQueue(Chi, null) && Me.CurrentTarget.HasAura("Shadow Fang")) { Logger.Write("YourRaidingBuddy Casting " + "Raiton"); await CastRaiton(); return false; } if (Actionmanager.CanCastOrQueue(Ten, null)) { Logger.Write("YourRaidingBuddy Casting " + "Ten" + "Ninjutsu!"); { await Coroutine.Wait(2000, () => Actionmanager.DoAction(Ten, null)); await CastNinjutsu(); return false; } } return false; } private static async Task CastHuton() { if (await Coroutine.Wait(2000, () => Actionmanager.DoAction(Jin, null))) { if (await Coroutine.Wait(2000, () => Actionmanager.DoAction(Chi, null))) { if (await Coroutine.Wait(2000, () => Actionmanager.DoAction(Ten, null))) { await CastNinjutsu(); } } } } private static async Task<bool> CastDoton() { if (Actionmanager.CanCastOrQueue(Jin, null)) { if (await Coroutine.Wait(2000, () => Actionmanager.DoAction(Jin, null))) { if (await Coroutine.Wait(2000, () => Actionmanager.DoAction(Ten, null))) { if (await Coroutine.Wait(2000, () => Actionmanager.DoAction(Chi, null))) { return await CastNinjutsu(); } } } } return false; } private static async Task<bool> CastRaiton() { if (!await Coroutine.Wait(2000, () => Actionmanager.DoAction(Ten, null))) return false; if (await Coroutine.Wait(2000, () => Actionmanager.DoAction(Chi, null))) { return await CastNinjutsu(); } return false; } private static async Task<bool> CastSuiton() { if (!await Coroutine.Wait(2000, () => Actionmanager.DoAction(Ten, null))) return false; if (!await Coroutine.Wait(2000, () => Actionmanager.DoAction(Chi, null))) return false; if (!await Coroutine.Wait(2000, () => Actionmanager.DoAction(Jin, null))) return false; if (await CastNinjutsu()) { return await Coroutine.Wait(2000, () => Core.Player.HasAura("Suiton")); } return false; } private static async Task<bool> CastNinjutsu() { if (await Coroutine.Wait(2000, () => Core.Player.HasAura("Mudra"))) { bool possibly = false; while (Core.Player.HasAura("Mudra")) { if (Core.Player.HasTarget) { if (Actionmanager.DoAction(Ninjutsu, Core.Target)) { possibly = true; } } if (!Core.Player.InCombat) return false; await Coroutine.Yield(); } await Coroutine.Wait(2000, () => Ninjutsu.Cooldown.TotalSeconds > 10); return possibly; } return false; } #endregion } }
We need to have a central place of these dot cooldown. People are using 3000 or 4000 for checking. We should have 1 place for all of this.
i do not understand then because it is casting deathflare instantly instead of letting dreadwyrm trance go down to 3 seconds
i guess if your working on summoner i will work on the monk code but i don't know how to make it so attacks are done by your position on the npc