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
{
//Neo93 07.05.2012
public static class JuggernautImmortal
{
[Class(CharacterClass.Warrior, AdvancedClass.Juggernaut, SkillTreeId.JuggernautImmortal)]
[Behavior(BehaviorType.Combat)]
public static Composite JuggernautImmortalPull()
{
return JuggernautImmortalCombat();
}
public const float RangedDistance = 2.8f;
public const float MeleeDistance = 0.3f;
public const float ChargeMinDistance = 1f;
public const float MinimumAoETargets = 2;
[Class(CharacterClass.Warrior, AdvancedClass.Juggernaut, SkillTreeId.JuggernautImmortal)]
[Behavior(BehaviorType.Combat)]
public static Composite JuggernautImmortalCombat()
{
return new PrioritySelector(
Movement.StopInRange(MeleeDistance),
Spell.WaitForCast(),
// ***Generel/***
Spell.Cast("Saber Throw", castWhen =>
BuddyTor.Me.CurrentTarget.Distance >= MeleeDistance &&
BuddyTor.Me.CurrentTarget.Distance <= RangedDistance),
Spell.Cast("Force Charge", castWhen =>
BuddyTor.Me.CurrentTarget.Distance >= ChargeMinDistance &&
BuddyTor.Me.CurrentTarget.Distance <= RangedDistance), //+3 Rage/15s CD/30m Range - Pull
//high priority aggro
Spell.Cast("Smash", castWhen =>
ObjectManager.GetObjects<Buddy.Swtor.Objects.TorNpc>().Count(o => o.Distance <= 0.3 && !o.IsDead) >= 2 &&
BuddyTor.Me.ResourceStat >= 3 &&
Helpers.Targets.Count() >= MinimumAoETargets),//-3 Rage/15s CD
//in range is king, it was waiting and force charging to get in range
Movement.MoveTo(ret => BuddyTor.Me.CurrentTarget.Position, MeleeDistance),
//needed higher priority
Spell.Cast("Force Scream", castWhen => BuddyTor.Me.ResourceStat > 3), //-4 Rage without proc, this high priority as it procs a bubble
Spell.Cast("Retaliation", castWhen => BuddyTor.Me.ResourceStat > 3), //-1 rage off the gcd, high priority
//debuff target and generate rage, we want to hit this ever time it is up, no need to over complicate it
Spell.Cast("Sundering Assault"),
Spell.Cast("Vicious Slash", castWhen => BuddyTor.Me.ResourceStat >= 3), //-3 rage
//when chained with force choke and backhand creates nice burst/control
//don't waste it on weak/standard targets
Spell.Cast("Ravage", castWhen => (int)BuddyTor.Me.CurrentTarget.Toughness >= (int)CombatToughness.Strong),
Spell.Cast("Crushing Blow", castWhen =>
BuddyTor.Me.ResourceStat >= 4 &&
AbilityManager.HasAbility("Crushing Blow")), //xsol - not in my spec
Spell.Cast("Force Push", castWhen => BuddyTor.Me.CurrentTarget.Toughness == CombatToughness.Player),
// **Personal Maint.**
Spell.Cast("Unleash", castWhen => BuddyTor.Me.IsStunned),//Insignia/2m CD
Spell.Cast("Enrage", castWhen => BuddyTor.Me.ResourceStat <= 6),//+6 Rage
// **CC**
//refactor: add situational check to save for key interupts based on group area context
Spell.Cast("Disruption", castWhen =>
BuddyTor.Me.CurrentTarget.IsCasting &&
BuddyTor.Me.CurrentTarget.CastTimeEnd - TimeSpan.FromSeconds(1) >= DateTime.Now),
//use force choke as an interupt or as a defense cd to stop dmg
Spell.Cast("Force Choke", castWhen =>
((BuddyTor.Me.CurrentTarget.IsCasting &&
!AbilityManager.CanCast("Disruption", BuddyTor.Me.CurrentTarget) || BuddyTor.Me.HealthPercent <= 60)) &&
!BuddyTor.Me.HasBuff("Saber Ward")),
//Spell.Cast("Chilling Scream", castWhen => ObjectManager.GetObjects<Buddy.Swtor.Objects.TorNpc>().Count(o => o.Distance <= .3 && !o.IsDead) >= 3 && BuddyTor.Me.ResourceStat >= 3 && Helpers.Targets.Count() >= 3),
//Spell.Cast("Intimidating Roar", castWhen => ObjectManager.GetObjects<Buddy.Swtor.Objects.TorNpc>().Count(o => o.Distance <= .3 && !o.IsDead) >= 3 && BuddyTor.Me.ResourceStat >= 3 && Helpers.Targets.Count() >= 3 && BuddyTor.Me.HealthPercent <= 60),
Spell.Cast("Backhand", castWhen =>
((BuddyTor.Me.CurrentTarget.IsCasting &&
(!AbilityManager.CanCast("Force Choke", BuddyTor.Me.CurrentTarget) &&
!AbilityManager.CanCast("Disruption", BuddyTor.Me.CurrentTarget)) ||
BuddyTor.Me.HealthPercent <= 30)) &&
!BuddyTor.Me.HasBuff("Saber Ward")),
//Spell.Cast("Intercede", castOn => Helpers.LowestHealthPlayer, castWhen => Helpers.LowestHealthPlayer.GroupId == BuddyTor.Me.GroupId && Helpers.LowestHealthPlayer.HealthPercent <= 50),
// **Offensive**
//strong skill but only usable on stunned - normal or weak - enemys
Spell.Cast("Pommel Strike", castWhen =>
BuddyTor.Me.CurrentTarget.IsStunned &&
(BuddyTor.Me.CurrentTarget.Toughness == CombatToughness.Standard ||
BuddyTor.Me.CurrentTarget.Toughness == CombatToughness.Weak)),
Spell.Cast("Savage Kick", castWhen => BuddyTor.Me.CurrentTarget.Toughness != CombatToughness.Player),
Spell.Cast("Backhand", castWhen => BuddyTor.Me.ResourceStat >= 1 && !BuddyTor.Me.CurrentTarget.IsStunned),
Spell.Cast("Sweeping Slash", castWhen =>
ObjectManager.GetObjects<Buddy.Swtor.Objects.TorNpc>().Count(o => o.Distance <= 0.3 && !o.IsDead) >= 4 &&
BuddyTor.Me.ResourceStat >= 4 &&
Helpers.Targets.Count() >= MinimumAoETargets),//-3 Rage/15s CD
// *Aggro*
//Spell.Cast("Threatening Scream"),
//only cast this when we need rage
Spell.Cast("Assault", castWhen => BuddyTor.Me.ResourceStat <= 5),
Movement.MoveTo(ret => BuddyTor.Me.CurrentTarget.Position, MeleeDistance)
);
}
[Class(CharacterClass.Warrior, AdvancedClass.Juggernaut, SkillTreeId.JuggernautImmortal)]
[Behavior(BehaviorType.Combat)]
public static Composite JuggernautImmortalOutOfCombat()
{
return new PrioritySelector(
Spell.Cast("Soresu Form", ret => AbilityManager.HasAbility("Soresu Form") && !BuddyTor.Me.HasBuff("Soresu Form")),
Spell.Cast("Shii-Cho Form", ret => !AbilityManager.HasAbility("Soresu Form") && !BuddyTor.Me.HasBuff("Shii-Cho Form"))
);
}
}
}