Hey folks, I will be working my way though the rotations, test each one out and providing some feedback on how they play in RL. I have toons in most every class, so this will take a while, but I thought I would just give basic feedback on missing items in rotations, etc. first, with some raiding notes if folks find those helpful. Here are a few suggestions / adds to the Assassin Deception spec: Added new ability - Ball Lightning at lvl 57 Added Shock into rotation, Ball Lightning replaces at lvl 57 Added Saber Strike into rotation for low resource management, plus it helps proc static charge Added InCombat handler for Recklessness, I was finding that it would pop when clicking on my toon Code: using Buddy.BehaviorTree; using DefaultCombat.Core; using DefaultCombat.Helpers; namespace DefaultCombat.Routines { class Deception : RotationBase { public override string Name { get { return "Assassin Deception"; } } public override Composite Buffs { get { return new PrioritySelector( Spell.Buff("Surging Charge"), Spell.Buff("Mark of Power"), Spell.Buff("Stealth", ret => !Rest.KeepResting() && !DefaultCombat.MovementDisabled && !Me.IsMounted) ); } } public override Composite Cooldowns { get { return new LockSelector( Spell.Buff("Unbreakable Will", ret => Me.IsStunned), Spell.Buff("Overcharge Saber", ret => Me.HealthPercent <= 85), Spell.Buff("Deflection", ret => Me.HealthPercent <= 60), Spell.Buff("Force Shroud", ret => Me.HealthPercent <= 50), Spell.Buff("Recklessness", ret => Me.BuffCount("Static Charge") < 1 && Me.InCombat), Spell.Buff("Blackout", ret => Me.ForcePercent <= 40) ); } } 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), //Interrupts Spell.Cast("Jolt", ret => Me.CurrentTarget.IsCasting && !DefaultCombat.MovementDisabled), Spell.Cast("Electrocute", ret => Me.CurrentTarget.IsCasting && !DefaultCombat.MovementDisabled), Spell.Cast("Low Slash", ret => Me.CurrentTarget.IsCasting && !DefaultCombat.MovementDisabled), //Rotation Spell.Cast("Discharge", ret => Me.BuffCount("Static Charge") == 3), Spell.Cast("Shock", ret => Me.BuffCount("Induction") == 2 && Me.Level < 57), Spell.Cast("Ball Lightning", ret => Me.BuffCount("Induction") == 2 && Me.Level >= 57), Spell.Cast("Maul", ret => (Me.HasBuff("Stealth") || Me.HasBuff("Duplicity")) && Me.IsBehind(Me.CurrentTarget)), Spell.Cast("Assassinate", ret => Me.CurrentTarget.HealthPercent <= 30), Spell.Cast("Voltaic Slash", ret => Me.Level >= 26), Spell.Cast("Thrash", ret => Me.Level < 26), Spell.Cast("Saber Strike"), Spell.Cast("Force Speed", ret => Me.CurrentTarget.Distance >= 1.1f && Me.IsMoving && Me.InCombat) ); } } public override Composite AreaOfEffect { get { return new Decorator(ret => Targeting.ShouldPBAOE, Spell.Cast("Lacerate", ret => Me.ForcePercent >= 60) ); } } } } Raiding Notes: (these are just suggestions, you may have to adjust for your style of play - passive abilities, etc.) -I typically don't enable force speed options because I like to use it myself when needed and with new Emersion passive, its nice to keep this on cooldown for when you need it most -I also disable Force Shroud, it does have some cooldown qualities, but some fights you need to save this at all costs, so I either set the value really low, or just disable and use manually -Low Slash I dont use, at max level it really doesn't make sense, unless you are using the passive Hand of Darkness -I have slight difference to Maul ability - Spell.Cast("Maul", ret => Me.HasBuff("Duplicity") && Me.IsBehind(Me.CurrentTarget)) - I dont use the "Stealth" buff, found it unreliable -I don't use Thrash, too much resource and I have found that Saber Strike, although does less damage and takes longer for animation, makes my resource not tank so quickly, allowing for higher damage output overall Thats it, sorry for the book, hope this helps others using this rotation. I have been using Pure rotation for long time, and now moving over to DefaultCombat. My next rotation focus will be Merc - Innovative Ordinance
Awesome, I am working on Merc IO, will probably be done later today. Out of curiosity, about how often are you guys releasing updates?
I do it whenever I get around to it, or whenever someone posts an update here. I am taking my doctoral exams on two weeks, so the updates from me will be less frequent for awhile. If you post an update here, I'll try to get it up ASAP. EDIT: just pushed your updates to Assassin Deception to the SVN. You can download now to test, or wait until the next auto-update.
Code: Spell.Buff("Dark Ward", ret => Me.BuffCount("Dark Ward") <= 1 || Me.BuffTimeLeft("Dark Ward") < 2), this does not work anymore, it will reapply dark ward only when buff completly fall off, tried different amount of buffcounts and timeleft but nothing maybe because dark ward name have number of charges inside now?
Here are my suggestions to the Merc Innovative Ordnance rotation: (This is a really difficult rotation, but insane dps numbers if done right) -Added Emergency Scan to cooldowns, its fairly cheap (15 heat), and nice for survivability -Took out Rail Shot from Low Resource handler, this just may be my own preference, but I like to regain resource as fast as possible -Added Mag Shot to rotation - lvl 57 replacement for Railshot -Added Missle Blast as a sub 30% ability, used with Volatile Warhead buff only -Added a second Mag Shot ability because I didn't know how to create an 'or' contition for the 'Superheated Shot' buff the procs, this could likely be combined with the first Mag Shot line -Added Power Shot to instant proc from Speed to Burn buff, alternatively Serrated Shot can be instant proc as well, I just choose power shot for overall damage -Added Serrated Shot lvl 41 DOT -Added debuff handler to Incendiary Missle -Added SuperCharged Gas with InCombat handler -Moved up Electo Net to take advantage of SuperCharged Gas buff -Added Unload to rotation, this is used to provide crit on Mag Shot every 60 sec, plus its decent dps -Disabled Fusion Missle because of low damage output compared to Death from Avove and Sweeping Blasters, however, is useful for Dot spreading, for some fights this is better Code: 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 LockSelector( Spell.Buff("Determination", ret => Me.IsStunned), Spell.Buff("Vent Heat", ret => Me.ResourcePercent() >= 50), Spell.Buff("Energy Shield", ret => Me.HealthPercent <= 40), Spell.Buff("Emergency Scan", ret => Me.HealthPercent <= 35), 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, new LockSelector( //Spell.Cast("Rail Shot", ret => Me.HasBuff("Prototype Particle Accelerator")), Spell.Cast("Rapid Shots") )), //Rotation Spell.Cast("Disabling Shot", ret => Me.CurrentTarget.IsCasting && Me.CurrentTarget.Distance <= Distance.Melee && !DefaultCombat.MovementDisabled), Spell.Cast("Mag Shot", ret => Me.HasBuff("Innovative Particle Accelerator") && Me.Level >= 57), Spell.Cast("Rail Shot", ret => Me.Level < 57), Spell.Cast("Missle Blast", ret => Me.CurrentTarget.HealthPercent <= 30 && Me.HasBuff("Volatile Warhead")), Spell.Cast("Mag Shot", ret => Me.HasBuff("Superheated Shot")), Spell.Cast("Power Shot", ret => Me.HasBuff("Speed to Burn")), Spell.DoT("Serrated Shot", "", 15000, ret => !Me.CurrentTarget.HasDebuff("Marked (Physical)")), Spell.DoT("Incendiary Missile", "", 12000, ret => !Me.CurrentTarget.HasDebuff("Burning (Incendiary Round)")), Spell.Cast("Supercharged Gas", ret => Me.BuffCount("Supercharge") == 10 && Me.InCombat), Spell.Cast("Electro Net", ret => Me.HasBuff("Supercharged Gas") && Me.CurrentTarget.HealthPercent > 30), Spell.Cast("Unload"), Spell.Cast("Thermal Detonator"), Spell.Cast("Power Shot") ); } } public override Composite AreaOfEffect { get { return new Decorator(ret => Targeting.ShouldAOE, new LockSelector( Spell.CastOnGround("Death from Above", ret => Me.CurrentTarget.Distance > Distance.MeleeAoE), //Spell.Cast("Fusion Missle", ret => Me.HasBuff("Thermal Sensor Override")), Spell.CastOnGround("Sweeping Blasters", ret => Me.CurrentTarget.Distance > Distance.MeleeAoE), Spell.Cast("Explosive Dart")) ); } } } } Raiding Notes: (these are just suggestions, you may have to adjust for your style of play - passive abilities, etc.) -This is one of the most difficult rotations in the game, but can produce insane DPS -Resouces management is the biggest issue; you may have to tweek the low resource handler percentage a bit to get better results, however, overall I am pretty satisfied -Some fights with lots of adds, Dot spreading with Explosive Dart and Fusion Missle are necessary, so you may want to tweek which AOE's you use -I also take the ranged distance check off for the AOE's, this didnt work well in previous versions of Pure, but seem more realiable in the current Default routine. Please let me know if anyone figures out how to combine some of my repeated lines. I am not brilliant with code, suggestions welcome Thanks EDIT: I think I have found a way to combine the Mag Shot lines, still not sure on Power Shot: Mag Shot line should look something like this I think: Code: Spell.Cast("Mag Shot", ret => Me.HasBuff("Innovative Particle Accelerator") || Me.HasBuff("Superheated Shot") && Me.Level >= 57),
Check what I have for Commando/Assault (whatever the mirror is), does that closely resemble what you're looking for?
Yes, I see what you did there in the Assault rotation. I will match up the abilities and repost the IO rotation.
Help me understand how the Spell.DoT works; Code: Spell.DoT("Serrated Shot", "", 15000), Does this mean that Serrated Shot will be cast every 15 sec?
When I boot up Buddy wing I get this error, unable to do anything else, wont let me pick a routine ( as it says) or anything else. There are 0 instructions on how to 'install' or get this to work so I plopped them into the routines folder after having to google for awhile to figure out where to put them Compiler Error: c:\Users\xxx\Downloads\BuddyWing 1.0.1138.557\Routines\DefaultCombat\DefaultCombat.cs(29,24) : error CS0246: The type or namespace name 'IManItem' could not be found (are you missing a using directive or an assembly reference?) Compiler Error: c:\Users\xxx\Downloads\BuddyWing 1.0.1138.557\Routines\DefaultCombat\Core\Targeting.cs(34,49) : error CS0103: The name 'Health' does not exist in the current context Compiler Error: c:\Users\Axxs\Downloads\BuddyWing 1.0.1138.557\Routines\DefaultCombat\Core\Targeting.cs(35,49) : error CS0103: The name 'Distance' does not exist in the current context Compiler Error: c:\Users\xxx\Downloads\BuddyWing 1.0.1138.557\Routines\DefaultCombat\Core\Targeting.cs(36,49) : error CS0103: The name 'Distance' does not exist in the current context Unhandled exception during init: System.InvalidOperationException: No routines were loaded. Please ensure there is a routine for your class before starting the bot. at Buddy.CommonBot.BotMain.SetCurrentCombatRoutine() at Buddywing.MainWindow.DoInitialization() Buddy Wing: The Old Robot is ready! I got rid of the errors, when googling (error CS0103) I only found a single thread that said merge it with default combat routines, instead of doing that I just put the Pure swtor folder completely different and didn't get an error when compiling.
You don't have to do anything; DefaultCombat ships with Buddywing. Do a fresh install and try again. As for instructions for the bot itself, walter has a nice guide on all kinds of minor fixes and improvements you can make, I always recommend it for new users.
Here's a little pro tip that changed my coding abilities when I discovered it: you can find the definition of anything by right-clicking it and selecting "Go To Definition." This requires you to open the entire DefaultCombat project file in Visual Studio, but you should be doing that anyway when you're editing routines. When we find the Definition of Spell.DoT, we see Code: public static Composite DoT(string spell, string debuff, float time = 0, Selection<bool> reqs = null) { return DoT(spell, ret => Me.CurrentTarget, debuff, time, reqs); } So we can look at the available elements for this function. "string spell" means that we need a string (words) with the name of the spell. So you'd use something like "Serrated Shot". Next we have "string debuff," which means we need a string with the EXACT name of the debuff. In your case it's probably something like "Bleeding (Serrated Shot)" but you need to confirm this. Note that in both cases, capitalization and punctuation are CRUCIAL*. You may note that some routines use a blank "" in place of the actual debuff. That is a relic from pre-3.0**; it is always preferable to use the name of the debuff over what comes next. Next you have "float time", which is the amount of time this spell is "blacklisted" for this target. It is a backup in case you can't get the name of the debuff (or the debuff name is shared). You don't ever need to use the float time if you have the debuff name (and the name is unique), and it's always preferable to use the name over the float time. Finally, you have the "reqs", which are any requirements you want to add in. You can add in any normal check you'd use anywhere else. Maybe this dot only needs to be cast on bosses or silvers. Maybe you only when to cast it when you have enough energy/cells/force. Whatever the case, you can add more requirements if necessary. Here's how I'd write Serrated Shot: Code: Spell.DoT("Serrated Shot", "debuff name"), *I once spent hours trying to figure out why the bot wasn't casting Slow-release Medpac. I had typed in Slow-Release Medpac. The difference between r and R is enough to fuck the whole thing up. **Before 3.0, debuffs frequently shared a name: "Bleeding" or "Burning". This made it impossible for DoT specs to differentiate between debuffs. We were forced to use the float times because there was no other way to make it work.
Hm, it should be working then. I'm working on my Darkness Assassin next (once my Scoundrel hits 60, he's 59.5 right now), so I'll take a look. My first instinct is maybe some problem with Spell.Buff (which wants to cast on the player) when we should be using Spell.Cast or maybe Spell.HoT instead. Like I said, I'll take a look soon and see if I can figure it out, but if you want to try those changes in the interim and report back that would be great.
Alltrue - thanks for the explanation on the Spell.Dot, I will take a look at that in VS, I don't have it installed on this machine, but I do on another. I figured it was from a previous version, but the 'reqs' section definitely looks intriguing and has some potential. Something I will have to play around with, because, most of the time you want Dots to be up on targets with high HP, but lesser targets that will go down quicker, I don't want a channeled Dot, it would waste too much time. Thank you sir, time to get coding
In the past, I would frequently set DoTs to only cast on silver and great mobs, but this expansion has made a lot of abilities and procs dependent on having the bleed/burn/dot on the target. Just watch out for those synergies.
I can fix this easily, but I need a log and the correct name of the Shadow spec (it's Serenity or something like that I think)