// Copyright (C) 2011-2015 Bossland GmbH
// See the file LICENSE for the source code's detailed license
using Buddy.BehaviorTree;
using DefaultCombat.Core;
using DefaultCombat.Helpers;
namespace DefaultCombat.Routines
{
public class Concealment : RotationBase
{
public override string Name
{
get { return "Operative Concealment"; }
}
public override Composite Buffs
{
get
{
return new PrioritySelector(
Spell.Buff("Coordination"),
Spell.Cast("Stealth", ret => !DefaultCombat.MovementDisabled && !Me.InCombat && !Me.HasBuff("Coordination"))
);
}
}
public override Composite Cooldowns
{
get
{
return new PrioritySelector(
Spell.Buff("Adrenaline Probe", ret => Me.EnergyPercent <= 45),
Spell.Buff("Stim Boost", ret => Me.BuffCount("Tactical Advantage") < 2),
Spell.Buff("Shield Probe", ret => Me.HealthPercent <= 75),
Spell.Buff("Evasion", ret => Me.HealthPercent <= 50)
);
}
}
public override Composite SingleTarget
{
get
{
return new PrioritySelector(
Spell.Cast("Backstab", ret => Me.IsStealthed && Me.IsBehind(Me.CurrentTarget)),
//Movement
CombatMovement.CloseDistance(Distance.Melee),
new Decorator(ret => Me.ResourcePercent() < 60 && !Buddy.CommonBot.AbilityManager.CanCast("Adrenaline Probe", Me),
new PrioritySelector(
Spell.Cast("Rifle Shot")
)),
new Decorator(
ret =>
(Me.CurrentTarget.HasDebuff("Poisoned (Acid Blade)") || Me.CurrentTarget.HasDebuff("Corrosive Dart")) &&
!Me.IsStealthed,
new PrioritySelector(Spell.Cast("Volatile Substance")))
,
new Decorator(
ret =>
Me.HasBuff("Tactical Advantage") &&
!Me.IsStealthed,
new PrioritySelector(Spell.Cast("Laceration")))
,
new Decorator(
ret =>
(!Me.CurrentTarget.HasDebuff("Corrosive Dart") || Me.CurrentTarget.DebuffTimeLeft("Corrosive Dart") <= 2) &&
!Me.IsStealthed,
new PrioritySelector(Spell.Cast("Corrosive Dart")))
,
new Decorator(
ret =>
!Me.HasBuff("Tactical Advantage") &&
!Me.IsStealthed,
new PrioritySelector(Spell.Cast("Veiled Strike")))
,
new Decorator(
ret =>
!Me.HasBuff("Tactical Advantage") &&
!Buddy.CommonBot.AbilityManager.CanCast("Veiled Strike", Me.CurrentTarget) &&
Me.IsBehind(Me.CurrentTarget),
new PrioritySelector(Spell.Cast("Backstab")))
,
new Decorator(
ret =>
!Me.HasBuff("Tactical Advantage") &&
!Buddy.CommonBot.AbilityManager.CanCast("Veiled Strike", Me.CurrentTarget) &&
!Buddy.CommonBot.AbilityManager.CanCast("Backstab", Me.CurrentTarget) &&
!Me.IsStealthed,
new PrioritySelector(Spell.Cast("Crippling Slice")))
,
new Decorator(
ret =>
!Me.HasBuff("Tactical Advantage") &&
Me.EnergyPercent >= 87 &&
!Buddy.CommonBot.AbilityManager.CanCast("Veiled Strike", Me.CurrentTarget) &&
!Buddy.CommonBot.AbilityManager.CanCast("Crippling Slice", Me.CurrentTarget) &&
!Buddy.CommonBot.AbilityManager.CanCast("Backstab", Me.CurrentTarget) &&
!Me.IsStealthed,
new PrioritySelector(Spell.Cast("Overload Shot")))
);
}
}
public override Composite AreaOfEffect
{
get
{
return new Decorator(ret => Targeting.ShouldAoe,
new PrioritySelector(
Spell.Cast("Fragmentation Grenade"),
Spell.Cast("Carbine Burst"))
);
}
}
}
}
// Copyright (C) 2011-2015 Bossland GmbH
// See the file LICENSE for the source code's detailed license
using Buddy.BehaviorTree;
using DefaultCombat.Core;
using DefaultCombat.Helpers;
namespace DefaultCombat.Routines
{
public class Lethality : RotationBase
{
public override string Name
{
get { return "Operative Lethality"; }
}
public override Composite Buffs
{
get
{
return new PrioritySelector(
Spell.Buff("Coordination"),
Spell.Cast("Stealth", ret => !Me.InCombat && !Me.HasBuff("Coordination"))
);
}
}
public override Composite Cooldowns
{
get
{
return new PrioritySelector(
Spell.Buff("Adrenaline Probe", ret => Me.EnergyPercent <= 45),
Spell.Buff("Stim Boost", ret => Me.BuffCount("Tactical Advantage") < 1)
// Spell.Buff("Shield Probe", ret => Me.HealthPercent <= 75)
// Spell.Buff("Evasion", ret => Me.HealthPercent <= 50)
);
}
}
public override Composite SingleTarget
{
get
{
return new PrioritySelector(
Spell.Cast("Hidden Strike", ret => Me.IsStealthed && Me.IsBehind(Me.CurrentTarget)),
//Movement
CombatMovement.CloseDistance(Distance.Melee),
Spell.Cast("Lethal Strike",
ret =>
Me.IsStealthed)
,
Spell.Cast("Corrosive Dart",
ret =>
(!Me.CurrentTarget.HasDebuff("Corrosive Dart") || Me.CurrentTarget.DebuffTimeLeft("Corrosive Dart") <= 2) &&
!Me.IsStealthed)
,
Spell.Cast("Corrosive Grenade",
ret =>
// Me.HasBuff("Cut Down") &&
(!Me.CurrentTarget.HasDebuff("Corrosive Grenade") || Me.CurrentTarget.DebuffTimeLeft("Corrosive Grenade") <= 2) &&
!Me.IsStealthed)
,
Spell.Cast("Corrosive Assault",
ret =>
Me.HasBuff("Tactical Advantage") &&
Me.CurrentTarget.HasDebuff("Corrosive Dart") &&
Me.CurrentTarget.HasDebuff("Corrosive Grenade") &&
!Me.IsStealthed)
,
Spell.Cast("Toxic Blast",
ret =>
Me.BuffCount("Tactical Advantage") < 2 &&
Me.CurrentTarget.HasDebuff("Corrosive Dart") &&
Me.CurrentTarget.HasDebuff("Corrosive Grenade") &&
!Me.IsStealthed)
,
Spell.Cast("Shiv",
ret =>
Me.BuffCount("Tactical Advantage") < 2 &&
Me.CurrentTarget.HasDebuff("Corrosive Dart") &&
Me.CurrentTarget.HasDebuff("Corrosive Grenade") &&
!Buddy.CommonBot.AbilityManager.CanCast("Toxic Blast", Me.CurrentTarget) &&
!Me.IsStealthed)
,
Spell.Cast("Lethal Strike",
ret =>
Me.CurrentTarget.HasDebuff("Corrosive Dart") &&
Me.CurrentTarget.HasDebuff("Corrosive Grenade"))
,
Spell.Cast("Overload Shot",
ret =>
Me.EnergyPercent > 85 &&
!Me.HasBuff("Tactical Advantage") &&
!Buddy.CommonBot.AbilityManager.CanCast("Shiv", Me.CurrentTarget) &&
!Buddy.CommonBot.AbilityManager.CanCast("Toxic Blast", Me.CurrentTarget) &&
!Buddy.CommonBot.AbilityManager.CanCast("Lethal Strike", Me.CurrentTarget) &&
Me.CurrentTarget.HasDebuff("Corrosive Dart") &&
Me.CurrentTarget.HasDebuff("Corrosive Grenade") &&
!Me.IsStealthed)
,
Spell.Cast("Rifle Shot",
ret =>
Me.EnergyPercent < 85 &&
!Me.HasBuff("Tactical Advantage") &&
!Buddy.CommonBot.AbilityManager.CanCast("Shiv", Me.CurrentTarget) &&
!Buddy.CommonBot.AbilityManager.CanCast("Toxic Blast", Me.CurrentTarget) &&
!Buddy.CommonBot.AbilityManager.CanCast("Lethal Strike", Me.CurrentTarget) &&
Me.CurrentTarget.HasDebuff("Corrosive Dart") &&
Me.CurrentTarget.HasDebuff("Corrosive Grenade") &&
!Me.IsStealthed)
);
}
}
public override Composite AreaOfEffect
{
get
{
return new Decorator(ret => Targeting.ShouldAoe,
new PrioritySelector(
Spell.Cast("Corrosive Grenade",
ret =>
!Me.CurrentTarget.HasDebuff("Corrosive Grenade") &&
!Me.IsStealthed)
,
Spell.Cast("Fragmentation Grenade",
ret =>
Me.CurrentTarget.HasDebuff("Corrosive Grenade") &&
!Me.IsStealthed)
,
Spell.Cast("Carbine Burst",
ret =>
Me.CurrentTarget.HasDebuff("Corrosive Grenade") &&
!Me.IsStealthed)
)
);
}
}
}
}
// Copyright (C) 2011-2015 Bossland GmbH
// See the file LICENSE for the source code's detailed license
using Buddy.BehaviorTree;
using DefaultCombat.Core;
using DefaultCombat.Helpers;
namespace DefaultCombat.Routines
{
public class InnovativeOrdnance : RotationBase
{
public override string Name
{
get { return "Mercenary Innovative Ordnance"; }
}
public override Composite Buffs
{
get
{
return new PrioritySelector(
Spell.Buff("Combustible Gas Cylinder"),
Spell.Buff("Hunter's Boon")
);
}
}
public override Composite Cooldowns
{
get
{
return new PrioritySelector(
Spell.Buff("Determination", ret => Me.IsStunned),
Spell.Buff("Supercharged Gas", ret => Me.BuffCount("Supercharge") == 10),
Spell.Buff("Thermal Sensor Override", ret => Me.InCombat && Me.CurrentTarget.BossOrGreater()),
Spell.Buff("Vent Heat", ret => Me.ResourcePercent() >= 50),
Spell.Buff("Energy Shield", ret => Me.HealthPercent <= 50),
Spell.Buff("Kolto Overload", ret => Me.HealthPercent <= 30)
);
}
}
public override Composite SingleTarget
{
get
{
return new LockSelector(
//Movement
CombatMovement.CloseDistance(Distance.Ranged),
new Decorator(ret => Me.ResourcePercent() > 40 && !Buddy.CommonBot.AbilityManager.CanCast("Vent Heat", Me),
new PrioritySelector(
Spell.Cast("Mag Shot", ret => Me.HasBuff("Innovative Particle Accelerator")),
Spell.Cast("Rapid Shots")
)),
//Rotation
Spell.Cast("Disabling Shot",
ret =>
Me.CurrentTarget.IsCasting && Me.CurrentTarget.Distance <= Distance.Melee && !DefaultCombat.MovementDisabled),
new Decorator(
ret =>
!Me.CurrentTarget.HasDebuff("Burning (Incendiary Missile)") || Me.CurrentTarget.DebuffTimeLeft("Burning (Incendiary Missile)") <= 2,
new PrioritySelector(Spell.Cast("Incendiary Missile")))
,
new Decorator(
ret =>
Me.HasBuff("Innovative Particle Accelerator"),
new PrioritySelector(Spell.Cast("Mag Shot")))
,
new Decorator(
ret =>
!Me.CurrentTarget.HasDebuff("Bleeding") || Me.CurrentTarget.DebuffTimeLeft("Bleeding") <= 2,
new PrioritySelector(Spell.Cast("Serrated Shot")))
,
new Decorator(
ret =>
Me.BuffCount("Surging Shots") == 10,
new PrioritySelector(Spell.Cast("Power Shot")))
,
new Decorator(
ret =>
Me.CurrentTarget.HasDebuff("Burning (Incendiary Missile)") &&
Me.CurrentTarget.HasDebuff("Bleeding") &&
!Me.HasBuff("Innovative Particle Accelerator"),
new PrioritySelector(
Spell.Cast("Thermal Detonator"),
Spell.Cast("Electro Net"),
Spell.Cast("Unload"),
Spell.Cast("Missile Blast", ret => Me.HasBuff("Volatile Warhead")),
Spell.Cast("Power Shot")))
);
}
}
public override Composite AreaOfEffect
{
get
{
return new Decorator(ret => Targeting.ShouldAoe,
new PrioritySelector(
Spell.CastOnGround("Death from Above"),
Spell.Cast("Fusion Missle", ret => Me.HasBuff("Thermal Sensor Override")),
Spell.Cast("Explosive Dart"))
);
}
}
}
}
// Copyright (C) 2011-2015 Bossland GmbH
// See the file LICENSE for the source code's detailed license
using Buddy.BehaviorTree;
using DefaultCombat.Core;
using DefaultCombat.Helpers;
namespace DefaultCombat.Routines
{
public class Arsenal : RotationBase
{
public override string Name
{
get { return "Mercenary Arsenal"; }
}
public override Composite Buffs
{
get
{
return new PrioritySelector(
Spell.Buff("High Velocity Gas Cylinder"),
Spell.Buff("Hunter's Boon")
);
}
}
public override Composite Cooldowns
{
get
{
return new PrioritySelector(
Spell.Buff("Determination", ret => Me.IsStunned),
Spell.Buff("Vent Heat", ret => Me.ResourcePercent() >= 60),
Spell.Buff("Supercharged Gas", ret => Me.BuffCount("Supercharge") == 10),
Spell.Buff("Energy Shield", ret => Me.HealthPercent <= 60),
Spell.Buff("Emergency Scan", ret => Me.HealthPercent <= 40),
Spell.Buff("Kolto Overload", ret => Me.HealthPercent <= 30),
Spell.Buff("Power Surge", ret => !Me.HasBuff("Barrage"))
);
}
}
public override Composite SingleTarget
{
get
{
return new PrioritySelector(
//Movement
CombatMovement.CloseDistance(Distance.Ranged),
//Interrupts
Spell.Cast("Disabling Shot", ret => Me.CurrentTarget.IsCasting && !DefaultCombat.MovementDisabled),
Spell.Cast("Electro Dart", ret => Me.CurrentTarget.IsCasting && !DefaultCombat.MovementDisabled),
//Rotation
Spell.Cast("Rapid Shots", ret => Me.ResourcePercent() > 70),
Spell.Cast("Blazing Bolts", ret => Me.HasBuff("Barrage") && Me.Level >= 57),
Spell.Cast("Unload", ret => Me.Level < 57),
Spell.Cast("Priming Shot", ret => !Me.HasBuff("Power Surge")),
Spell.Cast("Heatseeker Missiles", ret => Me.CurrentTarget.HasDebuff("Heat Signature")),
Spell.Cast("Rail Shot", ret => Me.BuffCount("Tracer Lock") == 5),
Spell.Cast("Electro Net"),
Spell.Cast("Tracer Missile", ret => !Me.HasBuff("Barrage")),
Spell.Cast("Rapid Shots", ret => Me.BuffCount("Tracer Lock") < 5 && !Me.HasBuff("Barrage"))
);
}
}
public override Composite AreaOfEffect
{
get
{
return new Decorator(ret => Targeting.ShouldAoe,
new PrioritySelector(
Spell.Buff("Thermal Sensor Override"),
Spell.Buff("Power Surge"),
Spell.CastOnGround("Death from Above"),
Spell.Cast("Fusion Missile", ret => Me.ResourcePercent() <= 10 && Me.HasBuff("Power Surge")),
Spell.Cast("Flame Thrower", ret => Me.CurrentTarget.Distance <= 1f),
Spell.CastOnGround("Sweeping Blasters", ret => Me.ResourcePercent() <= 60))
);
}
}
}
}
Did a test with your rotation, and although not testing many rounds on the 1.5M dummy, dps increased vs. the DefaultCombat rotation. Increasing 364 dps (from 3296 -> 3660 in my gear and level 65). However, reading guides on Dulfy it states IO should be slightly above Arsenal but has a more difficult rotation. The test i did was a lot lower than my Arsenal rotation, so i think some more work need to be doneHello there
Bellow there is a alternative rotation for merc IO for feedback.
Did a test with your rotation, and although not testing many rounds on the 1.5M dummy, dps increased vs. the DefaultCombat rotation. Increasing 364 dps (from 3296 -> 3660 in my gear and level 65). However, reading guides on Dulfy it states IO should be slightly above Arsenal but has a more difficult rotation. The test i did was a lot lower than my Arsenal rotation, so i think some more work need to be done
And i felt some lagging while running it, so it may need some work on that part aswell.
C
Hello there
Follow below updated rotations for operative dps. Feedbacks are welcome
Concealment
Feel free to submit a pull request for these on GitHub so we can fix them in the next release, if possible.
https://github.com/BosslandGmbH/BuddyWing.DefaultCombat
Can you check, the routine for the basic rotation if its in?The new Operative-Concealment seems to be much slower than the earlier version. Granted Im only level 13, it has a lot of downtime.
The new Operative-Concealment seems to be much slower than the earlier version. Granted Im only level 13, it has a lot of downtime.
Concealment at lv 13 dont have enough fillers between shiv and laceration, and backstab have to be in the back of the target what sometimes isnt achievable when soloing stuff on leveling.
In case you tried the rotation i posted it doesnt have rifle shot so it wont mess with priorityselector. In some cases it will keep casting rifle shot regardless of shiv or laceration being available. And its coded for lv65.
You can replace the "Veiled Strike" parts for "Shiv" and you can add the same code for overload shot below it replacing for rifle shot and changing one conditional: Me.EnergyPercent >= 87 for Me.EnergyPercent < 87.
I guess that should help you until lv58 thats when you learn veiled strike![]()