What's new
  • Visit Rebornbuddy
  • Visit Panda Profiles
  • Visit LLamamMagic
  • Visit Resources
  • Visit Downloads
  • Visit Portal
RebornBuddy Forums

Register a free account today to become a member! Once signed in, you'll be able to participate on this site by adding your own topics and posts, as well as connect with other members through your own private inbox!

YourRaidingBuddy - Coming Soon

New update out -->


  • Added test Summoner rotation (Still not completed fully)
  • Added Warrior Rotation //Credits stewiethecat
  • Added updated Darkknight Rotation //Credits heinzkies
  • Added updated Ninja Rotation //Credits Wolfrain62
  • Resolved an issue with StopBehaviors
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?
 
Hi zazey,

No one has started on one, so no :p
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?
 
Ninja rotation is pretty amaze! Definitely can "three finger" expert duties with it!
 
MAd error in latest

[22:51:28.485 N] Compiler Error: c:\Rebornbuddy 1.0.287.0\Routines\YourRaidingBuddy\Root.cs(30,46) : warning CS0109: The member 'YourRaidingBuddy.Root.Revision' does not hide an inherited member. The new keyword is not required.
[22:51:28.485 N] Compiler Error: c:\Rebornbuddy 1.0.287.0\Routines\YourRaidingBuddy\Root.cs(150,40) : warning CS1998: This async method lacks 'await' operators and will run synchronously. Consider using the 'await' operator to await non-blocking API calls, or 'await Task.Run(...)' to do CPU-bound work on a background thread.
[22:51:28.485 N] Compiler Error: c:\Rebornbuddy 1.0.287.0\Routines\YourRaidingBuddy\Core\Helpers\Movement.cs(133,13) : warning CS0162: Unreachable code detected
[22:51:28.485 N] Compiler Error: c:\Rebornbuddy 1.0.287.0\Routines\YourRaidingBuddy\Core\Helpers\Spell.cs(304,40) : warning CS1998: This async method lacks 'await' operators and will run synchronously. Consider using the 'await' operator to await non-blocking API calls, or 'await Task.Run(...)' to do CPU-bound work on a background thread.
[22:51:28.485 N] Compiler Error: c:\Rebornbuddy 1.0.287.0\Routines\YourRaidingBuddy\Rotations\Jobs\Bard.cs(36,40) : warning CS1998: This async method lacks 'await' operators and will run synchronously. Consider using the 'await' operator to await non-blocking API calls, or 'await Task.Run(...)' to do CPU-bound work on a background thread.
[22:51:28.485 N] Compiler Error: c:\Rebornbuddy 1.0.287.0\Routines\YourRaidingBuddy\Rotations\Jobs\Darkknight.cs(232,72) : error CS1660: Cannot convert lambda expression to type 'bool' because it is not a delegate type
[22:51:28.485 N] Compiler Error: c:\Rebornbuddy 1.0.287.0\Routines\YourRaidingBuddy\Rotations\Jobs\Darkknight.cs(253,70) : error CS0117: 'YourRaidingBuddy.Books.VariableBook' does not contain a definition for 'HostileUnitsTargettingMeCount'
[22:51:28.485 N] Compiler Error: c:\Rebornbuddy 1.0.287.0\Routines\YourRaidingBuddy\Rotations\Jobs\Summoner.cs(51,71) : error CS1660: Cannot convert lambda expression to type 'bool' because it is not a delegate type

...NVM appears to be working now..
 
Last edited:
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.
 
Last edited:
Thank you for the rundown.

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 :)
 
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
 
Last edited:

Hi VirgilS

I've fixed those null errors in latest version!

}
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

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
    }
}
 
Last edited:
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.
 
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

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
 
Back
Top