using System;
using System.Linq;
using Buddy.BehaviorTree;
using Buddy.Common;
using Buddy.CommonBot;
using Buddy.Swtor;
using WingIt.Dynamics;
using Action = Buddy.BehaviorTree.Action;
namespace WingIt.Routines
{
public static class SentinelWatchman
{
[Class(CharacterClass.Knight, AdvancedClass.Sentinel, SkillTreeId.SentinelWatchman)]
[Behavior(BehaviorType.Combat)]
public static Composite SentinelWatchmanCombat()
{
return new PrioritySelector(
Movement.StopInRange(0.4f),
Spell.WaitForCast(),
// Pull
Spell.Cast("Force Leap", ret => BuddyTor.Me.CurrentTarget.Distance >= 1f), //+3 Focuse/15s CD/30m Range - Pull
Spell.Cast("Overload Saber", castWhen => !BuddyTor.Me.HasBuff("Overload Saber")),
// CC Break
Spell.Cast("Resolve", castWhen => BuddyTor.Me.IsStunned), //Insignia/2m CD
Spell.Cast("Valorous Call", castWhen => !BuddyTor.Me.HasBuff("Centering")),
// Zen, top priority
Spell.Cast("Zen", castWhen => BuddyTor.Me.Buffs.FirstOrDefault(B => B.Name == "Centering").Stacks == 30 && !BuddyTor.Me.HasBuff("Zen")),
// Group buffs
//Spell.Cast("Inspiration", castWhen => BuddyTor.Me.CurrentTarget.Debuffs.FirstOrDefault(B => B.Name == "Centering").Stacks == 30 && BuddyTor.Me.InCombat),//5m CD
//Spell.Cast("Transcendence", castWhen => BuddyTor.Me.CurrentTarget.Debuffs.FirstOrDefault(B => B.Name == "Centering").Stacks == 30 && BuddyTor.Me.HealthPercent <= 50 || (BuddyTor.Me.CurrentTarget.Distance >= 30 && !AbilityManager.CanCast("Force Charge", BuddyTor.Me.CurrentTarget))),
Spell.Cast("Combat Focus", castWhen => BuddyTor.Me.InCombat && BuddyTor.Me.ResourceStat <= 6),
//#
Spell.Cast("Pacify", castwhen => BuddyTor.Me.CurrentTarget.Toughness == CombatToughness.Player || BuddyTor.Me.CurrentTarget.Toughness == CombatToughness.Standard || BuddyTor.Me.CurrentTarget.Toughness == CombatToughness.Strong || BuddyTor.Me.CurrentTarget.Toughness == CombatToughness.Weak),
// Defensive abilities
Spell.BuffSelf("Rebuke", castWhen => BuddyTor.Me.InCombat && BuddyTor.Me.HealthPercent <= 70),//1m CD
Spell.BuffSelf("Saber Ward", castWhen => BuddyTor.Me.InCombat && BuddyTor.Me.HealthPercent <= 50),//3m CD
Spell.BuffSelf("Force Camouflage", castWhen => BuddyTor.Me.InCombat && BuddyTor.Me.HealthPercent <= 20),//45s CD
Spell.BuffSelf("Guarded by the Force", castWhen => BuddyTor.Me.InCombat && BuddyTor.Me.HealthPercent <= 10),//1m15s CD
//**CC**
Spell.Cast("Force Kick", castWhen => BuddyTor.Me.CurrentTarget.IsCasting && BuddyTor.Me.CurrentTarget.CastTimeEnd - TimeSpan.FromSeconds(1) >= DateTime.Now),
Spell.Cast("Force Stasis", castWhen => ((BuddyTor.Me.CurrentTarget.IsCasting && !AbilityManager.CanCast("Disruption", BuddyTor.Me.CurrentTarget) || BuddyTor.Me.HealthPercent <= 60)) && !BuddyTor.Me.HasBuff("Saber Ward")),
Spell.Cast("Awe", onUnit =>
{
var previousTarget = BuddyTor.Me.CurrentTarget;
return
Helpers.Targets.FirstOrDefault(
t =>
t != previousTarget && (t.Toughness == CombatToughness.Strong)) ??
Helpers.Targets.FirstOrDefault(t => t != previousTarget);
}, castWhen => Helpers.Targets.Count() >= 3),
// Offensive abilities by priority
Spell.Cast("Merciless Slash", castWhen => BuddyTor.Me.ResourceStat >= 5),
Spell.Cast("Zealous Strike", castWhen => BuddyTor.Me.ResourceStat <= 6),
Spell.Cast("Force Sweep", castWhen => ObjectManager.GetObjects<Buddy.Swtor.Objects.TorNpc>().Count(o => o.Distance <= .4f && !o.IsDead) >= 3 && BuddyTor.Me.ResourceStat >= 3 && Helpers.Targets.Count() >= 3),
Spell.Cast("Cyclone Slash", castWhen => ObjectManager.GetObjects<Buddy.Swtor.Objects.TorNpc>().Count(o => o.Distance <= .4f && !o.IsDead) >= 3 && BuddyTor.Me.ResourceStat >= 3 && Helpers.Targets.Count() >= 3),
Spell.Cast("Cauterize", castWhen => !BuddyTor.Me.CurrentTarget.HasDebuff("Bleeding") && BuddyTor.Me.CurrentTarget.HealthPercent >= 30 && BuddyTor.Me.ResourceStat >= 2 && ObjectManager.GetObjects<Buddy.Swtor.Objects.TorNpc>().Count(o => o.Distance <= .4f && !o.IsDead) <= 3),
Spell.Cast("Dispatch", castWhen => BuddyTor.Me.CurrentTarget.HealthPercent <= 20 && BuddyTor.Me.ResourceStat >= 3),//-3 Rage
Spell.Cast("Master Strike"),//30s CD
Spell.Cast("Pommel Strike", castWhen => BuddyTor.Me.CurrentTarget.IsStunned && (BuddyTor.Me.CurrentTarget.Toughness == CombatToughness.Standard || BuddyTor.Me.CurrentTarget.Toughness == CombatToughness.Weak)),//strong skill but only usable on stunned - normal or weak - enemys
Spell.Cast("Zealous Strike", castWhen => BuddyTor.Me.ResourceStat <= 6),//+6 Rage/12s CD
Spell.Cast("Slash", castWhen => (BuddyTor.Me.ResourceStat >= 7 && AbilityManager.HasAbility("Merciless Slash")) || (BuddyTor.Me.ResourceStat >= 3 && !AbilityManager.HasAbility("Merciless Slash"))),
Spell.Cast("Strike", castWhen => BuddyTor.Me.ResourceStat <= 10),//+2 Rage
//Movement
Movement.MoveTo(ret => BuddyTor.Me.CurrentTarget.Position, 0.4f)
);
}
[Class(CharacterClass.Warrior, AdvancedClass.Sentinel, SkillTreeId.SentinelWatchman)]
[Behavior(BehaviorType.OutOfCombat)]
public static Composite SentinelWatchmanOutOfCombat()
{
Logger.Write("Watchman");
return new PrioritySelector(
Spell.Cast("Juyo Form", ret => AbilityManager.HasAbility("Juyo Form") && !BuddyTor.Me.HasBuff("Juyo Form")),
Spell.Cast("Shii-Cho Form", ret => !AbilityManager.HasAbility("Juyo Form") && !BuddyTor.Me.HasBuff("Shii-Cho Form"))
);
}
[Class(CharacterClass.Warrior, AdvancedClass.Sentinel, SkillTreeId.SentinelWatchman)]
[Behavior(BehaviorType.Pull)]
public static Composite SentinelWatchmanPull()
{
return SentinelWatchmanCombat();
}
}
}