Small update... Added a method to RotationBase.cs to close distance to target. Anyone screwing around with this for non-lazyraidering should use it. Here is an example of its use: Code: return new PrioritySelector( Spell.WaitForCast(), PreCombat, HandleCoolDowns, HandleAOE, HandleSingleTarget, CloseDistance(Distance.Melee) );
Update Redux... -removed hotkeys for movement,targeting, repop. -F12 hotkey now enables/disables all movement/targeting/repop -Added LazyRaider check to CloseDistance (only works if movement is enabled) Hoping Enable Repop is working. Its should, in theory.
I was never able to get three functions to work properly: 1. Buff time left. I tried using milliseconds (2500 for 2.5 seconds) and seconds (2.5). Neither worked properly. When it was in ms, the not just casted the same 18 second buff nonstop. When it was in seconds, the not let the buff expire. This is needed for my Sawbones routine, as I can save time and energy by keeping 2 stacks of Slow-release Medpac up instead of constantly having to reapply both stacks. 2. Cleanse. I know you were working on this, but I couldn't get it right. It would just spam-cast the cleanse even if my target had no debuffs. 3. I still can't get the aoe call to trigger reliably. I'll have 3 mobs on me in melee range and the not will just use the single-target rotation. Once he's killed 2 of them, he'll suddenly use aoe on the last mob. It looks silly in groups, especially with a class with good aoe like a Trooper or Marauder.
1. Have you tried returning the buff time left and comparing it with what is in game? 2. I did an update for this a couple days ago... Dispels are done by name and should be added to dispel.cs. 3. I havent specifically tested for this, but it shouldnt... what class?
I used Tank.BuffTimeLeft("Slow-release Medpac") < 2500 and Tank.BuffTimeLeft("Slow-release Medpac") < 2.5 Both worked like I said above. I don't know how to do what you're talking about. I'm just a stupid copy/paste monkey :/ In regards to 3.: Pretty much every class. Sometimes it'll work great for a few minutes, and I think "oh, something got fixed." But then it goes back to aoe'ing 2 dead mobs and one living one. No idea. Classes I use most: Guardian/Defense, Commando/Gunnery (good aoe potential here), Marauder/Annihilation, Sniper/Marksman.
try now.. just changed a mob.IsDead to !mob.IsDead... so it was counting only dead mobs before for the debuffs, I just changed b.Name == buffName to b.Name.Contains(buffName)... this means that if there is some extra shit after the name like (force) it will still pick it up. For the tank... There is no way for use to set the tank at the moment. It pretty much always makes it Me. I am going to make a GUI sometime soon so this crap can be set to work properly. Need to fix this movement and repop me first.
The Tank call seems to work fine for me in other respects. I have several calls that are like: Spell.Cast("Slow-release Medpac"), on => Tank, 100, ret => Tank != null && Tank.BuffCount("Slow-release Medpac") < 2) And it works just fine (even uses my companion when he's not my focus target). What I want to do is add an OR (||) call after the BuffCount call to also cast if the buff is about to expire in 2.5 seconds.
Like I said before... do a statement to print out the buff time to see what is happening. Its how you debug shit!! Add this to your routine Code: using Buddy.Common; new Action(delegate { if(Tank.HasBuff("buff")) Logging.Write(Tank.BuffTimeLeft("buff").ToString()); }),
Here is a my rotation for 50+ Assassin Deception: Spell.Cast("Jolt", ret => Me.CurrentTarget.IsCasting), Spell.Cast("Low Slash", ret => Me.CurrentTarget.IsCasting), Spell.Cast("Electrocute", ret => Me.CurrentTarget.IsCasting), Spell.Cast("Maul", ret => Me.HasBuff("Duplicity")), // maul can only be used behind target - can't code this? Spell.Cast("Voltaic Slash", ret => Me.ForcePercent >= 25), // moved up on rotation, builds voltage / induction stacks Spell.Cast("Assassinate", ret => Me.CurrentTarget.HealthPercent <= 30), Spell.Cast("Shock", ret => Me.BuffCount("Induction") == 2), Spell.Cast("Discharge", ret => Me.BuffCount("Static Charge") >= 3), // stacks max at 5, test at 3 first to see results Spell.Cast("Crushing Darkness"), //testing position in rotation Spell.Cast("Saber Strike") I will work on balancing this for lower level, just need to test it, may need to add back some lower abilities.
The Shadow/Infiltration routine I wrote works fine, you could just copy that with some name changes. I don't think Static Charge stacks past 3, does it? Also, be careful putting Voltaic Slash too high in the routine (that's the Clairvoyant Strike analogue, right?). The routine starts at the top and works its way down, so it'll just end up spamming Voltaic Slash until you run out of Force. Putting Discharge and Shock above it means that it will consume those procs quicker. Otherwise, when it's spamming VS, you'll end up wasting procs.
Thanks for the feedback, its much appreciated. The static charge stacks to 5, so I figured I would try at 3 and test it out. So far that seems to work okay, but could be adjusted. I hear you on the voltaic slash, I moved it lower in the rotation to begin with and it never casted so I moved it higher. I haven't had a chance to look at your shadow rotation, I will try to compare and see what makes most sense. You are right we dont want to spam voltaic, but at the same time, the use of voltaic, saber strike, and maul, build the induction and static charge stacks necessary for max damage from shock and discharge. Its all a balancing game, fun though. Does anyone else use a damage meter of some kind to test with? I use MOXparser, but I am fairly new to MMO's and don't have much experience with anything else.
Here's the single target version of my Shadow routine: Spell.Cast("Mind Snap", ret => Me.CurrentTarget.IsCasting), Spell.Cast("Shadow Strike", ret => Me.HasBuff("Stealth") || Me.HasBuff("Find Weakness")), Spell.Cast("Force Breach", ret => Me.BuffCount("Breaching Shadows") == 3), Spell.Cast("Spinning Strike", ret => Me.CurrentTarget.HealthPercent <= 30), Spell.Cast("Project", ret => Me.BuffCount("Circling Shadows") == 2), Spell.Cast("Clairvoyant Strike", ret => Me.ForcePercent >= 25), Spell.Cast("Saber Strike") ); I use TorTools combat parser, and I pull 1400-1700 at level 51 and Columi/Rakata gear with this routine.
Spell.WaitForCast() doesn't appear to be recognizing channels. I noticed this today while playing my Gunnery Commando (he has lots of channeled spells-- Full Auto, Mortar Volley, Plasma Cannon). It's not consistent, but the routine seems to always wait for spells to cast. It's just that for channels, it frequently clips. This is very bad when the routine clips a spell like Mortar Volley, which is the top aoe dps ability, for something like Frag Grenade, which is a weak aoe ability. I'm having a hard time reproducing this, as it's not consistent. Just wondering if anyone else is seeing this behavior for channeled spells.
I have noticed some channeled abilities getting clipped as well. I assumed they were getting interrupted by mobs... I looked at the method though, there isn't a method for "IsChanneling" so casting and channeling are the same thing to BW.
Yeah, the first thing I looked for was a IsChanneling call :/ The clipping isn't noticeable until I'm playing my Trooper. Most classes have 1-2 channeled spells, but the Gunnery Trooper has a bunch, including his highest-damage abilities. The bot definitely doesn't clip casting spells, only channels. On a side note: it looks like you just copied the Commando/Assault Specialist routine from Vanguard. There are several ability calls that don't exist for Commandos (Riot Stick, some aoe ability I've never seen). Is it okay if I fix those issues?
of cause it is ^^ we're all trying to work together here but sadly we don't have all classes to test and write the ccs for that.
Whoever wrote the Sorcerer lightning spec did a good job... I downed a raid boss and no one told me I suck.
both files are basically empty... one is named combatbot... second is named lazyraider... both include pretty much the same: Nothing but the Profiles Name.