• Visit Rebornbuddy
  • Visit Panda Profiles
  • Visit LLamamMagic
  • Do you even "class" bro?

    Discussion in 'Buddy Wing Forum' started by steadygrind, Nov 1, 2015.

    1. steadygrind

      steadygrind Member

      Joined:
      Jan 29, 2015
      Messages:
      63
      Likes Received:
      1
      Trophy Points:
      8
      yea I see what you are saying we could make some cool progress at this by starting a guide thread about how to use the modifiers for spells and such. such as leap to if at 100% or battering assault if at less that 50% resource. I wonder what would happen if you put multiple lines with the same attack or dot but placed different modifiers on them? one for the opening phase and one for the burn phase. I am sure we could get some pretty complex routines.
       
    2. Cryogenesis

      Cryogenesis Moderator Moderator

      Joined:
      Jul 13, 2010
      Messages:
      2,128
      Likes Received:
      13
      Trophy Points:
      38
      This would not fire an entire group of abilities for the opening.
      I think what he means is
      Code:
      New Decorator(Opening Sequence)
      {
      If not in Combat
      {
      Fire all spells inside this If statement, then we are in combat and go to resource
      }
      }
      
      New Decorator(Resources)
      {
      If In Combat but low on resources
      {
      Fire all spells inside this If statement, then we are high on resources and go to burst
      }
      }
      
      New Decorator(Burst)
      {
      If In Combat and high on resources
      {
      Fire all spells inside this If statement, then when low go back to resources
      }
      }
      
      This is not real code, but you get the idea.
       
    3. Cryogenesis

      Cryogenesis Moderator Moderator

      Joined:
      Jul 13, 2010
      Messages:
      2,128
      Likes Received:
      13
      Trophy Points:
      38
      Already did that, just put one ability with a shitload of conditions behind it.

      For instance:
      Code:
      Spell.Buff("Awe", ret => Me.HealthPercent <= 50 && Me.Level < 60 && Targeting.CheckDPSAOE(2, Distance.MeleeAoE, Me.Position) && !Me.HasBuff("Precision")),
      or

      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("Twin 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),
      					Spell.Cast("Twin Saber Throw", ret => Me.CurrentTarget.Distance >= 1f && Me.CurrentTarget.Distance <= 3f && !Me.HasBuff("Precision")),
                          Spell.Cast("Force Leap", ret => 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 <= 6 && !Me.HasBuff("Precision") && !Me.HasBuff("Opportune Attack") && !Buddy.CommonBot.AbilityManager.CanCast("Clashing Blast", Me.CurrentTarget)),
      					Spell.Cast("Precision", ret => Me.CurrentTarget.Distance <= 0.4f && ((Buddy.CommonBot.AbilityManager.CanCast("Master Strike", Me.CurrentTarget) && Buddy.CommonBot.AbilityManager.CanCast("Zen", Me) && Me.HasBuff("Opportune Attack")) || (Buddy.CommonBot.AbilityManager.CanCast("Dispatch", Me.CurrentTarget) && Me.HasBuff("Opportune Attack")))),
                          Spell.Cast("Dispatch", ret => (Me.HasBuff("Hand of Justice") && Me.HasBuff("Precision") && Me.HasBuff("Opportune Attack")) || Me.CurrentTarget.HealthPercent <= 30),
      					Spell.Cast("Master Strike", ret => ((Me.HasBuff("Precision") && Me.HasBuff("Zen") && Me.HasBuff("Opportune Attack")) || (Me.Level >= 30 && Me.Level < 60)) || Me.Level < 30),			
      					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))),
                          //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)
                          );
                  }
              }
      
      But like said, this is unstable due to Global Cooldown, because it checks for spells but they are not ready during GCD
       
      Last edited: Nov 3, 2015
    4. steadygrind

      steadygrind Member

      Joined:
      Jan 29, 2015
      Messages:
      63
      Likes Received:
      1
      Trophy Points:
      8
      hmm a "pause xxxx in milliseconds" command would be amazing at the end of the line.
       
    5. alltrueist

      alltrueist Active Member

      Joined:
      Dec 10, 2012
      Messages:
      1,424
      Likes Received:
      16
      Trophy Points:
      38
      Here's what you need to be doing (I think):
      Code:
      new Decorator(ret => !Me.InCombat,
                              new Decorator(ret => Me.CurrentTarget.Distance >= 1f,
                              new Sequence(
                                  Spell.Cast("Force Leap"),
                                  Spell.Cast("Presicion"),
                                  Spell.Cast("Blade Dance"))
                              )),
      A Sequence is different than a PrioritySelector because a sequence will execute the commands in order. No idea how this work with BW since I've never tried it-- maybe the 1.5 second GCD fucks everything up. But a sequence is what you guys are looking for. When the bot comes back up, try it out.

      BTW: the larger code looks like this:
      Code:
      public override Composite SingleTarget
      		{
      			get
      			{
      				return new LockSelector(
                          new Decorator(ret => !Me.InCombat,
                              new Decorator(ret => Me.CurrentTarget.Distance >= 1f,
                              new Sequence(
                                  Spell.Cast("Force Leap"),
                                  Spell.Cast("Presicion"),
                                  Spell.Cast("Blade Dance"))
                              )),
      
      					Spell.Cast("Saber Throw",
      						ret => !DefaultCombat.MovementDisabled && Me.CurrentTarget.Distance >= 0.5f && Me.CurrentTarget.Distance <= 3f),
      					Spell.Cast("Force Leap",
      						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("Force Kick", ret => Me.CurrentTarget.IsCasting && !DefaultCombat.MovementDisabled),
      					Spell.Cast("Dispatch", ret => Me.HasBuff("Hand of Justice") || Me.CurrentTarget.HealthPercent <= 30),
      					Spell.Cast("Precision", ret => Me.CurrentTarget.Distance <= 0.4f),
      					Spell.Cast("Blade Dance", ret => Me.HasBuff("Precision")),
      					Spell.Cast("Clashing Blast", ret => Me.HasBuff("Opportune Attack") && Me.Level >= 57),
      					Spell.Cast("Blade Storm", ret => Me.HasBuff("Opportune Attack") && Me.Level < 57),
      					Spell.Cast("Blade Rush"),
      					Spell.Cast("Slash", ret => Me.ActionPoints >= 7 && Me.Level < 26),
      					Spell.Cast("Zealous Strike", ret => Me.ActionPoints <= 7),
      					Spell.Cast("Strike", ret => Me.ActionPoints <= 10)
      					);
      			}
      		}
       
    6. steadygrind

      steadygrind Member

      Joined:
      Jan 29, 2015
      Messages:
      63
      Likes Received:
      1
      Trophy Points:
      8
      man this sucks! I have like a million ideas for new rotations but I cant test them without a bot that is working :mad:. I will probably forget half the things I am thinking by the time the bot comes back up :rolleyes:
       
    7. alltrueist

      alltrueist Active Member

      Joined:
      Dec 10, 2012
      Messages:
      1,424
      Likes Received:
      16
      Trophy Points:
      38
      Nothing stopping you from writing the rotation and saving the Sentinel.cs file in a different folder until the bot comes back up!
       
    8. steadygrind

      steadygrind Member

      Joined:
      Jan 29, 2015
      Messages:
      63
      Likes Received:
      1
      Trophy Points:
      8
      ouch hit me right in my laziness LOL.
       
    9. pindleskin

      pindleskin Community Developer

      Joined:
      Oct 24, 2012
      Messages:
      1,124
      Likes Received:
      2
      Trophy Points:
      38
      @alltruist I think that will only execute Force Leap as an "opener" and ignore the Presicion and Blade Dance because he is already in combat AND in range but could be wrong though :) can't test it right now
       
    10. alltrueist

      alltrueist Active Member

      Joined:
      Dec 10, 2012
      Messages:
      1,424
      Likes Received:
      16
      Trophy Points:
      38
      That's my fear as well. I've never used Sequences before, so I can tell if the bot will finish the sequence before moving on, or if it will instantly move to the next session upon Me.inCombat returning true. Oh well, a few more days according to Aevitas.
       
    11. lyvewyre

      lyvewyre Member

      Joined:
      Jan 3, 2013
      Messages:
      418
      Likes Received:
      12
      Trophy Points:
      18
      What about this one? Found in the API linked:

      CastTimeEnd "Stores the game time in which the currently casting ability should be finished"

      be good for skills like unload/blade dance to ensure they're finished before firing next skill.

      Other I saw was IsCasting which should class blade dance as a casting. You'd need to add a (not) Me.IsCasting to everything though I guess. Need to test whether it would count instants/GCD abilities as casting. Also good for a interrupt check.
       
      Last edited: Nov 3, 2015
    12. alltrueist

      alltrueist Active Member

      Joined:
      Dec 10, 2012
      Messages:
      1,424
      Likes Received:
      16
      Trophy Points:
      38
      You don't need it. Spell.Cast already has a check baked in for Me.IsCasting
       
    13. Cass

      Cass New Member

      Joined:
      Jan 24, 2014
      Messages:
      98
      Likes Received:
      2
      Trophy Points:
      0
      Hello there

      I was tweking Lethality single target rotation on Combat Default and its using lots of old abilities

      As it was stated here there is the gcd problem thats messing on part of the rotation

      Can anyone check the rotation below and see if its fine?

      Code:
      return new LockSelector(
      		//Movement
      		CombatMovement.CloseDistance(Distance.Melee),
      		Spell.Cast("Lethal Strike",	
      			ret => 
      			!Me.HasBuff("Tactical Advantage") && 
      			Me.IsStealthed)
      			,
      		Spell.Cast("Lethal Strike",	
      			ret => 
      			!Me.CurrentTarget.HasDebuff("Corrosive Dart") || 
      			Me.CurrentTarget.DebuffTimeLeft("Corrosive Dart") <= 2)
      			,
      		Spell.Cast("Corrosive Dart", 
      			ret => 
      			Me.HasBuff("Cut Down") && 
      			(!Me.CurrentTarget.HasDebuff("Corrosive Dart") || Me.CurrentTarget.DebuffTimeLeft("Corrosive Dart") <= 2))
      			,
      		Spell.Cast("Corrosive Grenade", 
      			ret => 
      			Me.HasBuff("Cut Down") && 
      			(!Me.CurrentTarget.HasDebuff("Corrosive Grenade") || Me.CurrentTarget.DebuffTimeLeft("Corrosive Grenade") <= 2))
      			,
      		Spell.Cast("Toxic Blast", 
      			ret => 
      			Me.BuffCount("Tactical Advantage") < 2 && 
      			Me.CurrentTarget.HasDebuff("Corrosive Dart") && 
      			Me.CurrentTarget.HasDebuff("Corrosive Grenade"))
      			,
      		Spell.Cast("Shiv", 
      			ret => 
      			Me.BuffCount("Tactical Advantage") < 2 && 
      			Me.CurrentTarget.HasDebuff("Corrosive Dart") && 
      			Me.CurrentTarget.HasDebuff("Corrosive Grenade"))
      			,
      		Spell.Cast("Corrosive Assault", 
      			ret => 
      			Me.HasBuff("Tactical Advantage") && 
      			Me.CurrentTarget.HasDebuff("Corrosive Dart") && 
      			Me.CurrentTarget.HasDebuff("Corrosive Grenade"))
      			,
      		Spell.Cast("Overload Shot",	
      			ret => 
      			Me.EnergyPercent > 80 &&
      			!Me.HasBuff("Tactical Advantage") && 
      			!Buddy.CommonBot.AbilityManager.CanCast("Shiv", Me.CurrentTarget) && 
      			!Buddy.CommonBot.AbilityManager.CanCast("Toxic Blast", Me.CurrentTarget) && 
      			Me.CurrentTarget.HasDebuff("Corrosive Dart") && 
      			Me.CurrentTarget.HasDebuff("Corrosive Grenade"))
      			,
      		Spell.Cast("Rifle Shot",
      			ret =>
      			!Me.HasBuff("Tactical Advantage") && 
      			!Buddy.CommonBot.AbilityManager.CanCast("Shiv", Me.CurrentTarget) && 
      			!Buddy.CommonBot.AbilityManager.CanCast("Toxic Blast", Me.CurrentTarget) && 
      			Me.CurrentTarget.HasDebuff("Corrosive Dart") && 
      			Me.CurrentTarget.HasDebuff("Corrosive Grenade"))
      		);
      I already tested the old debuff name "Poisoned (Corrosive Dart)" but it seems to be changed just to the name of the skill as with the old name the rotation keep casting corrosive dart non stop

      On the API there is something on TorAbility.GlobalCooldownTime Property but i dont know if it states the current cooldown of just the time from the cooldown ability regardless of being in use or not.

      How could we get the current cooldown from shiv and Toxic Blast so i could put a condition to use overload shot or rifle shot when cd > 1.5 or something ?(so that i could avoid mistaking use of those two when the other 2 are ready)

      Thanks for any help
       
      Last edited: Nov 6, 2015
    14. alltrueist

      alltrueist Active Member

      Joined:
      Dec 10, 2012
      Messages:
      1,424
      Likes Received:
      16
      Trophy Points:
      38
      I don't have an Operative, so I can't test. What happens when you run that? It seems like a lot of checks.
       
    15. Cass

      Cass New Member

      Joined:
      Jan 24, 2014
      Messages:
      98
      Likes Received:
      2
      Trophy Points:
      0
      Is a little bit laggy, but is was laggy anyway even before the changes

      Regarding the rotation what happens its that when shiv and toxic blast are about to be rady to use and the rotation uses overload shot or rifle shot, it activate the gcd and it shots again.

      Houd could i track shiv and toxic blast cooldown to avoid this?
      i tried to use

      Code:
      !Buddy.CommonBot.AbilityManager.CanCast("Shiv", Me.CurrentTarget))
      as a conditional, but as stated before the same thing about the gcd make the bot thinks that the skill its not ready.

      I have to tweak a little bit more the rotation from when im not on melee range

      edit: TorAbility.CooldownTime gives me the total cooldown or the current cooldown?
       
      Last edited: Nov 6, 2015
    16. steadygrind

      steadygrind Member

      Joined:
      Jan 29, 2015
      Messages:
      63
      Likes Received:
      1
      Trophy Points:
      8
      Not sure if it would be Spell.cast or Spell.Dot. I know some damage over time require a Spell.Dot but others don't. so watch that context

      Code:
       Spell.DoT("Corrosive Dart", "", 15000),
      	     Spell.DoT("Corrosive Grenade", "", 18000), 
      don't forget the time in m/s at the end
       
      Last edited: Nov 6, 2015

    Share This Page