When its ready.I check this discussion religiously on a daily basis. I cannot wait for its release. May we please have even just a rough estimate on the release?
Thank you for all your hard work. You guys are the best![]()
using System;using System.IO;
using System.Reflection;
using System.Threading.Tasks;
using ApocDev.Wildstar.Engine;
using ApocDev.Wildstar.Engine.Profiles;
using ApocDev.Wildstar.Game;
using log4net;
using Microsoft.Win32;
namespace Buddy.ProfileBot
{
public class ProfileBot : CoroutinePulsable, IBot, IUIButtonProvider
{
private static ILog Log = LogManager.GetLogger(typeof(ProfileBot));
public ProfileElement CurrentBehavior { get; private set; }
#region Overrides of CoroutinePulsable
/// <summary>
/// Whether or not this Pulsable object is currently allowed to be pulsed.
/// </summary>
public override bool CanBePulsed
{
get
{
// Some behaviors do support in-combat logic.
// Most however (and by default) do not. So we won't pulse if we're in combat, and don't support combat behaviors.
if (GameManager.LocalPlayer.IsInCombat)
{
return CurrentBehavior != null && CurrentBehavior.CanRunDuringCombat;
}
// Otherwise, we can always pulse
return true;
}
}
public override async Task CoroutineImplementation()
{
// This is *really* *really* simple.
foreach (var element in CurrentProfile.Elements)
{
Log.Info("Moved to new profile element: " + element);
CurrentBehavior = element;
while (!element.IsFinished)
{
// TODO: Move this to it's own IPulsable instance so it can be run in parallel with any behaviors, etc.
if (GameManager.CanVacuum)
{
GameManager.InputManager.KeyPress(InputAction.VacuumLoot);
}
// Run the current element in the profile.
await element.ProfileTagLogic();
}
}
}
#endregion
#region Implementation of IAuthored
/// <summary>
/// The name of this authored object.
/// </summary>
public string Name { get { return "Profile Bot"; } }
/// <summary>
/// The author of this object.
/// </summary>
public string Author { get { return "Bossland GmbH"; } }
/// <summary>
/// The version of this object implementation.
/// </summary>
public Version Version { get { return new Version(0, 0, 0, 1); } }
#endregion
#region Implementation of IEquatable<IBot>
/// <summary>
/// Indicates whether the current object is equal to another object of the same type.
/// </summary>
/// <returns>
/// true if the current object is equal to the <paramref name="other" /> parameter; otherwise, false.
/// </returns>
/// <param name="other">An object to compare with this object.</param>
public bool Equals(IBot other)
{
return ReferenceEquals(this, other) || (other.Name == Name && other.Version == Version);
}
#endregion
#region Implementation of IBot
/// <summary>
/// Called the first time the bot is to be started. Load any settings, register bot-level event handlers, etc here.
/// </summary>
public void OnInitialize()
{
}
/// <summary>
/// Called each time the pulsator holding this IBot is started. Initialize any Lua-level event handlers, or other
/// game-related actions here.
/// </summary>
public void OnStart()
{
GameEngine.BotPulsator.RegisterForPulse(GameManager.Lua.Events);
GameEngine.BotPulsator.RegisterForPulse(GameEngine.CurrentRoutine);
}
/// <summary>
/// Called each time the pulsator holding this IBot is stopped. Unregister any Lua-level event handlers, or other
/// game-related things here.
/// </summary>
public void OnStop()
{
GameEngine.BotPulsator.UnregisterForPulse(GameManager.Lua.Events);
GameEngine.BotPulsator.UnregisterForPulse(GameEngine.CurrentRoutine);
}
/// <summary>
/// Called when either this IBot instance is no longer the current bot (when the user/3rd party has switched IBot
/// instances), or the entirety of the program is shutting down.
/// Unregister any bot-level event handlers, implementations, etc, here.
/// </summary>
public void OnUninitialize()
{
}
#endregion
#region Implementation of IUIButtonProvider
/// <summary>
/// The text to be displayed on the button in the UI
/// </summary>
// Note: Button text should be all uppercase to go with the style of the main window. Totally optional for 3rd parties, but must be all upper for our official products.
public string ButtonText { get { return "LOAD PROFILE"; } }
/// <summary>
/// Called when the button is clicked.
/// </summary>
/// <param name="sender"></param>
public void OnButtonClicked(object sender)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Title = "Please select a profile...";
ofd.Filter = "Profile|*.xml;*.profile|All Files|*.*";
ofd.Multiselect = false;
ofd.InitialDirectory = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
ofd.CheckFileExists = true;
if (ofd.ShowDialog() == true)
{
Log.Info(string.Format("Loading profile: {0}", ofd.FileName.Replace(Environment.UserName, "<User>")));
var profile = ProfileLoader.LoadProfile(ofd.FileName);
Log.Info(string.Format("Profile {0} (version {1}) by {2} loaded!", profile.Name, profile.Version, profile.Author));
CurrentProfile = profile;
}
}
#endregion
/// <summary>
/// The currently running profile. This value should not be changed while the bot is running!
/// </summary>
// TODO: Write-protect only while running
public Profile CurrentProfile { get; set; }
}
}
Sorry for the lack of updates folks.
This one won't be too long unfortunately
Carbine has been doing patch after patch lately, and making large enough changes, that my head is beginning to hurt. (4 days spent on updating to the Sabotage patch, only for them to go and patch again literally an hour later)
That said, navigation works, ability casting works, telegraphs work (mostly... stupid math), and our first "bot" is already done.
Here's the source for the aptly named "Profile" bot:
Code:using System;using System.IO; using System.Reflection; using System.Threading.Tasks; using ApocDev.Wildstar.Engine; using ApocDev.Wildstar.Engine.Profiles; using ApocDev.Wildstar.Game; using log4net; using Microsoft.Win32; namespace Buddy.ProfileBot { public class ProfileBot : CoroutinePulsable, IBot, IUIButtonProvider { private static ILog Log = LogManager.GetLogger(typeof(ProfileBot)); public ProfileElement CurrentBehavior { get; private set; } #region Overrides of CoroutinePulsable /// <summary> /// Whether or not this Pulsable object is currently allowed to be pulsed. /// </summary> public override bool CanBePulsed { get { // Some behaviors do support in-combat logic. // Most however (and by default) do not. So we won't pulse if we're in combat, and don't support combat behaviors. if (GameManager.LocalPlayer.IsInCombat) { return CurrentBehavior != null && CurrentBehavior.CanRunDuringCombat; } // Otherwise, we can always pulse return true; } } public override async Task CoroutineImplementation() { // This is *really* *really* simple. foreach (var element in CurrentProfile.Elements) { Log.Info("Moved to new profile element: " + element); CurrentBehavior = element; while (!element.IsFinished) { // TODO: Move this to it's own IPulsable instance so it can be run in parallel with any behaviors, etc. if (GameManager.CanVacuum) { GameManager.InputManager.KeyPress(InputAction.VacuumLoot); } // Run the current element in the profile. await element.ProfileTagLogic(); } } } #endregion #region Implementation of IAuthored /// <summary> /// The name of this authored object. /// </summary> public string Name { get { return "Profile Bot"; } } /// <summary> /// The author of this object. /// </summary> public string Author { get { return "Bossland GmbH"; } } /// <summary> /// The version of this object implementation. /// </summary> public Version Version { get { return new Version(0, 0, 0, 1); } } #endregion #region Implementation of IEquatable<IBot> /// <summary> /// Indicates whether the current object is equal to another object of the same type. /// </summary> /// <returns> /// true if the current object is equal to the <paramref name="other" /> parameter; otherwise, false. /// </returns> /// <param name="other">An object to compare with this object.</param> public bool Equals(IBot other) { return ReferenceEquals(this, other) || (other.Name == Name && other.Version == Version); } #endregion #region Implementation of IBot /// <summary> /// Called the first time the bot is to be started. Load any settings, register bot-level event handlers, etc here. /// </summary> public void OnInitialize() { } /// <summary> /// Called each time the pulsator holding this IBot is started. Initialize any Lua-level event handlers, or other /// game-related actions here. /// </summary> public void OnStart() { GameEngine.BotPulsator.RegisterForPulse(GameManager.Lua.Events); GameEngine.BotPulsator.RegisterForPulse(GameEngine.CurrentRoutine); } /// <summary> /// Called each time the pulsator holding this IBot is stopped. Unregister any Lua-level event handlers, or other /// game-related things here. /// </summary> public void OnStop() { GameEngine.BotPulsator.UnregisterForPulse(GameManager.Lua.Events); GameEngine.BotPulsator.UnregisterForPulse(GameEngine.CurrentRoutine); } /// <summary> /// Called when either this IBot instance is no longer the current bot (when the user/3rd party has switched IBot /// instances), or the entirety of the program is shutting down. /// Unregister any bot-level event handlers, implementations, etc, here. /// </summary> public void OnUninitialize() { } #endregion #region Implementation of IUIButtonProvider /// <summary> /// The text to be displayed on the button in the UI /// </summary> // Note: Button text should be all uppercase to go with the style of the main window. Totally optional for 3rd parties, but must be all upper for our official products. public string ButtonText { get { return "LOAD PROFILE"; } } /// <summary> /// Called when the button is clicked. /// </summary> /// <param name="sender"></param> public void OnButtonClicked(object sender) { OpenFileDialog ofd = new OpenFileDialog(); ofd.Title = "Please select a profile..."; ofd.Filter = "Profile|*.xml;*.profile|All Files|*.*"; ofd.Multiselect = false; ofd.InitialDirectory = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location); ofd.CheckFileExists = true; if (ofd.ShowDialog() == true) { Log.Info(string.Format("Loading profile: {0}", ofd.FileName.Replace(Environment.UserName, "<User>"))); var profile = ProfileLoader.LoadProfile(ofd.FileName); Log.Info(string.Format("Profile {0} (version {1}) by {2} loaded!", profile.Name, profile.Version, profile.Author)); CurrentProfile = profile; } } #endregion /// <summary> /// The currently running profile. This value should not be changed while the bot is running! /// </summary> // TODO: Write-protect only while running public Profile CurrentProfile { get; set; } } }
Well, it's mostly just between trying to keep things updated, and actually get work on the bot done at the same time. This stage of the bot, is the worst for big updates to happen.
Did you even watch this video? He ends the video by saying why wild star is awesome and he likes it. Every game has things we dont like.
https://www.youtube.com/watch?v=NpR9g_L2_g8
And This Guys explains how to cook the perfect Steak.... same sense then you're Post. If you don't like it, keep it for yourself and let the other stay on topic. Like or Dislike is all a matter of personal opinion and is not the topic of this post.
He cooked a steak in a pan, wtf!
This is a great way to cook steak, especially using cast iron.
Here's Gordon Ramsay version:
https://www.youtube.com/watch?v=AmC9SmCBUj4
This is a great way to cook steak, especially using cast iron.
Here's Gordon Ramsay version:
https://www.youtube.com/watch?v=AmC9SmCBUj4
the best way to give yourself a heart attack from blocked arteries, the guy uses way too much salt and the amount of butter... one of the best way is to grill, 7 minutes each side (medium rare) and put garlic and herb (sometimes comes with it) ontop; If I could I'd stonebake it or use a Lava rock, the best way is by flame/gas/barb not electric.oh man.. I've got all those ingredients in my kitchen