• Visit Rebornbuddy
  • Default Combat Discussion

    Discussion in 'Combat Routines' started by Ama, Jan 5, 2015.

    1. 056

      056 New Member

      Joined:
      May 21, 2014
      Messages:
      67
      Likes Received:
      1
      Trophy Points:
      0
      Have you had any success with this? Can you post your rotation?
       
    2. Cryogenesis

      Cryogenesis Moderator Moderator

      Joined:
      Jul 13, 2010
      Messages:
      2,128
      Likes Received:
      13
      Trophy Points:
      38
      I can only post the logic i got with the framework.
      Code:
      using Buddy.BehaviorTree;
      using DefaultCombat.Core;
      using DefaultCombat.Helpers;
      
      namespace DefaultCombat.Routines
      {
          class Combat : RotationBase
          {
              public override string Name { get { return "Sentinel Combat"; } }
      
              public override Composite Buffs
              {
                  get
                  {
                      return new PrioritySelector(
                          //Handling Buffs
                          );
                  }
              }
      
              public override Composite Cooldowns
              {
                  get
                  {
                      return new LockSelector(
                          //Handling Cooldowns
                          );
                  }
              }
      		
      		private Composite HandleEngage
              {
                  get
                  {
                      return new LockSelector(
      					//CastOrder: Twin Saber Throw - Force Leap - Zealous Strike
      					);
                  }
              }
      		
      		private Composite HandleFillerMS
              {
                  get
                  {
                      return new LockSelector(
      					//CastOrder: Zen - Precision - Master Strike - Clashing Blast
      					);
                  }
              }
      		
      		private Composite HandleFillerDP
              {
                  get
                  {
                      return new LockSelector(
      					//CastOrder: Precision - Dispatch - Clashing Blast
      					);
                  }
              }
      
              public override Composite SingleTarget
              {
                  get
                  {
                      return new LockSelector(
      					//Engage Combat
                          new Decorator(ret => !DefaultCombat.MovementDisabled && Me.CurrentTarget.Distance >= 1f && Me.CurrentTarget.Distance <= 3f, HandleEngage),
                          
                          //Movement
                          CombatMovement.CloseDistance(Distance.Melee),
      
                          //Rotation
                          Spell.Cast("Force Kick", ret => Me.CurrentTarget.IsCasting && !DefaultCombat.MovementDisabled),
                          Spell.Cast("Zealous Strike", ret => Me.ActionPoints <= 6 && !Me.HasBuff("Precision")), // Go zealous strike if we are low on AP (private composite is not needed really, one line will do)
      					new Decorator(ret => Is Precision+ZEN+MS+OppertuneAttack Ready?, HandleFillerMS), // Check for Master Strike Filler
      					new Decorator(ret => Is Precision+Dispatch+OppertuneAttack Ready?, HandleFillerDP), // Check for Dispatch Filler
                          Spell.Cast("Blade Storm", ret => (Me.HasBuff("Opportune Attack") && Me.Level >= 28 && Me.Level < 57) || Me.Level < 28),
                          Spell.Cast("Blade Rush"),
                          Spell.Cast("Slash", ret => Me.ActionPoints >= 7 && Me.Level < 26),
                          Spell.Cast("Strike", ret => Me.ActionPoints <= 10)
                          );
                  }
              }
      /* Old code		
              public override Composite SingleTarget
              {
                  get
                  {
                      return new LockSelector(
                          Spell.Cast("Saber Throw", ret => !DefaultCombat.MovementDisabled && Me.CurrentTarget.Distance >= 0.5f && Me.CurrentTarget.Distance <= 3f),
      					Spell.Cast("Dual Saber Throw", ret => !DefaultCombat.MovementDisabled && Me.CurrentTarget.Distance >= 1f && Me.CurrentTarget.Distance <= 3f && !Me.HasBuff("Precision")),
                          Spell.Cast("Force Leap", ret => !DefaultCombat.MovementDisabled && Me.CurrentTarget.Distance >= 1f && Me.CurrentTarget.Distance <= 3f),
                          
                          //Movement
                          CombatMovement.CloseDistance(Distance.Melee),
      
                          //Rotation
                          Spell.Cast("Force Kick", ret => Me.CurrentTarget.IsCasting && !DefaultCombat.MovementDisabled),
                          Spell.Cast("Zealous Strike", ret => Me.ActionPoints <= 7 && !Me.HasBuff("Precision")),
      					Spell.Cast("Precision", ret => Me.CurrentTarget.Distance <= 0.4f),
                          Spell.Cast("Master Strike", ret => (Me.HasBuff("Precision") && (Me.HasBuff("Zen") || (Me.Level >= 30 && Me.Level < 60))) || Me.Level < 30),			
      					Spell.Cast("Dispatch", ret => Me.HasBuff("Hand of Justice") || Me.CurrentTarget.HealthPercent <= 30),
                          Spell.Cast("Clashing Blast", ret => Me.HasBuff("Opportune Attack") && Me.Level >= 57),
                          Spell.Cast("Blade Storm", ret => (Me.HasBuff("Opportune Attack") && Me.Level >= 28 && Me.Level < 57) || Me.Level < 28),
                          Spell.Cast("Blade Rush"),
                          Spell.Cast("Slash", ret => Me.ActionPoints >= 7 && Me.Level < 26),
                          Spell.Cast("Strike", ret => Me.ActionPoints <= 10)
                          );
                  }
              }
      */
              public override Composite AreaOfEffect
              {
                  get
                  {
                      return new Decorator(ret => Targeting.ShouldPBAOE,
                              new LockSelector(
      							//Handle AOE Rotation
      						)
      				);
                  }
              }
          }
      }
      
      Can any of the Rotation gurus check, if my new Decorator stuff will work this way.
      And will everything inside the privates be handled first and then off to the rest of the rotation or will it do just on spell and be done with it?
      because it really needs to fire everything in order of the private components.
      Also the codesnippets from Jon are not implemented in this logic.

      i took this code as an example Gunnery Pure Rotation:
      Code:
      using System;
      using System.Collections.Generic;
      using System.Linq;
      using Buddy.BehaviorTree;
      using Buddy.Swtor;
      using Buddy.Swtor.Objects;
      using PureSWTor.Helpers;
      using PureSWTor.Core;
      using PureSWTor.Managers;
      
      using Action = Buddy.BehaviorTree.Action;
      using Distance = PureSWTor.Helpers.Global.Distance;
      
      namespace PureSWTor.Classes.Commando
      {
          class Gunnery : RotationBase
          {
              #region Overrides of RotationBase
      
              public override string Revision
              {
                  get { return ""; }
              }
      
              public override CharacterDiscipline KeySpec
              {
                  get { return CharacterDiscipline.Gunnery; }
              }
      
              public override string Name
              {
                  get { return "Commando Gunnery by alltrueist"; }
              }
              
      
              public override Composite PreCombat
              {
                  get
                  {
                      return new PrioritySelector(
                          Spell.Buff("Armor-piercing Cell"),
                          Spell.Buff("Fortification"),
                          Rest.HandleRest
                          );
                  }
              }
      
              private Composite HandleCoolDowns
              {
                  get
                  {
                      return new LockSelector(
                          Spell.Buff("Tenacity"),
                          MedPack.UseItem(ret => Me.HealthPercent <= 40),
                          Spell.Buff("Reactive Shield", ret => Me.HealthPercent <= 70),
                          Spell.Buff("Adrenaline Rush", ret => Me.HealthPercent <= 30),
                          Spell.Buff("Recharge Cells", ret => Me.ResourceStat <= 40),
                          Spell.Buff("Supercharged Cell", ret => Me.BuffCount("Supercharge") == 10),
                          Spell.Buff("Reserve Powercell", ret => Me.ResourceStat <= 60)
                          );
                  }
              }
      
              private Composite HandleLowCells
              {
                  get
                  {
                      return new LockSelector(
                          Spell.Cast("Hammer Shot")
                          );
                  }
              }
      
              private Composite HandleSingleTarget
              {
                  get
                  {
                      return new LockSelector(
                          //Movement
                          CloseDistance(Distance.Ranged),
      
                          Spell.Cast("Disabling Shot", ret => Me.CurrentTarget.IsCasting && !LazyRaider.MovementDisabled),
      
                          Spell.Cast("Boltstorm", ret => Me.HasBuff("Curtain of Fire") && Me.Level >= 57),
                          Spell.Cast("Full Auto", ret => Me.HasBuff("Curtain of Fire") && Me.Level < 57),
                          Spell.Cast("Demolition Round", ret => Me.CurrentTarget.HasDebuff("Gravity Vortex")),
                          Spell.Cast("Electro Net", ret => Me.CurrentTarget.StrongOrGreater()),
                          Spell.Cast("Vortex Bolt"),
                          Spell.Cast("High Impact Bolt", ret => Me.BuffCount("Charged Barrel") == 5),
                          Spell.Cast("Grav Round")
                          );
                  }
              }
      
              private Composite HandleAOE
              {
                  get
                  {
                      return new Decorator(ret => ShouldAOE(2, Distance.MeleeAoE),
                                  new LockSelector(
                                      Spell.Cast("Tech Override"),
                                      Spell.CastOnGround("Mortar Volley", ret => Me.CurrentTarget.Distance > 0.5f),
                                      Spell.Cast("Plasma Grenade", ret => Me.ResourceStat >= 90 && Me.HasBuff("Tech Override")),
                                      Spell.Cast("Pulse Cannon", ret => Me.CurrentTarget.Distance <= 1f),
                                      Spell.CastOnGround("Hail of Bolts", ret => Me.ResourceStat >= 90)
                                      ));
                  }
              }
      
              private class LockSelector : PrioritySelector
              {
                  public LockSelector(params Composite[] children)
                      : base(children)
                  {
                  }
      
                  public override RunStatus Tick(object context)
                  {
                      using (BuddyTor.Memory.AcquireFrame())
                      {
                          return base.Tick(context);
                      }
                  }
              }
      
      
              public override Composite PVERotation
              {
                  get
                  {
                      return new PrioritySelector(
                          Spell.WaitForCast(),
                          HandleCoolDowns,
                          HandleAOE,
                          new Decorator(ret => Me.ResourcePercent() < 60, HandleLowCells),
                          new Decorator(ret => Me.ResourcePercent() >= 60, HandleSingleTarget)
                      );
                  }
              }
      
              public override Composite PVPRotation
              {
                  get { return PVERotation; }
              }
      
              #endregion
          }
      }
      
       
    3. alltrueist

      alltrueist Active Member

      Joined:
      Dec 10, 2012
      Messages:
      1,424
      Likes Received:
      16
      Trophy Points:
      38
      I would use decorators instead. Look at how low energy is handled in the Marksmanship routine:

      Code:
      public override Composite SingleTarget
              {
                  get
                  {
                      return new LockSelector(
                          //Movement
                          CombatMovement.CloseDistance(Distance.Ranged),
      
                          //Low Energy
                          new Decorator(ret => Me.EnergyPercent < 60,
                              new LockSelector(
                                  Spell.Cast("Rifle Shot")
                                  )),
      
                          //Rotation
                          Spell.Cast("Distraction", ret => Me.CurrentTarget.IsCasting),
                          Spell.Buff("Crouch", ret => !Me.IsInCover() && !Me.IsMoving),
                          Spell.Cast("Followthrough"),
                          Spell.Cast("Penetrating Blasts", ret => Me.IsInCover() && Me.Level >= 26),
                          Spell.Cast("Series of Shots", ret => Me.IsInCover() && Me.Level < 26),
                          Spell.DoT("Corrosive Dart", "Poisoned (Corrosive Dart)"),
                          Spell.Cast("Ambush", ret => Me.IsInCover() && Me.BuffCount("Zeroing Shots") == 2),
                          Spell.Cast("Takedown", ret => Me.CurrentTarget.HealthPercent <= 30),
                          Spell.Cast("Snipe", ret => Me.IsInCover()),
                          Spell.Cast("Overload Shot", ret => !Me.IsInCover())
                          );
                  }
              }
      Place each Decorator you need at the top (in whatever order you want them prioritized). Define each of them by whatever method you need-- you'll see that here we used Me.EnergyPercent < 60. In your case, I think you'll want something like Me.HasBuff("Precision"). That way, when you have the Precision buff, you'll execute everything in the decorator, and when you don't, you'll execute everything else. I hope that makes sense.

      EDIT:

      In your case, here's specifically what I'd do:

      1. Move Precision and Zen to the Cooldowns section. Make sure they only fire when you want them to (MS or Dispatch is off-cooldown, you have X amount of Focus)
      2. Create two new Decorators at the top: name one Pull and one Precision
      3. Define those Decorators (think Me.EnergyPercent < 60): Pull should be !Me.InCombat and maybe something to do with enemy distance <= 30; Dispatch should be Me.HasBuff("Precision")
      4. Within those Decorators, outline a rotation. With pull, you can get 1-2 abilities max to fire before the game shifts to the normal rotation (since you'll be in-combat then); with Precision, you'll be able to define an entire rotation, as long as you want.
      5. The single target rotation that comes after these should be the normal rotation you execute outside of Precision.
       
      Last edited: Jul 21, 2015
    4. Cryogenesis

      Cryogenesis Moderator Moderator

      Joined:
      Jul 13, 2010
      Messages:
      2,128
      Likes Received:
      13
      Trophy Points:
      38
      Thanks for the support! Hell i was thinking to big again :)
      Its clear to me what to do now. But the pull isnt going to work if i read your text correctly.
      As the rotation is reading spell and then begins from the beginning again, Zealous strike will NEVER go off, as its in range of melee combat.
      Problem is with Precision its a 3sec spell/buff. so preferably we need zen to be activated then precision then master strike and then Clashing Blast.
      I need to see if Clashing blast fits in that routine or not as defining the Decorators could possibly rule out clashing blast in the worst scenario.
      Anyways i gonna check this tonight, see where it leads me :)
      Again thank you.
       
    5. Day7

      Day7 Member

      Joined:
      Dec 14, 2014
      Messages:
      175
      Likes Received:
      2
      Trophy Points:
      18
      Ok so, no matter what class I have in game, all I need is the defaultcombat routine here and it will work as a basic rotation for PvE?

      More accurately, I would like to control my character myself, enter combat manually, and it will cast my spells in an efficient manner for me?
       
    6. Cryogenesis

      Cryogenesis Moderator Moderator

      Joined:
      Jul 13, 2010
      Messages:
      2,128
      Likes Received:
      13
      Trophy Points:
      38
      Yes but you need Combat Bot.xml to manually move.
      download it from here: http://kicks-swtor-scripts.googlecode.com/svn/trunk/Useful Profiles/
       
    7. Day7

      Day7 Member

      Joined:
      Dec 14, 2014
      Messages:
      175
      Likes Received:
      2
      Trophy Points:
      18
    8. Cryogenesis

      Cryogenesis Moderator Moderator

      Joined:
      Jul 13, 2010
      Messages:
      2,128
      Likes Received:
      13
      Trophy Points:
      38
      So in Reply to Alltrueist, i managed to implement it all (Do note this is a testbuild):
      Jedi Knight Sentinel Combat (lvl 60):
      Code:
      using Buddy.BehaviorTree;
      using DefaultCombat.Core;
      using DefaultCombat.Helpers;
      
      namespace DefaultCombat.Routines
      {
          class Combat : RotationBase
          {
              public override string Name { get { return "Sentinel Combat"; } }
      
              public override Composite Buffs
              {
                  get
                  {
                      return new PrioritySelector(
                          Spell.Buff("Ataru Form"),
                          Spell.Buff("Force Might")
                          );
                  }
              }
      
              public override Composite Cooldowns
              {
                  get
                  {
                      return new LockSelector(
                          Spell.Buff("Resolute"),
                          Spell.Buff("Rebuke", ret => Me.HealthPercent <= 90 && !Me.HasBuff("Precision")),
                          Spell.Buff("Saber Reflect", ret => Me.HealthPercent <= 70 && !Me.HasBuff("Precision")),
      					//Spell.Buff("Awe", ret => Me.HealthPercent <= 50 && Me.Level < 60 && Targeting.CheckDPSAOE(2, Distance.MeleeAoE, Me.Position) && !Me.HasBuff("Precision")),
                          Spell.Buff("Saber Ward", ret => Me.HealthPercent <= 50 && !Me.HasBuff("Precision")),
      					//Spell.Buff("Heroic Moment: Call on the Force", ret => Me.HealthPercent <= 10 && Me.Companion != null && !Me.HasBuff("Precision")),
      					//Spell.Buff("Guarded by the Force", ret => Me.HealthPercent <= 5),
                          Spell.Buff("Valorous Call", ret => Me.BuffCount("Centering") < 5 && !Me.HasBuff("Precision")),
                          Spell.Buff("Zen", ret => Me.CurrentTarget.Distance <= 0.4f && !Me.HasBuff("Precision")),
      					Spell.Cast("Precision", ret => Me.CurrentTarget.Distance <= 0.4f && (Buddy.CommonBot.AbilityManager.CanCast("Master Strike", Me.CurrentTarget) || Buddy.CommonBot.AbilityManager.CanCast("Dispatch", Me.CurrentTarget)))
                          );
                  }
              }
      
              public override Composite SingleTarget
              {
                  get
                  {
                      return new LockSelector(
                          new Decorator(ret => Me.CurrentTarget.Distance >= 1f && Me.CurrentTarget.Distance <= 3f && !Me.HasBuff("Precision"),
                              new LockSelector(
                                  Spell.Cast("Twin Saber Throw"),
      							Spell.Cast("Force Leap"),
      							Spell.Cast("Zealous Strike", ret => Me.ActionPoints <= 7)
                                  )),				
                          
                          //Movement
                          CombatMovement.CloseDistance(Distance.Melee),
      
                          //Rotation
                          Spell.Cast("Force Kick", ret => Me.CurrentTarget.IsCasting && !DefaultCombat.MovementDisabled),
      					//Filler Master Strike
                          new Decorator(ret => Me.HasBuff("Precision") && Me.HasBuff("Zen"),
                              new LockSelector(
                                  Spell.Cast("Master Strike"),
      							Spell.Cast("Clashing Blast", ret => Me.HasBuff("Opportune Attack") && Me.Level >= 57)
                                  )),
      					//Filler Dispatch
                          new Decorator(ret => Me.HasBuff("Precision"),
                              new LockSelector(
                                  Spell.Cast("Dispatch", ret => Me.HasBuff("Hand of Justice") || Me.CurrentTarget.HealthPercent <= 30),
      							Spell.Cast("Clashing Blast", ret => Me.HasBuff("Opportune Attack") && Me.Level >= 57)
                                  )),	
      					Spell.Cast("Clashing Blast", ret => Me.HasBuff("Opportune Attack") && Me.Level >= 57 && (!Buddy.CommonBot.AbilityManager.CanCast("Master Strike", Me.CurrentTarget) || !Buddy.CommonBot.AbilityManager.CanCast("Dispatch", Me.CurrentTarget))),				
      					//Other Filler
                          Spell.Cast("Blade Rush"),
                          Spell.Cast("Zealous Strike", ret => Me.ActionPoints <= 6),
      					Spell.Cast("Slash", ret => Me.ActionPoints >= 7 && Me.Level < 26),
                          Spell.Cast("Strike", ret => Me.ActionPoints <= 10)
                          );
                  }
              }
      
              public override Composite AreaOfEffect
              {
                  get
                  {
                      return new Decorator(ret => Targeting.ShouldPBAOE,
                              new LockSelector(
      							Spell.Cast("Precision", ret => Me.CurrentTarget.Distance <= 0.4f),
      							Spell.Cast("Legacy Force Sweep"),	
                                  Spell.Cast("Force Sweep"),
                                  Spell.Cast("Cyclone Slash")
      						)
      				);
                  }
              }
          }
      }
      
      For some reason, the bot aint consistent.
      If i run the Original combat file i hover around 2600DPS with my current gear.
      If i run my file on a training dummy i get mixed results.
      For instance if i engage for run 1, it can hit 3700 DPS and goes down to 3100 and stays around that point.
      But other runs, in this example 2, i can still hover around 2600DPS.
      I think the problem lies with the part where i am low on actionpoints. I need to fill this with Zealous strike.
      If i take Zealous strike up on the list or under Buff, my dps goes down dramatically.
      So i need to find out how to get the bot stay around a certain AP level (around 6ish or higher) to be able to fire all the spells it wants to.

      Anyways let me know what you think.
      Also there is a part in for lower levels to be more survivable against Boss mobs during leveling (just uncomment them under the buff section)
       
    9. alltrueist

      alltrueist Active Member

      Joined:
      Dec 10, 2012
      Messages:
      1,424
      Likes Received:
      16
      Trophy Points:
      38
      If you're having issues just clamp the ActionPoints values on both sides. I struggled so much with this on my Guardian rotations-- you can tweak and tweak and never figure out the "correct" value. It sounds like you're low, do you know which spell is using force points but not doing much for DPS? That would the spell to add an ActionPoints > x clamp to. Otherwise, you'll just have to lower the requirements for Strike-- I know the Guardian routines have it at 9.

      Otherwise it all looks good. I'm glad you got the cooldown checks to work, I was never able to get them to work. It also sounds like the multiple Decorators had a massive impact (+500 dps), so that's good.
       
    10. Cryogenesis

      Cryogenesis Moderator Moderator

      Joined:
      Jul 13, 2010
      Messages:
      2,128
      Likes Received:
      13
      Trophy Points:
      38
      Thx for the reply and info...
      I think you are right to search for the lesser spell that is pferming the worst. and yes i saw strike come in to much.
      Heres a snippet from the log:
      Code:
      [18:34:40.853 N] [DefaultCombat] >> Casting <<   Force Leap
      [18:34:41.664 N] [DefaultCombat] >> Casting <<   Zen
      [18:34:42.422 N] [DefaultCombat] >> Casting <<   Precision
      [18:34:42.595 N] [DefaultCombat] >> Casting <<   Master Strike
      [18:34:45.185 N] [DefaultCombat] >> Casting <<   Blade Rush
      [18:34:46.317 N] [DefaultCombat] >> Casting <<   Zealous Strike
      [18:34:47.461 N] [DefaultCombat] >> Casting <<   Clashing Blast
      [18:34:48.618 N] [DefaultCombat] >> Casting <<   Blade Rush
      [18:34:52.427 N] [DefaultCombat] >> Casting <<   Precision
      [18:34:52.612 N] [DefaultCombat] >> Casting <<   Dispatch
      [18:34:54.098 N] [DefaultCombat] >> Casting <<   Strike
      [18:34:55.585 N] [DefaultCombat] >> Casting <<   Clashing Blast
      [18:34:57.053 N] [DefaultCombat] >> Casting <<   Zealous Strike
      [18:34:58.563 N] [DefaultCombat] >> Casting <<   Blade Rush
      [18:35:03.055 N] [DefaultCombat] >> Casting <<   Strike
      [18:35:04.540 N] [DefaultCombat] >> Casting <<   Precision
      [18:35:04.667 N] [DefaultCombat] >> Casting <<   Dispatch
      [18:35:06.134 N] [DefaultCombat] >> Casting <<   Strike
      [18:35:07.651 N] [DefaultCombat] >> Casting <<   Clashing Blast
      [18:35:07.764 N] [DefaultCombat] >> Casting <<   Zen
      [18:35:09.153 N] [DefaultCombat] >> Casting <<   Clashing Blast
      [18:35:10.293 N] [DefaultCombat] >> Casting <<   Blade Rush
      [18:35:13.769 N] [DefaultCombat] >> Casting <<   Zealous Strike
      [18:35:15.026 N] [DefaultCombat] >> Casting <<   Blade Rush
      [18:35:16.189 N] [DefaultCombat] >> Casting <<   Clashing Blast
      [18:35:17.697 N] [DefaultCombat] >> Casting <<   Precision
      [18:35:17.895 N] [DefaultCombat] >> Casting <<   Blade Rush
      [18:35:19.401 N] [DefaultCombat] >> Casting <<   Strike
      [18:35:20.931 N] [DefaultCombat] >> Casting <<   Blade Rush
      [18:35:22.413 N] [DefaultCombat] >> Casting <<   Strike
      [18:35:23.972 N] [DefaultCombat] >> Casting <<   Blade Rush
      [18:35:25.531 N] [DefaultCombat] >> Casting <<   Zealous Strike
      [18:35:27.093 N] [DefaultCombat] >> Casting <<   Blade Rush
      [18:35:30.044 N] [DefaultCombat] >> Casting <<   Precision
      [18:35:30.235 N] [DefaultCombat] >> Casting <<   Dispatch
      [18:35:31.701 N] [DefaultCombat] >> Casting <<   Strike
      [18:35:33.189 N] [DefaultCombat] >> Casting <<   Clashing Blast
      [18:35:33.298 N] [DefaultCombat] >> Casting <<   Zen
      [18:35:34.714 N] [DefaultCombat] >> Casting <<   Blade Rush
      [18:35:37.023 N] [DefaultCombat] >> Casting <<   Strike
      [18:35:38.175 N] [DefaultCombat] >> Casting <<   Blade Rush
      [18:35:39.306 N] [DefaultCombat] >> Casting <<   Zealous Strike
      [18:35:40.451 N] [DefaultCombat] >> Casting <<   Blade Rush
      [18:35:43.109 N] [DefaultCombat] >> Casting <<   Clashing Blast
      [18:35:44.575 N] [DefaultCombat] >> Casting <<   Precision
      [18:35:44.864 N] [DefaultCombat] >> Casting <<   Dispatch
      [18:35:46.330 N] [DefaultCombat] >> Casting <<   Blade Rush
      [18:35:47.873 N] [DefaultCombat] >> Casting <<   Strike
      [18:35:49.409 N] [DefaultCombat] >> Casting <<   Blade Rush
      [18:35:50.911 N] [DefaultCombat] >> Casting <<   Zealous Strike
      [18:35:52.421 N] [DefaultCombat] >> Casting <<   Clashing Blast
      [18:35:53.886 N] [DefaultCombat] >> Casting <<   Blade Rush
      [18:35:54.731 N] [DefaultCombat] >> Casting <<   Zen
      [18:35:54.930 N] [DefaultCombat] >> Casting <<   Valorous Call
      [18:35:55.394 N] [DefaultCombat] >> Casting <<   Blade Rush
      [18:35:57.682 N] [DefaultCombat] >> Casting <<   Precision
      [18:35:57.811 N] [DefaultCombat] >> Casting <<   Master Strike
      [18:36:00.910 N] [DefaultCombat] >> Casting <<   Strike
      [18:36:02.136 N] [DefaultCombat] >> Casting <<   Blade Rush
      [18:36:03.301 N] [DefaultCombat] >> Casting <<   Zealous Strike
      [18:36:03.615 N] [DefaultCombat] >> Casting <<   Zen
      [18:36:04.538 N] [DefaultCombat] >> Casting <<   Clashing Blast
      [18:36:05.685 N] [DefaultCombat] >> Casting <<   Blade Rush
      [18:36:07.985 N] [DefaultCombat] >> Casting <<   Precision
      [18:36:08.123 N] [DefaultCombat] >> Casting <<   Dispatch
      [18:36:09.261 N] [DefaultCombat] >> Casting <<   Strike
      [18:36:10.423 N] [DefaultCombat] >> Casting <<   Blade Rush
      [18:36:11.579 N] [DefaultCombat] >> Casting <<   Clashing Blast
      [18:36:13.040 N] [DefaultCombat] >> Casting <<   Zealous Strike
      [18:36:14.519 N] [DefaultCombat] >> Casting <<   Blade Rush
      [18:36:18.950 N] [DefaultCombat] >> Casting <<   Precision
      [18:36:19.142 N] [DefaultCombat] >> Casting <<   Dispatch
      [18:36:20.629 N] [DefaultCombat] >> Casting <<   Strike
      [18:36:22.124 N] [DefaultCombat] >> Casting <<   Clashing Blast
      [18:36:23.623 N] [DefaultCombat] >> Casting <<   Strike
      [18:36:25.085 N] [DefaultCombat] >> Casting <<   Zealous Strike
      [18:36:26.614 N] [DefaultCombat] >> Casting <<   Blade Rush
      [18:36:27.135 N] [DefaultCombat] >> Casting <<   Zen
      [18:36:28.138 N] [DefaultCombat] >> Casting <<   Blade Rush
      [18:36:31.631 N] [DefaultCombat] >> Casting <<   Clashing Blast
      [18:36:32.857 N] [DefaultCombat] >> Casting <<   Precision
      [18:36:33.029 N] [DefaultCombat] >> Casting <<   Master Strike
      [18:36:36.006 N] [DefaultCombat] >> Casting <<   Blade Rush
      [18:36:37.139 N] [DefaultCombat] >> Casting <<   Zealous Strike
      [18:36:38.708 N] [DefaultCombat] >> Casting <<   Blade Rush
      [18:36:40.177 N] [DefaultCombat] >> Casting <<   Clashing Blast
      [18:36:41.651 N] [DefaultCombat] >> Casting <<   Blade Rush
      [18:36:43.132 N] [DefaultCombat] >> Casting <<   Precision
      [18:36:43.324 N] [DefaultCombat] >> Casting <<   Dispatch
      [18:36:44.791 N] [DefaultCombat] >> Casting <<   Strike
      [18:36:46.292 N] [DefaultCombat] >> Casting <<   Blade Rush
      [18:36:47.784 N] [DefaultCombat] >> Casting <<   Strike
      [18:36:49.267 N] [DefaultCombat] >> Casting <<   Clashing Blast
      [18:36:50.786 N] [DefaultCombat] >> Casting <<   Zealous Strike
      [18:36:52.292 N] [DefaultCombat] >> Casting <<   Blade Rush
      [18:36:52.877 N] [DefaultCombat] >> Casting <<   Zen
      [18:36:53.809 N] [DefaultCombat] >> Casting <<   Blade Rush
      [18:36:56.688 N] [DefaultCombat] >> Casting <<   Twin Saber Throw
      [18:36:57.834 N] [DefaultCombat] >> Casting <<   Force Leap
      [18:36:58.983 N] [DefaultCombat] >> Casting <<   Precision
      [18:36:59.162 N] [DefaultCombat] >> Casting <<   Master Strike
      [18:37:01.631 N] [DefaultCombat] >> Casting <<   Clashing Blast
      [18:37:02.812 N] [DefaultCombat] >> Casting <<   Blade Rush
      [18:37:04.271 N] [DefaultCombat] >> Casting <<   Strike
      [18:37:05.804 N] [DefaultCombat] >> Casting <<   Blade Rush
      [18:37:08.793 N] [DefaultCombat] >> Casting <<   Precision
      [18:37:09.086 N] [DefaultCombat] >> Casting <<   Dispatch
      [18:37:10.560 N] [DefaultCombat] >> Casting <<   Zealous Strike
      [18:37:12.065 N] [DefaultCombat] >> Casting <<   Clashing Blast
      [18:37:13.614 N] [DefaultCombat] >> Casting <<   Blade Rush
      [18:37:15.436 N] [DefaultCombat] >> Casting <<   Zen
      
      Code:
      [18:50:10.559 N] [DefaultCombat] >> Casting <<   Precision
      [18:50:10.761 N] [DefaultCombat] >> Casting <<   Dispatch
      [18:50:12.236 N] [DefaultCombat] >> Casting <<   Blade Rush
      [18:50:15.200 N] [DefaultCombat] >> Casting <<   Strike
      [18:50:16.677 N] [DefaultCombat] >> Casting <<   Clashing Blast
      [18:50:18.248 N] [DefaultCombat] >> Casting <<   Strike
      [18:50:19.707 N] [DefaultCombat] >> Casting <<   Blade Rush
      [18:50:20.271 N] [DefaultCombat] >> Casting <<   Zen
      [18:50:21.227 N] [DefaultCombat] >> Casting <<   Blade Rush
      [18:50:22.386 N] [DefaultCombat] >> Casting <<   Precision
      [18:50:22.522 N] [DefaultCombat] >> Casting <<   Master Strike
      [18:50:25.197 N] [DefaultCombat] >> Casting <<   Zealous Strike
      [18:50:26.330 N] [DefaultCombat] >> Casting <<   Blade Rush
      [18:50:27.502 N] [DefaultCombat] >> Casting <<   Clashing Blast
      [18:50:28.682 N] [DefaultCombat] >> Casting <<   Blade Rush
      [18:50:29.828 N] [DefaultCombat] >> Casting <<   Strike
      [18:50:31.393 N] [DefaultCombat] >> Casting <<   Blade Rush
      [18:50:32.904 N] [DefaultCombat] >> Casting <<   Strike
      [18:50:35.835 N] [DefaultCombat] >> Casting <<   Clashing Blast
      [18:50:37.382 N] [DefaultCombat] >> Casting <<   Precision
      [18:50:37.557 N] [DefaultCombat] >> Casting <<   Dispatch
      [18:50:39.022 N] [DefaultCombat] >> Casting <<   Blade Rush
      [18:50:40.568 N] [DefaultCombat] >> Casting <<   Zealous Strike
      [18:50:42.072 N] [DefaultCombat] >> Casting <<   Blade Rush
      [18:50:45.647 N] [DefaultCombat] >> Casting <<   Zen
      [18:50:46.516 N] [DefaultCombat] >> Casting <<   Blade Rush
      [18:50:47.676 N] [DefaultCombat] >> Casting <<   Strike
      [18:50:48.840 N] [DefaultCombat] >> Casting <<   Clashing Blast
      [18:50:50.013 N] [DefaultCombat] >> Casting <<   Precision
      [18:50:50.140 N] [DefaultCombat] >> Casting <<   Master Strike
      [18:50:53.136 N] [DefaultCombat] >> Casting <<   Zealous Strike
      [18:50:54.316 N] [DefaultCombat] >> Casting <<   Blade Rush
      [18:50:56.925 N] [DefaultCombat] >> Casting <<   Strike
      [18:50:59.862 N] [DefaultCombat] >> Casting <<   Precision
      [18:50:59.994 N] [DefaultCombat] >> Casting <<   Dispatch
      [18:51:01.479 N] [DefaultCombat] >> Casting <<   Clashing Blast
      [18:51:02.993 N] [DefaultCombat] >> Casting <<   Blade Rush
      [18:51:05.985 N] [DefaultCombat] >> Casting <<   Zealous Strike
      [18:51:07.483 N] [DefaultCombat] >> Casting <<   Blade Rush
      [18:51:09.371 N] [DefaultCombat] >> Casting <<   Zen
      [18:51:09.479 N] [DefaultCombat] >> Casting <<   Valorous Call
      [18:51:10.444 N] [DefaultCombat] >> Casting <<   Blade Rush
      [18:51:11.604 N] [DefaultCombat] >> Casting <<   Precision
      [18:51:11.963 N] [DefaultCombat] >> Casting <<   Master Strike
      [18:51:14.566 N] [DefaultCombat] >> Casting <<   Dispatch
      [18:51:15.705 N] [DefaultCombat] >> Casting <<   Strike
      [18:51:16.863 N] [DefaultCombat] >> Casting <<   Clashing Blast
      [18:51:17.994 N] [DefaultCombat] >> Casting <<   Strike
      [18:51:18.372 N] [DefaultCombat] >> Casting <<   Zen
      [18:51:19.126 N] [DefaultCombat] >> Casting <<   Strike
      [18:51:20.308 N] [DefaultCombat] >> Casting <<   Blade Rush
      [18:51:23.780 N] [DefaultCombat] >> Casting <<   Clashing Blast
      [18:51:24.929 N] [DefaultCombat] >> Casting <<   Zealous Strike
      [18:51:26.061 N] [DefaultCombat] >> Casting <<   Blade Rush
      [18:51:27.549 N] [DefaultCombat] >> Casting <<   Precision
      [18:51:27.750 N] [DefaultCombat] >> Casting <<   Blade Rush
      [18:51:29.278 N] [DefaultCombat] >> Casting <<   Strike
      [18:51:30.743 N] [DefaultCombat] >> Casting <<   Dispatch
      [18:51:32.267 N] [DefaultCombat] >> Casting <<   Clashing Blast
      [18:51:33.744 N] [DefaultCombat] >> Casting <<   Blade Rush
      [18:51:35.215 N] [DefaultCombat] >> Casting <<   Zealous Strike
      [18:51:36.734 N] [DefaultCombat] >> Casting <<   Blade Rush
      [18:51:39.116 N] [DefaultCombat] >> Casting <<   Zen
      [18:51:39.741 N] [DefaultCombat] >> Casting <<   Precision
      [18:51:39.925 N] [DefaultCombat] >> Casting <<   Master Strike
      [18:51:43.015 N] [DefaultCombat] >> Casting <<   Blade Rush
      [18:51:44.179 N] [DefaultCombat] >> Casting <<   Strike
      [18:51:45.328 N] [DefaultCombat] >> Casting <<   Clashing Blast
      [18:51:46.497 N] [DefaultCombat] >> Casting <<   Strike
      [18:51:47.648 N] [DefaultCombat] >> Casting <<   Blade Rush
      [18:51:48.831 N] [DefaultCombat] >> Casting <<   Zealous Strike
      [18:51:50.294 N] [DefaultCombat] >> Casting <<   Blade Rush
      [18:51:51.778 N] [DefaultCombat] >> Casting <<   Precision
      [18:51:51.978 N] [DefaultCombat] >> Casting <<   Dispatch
      [18:51:53.452 N] [DefaultCombat] >> Casting <<   Clashing Blast
      
      As you can see its not Always perfect, and the spell check doesnt Always work perfectly if you ask me.
      Sometimes zen is ignored as buff or is on timer for doing a normal spell.
      It registers this as Not available sadly.
       
      Last edited: Jul 21, 2015
    11. alltrueist

      alltrueist Active Member

      Joined:
      Dec 10, 2012
      Messages:
      1,424
      Likes Received:
      16
      Trophy Points:
      38
      At this level of precision, especially on a complex rotation like this, you'll have to tweak until you like. There's some things the bot simply can't do, and pooling resources for burst phases is up there.

      With Pure, I used a ton of LockSelectors to make sure the bot chose the correct action. I got criticized for using too many, but even then the bot would skip over the correct ability numerous times during a play session. No idea why. This is why coding is so damn frustrating :D
       
    12. Cryogenesis

      Cryogenesis Moderator Moderator

      Joined:
      Jul 13, 2010
      Messages:
      2,128
      Likes Received:
      13
      Trophy Points:
      38
      Hmm made me wonder yesterday. The code Jon gave, reports if a spell is ready to be casted, but if its on cooldown by the 'universal main hand cooldown of <1sec' it will report back to the bot, as not ready.
      Wouldnt it be better to code in a pause for common spells which generate this universal mainhand cooldown? if it then checks, the spell is ready and it will not go way down in the list of spells. And yes if it goes down to much you get the inefficient spells!
      Can you or anyone else eleborate on this matter?
       
    13. pindleskin

      pindleskin Community Developer

      Joined:
      Oct 24, 2012
      Messages:
      1,124
      Likes Received:
      2
      Trophy Points:
      38
      Need any changes to DefaultRoutine?
       
    14. Cryogenesis

      Cryogenesis Moderator Moderator

      Joined:
      Jul 13, 2010
      Messages:
      2,128
      Likes Received:
      13
      Trophy Points:
      38
      I Changed the following spells:
      Consular: Noble Sacrifice to Vindicate
      Sorcerer: Consumption to Consuming Darkness

      They need to be checked if they need more work, on the consumption part. But this is more for the peeps who know the classes.
       

      Attached Files:

    15. Cryogenesis

      Cryogenesis Moderator Moderator

      Joined:
      Jul 13, 2010
      Messages:
      2,128
      Likes Received:
      13
      Trophy Points:
      38
      Can you explain me the spell Force in balance? when do you use it? only to apply Prolific justice or what?

      Edit:
      Nvm i think i found it:

      Force in Balance (FiB) is an incredibly important ability.
      It does not hit quite as hard as in 2.10, but still packs quite a punch, and now hits up to 8 targets.
      It also leaves 15 Stacks of Force Suppression on its targets, and will spread your Force Breach and Sever Force effects to its targets that are not already affected by them.
      For single target situations, it is best to use this ability on its 15 second cooldown. With 3.0, this ability causes its targets to take 10% increased area of effect damage.



      If i read this, i think we only have to add Whirling Blow in the single rotation just to get those debuffs back in. What you think?

      For testing purposes i added these lines as they are under the AOE part.
      If it hogs the dps to much revert back to the old files.
       
      Last edited: Jul 22, 2015
    16. strepie

      strepie New Member

      Joined:
      Jun 11, 2012
      Messages:
      290
      Likes Received:
      2
      Trophy Points:
      0
      Woot! TY TY TY Alltrueist and Cryogenesis esp. - man you guys are awesome! :)
       
    17. alltrueist

      alltrueist Active Member

      Joined:
      Dec 10, 2012
      Messages:
      1,424
      Likes Received:
      16
      Trophy Points:
      38
      No, we don't need to change anything here. Whirling Blow doesn't refresh the debuff on the target, it only spreads it to other targets. In the AoE section, you can see that I already forced it to check if those debuffs are on the target before casting Whirling Blow. All that really changed here is that instead of FiB spreading the DoTs, now Whirling Blow does.
       
    18. Cryogenesis

      Cryogenesis Moderator Moderator

      Joined:
      Jul 13, 2010
      Messages:
      2,128
      Likes Received:
      13
      Trophy Points:
      38
      Ok makes sence. Althow the Hatred version (serenities counterpart) hasnt got this implemented:
      Code:
              public override Composite SingleTarget
              {
                  get
                  {
                      return new LockSelector(
                          Spell.Buff("Force Speed", ret => !DefaultCombat.MovementDisabled && Me.CurrentTarget.Distance >= 1f && Me.CurrentTarget.Distance <= 3f),
      
                          //Movement
                          CombatMovement.CloseDistance(Distance.Melee),
      
                          Spell.Cast("Jolt", ret => Me.CurrentTarget.IsCasting && !DefaultCombat.MovementDisabled),
                          Spell.CastOnGround("Death Field"),
      					Spell.Cast("Lacerate", ret => Me.ForcePercent >= 60 && Targeting.ShouldPBAOE),
                          Spell.DoT("Discharge", "Discharge"),
                          Spell.DoT("Creeping Terror", "Creeping Terror"),
                          Spell.Cast("Crushing Darkness", ret => Me.HasBuff("Raze")),
                          Spell.Cast("Assassinate", ret => Me.CurrentTarget.HealthPercent <= 30),
                          Spell.Cast("Thrash"),
                          Spell.Buff("Force Speed", ret => Me.CurrentTarget.Distance >= 1.1f && Me.IsMoving && Me.InCombat)
                          );
                  }
              }
      
              public override Composite AreaOfEffect
              {
                  get
                  {
                      return new LockSelector(
                          Spell.CastOnGround("Death Field", ret => Targeting.ShouldAOE),
                          Spell.Cast("Lacerate", ret => Me.ForcePercent >= 60 && Targeting.ShouldPBAOE)
                      );
                  }
              }
      
      Ill take my code down, as it has no benefit.
       
    19. alltrueist

      alltrueist Active Member

      Joined:
      Dec 10, 2012
      Messages:
      1,424
      Likes Received:
      16
      Trophy Points:
      38
      Yeah, I implemented into Hatred before uploading.

      If it's not working well enough, I could always force Whirling Blow and Lacerate to check if the debuffs are up, but it should work fine this way.
       
    20. Cryogenesis

      Cryogenesis Moderator Moderator

      Joined:
      Jul 13, 2010
      Messages:
      2,128
      Likes Received:
      13
      Trophy Points:
      38
      Marauder Carnage update for leveling to endgame:
      Code:
      using Buddy.BehaviorTree;
      using DefaultCombat.Core;
      using DefaultCombat.Helpers;
      
      namespace DefaultCombat.Routines
      {
          class Carnage : RotationBase
          {
              public override string Name { get { return "Marauder Carnage"; } }
      
              public override Composite Buffs
              {
                  get
                  {
                      return new PrioritySelector(
                          Spell.Buff("Ataru Form"),
                          Spell.Buff("Unnatural Might")
                          );
                  }
              }
      
              public override Composite Cooldowns
              {
                  get
                  {
                      return new LockSelector(
                          Spell.Buff("Unleash"),
                          Spell.Buff("Cloak of Pain", ret => Me.HealthPercent <= 90),
                          Spell.Buff("Force Camouflage", ret => Me.HealthPercent <= 70),
                          Spell.Buff("Saber Ward", ret => Me.HealthPercent <= 50),
                          Spell.Buff("Undying Rage", ret => Me.HealthPercent <= 10),
                          Spell.Buff("Frenzy", ret => Me.BuffCount("Fury") < 5),
                          Spell.Buff("Berserk")
                          );
                  }
              }
      
              public override Composite SingleTarget
              {
                  get
                  {
                      return new LockSelector(
                          Spell.Cast("Saber Throw", ret => !DefaultCombat.MovementDisabled && Me.CurrentTarget.Distance >= 0.5f && Me.CurrentTarget.Distance <= 3f),
                          Spell.Cast("Force Charge", ret => !DefaultCombat.MovementDisabled && Me.CurrentTarget.Distance >= 1f && Me.CurrentTarget.Distance <= 3f),
                          Spell.Cast("Dual Saber Throw", ret => !DefaultCombat.MovementDisabled && Me.CurrentTarget.Distance >= 1f && Me.CurrentTarget.Distance <= 3f),
      
                          //Movement
                          CombatMovement.CloseDistance(Distance.Melee),
      
                          //Rotation
                          Spell.Cast("Disruption", ret => Me.CurrentTarget.IsCasting && !DefaultCombat.MovementDisabled),
                          Spell.Cast("Gore", ret => !Me.HasBuff("Gore")),
                          Spell.Cast("Ravage", ret => Me.HasBuff("Gore") || Me.Level < 41), //Double check level when Gore is obtained!!
                          Spell.Cast("Vicious Throw", ret => Me.HasBuff("Slaughter") || Me.CurrentTarget.HealthPercent <= 30),
                          Spell.Cast("Force Scream", ret => Me.HasBuff("Execute") || Me.Level < 28), //Double check level when Execute is obtained!!
                          Spell.Cast("Rupture", ret => Me.HasBuff("Massacre")),
                          Spell.Cast("Massacre"),
                          Spell.Cast("Battering Assault", ret => Me.ActionPoints <= 7),
      					Spell.Cast("Vicious Slash", ret => Me.ActionPoints >= 7 && Me.Level < 30), //Double check level if we want to use it further then level 30!!
                          Spell.Cast("Assault", ret => Me.ActionPoints <= 9),
                          Spell.Cast("Retaliation")
      					// See http://theblackforge.eu/mobile/forum/viewthread/m/13971628/id/7171060-marauder for more info.
                          );
                  }
              }
      
              public override Composite AreaOfEffect
              {
                  get
                  {
                      return new Decorator(ret => Targeting.ShouldPBAOE,
                          new LockSelector(
                              Spell.Cast("Smash"),
                              Spell.Cast("Sweeping Slash")
                      ));
                  }
              }
          }
      }
      
       

    Share This Page