Hi, Anyone Got a good engineer routine just hit 50, my lAs built
http://www.jabbithole.com/builder/engineer#2840K0a337I27800/su8.0.2t13.23a.0.0
http://www.jabbithole.com/builder/engineer#2840K0a337I27800/su8.0.2t13.23a.0.0
Hey Deathdisguise.
I changed a few things in the default.warrior routine, cause of savage strike interrupting the rampage cast.
only tested it once, but I think its working a lot better. http://pastebin.com/Mvq1TKgg
I changed;
-moving rampage up, so it has a higher priority.
-changed minimum resource use to 250 at T8. This seemed to be where the issue were. if you dropped below 500 before the third or fourth hit, you would cast Savage strike or some other filler.
You will still cast most of the hit above 500 energy, 95% of the time, so think this solution is justified.
-moved down Savage strike above tremor (maybe below since you want to prioritize tremor over savage strike due to the long animation of Savage Strike)
- changed the value on (SpellController.Cooldown("Rampage") > 3250) to 250 instead of 3250 for both Tremor and Savage Strike. You want to use it on cooldown if rampage and WW is on cooldown, rather than casting Relentless strike, in my opinion. (but maybe that's because I am using both Savage Strike and Tremor)
Hope you can use the changes or test them yourself to see if its done correctly.
Best regard /flitsbue
[Compiler Error] d:\Downloads\Wildbuddy 1.1.604.3\Bots\Agility\Routines\Stalker\Stalker_Drop6.cs(8,11) : error CS0535: 'Agility.Routines.Stalker_Drop6' does not implement interface member 'Agility.Routines.IAgilityRoutine.Class'
Getting this error when trying to use a user submitted profile from a few pages back. Anyway I can fix this?
Yeah, I'm retarded with this stuff. I looked between the default stalker and the drop6 stalker and couldn't see what I need to match. Did something change that broke this profile? Attached is the profile I'm using.
View attachment 191890
public Class Class { get { return Class.Stalker; } }
using Buddy.Wildstar.Game;
using Buddy.Wildstar.Game.Actors;
using log4net;
using System;
namespace Agility.Routines
{
class Spellslinger_flawd : IAgilityRoutine
{
private static ILog Log = LogManager.GetLogger("Agility [SpellController]");
public string Name { get { return "Sling Ding"; } }
public string Version { get { return "0.1"; } }
public string Author { get { return "flawd"; } }
private Player Me { get { return GameManager.LocalPlayer; } }
private Actor Target { get { return GameManager.LocalPlayer.CurrentTarget; } }
public string Routine()
{
// Log current Spell Surge and Spell Power state
string msg = ">>[DEBUG]: ";
msg = msg + string.Format("SS: [{0}] SP: [{1}] ", Me.HasBuff("Spell Surge"), Me.SpellPower);
// If player can Flame Burst
if (SpellController.CanCast("Flame Burst"))
{
Log.Info(msg + ">> Flame Burst!");
return "Flame Burst";
}
// If player is currently casting
if (Me.IsCasting)
{
msg = msg + string.Format(">> Casting : [{0}] C#: [{1}] ", Me.CurrentCast.Name, SpellController.CastBar.CurrentThresshold);
// Charge Shot: charge up to 3
if (Me.CurrentCast.Name == "Charged Shot")
{
if (SpellController.CastBar.CurrentThresshold != 3)
{
Log.Info(msg + ">> Waiting for charge up!");
return null;
}
else
{
Log.Info(msg + ">> Fire!");
return "Charged Shot";
}
}
// True Shot: Spam it! Maybe some timing later?
if (Me.CurrentCast.Name == "True Shot")
{
Log.Info(msg + ">> Fire!");
return "True Shot";
}
// True Shot: Spam it! Maybe some timing later?
if (Me.CurrentCast.Name == "Rapid Fire")
{
Log.Info(msg + ">> Fire!");
return "Rapid Fire";
}
//Weird Surge issue needs looking into.
//Log.Info(MSG + ">> Wait for Cast!");
//return null;
}
// Pull with Charged Shot
if (SpellController.CanCast("Charged Shot") && !Me.IsInCombat)
{
Log.Info(msg + ">> Pull with charged shot");
return "Charged Shot";
}
// If currently Surged
if (Me.HasBuff("Spell Surge"))
{
msg = msg + ">> Spell Surged: ";
// IF Surged and need non surged Ignite drop
if (SpellController.CanCast("Ignite") && IgniteDue(0))
{
Log.Info(msg + ">> Unsurge for normal Ignite!");
return "Spell Surge";
}
if (SpellController.CanCast("Ignite") && Me.SpellPower > 25 && IgniteDue(1))
{
Log.Info(msg + ">> Ignite!");
return "Ignite";
}
if (SpellController.CanCast("True Shot") && Me.SpellPower > 25) //18
{
Log.Info(msg + ">> True Shot");
return "True Shot";
}
if (SpellController.CanCast("Arcane Missiles") && Me.SpellPower > 25) //18
{
Log.Info(msg + ">> Arcane Missiles");
return "Arcane Missiles";
}
if (SpellController.CanCast("Wild Barrage") && Me.SpellPower > 25) //12
{
Log.Info(msg + ">> Wild Barrage!");
return "Wild Barrage";
}
if (SpellController.CanCast("Charged Shot") && Me.SpellPower > 25) //10
{
Log.Info(msg + ">> Charged Shot!");
return "Charged Shot";
}
if (SpellController.CanCast("Rapid Fire") && Me.SpellPower > 25) //10
{
Log.Info(msg + ">> Rapid Fire!");
return "Rapid Fire";
}
if (SpellController.CanCast("Chill") && Me.SpellPower > 25) // 7
{
Log.Info(msg + ">> Chill!");
return "Chill";
}
if (SpellController.CanCast("Quick Draw") && Me.SpellPower > 40)
{
Log.Info(msg + ">> Quick Draw!");
return "Quick Draw";
}
if (SafeToSurge())
{
Log.Info(msg + ">> Unsurge!");
return "Spell Surge";
}
}
else
{
msg = msg + "||Not Surged: ";
// In Before Surge Check: Is normal ignite needed?
if (SpellController.CanCast("Ignite") && IgniteDue(0))
{
Log.Info(msg + ">> Normal Ignite!");
return "Ignite";
}
if (SafeToSurge() &&
(SpellController.CanCast("Quick Draw") && Me.SpellPower > 40) ||
(SpellController.CanCast("Charged Shot") && Me.SpellPower > 25) ||
(SpellController.CanCast("Ignite") && Me.SpellPower > 25 && IgniteDue(1)) ||
(SpellController.CanCast("Wild Barrage") && Me.SpellPower > 25) ||
(SpellController.CanCast("Chill") && Me.SpellPower > 25) ||
(SpellController.CanCast("Rapid Fire") && Me.SpellPower > 25) ||
(SpellController.CanCast("True Shot") && Me.SpellPower > 25) ||
(SpellController.CanCast("Arcane Missiles") && Me.SpellPower > 25)
)
{
Log.Info(msg + ">> Surge!");
return "Spell Surge";
}
if (SpellController.CanCast("Flash Freeze")) //30
{
Log.Info(msg + ">> Flash Freeze!");
return "Flash Freeze";
}
if (SpellController.CanCast("True Shot")) //18
{
Log.Info(msg + ">> True Shot");
return "True Shot";
}
if (SpellController.CanCast("Arcane Missiles")) //18
{
Log.Info(msg + ">> Arcane Missiles");
return "Arcane Missiles";
}
if (SpellController.CanCast("Wild Barrage")) //12
{
Log.Info(msg + ">> Wild Barrage!");
return "Wild Barrage";
}
if (SpellController.CanCast("Charged Shot")) //10
{
Log.Info(msg + ">> Charged Shot!");
return "Charged Shot";
}
if (SpellController.CanCast("Rapid Fire")) //10
{
Log.Info(msg + ">> Rapid Fire!");
return "Rapid Fire";
}
if (SpellController.CanCast("Chill")) // 7
{
Log.Info(msg + ">> Chill!");
return "Chill";
}
if (SpellController.CanCast("Quick Draw"))
{
Log.Info(msg + ">> Quick Draw!");
return "Quick Draw";
}
}
return null;
}
// Check if we Need an ignite. Both normal and surged
private bool IgniteDue(int Surged)
{
TimeSpan span = DateTime.Now - SpellController.CastTracker.Ignite;
int SpellTier = SpellController.Tier("Ignite");
int CastTime;
int SpellID = 0;
// 0 8
//normal = 34754, 49142, 49143, 49144, 49145, 49146, 49147, 49148, 49149
//surged = 34755, 49151, 49152, 49153, 49154, 49155, 49156, 49157, 77138
// Get BuffID of Target Ignite Tier
if (Surged == 1) // Surged Ignite
{
if (SpellTier == 8)
SpellID = 77138;
else if (SpellTier == 7)
SpellID = 49157;
else if (SpellTier == 6)
SpellID = 49156;
else if (SpellTier == 5)
SpellID = 49155;
else if (SpellTier == 4)
SpellID = 49154;
else if (SpellTier == 3)
SpellID = 49153;
else if (SpellTier == 2)
SpellID = 49152;
else if (SpellTier == 1)
SpellID = 49151;
else if (SpellTier == 0)
SpellID = 34755;
}
else if (Surged == 0) // Normal Ignite
{
if (SpellTier == 8)
return false; // Tier 8 Applies both Surged and non Surged ignore
else if (SpellTier == 7)
SpellID = 49148;
else if (SpellTier == 6)
SpellID = 49147;
else if (SpellTier == 5)
SpellID = 49146;
else if (SpellTier == 4)
SpellID = 49145;
else if (SpellTier <=3)
return false; // Can Only apply one Ignite prioritize Surged.
}
// Pad cast time for hit recognition
if (SpellTier >= 4)
CastTime = 500 + 250;
else
CastTime = 1000 + 250;
// Don't recast till CastTime + 250 ms has passed to prevent Spam. Only cast it target is missing Ignite or it has been 8 sec since you last cast Ignite.
if ((int)span.TotalMilliseconds > CastTime && (((int)span.TotalMilliseconds > 8000) || !SpellController.IsTickingID(SpellID)))
{
//Log.Info(string.Format(">>[DEBUG]: IgniteDue >> Need Ignite! Last Cast: {0} IsTicking: {1}.", span.TotalMilliseconds, SpellController.IsTickingID(SpellID)));
return true;
}
//Log.Info(string.Format(">>[DEBUG]: IgniteDue >> Not Needed! Last Cast: {0} IsTicking: {1}.", span.TotalMilliseconds, SpellController.IsTickingID(SpellID)));
return false;
}
private bool SafeToSurge()
{
TimeSpan span = DateTime.Now - SpellController.CastTracker.Surge;
if ((int)span.TotalMilliseconds > 500)
{
//Log.Info(string.Format(">>[DEBUG]: SafeToSurge >> Safe! Last Cast: {0}", span.TotalMilliseconds));
return true;
}
//Log.Info(string.Format(">>[DEBUG]: SafeToSurge >> {0}! Last Cast: {1}", (int)span.TotalMilliseconds > 500, (int)span.TotalMilliseconds));
return false;
}
}
}
DD, how can I get this routine to work with agility. I took it from guy90210 spellslinger routine
Code:using Buddy.Wildstar.Game; using Buddy.Wildstar.Game.Actors; using log4net; using System; namespace Agility.Routines { class Spellslinger_flawd : IAgilityRoutine { private static ILog Log = LogManager.GetLogger("Agility [SpellController]"); public string Name { get { return "Sling Ding"; } } public string Version { get { return "0.1"; } } public string Author { get { return "flawd"; } } private Player Me { get { return GameManager.LocalPlayer; } } private Actor Target { get { return GameManager.LocalPlayer.CurrentTarget; } } public string Routine() { // Log current Spell Surge and Spell Power state string msg = ">>[DEBUG]: "; msg = msg + string.Format("SS: [{0}] SP: [{1}] ", Me.HasBuff("Spell Surge"), Me.SpellPower); // If player can Flame Burst if (SpellController.CanCast("Flame Burst")) { Log.Info(msg + ">> Flame Burst!"); return "Flame Burst"; } // If player is currently casting if (Me.IsCasting) { msg = msg + string.Format(">> Casting : [{0}] C#: [{1}] ", Me.CurrentCast.Name, SpellController.CastBar.CurrentThresshold); // Charge Shot: charge up to 3 if (Me.CurrentCast.Name == "Charged Shot") { if (SpellController.CastBar.CurrentThresshold != 3) { Log.Info(msg + ">> Waiting for charge up!"); return null; } else { Log.Info(msg + ">> Fire!"); return "Charged Shot"; } } // True Shot: Spam it! Maybe some timing later? if (Me.CurrentCast.Name == "True Shot") { Log.Info(msg + ">> Fire!"); return "True Shot"; } // True Shot: Spam it! Maybe some timing later? if (Me.CurrentCast.Name == "Rapid Fire") { Log.Info(msg + ">> Fire!"); return "Rapid Fire"; } //Weird Surge issue needs looking into. //Log.Info(MSG + ">> Wait for Cast!"); //return null; } // Pull with Charged Shot if (SpellController.CanCast("Charged Shot") && !Me.IsInCombat) { Log.Info(msg + ">> Pull with charged shot"); return "Charged Shot"; } // If currently Surged if (Me.HasBuff("Spell Surge")) { msg = msg + ">> Spell Surged: "; // IF Surged and need non surged Ignite drop if (SpellController.CanCast("Ignite") && IgniteDue(0)) { Log.Info(msg + ">> Unsurge for normal Ignite!"); return "Spell Surge"; } if (SpellController.CanCast("Ignite") && Me.SpellPower > 25 && IgniteDue(1)) { Log.Info(msg + ">> Ignite!"); return "Ignite"; } if (SpellController.CanCast("True Shot") && Me.SpellPower > 25) //18 { Log.Info(msg + ">> True Shot"); return "True Shot"; } if (SpellController.CanCast("Arcane Missiles") && Me.SpellPower > 25) //18 { Log.Info(msg + ">> Arcane Missiles"); return "Arcane Missiles"; } if (SpellController.CanCast("Wild Barrage") && Me.SpellPower > 25) //12 { Log.Info(msg + ">> Wild Barrage!"); return "Wild Barrage"; } if (SpellController.CanCast("Charged Shot") && Me.SpellPower > 25) //10 { Log.Info(msg + ">> Charged Shot!"); return "Charged Shot"; } if (SpellController.CanCast("Rapid Fire") && Me.SpellPower > 25) //10 { Log.Info(msg + ">> Rapid Fire!"); return "Rapid Fire"; } if (SpellController.CanCast("Chill") && Me.SpellPower > 25) // 7 { Log.Info(msg + ">> Chill!"); return "Chill"; } if (SpellController.CanCast("Quick Draw") && Me.SpellPower > 40) { Log.Info(msg + ">> Quick Draw!"); return "Quick Draw"; } if (SafeToSurge()) { Log.Info(msg + ">> Unsurge!"); return "Spell Surge"; } } else { msg = msg + "||Not Surged: "; // In Before Surge Check: Is normal ignite needed? if (SpellController.CanCast("Ignite") && IgniteDue(0)) { Log.Info(msg + ">> Normal Ignite!"); return "Ignite"; } if (SafeToSurge() && (SpellController.CanCast("Quick Draw") && Me.SpellPower > 40) || (SpellController.CanCast("Charged Shot") && Me.SpellPower > 25) || (SpellController.CanCast("Ignite") && Me.SpellPower > 25 && IgniteDue(1)) || (SpellController.CanCast("Wild Barrage") && Me.SpellPower > 25) || (SpellController.CanCast("Chill") && Me.SpellPower > 25) || (SpellController.CanCast("Rapid Fire") && Me.SpellPower > 25) || (SpellController.CanCast("True Shot") && Me.SpellPower > 25) || (SpellController.CanCast("Arcane Missiles") && Me.SpellPower > 25) ) { Log.Info(msg + ">> Surge!"); return "Spell Surge"; } if (SpellController.CanCast("Flash Freeze")) //30 { Log.Info(msg + ">> Flash Freeze!"); return "Flash Freeze"; } if (SpellController.CanCast("True Shot")) //18 { Log.Info(msg + ">> True Shot"); return "True Shot"; } if (SpellController.CanCast("Arcane Missiles")) //18 { Log.Info(msg + ">> Arcane Missiles"); return "Arcane Missiles"; } if (SpellController.CanCast("Wild Barrage")) //12 { Log.Info(msg + ">> Wild Barrage!"); return "Wild Barrage"; } if (SpellController.CanCast("Charged Shot")) //10 { Log.Info(msg + ">> Charged Shot!"); return "Charged Shot"; } if (SpellController.CanCast("Rapid Fire")) //10 { Log.Info(msg + ">> Rapid Fire!"); return "Rapid Fire"; } if (SpellController.CanCast("Chill")) // 7 { Log.Info(msg + ">> Chill!"); return "Chill"; } if (SpellController.CanCast("Quick Draw")) { Log.Info(msg + ">> Quick Draw!"); return "Quick Draw"; } } return null; } // Check if we Need an ignite. Both normal and surged private bool IgniteDue(int Surged) { TimeSpan span = DateTime.Now - SpellController.CastTracker.Ignite; int SpellTier = SpellController.Tier("Ignite"); int CastTime; int SpellID = 0; // 0 8 //normal = 34754, 49142, 49143, 49144, 49145, 49146, 49147, 49148, 49149 //surged = 34755, 49151, 49152, 49153, 49154, 49155, 49156, 49157, 77138 // Get BuffID of Target Ignite Tier if (Surged == 1) // Surged Ignite { if (SpellTier == 8) SpellID = 77138; else if (SpellTier == 7) SpellID = 49157; else if (SpellTier == 6) SpellID = 49156; else if (SpellTier == 5) SpellID = 49155; else if (SpellTier == 4) SpellID = 49154; else if (SpellTier == 3) SpellID = 49153; else if (SpellTier == 2) SpellID = 49152; else if (SpellTier == 1) SpellID = 49151; else if (SpellTier == 0) SpellID = 34755; } else if (Surged == 0) // Normal Ignite { if (SpellTier == 8) return false; // Tier 8 Applies both Surged and non Surged ignore else if (SpellTier == 7) SpellID = 49148; else if (SpellTier == 6) SpellID = 49147; else if (SpellTier == 5) SpellID = 49146; else if (SpellTier == 4) SpellID = 49145; else if (SpellTier <=3) return false; // Can Only apply one Ignite prioritize Surged. } // Pad cast time for hit recognition if (SpellTier >= 4) CastTime = 500 + 250; else CastTime = 1000 + 250; // Don't recast till CastTime + 250 ms has passed to prevent Spam. Only cast it target is missing Ignite or it has been 8 sec since you last cast Ignite. if ((int)span.TotalMilliseconds > CastTime && (((int)span.TotalMilliseconds > 8000) || !SpellController.IsTickingID(SpellID))) { //Log.Info(string.Format(">>[DEBUG]: IgniteDue >> Need Ignite! Last Cast: {0} IsTicking: {1}.", span.TotalMilliseconds, SpellController.IsTickingID(SpellID))); return true; } //Log.Info(string.Format(">>[DEBUG]: IgniteDue >> Not Needed! Last Cast: {0} IsTicking: {1}.", span.TotalMilliseconds, SpellController.IsTickingID(SpellID))); return false; } private bool SafeToSurge() { TimeSpan span = DateTime.Now - SpellController.CastTracker.Surge; if ((int)span.TotalMilliseconds > 500) { //Log.Info(string.Format(">>[DEBUG]: SafeToSurge >> Safe! Last Cast: {0}", span.TotalMilliseconds)); return true; } //Log.Info(string.Format(">>[DEBUG]: SafeToSurge >> {0}! Last Cast: {1}", (int)span.TotalMilliseconds > 500, (int)span.TotalMilliseconds)); return false; } } }
If you actually read this post he actually stated he is not going to do any new rotations.hey still w8 stalker - aoe build rotation and tank build =)![]()
I'll eventually be supplying only an 'AutoAttack', 'Default', and 'Stun' routine with each class. The Default routine will offer moderate DPS and handle all abilities, which will be perfect for leveling! Specialized routines I'll be leaving to the community to develop and submit themselves in the future!
using Agility.Events;
class RoutineName : IAgilityRoutine
{
//Events
AgilityEvent testEvent = new AgilityEvent(LuaEvent.ChatMessage, HandleChatMessage);
private static void HandleChatMessage(string eventName, LuaEventArgument[] args)
{
// Chat message fired, omg!
}
// Routine.
public string Routine()
{
// Events.
AgilityEvents.RegisterEvent(testEvent);
// Your routine stuff here!
return null;
}
}
Hey Deathdisguise.
Sometimes I get an issue with the routine not working.
instead of using the abilities, its writing "Severity" (dont have a log)
What is it trying to do when spamming this? would love to know, so I can fix it in the future.
I fixed it by reinstalling WB, so dont have a log of the issue.
but found a single line with severity;
"[Pulsator Thread] INFO Agility [SpellController] - [52593] [0] [Ok] Severity"
Severity is likely your equipped gadget spell that was attempting to be used, it shouldn't be doing that, and the fact that it is worries me.![]()