Jump to content

reapler

Elite user
  • Posts

    288
  • Joined

  • Last visited

Everything posted by reapler

  1. Hello, if you bot many accounts you can avoid it with using proxy. For each account you create & log in, a seperate address should be used. They probably have a system which tracks your ip and looking for other accounts which are linked with it on website use & in-game to find / mark you, if you bot at scale. I guess Warmane does also log pretty everything which is useful for them(they have the expertise to do that). To trade your gold for example you can split the amount, trade back item & maybe using middleman for a specific amount of transactions in-game if you trade really much. But with for your current purposes you should be safe if you follow the mentioned tips from @Sundance. One thing left to say: if you get reported by players as a bot there's a little chance to not get checked & banned or blacklisted since gms can easily prove you as a bot ;)
  2. Hello, i'm currently working on a quest editor because the provided one doesn't fit to my imagination. I wanted to add some custom functions like adding transport step, specific npc using and so on. It looks like this so far (not fully finished): For now i have a few questions of the quests editor window: -Is it really needed that the marked area to have more than one questid? if yes an example would be useful -Does the name of the quest affect the common quest product? Here "quest1 - KillAndLoot". So far i tested it, only the quest id influence it but i'm not sure if some other function will also need the name If you have also other ideas for the editor, please leave your suggestions here.
  3. You could use a lower value for that since acquiring data from objectmanager doesn't take too long. I would say you can even set it to 50ms but it would be an overkill & not useful in the end. I recommend 2000ms.
  4. Hello, you could use https://wrobot.eu/files/file/1215-tbc-combatlooter/ since the methods should also work on vanilla.
  5. Yes it also return false(Wotlk+Tbc). Logging.Write("ongroundmount: "+MountTask.OnGroundMount());//false Logging.Write("ismounted: " + wManager.Wow.ObjectManager.ObjectManager.Me.IsMounted);//true But the only thing is im confused about the checking lua item spell for the mounts. I guess the ".isMounted" property isn't enough for the task? Because in that method it checks whether you are on Mount, if player is mounted it goes checking for lua & i think it could return a wrong value still if the character is on mount. For example "SpellManager.HaveBuffLua(wManagerSetting.CurrentSetting.GroundMountName)" could still return a wrong value because Itemname is not the reveived spell from the item. I used item "Reins of the Swift Frostsaber" but i got a spell with "Swift Frostsaber" on tbc for example. I hope thats the bug which leads to this problem hehe
  6. @Droidz The "MountTask.OnGroundMount()" has a bug which is also connected with the dismount method but i'm not sure if any products will also use it(but i haven't seen anything on Grinder for example). All in all you have 16 usages of the dismount method but i think the dismount was used with a true stopmove parameter so the bug could be in "wManager.Wow.Bot.Tasks.MountTask(1)" or "wManager.Wow.Helpers.MovementManager(2)" because it happens also on grinder as well on party product so it could happen not on "ToTown" state for example. But it's just an assumption maybe there are also more false OnMount checks.
  7. Hello, you may disable your plugins or change fightclass & try to reproduce the bug since it could have an impact of the bot behavior.
  8. A raw revision (i wasn't so fastidious):
  9. Hello, @King Smilie you can decompile the libraries from \WRobot\Bin. Here explained: This is how it looks like from dotpeek You can also use every other .net decompiler mentioned in the other posts. I also recommend to use some extensions for Visual Studio(also in the posts) it has a free trial and it helped me alot to understand c#. Edit: I looked into your fightclass. You should use Visual Studio, if you are going to continue writing in c#. It can show you immediately what's wrong with your code while you are writing it and it has many many other features to assist you.
  10. Hello, i think they have an other path but i'm not sure(too less knowledge about battlegrounder product). However i'm working on a solution for this problem it looks like this: (orange = wrobot path / yellow = own generated path / green = the mesh) You may help me, if you could share the log while you are in battleground. So i can see whether a path is generated or something else.
  11. Hello, you can use the event "UNIT_COMBAT" in conjunction with "wManager.Wow.Helpers.EventsLuaWithArgs.OnEventsLuaWithArgs": wManager.Wow.Helpers.EventsLuaWithArgs.OnEventsLuaWithArgs += delegate (LuaEventsId id, List<string> args) { if (id == LuaEventsId.UNIT_COMBAT && args[0] == "TARGET" && args[1] == "WOUND") { //your code } }; I belive the arguments are right. You just need to setup timer & get actual attack speed.
  12. I belive you need to write some beloved c# code. You could add a spell in the fightclass editor & set it as c#: if (wManager.Statistics.RunningTimeInSec() < 2) { robotManager.Helpful.Logging.Write("Register OnFightStart"); wManager.Events.FightEvents.OnFightStart += delegate(WoWUnit unit, CancelEventArgs cancelable) { if ((int) unit.Reaction < 3) { cancelable.Cancel = true; } }; System.Threading.Thread.Sleep(2000); } it will cancel all starting fights if unit is unfriendly or hostile. But i'm not sure how it will work in bg.
  13. Hello again, i have to inform you that you unfortunately cannot access Automaton.Bot.AutomatonSetting. My first thought was, it would be like on the grinder bot which granted me access to profiles & everything else. The thread related code would work as well loading the different products. Under this circumstances you have a few options: -to use WRotation and a plugin to block the fightevents til you allow access (but you need to write the own behavior like to move on random vector3 & attack specific npcs) -use xml writer to override the settings which you need & reload the product while using the plugin to start & stop I think the second option would easier to implement. If i have time, i can look after the writer. Edit: This is how you can use the threadmanager & cachemanager(without xml writer) but a bit unclean using System; using System.Collections.Generic; using System.Threading; using System.Runtime.Caching; using robotManager.Helpful; using robotManager.Products; using wManager.Plugin; using wManager.Wow.Enums; using wManager.Wow.Helpers; using Timer = robotManager.Helpful.Timer; public class Main : IPlugin { #region Variables private ThreadManager _threadManager = new ThreadManager(); #endregion #region Classes public class CacheManager { public static void SaveTocache(string cacheKey, object savedItem, DateTime absoluteExpiration) { if (!IsIncache(cacheKey)) { MemoryCache.Default.Add(cacheKey, savedItem, absoluteExpiration); } else { MemoryCache.Default.Set(cacheKey, savedItem, absoluteExpiration); } } public static T GetFromCache<T>(string cacheKey) where T : class { return MemoryCache.Default[cacheKey] as T; } public static void RemoveFromCache(string cacheKey) { MemoryCache.Default.Remove(cacheKey); } public static bool IsIncache(string cacheKey) { return MemoryCache.Default[cacheKey] != null; } public static bool IsIncache(Action method) { return MemoryCache.Default[method.Method.Name] != null; } } public class ThreadManager { public int TableId = 1; Dictionary<string, Thread> _threads = new Dictionary<string, Thread>(); /// <summary> /// Starts a thread /// </summary> /// <param name="method">The method to start on</param> /// <param name="threadName">Define thread name</param> /// <param name="cache">Write thread also to memory cache</param> /// <param name="cacheExpiration">when the cache expires in memory (not on current instance!)</param> public void Start(Action method, string threadName, bool cache = false, DateTime cacheExpiration = default(DateTime)) { if (!cache) { if (!_threads.ContainsKey(threadName)) { Thread Thread = new Thread(() => method()); Thread.Name = Convert.ToString(TableId); Thread.Start(); _threads.Add(threadName, Thread); Logging.Write("Start Thread " + threadName + "."); } else { Logging.Write("Thread " + threadName + " already executed."); } } else { if (!CacheManager.IsIncache(threadName)) { Thread Thread = new Thread(() => method()); Thread.Name = Convert.ToString(TableId); Thread.Start(); if (cacheExpiration == default(DateTime)) { CacheManager.SaveTocache(threadName, Thread, DateTime.Now.AddMinutes(30)); Logging.Write("Start Thread " + threadName + ".\nExpires at " + DateTime.Now.AddMinutes(30)); } else { CacheManager.SaveTocache(threadName, Thread, cacheExpiration); Logging.Write("Start Thread " + threadName + ".\nExpires at " + cacheExpiration); } } else { Logging.Write("Thread " + threadName + " already executed."); } } } /// <summary> /// Starts a thread /// </summary> /// <param name="method">The method to start on</param> /// <param name="cache">Write thread also to memory cache</param> /// <param name="cacheExpiration">when the cache expires in memory (not on current instance!)</param> public void Start(Action method, bool cache = false, DateTime cacheExpiration = default(DateTime)) { if (!cache) { if (!_threads.ContainsKey(method.Method.Name)) { Thread Thread = new Thread(() => method()); Thread.Name = Convert.ToString(TableId); Thread.Start(); _threads.Add(method.Method.Name, Thread); Logging.Write("Start Thread " + method.Method.Name + "."); } else { Logging.Write("Thread " + method.Method.Name + " already executed."); } } else { if (!CacheManager.IsIncache(method.Method.Name)) { Thread Thread = new Thread(() => method()); Thread.Name = Convert.ToString(TableId); Thread.Start(); if (cacheExpiration == default(DateTime)) { CacheManager.SaveTocache(method.Method.Name, Thread, DateTime.Now.AddMinutes(30)); Logging.Write("Start Thread " + method.Method.Name + ".\nExpires at " + DateTime.Now.AddMinutes(30)); } else { CacheManager.SaveTocache(method.Method.Name, Thread, cacheExpiration); Logging.Write("Start Thread " + method.Method.Name + ".\nExpires at " + cacheExpiration); } } else { Logging.Write("Thread " + method.Method.Name + " already executed."); } } } /// <summary> /// Aborts a thread /// </summary> /// <param name="threadName">Define thread name</param> /// <param name="cache">Determine whether if thread on cache</param> public void Abort(string threadName, bool cache = false) { if (!cache) { if (_threads.ContainsKey(threadName)) { _threads[threadName].Abort(); _threads.Remove(threadName); Logging.Write("Abort Thread " + threadName + "."); } } else { if (CacheManager.IsIncache(threadName)) { CacheManager.GetFromCache<Thread>(threadName).Abort(); CacheManager.RemoveFromCache(threadName); Logging.Write("Abort Thread " + threadName + "."); } else { Logging.Write("Thread " + threadName + "could not be found in cache."); } } } /// <summary> /// Aborts a thread /// </summary> /// <param name="method">The method which was associated with the thread</param> /// <param name="cache">Determine whether if thread on cache</param> public void Abort(Action method, bool cache = false) { if (!cache) { if (_threads.ContainsKey(method.Method.Name)) { _threads[method.Method.Name].Abort(); _threads.Remove(method.Method.Name); Logging.Write("Abort Thread " + method.Method.Name + "."); } } else { if (CacheManager.IsIncache(method.Method.Name)) { CacheManager.GetFromCache<Thread>(method.Method.Name).Abort(); CacheManager.RemoveFromCache(method.Method.Name); Logging.Write("Abort Thread " + method.Method.Name + "."); } else { Logging.Write("Thread " + method.Method.Name + "could not be found in cache."); } } } } #endregion #region WRobot Methods public void Initialize() { } public void Dispose() { } public void Settings() { if (!CacheManager.IsIncache("Thread1")) { _threadManager.Start(Thread1, true, DateTime.Now.AddMinutes(60)); CacheManager.SaveTocache("EventsLuaWithArgsOnOnEventsLuaWithArgs", _handler, DateTime.Now.AddMinutes(60)); EventsLuaWithArgs.OnEventsLuaWithArgs += CacheManager.GetFromCache<EventsLuaWithArgs.EventsLuaWithArgsHandler>("EventsLuaWithArgsOnOnEventsLuaWithArgs"); } else { Logging.Write("Dispose"); EventsLuaWithArgs.OnEventsLuaWithArgs -= CacheManager.GetFromCache<EventsLuaWithArgs.EventsLuaWithArgsHandler>("EventsLuaWithArgsOnOnEventsLuaWithArgs"); CacheManager.RemoveFromCache("EventsLuaWithArgsOnOnEventsLuaWithArgs"); _threadManager.Abort(Thread1, true); } } #endregion #region Handler private EventsLuaWithArgs.EventsLuaWithArgsHandler _handler = delegate (LuaEventsId id, List<string> args) { if (id == LuaEventsId.EXECUTE_CHAT_LINE) { Logging.Write(args[0]); if (args[0] == "/start") { Products.LoadProducts("Automaton"); Products.ProductStart(); } if (args[0] == "/stop") { Products.ProductStop(); //need to resubscribe events EventsLuaWithArgs.OnEventsLuaWithArgs -= CacheManager.GetFromCache<EventsLuaWithArgs.EventsLuaWithArgsHandler>("EventsLuaWithArgsOnOnEventsLuaWithArgs"); EventsLuaWithArgs.OnEventsLuaWithArgs += CacheManager.GetFromCache<EventsLuaWithArgs.EventsLuaWithArgsHandler>("EventsLuaWithArgsOnOnEventsLuaWithArgs"); } } }; #endregion #region Threads public void Thread1() { var timer = new Timer(1000); timer.ForceReady(); Logging.Write("Initialized Thread1"); while (true) { try { if (timer.IsReady) { Logging.Write("Pulse"); timer.Reset(); } } catch (Exception e) { Logging.WriteError(e.ToString()); } Thread.Sleep(30); } } #endregion }
  14. A nice thought to use the automaton for this task. But i agree it would be much work to make it happen. By your plugin you could use "Automaton.Bot.AutomatonSetting.CurrentSetting.ObjectNpcHarvest" to add npcs(you must add new line for each name: \n). But at first you must load the product in order to access it. If you have written the names to the settings you must save them. So you could design the tool as plugin or maybe customprofile(start thread only from clicking on settings or even make a winform gui if you need to adjust something or add start/stop buttons). Stuff that may help you(doesn't include things what i've already mentioned on other posts): load/switch product: https://wrobot.eu/forums/topic/5507-changing-botbase/ execute macro & other relevant tasks: public void Settings() { //start thread1 with the classes i presented on the other post } public void Thread1 { //other things to initialize EventsLuaWithArgs.OnEventsLuaWithArgs += EventsLuaWithArgsOnOnEventsLuaWithArgs; //don't forget to unsubscribe if you abort your thread (-=) //add here while loop if needed } private void EventsLuaWithArgsOnOnEventsLuaWithArgs(LuaEventsId id, List<string> args) { if (id == LuaEventsId.EXECUTE_CHAT_LINE) { robotManager.Helpful.Logging.Write(args[0]);//if a macro is pressed or something on chat line is printed if (args[0] == "/add target")// "/add target" your macro ingame to add targets { //get npc name by "ObjectManager.Me.TargetObject.Name" and save string variable somewhere //add new entries like this: namestokill + "\n" + newname //load product, configure settings with your npcname, save } if (args[0] == "/clear targetlist") { //clears your string variable } if (args[0] == "/startfarm") { //load product, start product } //you can also stop automatically the product if a certain condition is met on the while loop on thread1 if (args[0] == "/stopfarm") { //stop product } } }
  15. Hello, you could try this as c# code in your fightclass: if (wManager.Statistics.RunningTimeInSec() < 2) { robotManager.Helpful.Logging.Write("Register OnLootSuccessful"); wManager.Events.LootingEvents.OnLootSuccessful += delegate(WoWUnit unit) { //task because with thread sleep you would block the thread Task.Run(async delegate { await System.Threading.Tasks.Task.Delay(2000);//your delay wManager.Wow.Helpers.SpellManager.CastSpellByNameLUA("Prowl"); }); }; System.Threading.Thread.Sleep(2000);//to initialize event only once on startup } So it will cast prowl everytime after you have looted the unit. You can also extend it to do something other after loot if you want. But i think @eeny's solution would also work with less effort :) just want to show the other possibility.
  16. Hello, i'm glad to hear it. If you have a specific question you may ask here on the forum. I also recommend to look into https://stackoverflow.com/ if you have a c# related question on your mind. Edit: forgot to mention that https://www.dotnetperls.com/ is also a good source for simple examples
  17. Hello, i think you can use the already built-in blacklist tool in WRobot which npc it should not attack but i don't know exactly, what do you want to achieve ( a special case which the character shouldn't do this on x condition?)
  18. I forgot to mention you can pause the rotation by pressing alt +x but i think i could also add this for different keys without pause the fightclass. For the other features you have mentioned i think a manual mode would also fit very well along with some automated things. I can imagine a macro for example to heal / cleanse optimal target or to force some cast. But at first i want to finish some other projects. For now i hope the settings are enough to adjust it to your likings. In about three weeks you can except that i will look into it again ;)
  19. I would write a plugin & register a few events, so you can control your character & block actions from the bot itself or execute your own behavior. This is how it could look like (not tested): private bool _died; private List<string> _WaitonContinent = new List<string> { "Netherstorm", "otherzones" }; public void Initialize()//method from WRobot's plugin interface { MovementEvents.OnMovementPulse += MovementEventsOnOnMovementPulse; EventsLua.AttachEventLua(LuaEventsId.PLAYER_DEAD, m => Event_PLAYER_DEAD()); //... } public void Dispose()//method from WRobot's plugin interface { MovementEvents.OnMovementPulse -= MovementEventsOnOnMovementPulse; } private void MovementEventsOnOnMovementPulse(List<Vector3> points, CancelEventArgs cancelable) { if (_died && ObjectManager.Me.Position.DistanceZ(ObjectManager.Me.PositionCorpse) > 250)//use spirit healer if corpse has a z-distance over 250 { wManagerSetting.CurrentSetting.UseSpiritHealer = true; if (_WaitonContinent.Contains(Usefuls.MapZoneName))//check if it is correct you can either use .SubMapZoneName { robotManager.Helpful.Logging.Write("We are in zone "+Usefuls.MapZoneName + "\n=>Wait"); wManagerSetting.CurrentSetting.WaitResurrectionSickness = true; } cancelable.Cancel = true; _died = false; } if (wManager.Wow.ObjectManager.ObjectManager.Me.IsValid && wManager.Wow.ObjectManager.ObjectManager.Me.IsAlive && !wManager.Wow.ObjectManager.ObjectManager.Me.HaveBuff(15007) && wManagerSetting.CurrentSetting.WaitResurrectionSickness) { Thread.Sleep(1000); wManagerSetting.CurrentSetting.WaitResurrectionSickness = false; } } public void Event_PLAYER_DEAD() { _died = true; }
  20. Hello it is possible, but you need to create an extra thread to run your plugin because if the product is stopped it will also dispose your plugin(you also need to write it to memorycache). So you could do different tasks while product is stopped like changing product or i guess even the profile and the other stuff you have mentioned. But it costs work :) You can find the thread & cache manager under this post: Usage: //... public void Initialize()//method from WRobot plugin interface { ThreadManager threadManager = new ThreadManager(); if (!threadManager.CacheManager_.IsIncache("Pulse")) { new ThreadManager().Start(Pulse, true, DateTime.Now.AddMinutes(30)); } } //... public void Pulse() { robotManager.Helpful.Logging.Write("Initialized"); //...things you want to initialize var timer = new robotManager.Helpful.Timer(1000); timer.ForceReady(); while (true) { try { if (Conditions.ProductIsStartedNotInPause && Conditions.InGameAndConnected && timer.IsReady) { robotManager.Helpful.Logging.Write("Pulse"); //...on pulse timer.Reset(); } } catch (Exception e) { robotManager.Helpful.Logging.WriteError(e.ToString()); } Thread.Sleep(30); } } Edit: Important: if the mentioned code will be used to change settings it can fail on specific products(automaton is known after some researches)
  21. Thanks for your suggestions. I had also some of these ideas in my mind and but i was just too lazy to implement it haha The heal on dead cast would be instant fixed. The features will be added in lets say 3weeks(other stuff to finish)
  22. @nate11 Thanks for your report. The new version is now available. If you would like, you may leave a feedback how it is working.
  23. @scripterx would you like to tell me if in the log is still a path generated in WG like this: [N] 02:59:21 - [Path-Finding] FindPath from 1619,308 ; 264,3642 ; -58,90842 ; "None" to 1567,12 ; 266,345 ; -43,10271 ; "None" (Azeroth) [N] 02:59:21 - [Path-Finding] Path Count: 18 (97,26425y) or you can post a log if you are unsure.
  24. Hello, for your two tasks you need the objectmanager. To talk and select a gossip you can use this in your runcode step: //single can be here used because it's unlikely happen that the picked npc is existing more than one time WoWUnit toTalk = wManager.Wow.ObjectManager.ObjectManager.GetObjectWoWUnit() .SingleOrDefault(i => i.Name == "YOURNPCNAME"); if (toTalk != null) { wManager.Wow.Bot.Tasks.GoToTask.ToPositionAndIntecractWithNpc(toTalk.Position, toTalk.Entry, 1); //1=the gossip you want to select } For your second task you need to find the entry for your lever. You can use the Development tools which you find in WRobot window under the "Tools" tab. Now go close as possible to the lever and click "Dump all informations". A new tab in your browser opens with all wowobjects. Now you need to search for the closest WoWGameObject. If you have found it make sure it is that object: the distance should be under 5yrds & maybe a name is also printed like lever, trigger or something else. To use the object you can use this in your next step: WoWGameObject lever = wManager.Wow.ObjectManager.ObjectManager.GetObjectWoWGameObject().FirstOrDefault(i => i.Entry == YOURENTRY); if (lever != null) { wManager.Wow.Helpers.Interact.InteractGameObject(lever.GetBaseAddress); } You may also look for some other dungeons profile if you haven't done yet. For reseting you can take a look there:
  25. Hello, you can decompile the WRobot libraries from \WRobot\Bin\ to get all classes, methods or whatever you would like to find Here explained:
×
×
  • Create New...