Marsbar 228 Posted October 30, 2017 Share Posted October 30, 2017 This took me a while, I had the help of my GF who did mathy things in school (unlike me) to be my human calculator; var xvector = (ObjectManager.Me.Position.X) - (ObjectManager.Target.Position.X); var yvector = (ObjectManager.Me.Position.Y) - (ObjectManager.Target.Position.Y); Vector3 newpos = new Vector3() { X = ObjectManager.Me.Position.X + (float)((xvector * (20 / ObjectManager.Target.GetDistance)-xvector)), Y = ObjectManager.Me.Position.Y + (float)((yvector * (20 / ObjectManager.Target.GetDistance)-yvector)), Z = ObjectManager.Me.Position.Z }; MovementManager.Go(PathFinder.FindPath(newpos), false); Currently this runs ~20 yards back away from the target using the pathfinder, you can change the 20 to be what you want and also add it to the onfightloop with an if condition. Let me know how it goes! Link to comment https://wrobot.eu/forums/topic/7507-solved-move-after-frost-nova-is-it-really-that-hard/?page=3#findComment-34278 Share on other sites More sharing options...
Seminko 40 Posted October 30, 2017 Author Share Posted October 30, 2017 1 hour ago, Marsbar said: This took me a while, I had the help of my GF who did mathy things in school (unlike me) to be my human calculator; var xvector = (ObjectManager.Me.Position.X) - (ObjectManager.Target.Position.X); var yvector = (ObjectManager.Me.Position.Y) - (ObjectManager.Target.Position.Y); Vector3 newpos = new Vector3() { X = ObjectManager.Me.Position.X + (float)((xvector * (20 / ObjectManager.Target.GetDistance)-xvector)), Y = ObjectManager.Me.Position.Y + (float)((yvector * (20 / ObjectManager.Target.GetDistance)-yvector)), Z = ObjectManager.Me.Position.Z }; MovementManager.Go(PathFinder.FindPath(newpos), false); Currently this runs ~20 yards back away from the target using the pathfinder, you can change the 20 to be what you want and also add it to the onfightloop with an if condition. Let me know how it goes! Wow man, thanks for taking the time! And thanks to your girlfriend! It does what it's supposed to... but... bad news... still the same stuttering issue. :( Here is how I tested: made a blank Fightclass with only Frost Nova and your move. Tries to move but stutters = does not even move the full 20 yards. Spoiler using System; using System.Linq; using System.Threading; using System.Windows.Forms; using robotManager.Helpful; using robotManager.Products; using wManager.Wow.Class; using wManager.Wow.Enums; using wManager.Events; using wManager.Wow.Helpers; using wManager.Wow.ObjectManager; using System.Configuration; using System.ComponentModel; using System.IO; using robotManager; using System.Collections.Generic; using Timer = robotManager.Helpful.Timer; public class Main : ICustomClass { public float Range { get { return 29f; } } private bool iMageLaunched; public void Initialize() // When product started, initialize and launch Fightclass { iMageLaunched = true; Logging.Write("iMage initialized."); Start(); } public void Dispose() // When product stopped { iMageLaunched = false; Logging.Write("iMage stopped."); } public void ShowConfiguration() // When use click on Fight class settings { iMageSettings.Load(); iMageSettings.CurrentSetting.ToForm(); iMageSettings.CurrentSetting.Save(); } // SPELLS: public Spell FrostBolt = new Spell("Frostbolt"); private void CombatRotation() { if (ObjectManager.Target.GetDistance <= 6 && !ObjectManager.Target.HaveBuff("Frost Nova") && !ObjectManager.Target.HaveBuff("Frostbite") && ObjectManager.Target.HealthPercent >= 25) // && ObjectManager.Target.GetDistance >= 6 { SpellManager.CastSpellByNameLUA("Frost Nova"); return; } else if ((ObjectManager.Target.HaveBuff("Frost Nova") || ObjectManager.Target.HaveBuff("Frostbite")) && ObjectManager.Target.GetDistance <= 6) { while (ObjectManager.Target.GetDistance <= 6) { var xvector = (ObjectManager.Me.Position.X) - (ObjectManager.Target.Position.X); var yvector = (ObjectManager.Me.Position.Y) - (ObjectManager.Target.Position.Y); Vector3 newpos = new Vector3() { X = ObjectManager.Me.Position.X + (float)((xvector * (20 / ObjectManager.Target.GetDistance)-xvector)), Y = ObjectManager.Me.Position.Y + (float)((yvector * (20 / ObjectManager.Target.GetDistance)-yvector)), Z = ObjectManager.Me.Position.Z }; MovementManager.Go(PathFinder.FindPath(newpos), false); } return; } } public void Start() { Logging.Write("iMage Loaded"); while (iMageLaunched) { if (!Products.InPause) { if (!ObjectManager.Me.IsDeadMe) { if (Fight.InFight && ObjectManager.Me.Target > 0) { CombatRotation(); } } } Thread.Sleep(50); } Logging.Write("iMage is now stopped."); } [Serializable] public class iMageSettings : Settings { public iMageSettings() { ConfigWinForm(new System.Drawing.Point(400, 400), "iMage" + Translate.Get("Settings")); } public static iMageSettings CurrentSetting { get; set; } public bool Save() { try { return Save(AdviserFilePathAndName("iMage-Mage", ObjectManager.Me.Name + "." + Usefuls.RealmName)); } catch (Exception e) { Logging.WriteError("iMageSettings > Save(): " + e); return false; } } public static bool Load() { try { if (File.Exists(AdviserFilePathAndName("iMage-Mage", ObjectManager.Me.Name + "." + Usefuls.RealmName))) { CurrentSetting = Load<iMageSettings>(AdviserFilePathAndName("iMage-Mage", ObjectManager.Me.Name + "." + Usefuls.RealmName)); return true; } CurrentSetting = new iMageSettings(); } catch (Exception e) { Logging.WriteError("iMageSettings > Load(): " + e); } return false; } } } I tried adding the MoveEvents but with those, the bot doesn't move at all. Also tried making a Fightclass with movement only so I can record and show it you all. Here's the code: Spoiler using System; using System.Linq; using System.Threading; using System.Windows.Forms; using robotManager.Helpful; using robotManager.Products; using wManager.Wow.Class; using wManager.Wow.Enums; using wManager.Events; using wManager.Wow.Helpers; using wManager.Wow.ObjectManager; using System.Configuration; using System.ComponentModel; using System.IO; using robotManager; using System.Collections.Generic; using Timer = robotManager.Helpful.Timer; public class Main : ICustomClass { public float Range { get { return 29f; } } private bool iMageLaunched; public void Initialize() // When product started, initialize and launch Fightclass { iMageLaunched = true; Logging.Write("iMage initialized."); Start(); } public void Dispose() // When product stopped { iMageLaunched = false; Logging.Write("iMage stopped."); } public void ShowConfiguration() // When use click on Fight class settings { iMageSettings.Load(); iMageSettings.CurrentSetting.ToForm(); iMageSettings.CurrentSetting.Save(); } // SPELLS: public Spell FrostBolt = new Spell("Frostbolt"); private void CombatRotation() { if (ObjectManager.Target.GetDistance <= 6) { while (ObjectManager.Target.GetDistance <= 20) { var xvector = (ObjectManager.Me.Position.X) - (ObjectManager.Target.Position.X); var yvector = (ObjectManager.Me.Position.Y) - (ObjectManager.Target.Position.Y); Vector3 newpos = new Vector3() { X = ObjectManager.Me.Position.X + (float)((xvector * (20 / ObjectManager.Target.GetDistance)-xvector)), Y = ObjectManager.Me.Position.Y + (float)((yvector * (20 / ObjectManager.Target.GetDistance)-yvector)), Z = ObjectManager.Me.Position.Z }; MovementManager.Go(PathFinder.FindPath(newpos), false); } return; } } public void Start() { Logging.Write("iMage Loaded"); while (iMageLaunched) { if (!Products.InPause) { if (!ObjectManager.Me.IsDeadMe) { if (Fight.InFight && ObjectManager.Me.Target > 0) { CombatRotation(); } } } Thread.Sleep(50); } Logging.Write("iMage is now stopped."); } [Serializable] public class iMageSettings : Settings { public iMageSettings() { ConfigWinForm(new System.Drawing.Point(400, 400), "iMage" + Translate.Get("Settings")); } public static iMageSettings CurrentSetting { get; set; } public bool Save() { try { return Save(AdviserFilePathAndName("iMage-Mage", ObjectManager.Me.Name + "." + Usefuls.RealmName)); } catch (Exception e) { Logging.WriteError("iMageSettings > Save(): " + e); return false; } } public static bool Load() { try { if (File.Exists(AdviserFilePathAndName("iMage-Mage", ObjectManager.Me.Name + "." + Usefuls.RealmName))) { CurrentSetting = Load<iMageSettings>(AdviserFilePathAndName("iMage-Mage", ObjectManager.Me.Name + "." + Usefuls.RealmName)); return true; } CurrentSetting = new iMageSettings(); } catch (Exception e) { Logging.WriteError("iMageSettings > Load(): " + e); } return false; } } } Here's the video of above code in action: https://www.youtube.com/watch?v=B9ANAEQ0rSg I googled a bit and found an example where a while loop with sleep is used until the movement stops. I thought that makes sense so I tried and logged the loops to see what's going on. while (ObjectManager.Target.GetDistance <= 20) { var xvector = (ObjectManager.Me.Position.X) - (ObjectManager.Target.Position.X); var yvector = (ObjectManager.Me.Position.Y) - (ObjectManager.Target.Position.Y); Vector3 newpos = new Vector3() { X = ObjectManager.Me.Position.X + (float)((xvector * (20 / ObjectManager.Target.GetDistance)-xvector)), Y = ObjectManager.Me.Position.Y + (float)((yvector * (20 / ObjectManager.Target.GetDistance)-yvector)), Z = ObjectManager.Me.Position.Z }; MovementManager.Go(PathFinder.FindPath(newpos), false); Logging.Write("STARTED MOVING"); while (MovementManager.InMovement && Conditions.InGameAndConnectedAndAliveAndProductStartedNotInPause) { Thread.Sleep(1000); Logging.Write("STILL MOVING"); } } Didn't have any effect at all. Here is the result from the log. It looks like how I though it would look. It doesn't perform the move, it performs dozens of small little tiny moves for some reason, hence the stuttering. Quote 22:26:49 - STARTED MOVING 22:26:50 - STILL MOVING 22:26:50 - STARTED MOVING 22:26:51 - STILL MOVING 22:26:51 - STARTED MOVING 22:26:52 - STILL MOVING 22:26:52 - STARTED MOVING 22:26:53 - STILL MOVING 22:26:53 - STARTED MOVING 22:26:54 - STILL MOVING 22:26:54 - STARTED MOVING 22:26:55 - STILL MOVING 22:26:56 - STARTED MOVING 22:26:57 - STILL MOVING 22:26:57 - STARTED MOVING 22:26:58 - STILL MOVING 22:26:58 - STARTED MOVING Link to comment https://wrobot.eu/forums/topic/7507-solved-move-after-frost-nova-is-it-really-that-hard/?page=3#findComment-34281 Share on other sites More sharing options...
Marsbar 228 Posted October 30, 2017 Share Posted October 30, 2017 Can you try targetting something (can be a friendly), running wrotation and running my code in the dev tools? Edit: I'm also in vanilla and it works running in dev tools, havent tried it in a fight class yet Link to comment https://wrobot.eu/forums/topic/7507-solved-move-after-frost-nova-is-it-really-that-hard/?page=3#findComment-34282 Share on other sites More sharing options...
Seminko 40 Posted October 30, 2017 Author Share Posted October 30, 2017 11 minutes ago, Marsbar said: Can you try targetting something (can be a friendly), running wrotation and running my code in the dev tools? Edit: I'm also in vanilla and it works running in dev tools, havent tried it in a fight class yet I don't know how to do that. However I tried with a custom profile and it worked nicely. But, keep in mind that simple wManager.Wow.Helpers.Move.StrafeLeft(Move.MoveAction.PressKey, 1000); also worked with a custom profile but got messed up once it was inside a Fightclass and my toon was in combat. EDIT: But since you mentioned it, how do you run code from within the dev tools? You just put it in and start WRotation? If so, that did nothing. Link to comment https://wrobot.eu/forums/topic/7507-solved-move-after-frost-nova-is-it-really-that-hard/?page=3#findComment-34283 Share on other sites More sharing options...
Marsbar 228 Posted October 30, 2017 Share Posted October 30, 2017 You can run any c# code in the dev tools; Tools>Development Tools>Paste your code in the window>Press c# button. I'll try adding it to a fight class and see if i get better results. Link to comment https://wrobot.eu/forums/topic/7507-solved-move-after-frost-nova-is-it-really-that-hard/?page=3#findComment-34284 Share on other sites More sharing options...
Seminko 40 Posted October 30, 2017 Author Share Posted October 30, 2017 3 minutes ago, Marsbar said: You can run any c# code in the dev tools; Tools>Development Tools>Paste your code in the window>Press c# button. I'll try adding it to a fight class and see if i get better results. Yup that worked fine just like the custom profile. Link to comment https://wrobot.eu/forums/topic/7507-solved-move-after-frost-nova-is-it-really-that-hard/?page=3#findComment-34285 Share on other sites More sharing options...
Apexx 60 Posted October 30, 2017 Share Posted October 30, 2017 Not sure if you have seen this post -> move back if... add code in fightclass editor Seminko 1 Link to comment https://wrobot.eu/forums/topic/7507-solved-move-after-frost-nova-is-it-really-that-hard/?page=3#findComment-34286 Share on other sites More sharing options...
Marsbar 228 Posted October 30, 2017 Share Posted October 30, 2017 Try adding FightEvents.OnFightLoop += (unit, cancelable) => { if (ObjectManager.Target.GetDistance < 8) { var xvector = (ObjectManager.Me.Position.X) - (ObjectManager.Target.Position.X); var yvector = (ObjectManager.Me.Position.Y) - (ObjectManager.Target.Position.Y); Vector3 newpos = new Vector3() { X = ObjectManager.Me.Position.X + (float)((xvector * (20 / ObjectManager.Target.GetDistance) - xvector)), Y = ObjectManager.Me.Position.Y + (float)((yvector * (20 / ObjectManager.Target.GetDistance) - yvector)), Z = ObjectManager.Me.Position.Z }; MovementManager.Go(PathFinder.FindPath(newpos), false); Thread.Sleep(1500); } }; edit: the thread.sleep is a bit of a workaround to stop whatever else is interfering you may also want to increase that if distance to higher than 8 Apexx and Seminko 1 1 Link to comment https://wrobot.eu/forums/topic/7507-solved-move-after-frost-nova-is-it-really-that-hard/?page=3#findComment-34287 Share on other sites More sharing options...
Seminko 40 Posted October 30, 2017 Author Share Posted October 30, 2017 19 minutes ago, Marsbar said: Try adding FightEvents.OnFightLoop += (unit, cancelable) => { if (ObjectManager.Target.GetDistance < 8) { var xvector = (ObjectManager.Me.Position.X) - (ObjectManager.Target.Position.X); var yvector = (ObjectManager.Me.Position.Y) - (ObjectManager.Target.Position.Y); Vector3 newpos = new Vector3() { X = ObjectManager.Me.Position.X + (float)((xvector * (20 / ObjectManager.Target.GetDistance) - xvector)), Y = ObjectManager.Me.Position.Y + (float)((yvector * (20 / ObjectManager.Target.GetDistance) - yvector)), Z = ObjectManager.Me.Position.Z }; MovementManager.Go(PathFinder.FindPath(newpos), false); Thread.Sleep(1500); } }; GG WP! Yup that's it. Works both in my test blank fightclass as well as in the main one! Thank you very much @Marsbar. Also thank you @Matenia and @Apexx ! I apreciate the help guys! This will definitely help me with my rogue fightclass as well. The only thing missing from perfection is moving to a spot without mobs. But that is way above my knowledge of coding :-D 23 minutes ago, Apexx said: Not sure if you have seen this post -> move back if... add code in fightclass editor You know what the funny part is? I've seen that post dozens of times when I was googling but since I didn't know what FightEvents.OnFightLoop was or even how to use it properly I didn't even attempted to fiddle with it. I was so close yet so far :-D Apexx 1 Link to comment https://wrobot.eu/forums/topic/7507-solved-move-after-frost-nova-is-it-really-that-hard/?page=3#findComment-34289 Share on other sites More sharing options...
Seminko 40 Posted October 30, 2017 Author Share Posted October 30, 2017 Just so I understand and correct me if I'm wrong, but this basically overrides the default Fight behavior? It "cancels" the current Fight behavior, inserts a new one (our code), and once that inserted "event" is resolved it continues with the BAU Fight behavior. Is that correct? Link to comment https://wrobot.eu/forums/topic/7507-solved-move-after-frost-nova-is-it-really-that-hard/?page=3#findComment-34291 Share on other sites More sharing options...
Marsbar 228 Posted October 31, 2017 Share Posted October 31, 2017 9 hours ago, Seminko said: Just so I understand and correct me if I'm wrong, but this basically overrides the default Fight behavior? It "cancels" the current Fight behavior, inserts a new one (our code), and once that inserted "event" is resolved it continues with the BAU Fight behavior. Is that correct? No, that's why you were getting the stuttering. It was trying to go back to doing what it was and then hitting the condition again (i think). We're adding extra behavior to the onfightloop. In regards to moving to a "safe" position, it may not be as hard as we think. We need to change the direction of the vector if a mob is too close to the end position. If you look at the code you can see that the xvector and yvector are our position xy minus the target xy. This ends up giving us the x and y distance we move in the x and y directions. Example (ignoring z axis): Our target is at position x:55,y:45 We are at position x:48,y:44 Our x position minus the target x position = our x vector == 48 - 55 = -7 Our y position minus the target y position = our y vector == 44 - 45 = -1 What we could do is then add or subtract to that vector if an enemy is too close to our target pos, which would change the direction from the Me pos. (I'm at work again so cant play with it but it's actually quite interesting because I'm starting to get how this works lol) Seminko 1 Link to comment https://wrobot.eu/forums/topic/7507-solved-move-after-frost-nova-is-it-really-that-hard/?page=3#findComment-34304 Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now