FORUM [22/48]: https://wrobot.eu/forums/forum/40-developers-assistance/ #################################################################################################### ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/10392-unofficial-wrobot-api-documentation/ TITLE: Unofficial WRobot API Documentation ---------------------------------------------------------------------------------------------------- Serrec Hi! There are often questions regarding the wrobot api and what functions it has, generally you're told to either decompile the dlls or reference them in your visual studio project and use the object browser. Some people only want to know a certain function name and don't wish to go into the deeper realms of development. There isn't a resource they can use to obtain that info without some effort on their part, that's hopefully where this site I generated will come in handy: Unofficial WRobot API Docs It was created by decompiling the vanilla wmanager and robotmanager dlls and generating an api web template using docfx . Currently it doesn't give you anything more than you'd have by decompiling the dlls yourself but I'm hoping to update this with method, property, constructer etc. descriptions and potentially basic code snippets for a better understanding of the wrobot api. If you're interested in contributing let me know and I can add you to the gitlab project (sorry if you don't like gitlab but it was quick and easy with free private repos). ---------------------------------------- Dreamful I'm going to slowly start adding small code snippets / tutorials to this eg. https://marsbars.gitlab.io/unoffical-wrobot-api-docs/articles/plugin.html Let me know if you spot anything wrong with it or have suggestions on what to add. ---------------------------------------- Unknown This will be super helpful, thank you for making this. It's long overdue ? ---------------------------------------- Unknown Can I dream of the day that the bot will support python? ---------------------------------------- Unknown I wish I could rep you more than once ❤️ ---------------------------------------- Garub Yes adding ability to use http://ironpython.net if possible will be a great thing ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/11961-fightclass-framework-for-243335a-and-more/ TITLE: Fightclass Framework for 2.4.3/3.3.5a and more ---------------------------------------------------------------------------------------------------- @Droidz | 2020-03-19T15:58:04Z If you've seen my 1.12 fightclass framework , this is basically the much enhanced version. It should work for WoW 2.4.3 and 3.3.5a, possibly many more expansions. The only thing you would have to do is adjust the way combatlog events are parsed, if paramters have changed in your expansion. Everything else should be handled by wRobot. Below you can find the GitHub repository. It also contains a very simple enhancement shaman fightclass as an example that you could change to fit your own needs. This is for developers only. If you're a regular user, I recommend just buying my fightclasses. They are, in my opinion, fairly priced. Features: - checks with server if a spell was successful - support for different types of spells - no more double casts of any sort (heals, debuffs, damage) - possibility to ignore server responses - easy offtarget handling - performant caching and rotation handling - possibility to use as a healing framework - support for wanding - multilanguage support - dispel by debuff type https://github.com/Schaka/wRobotFightclassFrameworkEnhanced @Droidz would be nice if you could sticky/pin this thread Edited March 19, 2020 by Matenia ---------------------------------------- TheSmokie Great contribution. Clearly a lot of work went into this. ---------------------------------------- TheSmokie Legend! ? ---------------------------------------- Unknown Most advanced and fundamental fight class sample I've ever seen. Awesome work. The only moment I still didn't get is wanding. Sometimes while wanding the bot is something like can't change rotation step. I mean for example i've got 10 steps in my rotation. Wanding has lowest priority. And if all conditions is fit for wanding he starts shoot. Everything is fine, but if he starts wanding, rotation step is not changing until I manually interrupt hes wanding process by pressing any movement key. Right after that rotation is working again as it should and bot continues rotate steps. Even other rotations spells with "force" enabled doesn't work. This problem happens only when bot is wanding. For other spells everything is good. My conditions for wanding: new RotationStep(new RotationSpell("Shoot"), 10f, (s, t) => MeHaveWand() && !RotationCombatUtil.IsAutoShooting() && !Me.GetMove, RotationCombatUtil.BotTarget), private static bool MeHaveWand() { return ObjectManager.Me.GetEquipedItemBySlot(InventorySlot.INVSLOT_RANGED) != 0 ? true : false; } public static bool IsAutoShooting() { return Lua.LuaDoString ("return IsAutoRepeatSpell('Shoot')"); } Maybe some problems with spell verification. Wow vanilla. ---------------------------------------- Talamin If @Matenia could make a video tutorial detailing the process of creating a combat routine it would be very good. I would even pay for a course (udemy). ---------------------------------------- Unknown | 2020-06-14T20:24:19Z Clearly says this isn't for 1.12. Also clearly even references the 1.12 framework. Also, what is it with people using the cracked version of wRobot coming here expecting help? That being said, there can always be race conditions when you're technically on gcd from wanding which blocks other spells from being usable. Edited June 14, 2020 by Matenia ---------------------------------------- Unknown Multilingual casting skills are abnormal and slow 3.3.5 ---------------------------------------- Unknown I don't really do anything differently for other languages than English. Except checking buffs (but you can do this yourself just using HaveBuff wRobot API offers). There's probably some English language strings somewhere still. And I definitely don't have support for Chinese rank strings either. ---------------------------------------- Kamogli I am using Matenias Framework and it´s running really fast. Some decisions take 200ms to be made, but this is due the complex Rotations. ---------------------------------------- Unknown I used the German test. Unable to cast skills continuously. English is normal thank you for your sharing ElementalShaman.7z ---------------------------------------- Kamogli | 2020-06-17T08:27:13Z public string FullName () { return _rank != null ? ( $ "{_name}({RotationSpellbook.RankString} {_rank})" ) : _name ; } public bool IsKnown () { return RotationSpellbook . IsKnown ( _name , _rank ?? 1 ); } Change these lines in RotationSpell. I guess I accidentally messed this up when merging two frameworks. If you use Spell.NameInGame instead of _name, it should use the localized name. if ( spell . Spell . Name == "Shoot" && IsAutoRepeating ( "Shoot" )) { return true ; } //IsAutoRepeating should use spell.Name.NameInGame As far as I can tell, everything else already uses the localized name. There is also one more issue with something not localized (shouldn't matter too much): // this error is not found through casting or combatlog events because it's caused by the client checking IsSpellInRange when using CastSpellByName // we could technically execute this check ourselves in CombatLogUtil but usually the client-side range check (memory based GetDistance) is enough) and cheaper! // therefore we're listening to error messages and executing this check lazily if ( id == "UI_ERROR_MESSAGE" && ( args [ 0 ] == "Out of range." || args [ 0 ] == "You are too far away!" )) { RotationSpellVerifier . ClearIfOutOfRange (); } Also this should probably be reworked or use the non-Lua wRobot option: public static bool CastingSpell ( this WoWUnit unit , params string [] names ) { return RotationCombatUtil . ExecuteActionOnUnit ( unit , ( luaUnitId ) => { string luaString = $@ " local isCastingSpell = false ; local name = UnitCastingInfo ( "" { luaUnitId } "" ) if { LuaOrCondition ( names , "name" )} then isCastingSpell = true end return isCastingSpell ; "; return Lua . LuaDoString ( luaString ); }); } Edited June 17, 2020 by Matenia ---------------------------------------- Unknown _name = Spell . NameInGame 我自己无法修复。 期待您的更新 ---------------------------------------- TheSmokie There will be no updates for people who don't even own a wRobot license. Me telling you what to do to fix it was already generous. It's an incredibly easy fix in only 2 methods. ---------------------------------------- Stresse This Framework is abolutely amazing. Everyone who spend some time to understand how it works will enjoy the Possibilities with this! Thx Matenia for this awesome Piece of Code! ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/12802-official-wrobot-api-documentation/ TITLE: Official WRobot API Documentation ---------------------------------------------------------------------------------------------------- Matenia WRobot API Documentation Website :¬† https://wrobot.eu/byme/doc/ Offline documentation :¬† https://wrobot.eu/byme/doc/WRobot.chm (from Wotlk version, Updated the 01 February 2021) ¬† ¬† Unofficial documentation is available here ¬† ¬† ¬† ,¬†it is still very useful because it contains examples and descriptions that are not available in the official. ¬† ¬† ---------------------------------------- Droidz Amazing! ---------------------------------------- vodkalol This has been long awaited for! Thank you everyone for your dedicated work towards the project!¬† ---------------------------------------- Unknown Is exists doc for all variables in settings files? ---------------------------------------- Unknown Yes : https://wrobot.eu/byme/doc/html/AllMembers.T-wManager.wManagerSetting.htm https://wrobot.eu/byme/doc/html/AllMembers.T-wManager.wManagerGlobalSetting.htm https://wrobot.eu/byme/doc/html/AllMembers.T-robotManager.robotManagerGlobalSetting.htm ---------------------------------------- @ Droidz Normally Open Source / Community projects die over time. But @ Droidz is an exceptional person. Keeps building & doing his own thing. I like that a lot. I hope it means I can hack the bot exactly how I want. - (like, creating AI plugins to override the current too robotic movement patterns & reaction times currently, too static in short) Will be checking the API documentation now ü§ì ---------------------------------------- Unknown I must admit the documentation is pretty raw and I'm just a Python n00bo. Funny how working with AI (machine learning & deep learning) is relatively easy to get into as a new programmer starting out with Python. (a big amount of guides/tutorials) But when you get outside of the realm of user-friendly-ness & data-science and hit the classical programming world. You get hit by the reality shock of how programming always have been prior. And you kinda get into foster position and want to go back to the mainstream Python bubble you live in normally - where you can solve anything with Python (at least it feels like it, and there is a lot of truth to it) I think I will start out with tinkering with some of the plugins/fightclasses that is in .cs format. And maybe try explore how to de-compile some .dll files to figure out the C# syntax works and some code I can copy-paste for my own projects. Learning a new language is a lot to ask for, for a hobby project. My time would likely be better spent on building a next-level trading bot with AI instead üòï Time will show. But those who knows C#, C++, and the other language, with years of experience, can begin hacking the bot to the next level now üëç ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/15422-how-to-read-packets/ TITLE: How to read packets? ---------------------------------------------------------------------------------------------------- Unknown I would like to read outgoing wow packets, like this program https://github.com/tripleslash/wowscout Is it possible using wrobot? ---------------------------------------- Unknown Anything is possible, wrobot just uses C#, besides a massive API, Wrobot can run all .net code . Just takes time and understanding how to build it. With wrobot plug-in you can build your own internet browser if you really wanted. why do you wanna see out going packets? Besides warden , I can surely tell you that there’s nothing interesting . ---------------------------------------- @ Droidz not gonna lie, would be awesome if @ Droidz Add a Asm DetourHook class to wrobot so we can hook functions and have more control over wow. but i know he is using Break points and i dont know if having asm hook will mess with break points. @ Pudge i wrote my own packet sniffer for wow in c++ (its not public) if you want to message me, i can let you use a copy of it. ---------------------------------------- e Hi, I just want to check only the one packet (0x1CA), what allows server administration see the name and the username of your pc. I have a bypass, but i am not really sure that it works fine. Can it be used as a wrobot plugin? ---------------------------------------- Unknown So with wrobot plug-in, you’d have to use a detourhook using ASM, wow uses two different send data to server function. One is for public static and other is loaded when warden is loaded. I know that from wotlk below the server don’t get the pc username. For Cata and above I have no clue. ---------------------------------------- Unknown Hi, I'm sorry, but this cannot be implemented securely with a plugin. By default, WRobot should change the machine name (wotlk) (provided that the game is always launched from the Relogger if you want to hide all time the name of your machine). ---------------------------------------- @ Droidz @ Droidz You are correct, sorry i should of thought of this before i replied. So to make a plugin more secure, you would have to hook and spoof Memcheck and PageScan to make sure when they do check if something is detoured. that we send back the right data they seek. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/15433-matenias-humanmasterplugin-all-fightclasses-and-experimental-projects-for-later-expansions-including-a-quester/ TITLE: Matenia's HumanMasterPlugin, all Fightclasses and experimental projects for later expansions, including a Quester ---------------------------------------------------------------------------------------------------- Pudge | 2024-06-28T06:14:08Z Edit: If you send me a PM about this asking for free support, YOU WILL BE BLOCKED. I will NOT compile any of it for you. Do not PM me asking to buy or asking me to help you compile it. If you can't add the binaries to your build to compile it, it's not for you. Put in the effort to learn or ask someone else to do it for you.  The experimental project contains its own quester, own combat engine and own fightclasses using that combat engine. It was developed with 3.3.5a in mind and I tried to move it to Legion+ and 64 bit. None of it works in its current form. Git history may help. This also has a modified version of Reapler's WowDB. The fightclasses zip contains everything ever posted on here. It has HMP, my fightclasses etc. This works 100%, you just need to put your own WRobot binaries into the projects. I can't maintain the code anymore and at the moment it just costs me money. Everything has officially been abandoned. Servers will go down in June or July whenever my contract runs out.  Feel free to do with this code whatever you want and do as you please. This does NOT include turning it into paid products. I had a good run here on WRobot and hope at least the Wholesome team can make use of some of this. wrobot-experimental.zip wrobot-fightclasses.zip Edited June 28, 2024 by Matenia ---------------------------------------- aluba9527 Hello Schaka, I have been using your warrior vanilla profile for quite a few years now and it always worked fine for me. Thank you for developing thoses great plugins. I was wondering, since I don’t know how to compile anything or code. Can I still use the same plugin as I used them on their actuel DDL form? I hope the best for you. ---------------------------------------- Unknown You'll have to compile it yourself, removing the auth code. Alternatively, someone else will have to do it for you. The entire project code is there, it's as easy as loading it up in Visual Studio, removing the one line of authentication code and hitting build. Otherwise you and everyone else will lose access when the servers go down. It's a decision I had to make. I've been supporting these for 8 years, people got their money's worth. ---------------------------------------- Unknown hey schaka i have bought almost all your profiles. but i'm not good at code i don't know how to make these source code into .dll since your auth server will shut down soon. i'm afraid i can't enjoy your profect files without your help. can you just make these codes into .dll without auth system? thanks a lot! have a good day! ---------------------------------------- Unknown This is exactly what I tried with VisualStudio 2015 but Im getting a lot of error (syntax error) and a lot of warning about OutputPath. It's not as easy when I never created or programmed. Even I tried to recompile without any modification and it doesnt seem to work.   ---------------------------------------- @ Asan @ Asan WarriorVanilla.dll here is a build copy of @ Matenia Warrior Vanilla without Auth . ---------------------------------------- Unknown Ohhh thank you so much ! Just for my information, what is long to do that ? and wich soft did you use to compile? 😮 Asan, ---------------------------------------- @ Asan Each time I start Wrobot, the game insta crash with this modified fightclass  but if I try the old one, it still work for like a few minutes then stop. Would it be possible to keep authentification but keep it working until the next 1000 minutes ? ---------------------------------------- Unknown Hi Nax, could you please compile the HumanMasterPlugin, I would really appreciate it! ---------------------------------------- Unknown This is a great release. Thank you for the generosity. What version of studios was this compiled in? I'm getting mad errors, sadly. 2022  ---------------------------------------- 9zero6online  ---------------------------------------- Unknown Thank you for forwarding along that info! Visual Studio 2012 throws even more errors. :( ---------------------------------------- Unknown Are you using the recommended net framework? ---------------------------------------- Unknown Would you be able to release the Humanmasterplugin without the Auth? ---------------------------------------- Unknown +1 Would be awesome if someone could upload the altered Version 🙂  ---------------------------------------- Unknown It really not hard, if you are unable to do it yourself. you dont need nor deserve a copy. ---------------------------------------- piff813 Considering i paid for and own an actual copy of it, it aint very friendly of you to say i dont deserve something just because someone never coded before. we dont need that kind of attitude in this community when we should be helping eachother out.  Well Heres the Humanmasterplugin without Auth for all of those who " dont deserve it " HumanMasterPlugin.dll ---------------------------------------- @ Zer0 Bro, you're a legend. Thank you very much!!! ---------------------------------------- Unknown Does anyone could help me to compile the rogue profile for PvE ? I dont know how to do that but Im interesting to try this profile! ---------------------------------------- Unknown Is anyone able to remove auth from the FrostMageVanilla fight class? I bought this a while ago and it worked great, but now with the auth servers down i cannot use it. Thanks! ---------------------------------------- Unknown This profile is great, i bought it since 2021, i have bot to 60' 5 or 6 rogues! It looks very human like, i have never got reported using this profile! (i am very careful with many other factors thought) Unfortunately i am failing to compile any of this files on Visual studio 2022, i am getting flooded from errors 😞 ---------------------------------------- Unknown Well thank you for still trying. Im trying some free profile so far, its ok but not much... ---------------------------------------- Unknown Can someone compile and share the wotlk (3.3.5) fight class for PvE Ret Paladin? ---------------------------------------- Unknown If you'd like i can give it a try and see what you are doing wrong and compile it for you ---------------------------------------- Skemez here please, I hope this helps you. There are problems with Riposte but try it yourself CombatRogueVanilla_offen.dll ---------------------------------------- Unknown Thanks  guys! ---------------------------------------- @ Asan Hey do you have a rogue one by chance? ---------------------------------------- Unknown RogueCombatvanilla.dll ? ---------------------------------------- Unknown Same bro, just came back from massive break. Any luck on the rogue? ---------------------------------------- Unknown I don't understand what you want guys, I have already uploaded the Fight Class rouge here ---------------------------------------- Unknown Thank you I will try out 😄 ---------------------------------------- Unknown Schaka youre the best! You had by far the best Fightclasses! Can someone compile all of them please?  ---------------------------------------- Unknown I would also like to have some of this fightclasses compiled ... i downloaded visual studio asked chatgpt and stuff how to do it but when i try to build it there come 109 errors and i dont have a outputfile in bin/debug folder 😕  so i dont deserve it now or what? would be great if someone can compile all of them maybe? ---------------------------------------- Unknown Which line of code? I'll pay you to tell me since you said you won't help for free. ---------------------------------------- Unknown I also seem to be having this issue. ---------------------------------------- Unknown wtb AdvancedBattlegrounder 1.0.0 wotlk Battlegrounder.rar ---------------------------------------- Unknown anyone can compile the TBC druid fightclass? thanks a lot! ---------------------------------------- eweeharp AdvancedBattlegrounder.dll AdvancedBattlegrounder.pdb In case anyone needs this, I took the authentication code and compiled it. ---------------------------------------- eweeharp If anyone has more wotlk stuff, pass it here ---------------------------------------- Unknown why dont you make it free?  ---------------------------------------- tlynx How much more free than making the source available for everyone do you want it? I shared thousands of lines of code and years of work. How entitled do you have to be to ask for more? ---------------------------------------- Unknown can someone share frostmage pls nvm i compiled by myself, thanks for sharing all this!! gl ---------------------------------------- @ Matenia wasnt towars you @ Matenia  the guys post above me is what I was replying to. I thought he took your code and added a authenticator like he was selling it now ---------------------------------------- thegarbonzo For those able to compile the things where did you find VS2012? I have no issue going through the code and removing the Auth stuff but getting stuff to build in 2022 seems to be a headache. EDIT: I think I have figured most of it out in 2022 but for some reason it keeps trying to build to "F:\Games\***" when I dont have a F drive and I cant find anything pointing to that specific path anywhere. EDIT EDIT: I figured it out. If anyone needs help lmk I can walk you through the steps to get it to compile in VS2022   ---------------------------------------- Unknown Anyone can tell me how to compile a profile with Visual studio? Or if anyone have the warrior/human quester could share it with me? ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/15433-matenias-humanmasterplugin-all-fightclasses-and-experimental-projects-for-later-expansions-including-a-quester/?&page=2 TITLE: Matenia's HumanMasterPlugin, all Fightclasses and experimental projects for later expansions, including a Quester ---------------------------------------------------------------------------------------------------- Unknown Thanks  guys! ---------------------------------------- @ Asan Hey do you have a rogue one by chance? ---------------------------------------- Unknown RogueCombatvanilla.dll ? ---------------------------------------- Unknown Same bro, just came back from massive break. Any luck on the rogue? ---------------------------------------- Unknown I don't understand what you want guys, I have already uploaded the Fight Class rouge here ---------------------------------------- Unknown Thank you I will try out 😄 ---------------------------------------- Unknown Schaka youre the best! You had by far the best Fightclasses! Can someone compile all of them please?  ---------------------------------------- Unknown I would also like to have some of this fightclasses compiled ... i downloaded visual studio asked chatgpt and stuff how to do it but when i try to build it there come 109 errors and i dont have a outputfile in bin/debug folder 😕  so i dont deserve it now or what? would be great if someone can compile all of them maybe? ---------------------------------------- Unknown Which line of code? I'll pay you to tell me since you said you won't help for free. ---------------------------------------- Unknown I also seem to be having this issue. ---------------------------------------- Unknown wtb AdvancedBattlegrounder 1.0.0 wotlk Battlegrounder.rar ---------------------------------------- Unknown anyone can compile the TBC druid fightclass? thanks a lot! ---------------------------------------- eweeharp AdvancedBattlegrounder.dll AdvancedBattlegrounder.pdb In case anyone needs this, I took the authentication code and compiled it. ---------------------------------------- eweeharp If anyone has more wotlk stuff, pass it here ---------------------------------------- Unknown why dont you make it free?  ---------------------------------------- tlynx How much more free than making the source available for everyone do you want it? I shared thousands of lines of code and years of work. How entitled do you have to be to ask for more? ---------------------------------------- Unknown can someone share frostmage pls nvm i compiled by myself, thanks for sharing all this!! gl ---------------------------------------- @ Matenia wasnt towars you @ Matenia  the guys post above me is what I was replying to. I thought he took your code and added a authenticator like he was selling it now ---------------------------------------- thegarbonzo For those able to compile the things where did you find VS2012? I have no issue going through the code and removing the Auth stuff but getting stuff to build in 2022 seems to be a headache. EDIT: I think I have figured most of it out in 2022 but for some reason it keeps trying to build to "F:\Games\***" when I dont have a F drive and I cant find anything pointing to that specific path anywhere. EDIT EDIT: I figured it out. If anyone needs help lmk I can walk you through the steps to get it to compile in VS2022   ---------------------------------------- Unknown Anyone can tell me how to compile a profile with Visual studio? Or if anyone have the warrior/human quester could share it with me? ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/15457-hunter-fight-class/ TITLE: Hunter Fight Class ---------------------------------------------------------------------------------------------------- Unknown How do I force the bot to attack from a distance? I have set the range in the fight class and tried conditions like targetDitance > 10 but the bot keeps running up to the mob and hitting it in mele. ---------------------------------------- Unknown ççççç ---------------------------------------- Unknown up same problem ---------------------------------------- Unknown Also need to figure this out. Server I'm on, Hunter's auto shot is broken, so it reads it as melee. I just need it to cast one spell while standing in 1 spot. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/15464-isssue-of-using-one-plugin-for-different-wrobot-versions/ TITLE: isssue of using one plugin for different wrobot versions ---------------------------------------------------------------------------------------------------- Unknown Hello, I'm facing a problem where I can't use the same compiled plugin for different versions of wrobot, because the binaries from the references are not suitable. The bot just crashes, and I can't even figure out which method is causing this. I just wouldn’t want to make several projects that would have completely identical plugin code, except for binaries. The fact is that some compiled plugins with references to WOTLK binaries work without problems for TBC. Is there a way to determine which of the methods is not suitable for a particular version? I would like to get at least an exception thrown into the log, instead of crashing the program. ---------------------------------------- Unknown Hello, I'm not sure if this will work, but try adding a Try/Catch with a log in case of an error in the "Initialize" function (from IPlugin). Usually, it's the enums, so you can try to retrieve them from a String instead of a raw link: https://stackoverflow.com/questions/16100/convert-a-string-to-an-enum-in-c-sharp ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/15466-farmingignoreifplayernear/ TITLE: Farming.IgnoreIfPlayerNear ---------------------------------------------------------------------------------------------------- Unknown Hi! How to set IgnoreIfPlayerNear for farming state? In OnRunState event is good idea? ---------------------------------------- Unknown Hello, robotManager . Events . FiniteStateMachineEvents . OnRunState += ( engine , state , cancelEvent ) => { if ( state is wManager . Wow . Bot . States . Farming farmingState ) { farmingState . IgnoreIfPlayerNear = true ; } }; ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/15468-objectmanagergetwowgameobjectforfarmcount-0/ TITLE: ObjectManager.GetWoWGameObjectForFarm().Count() = 0 ---------------------------------------------------------------------------------------------------- Unknown Hi! What is underhood of ObjectManager.GetWoWGameObjectForFarm() ? After 10 hours herb&minerals harvesting I have Count() = 0 of that objects. Stop/restart solves the problem. ---------------------------------------- Unknown log entry: ObjectManager > Seems bugged, infinite loop ?, break ---------------------------------------- Unknown Hello, Nodes are probably blacklisted. Can you share full log file of bugged bot session. ---------------------------------------- Unknown No it's not blacklisted, I checked sources of ObjectManager.GetWoWGameObjectForFarm(): if (( woWGameObject . GOType == WoWGameObjectType . Chest || woWGameObject . GOType == WoWGameObjectType . Goober ) && woWGameObject . CanOpen ) and... woWGameObject . CanOpen property is false for all of my nodes after a couple a hours of gameplay. How could it be? temporary I solve my problem by addind node entry to wManagerSetting . CurrentSetting . ListHarvest according to Farming state sources. But what happens exactly? ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/15503-compilation-error-in-wrobot-unexpected-characters-need-help/ TITLE: Compilation error in wrobot: Unexpected characters $. Need help. ---------------------------------------------------------------------------------------------------- Unknown I am using the $@ method to include content in the string, but when I run Wrobot, it prompts "Unexpected characters $". Is it that Wrobot does not support compilation in this way? Or is there a problem with the code? Below is my code, thank ! public static void DeleteItems(string itemName, int leaveAmount = 0) { var itemQuantity = ItemsManager.GetItemCountByNameLUA(itemName) - leaveAmount; if (string.IsNullOrWhiteSpace(itemName) || itemQuantity <= 0) { return; } string luaToDelete = $@" local itemCount = {itemQuantity}; local deleted = 0; for b=0,4 do if GetBagName(b) then for s=1, GetContainerNumSlots(b) do local itemLink = GetContainerItemLink(b, s) if itemLink then local itemString = string.match(itemLink, ""item[%-?%d:]+""); local _, stackCount = GetContainerItemInfo(b, s); local leftItems = itemCount - deleted; if ((GetItemInfo(itemString) == ""{itemName}"") and leftItems > 0) then if stackCount <= 1 then PickupContainerItem(b, s); DeleteCursorItem(); deleted = deleted + 1; else if (leftItems > stackCount) then SplitContainerItem(b, s, stackCount); DeleteCursorItem(); deleted = deleted + stackCount; else SplitContainerItem(b, s, leftItems); DeleteCursorItem(); deleted = deleted + leftItems; end end end end end end end "; Lua.LuaDoString(luaToDelete); } ---------------------------------------- Unknown Hello, WRobot uses an older version of the C# compiler that does not support string interpolation with the '$' syntax for variables like {varname}. However, you can use '@' for multiline strings. ---------------------------------------- Unknown Thank you, I will try. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/15515-need-help-with-plugin/ TITLE: Need help with plugin ---------------------------------------------------------------------------------------------------- @ Droidz Hello, I'm trying do a simple plugin, which will auto buying food/water, because in my server (RU) don't work plugins, that already there are. So, can someone check my code and say, where did I mistakes? Because VS got me too many errors. I have to say, so I'm not C# programmer, I'm most of specalization on JS, and because of that, I can do many errors, I'm trying used for solve their ChatGPT, but it don't helping so much, so I need people's help. My code: using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using wManager.Wow.Helpers; using wManager.Wow.ObjectManager; using wManager.Plugin; using robotManager.Helpful; using robotManager.Products; using wManager.Wow.Enums; public class FoodWaterPlugin : IPlugin { private readonly List foodItems = new List { new ItemInfo(4540, 1, 5), new ItemInfo(4541, 5, 15), new ItemInfo(4542, 10, 20), new ItemInfo(4544, 15, 25), new ItemInfo(4601, 20, 30), new ItemInfo(8950, 25, 35), new ItemInfo(8076, 30, 40), new ItemInfo(4599, 35, 45), new ItemInfo(2287, 40, 50), new ItemInfo(8952, 45, 55), new ItemInfo(2679, 50, 60), new ItemInfo(2680, 55, 65), new ItemInfo(2681, 60, 70), new ItemInfo(2682, 65, 75), new ItemInfo(2684, 70, 75), new ItemInfo(2687, 75, 80), new ItemInfo(2683, 80, 80), new ItemInfo(2681, 55, 60), new ItemInfo(2685, 60, 65), new ItemInfo(3727, 65, 70), new ItemInfo(3726, 70, 75), new ItemInfo(3728, 75, 80), new ItemInfo(4594, 80, 80) }; private readonly List waterItems = new List { new ItemInfo(159, 1, 5), new ItemInfo(1179, 5, 15), new ItemInfo(1205, 15, 25), new ItemInfo(1708, 25, 35), new ItemInfo(1645, 35, 45), new ItemInfo(8766, 45, 55), new ItemInfo(28399, 55, 65), new ItemInfo(33044, 65, 75), new ItemInfo(27860, 75, 80), new ItemInfo(33445, 80, 80), new ItemInfo(3356, 10, 20), new ItemInfo(2287, 20, 30), new ItemInfo(27422, 30, 40), new ItemInfo(33176, 40, 50), new ItemInfo(33177, 50, 60), new ItemInfo(33178, 60, 70), new ItemInfo(33179, 70, 80), new ItemInfo(33180, 80, 80), new ItemInfo(40731, 80, 80), new ItemInfo(19999, 40, 50), new ItemInfo(5469, 15, 25), new ItemInfo(13923, 30, 40), new ItemInfo(13443, 60, 70) }; public void Initialize() { Logging.Write("[FoodWaterPlugin] Initialized."); EventsLua.AttachEventLua("UNIT_SPELLCAST_SUCCEEDED", (s, e) => OnSpellCastSucceeded(s, e)); CheckAndBuyFoodWater(); } public void Dispose() { Logging.Write("[FoodWaterPlugin] Disposed."); EventsLua.DetachEventLua("UNIT_SPELLCAST_SUCCEEDED", (s, e) => OnSpellCastSucceeded(s, e)); } public void Settings() { } private void OnSpellCastSucceeded(string luaEvent, List args) { if (args[0] == "player") { CheckAndBuyFoodWater(); } } private void CheckAndBuyFoodWater() { if (ObjectManager.Me.IsDead || ObjectManager.Me.InCombatFlagOnly) return; int foodCount = GetItemCount(GetBestFood()); int waterCount = GetItemCount(GetBestWater()); if (foodCount < 5 || waterCount < 5) { GoToVendorAndBuy(); } } private uint GetBestFood() { int playerLevel = ObjectManager.Me.Level; return foodItems.Where(item => item.MinLevel <= playerLevel && item.MaxLevel >= playerLevel) .OrderByDescending(item => item.MinLevel) .Select(item => item.Entry) .FirstOrDefault(); } private uint GetBestWater() { int playerLevel = ObjectManager.Me.Level; return waterItems.Where(item => item.MinLevel <= playerLevel && item.MaxLevel >= playerLevel) .OrderByDescending(item => item.MinLevel) .Select(item => item.Entry) .FirstOrDefault(); } private int GetItemCount(uint itemId) { return ItemsManager.GetItemCountByIdLUA((int)itemId); } private void GoToVendorAndBuy() { // Ищем ближайшего вендора WoWUnit vendor = ObjectManager.GetNearestWoWUnit(ObjectManager.GetWoWUnitVendor()).FirstOrDefault(); if (vendor != null) { // Идем к вендору и покупаем MovementManager.Go(PathFinder.FindPath(vendor.Position)); vendor.Target(); Interact.InteractGameObject(vendor.GetBaseAddress); Lua.LuaDoString($"BuyItem({GetBestFood()}, 20)"); Lua.LuaDoString($"BuyItem({GetBestWater()}, 20)"); AddToDoNotSell(GetBestFood().ToString()); AddToDoNotSell(GetBestWater().ToString()); } } private void AddToDoNotSell(string itemId) { if (!ItemsManager.GetDoNotSellList().Contains(itemId)) { ItemsManager.GetDoNotSellList().Add(itemId); } } private void RemoveFromDoNotSell(string itemId) { if (ItemsManager.GetDoNotSellList().Contains(itemId)) { ItemsManager.GetDoNotSellList().Remove(itemId); } } private class ItemInfo { public uint Entry { get; } public int MinLevel { get; } public int MaxLevel { get; } public ItemInfo(uint entry, int minLevel, int maxLevel) { Entry = entry; MinLevel = minLevel; MaxLevel = maxLevel; } } } I'm trying do a little database with item, which bot have to buy, when they're gone, also add to plugin check my lvl and check lvl item, swap then when he's had bigger lvl, also add food/drinks to don't sell list and delete then they become low lvl. I hope for your help, if you help me with this, I upload this plugin for everyone, who have same problems and they can't use HMP or Wholesome vendor... @ Droidz ---------------------------------------- Unknown Hi, Your code has several syntax problems (which I fixed), and some logic problems (which I did not correct), but I gave advice in the code comments (I did not test the code) : using System . Collections . Generic ; using System . Linq ; using wManager . Wow . Helpers ; using wManager . Wow . ObjectManager ; using wManager . Plugin ; using robotManager . Helpful ; using wManager . Wow . Bot . States ; public class Main : IPlugin { private readonly List < ItemInfo > foodItems = new List < ItemInfo > { new ItemInfo ( 4540 , 1 , 5 ), new ItemInfo ( 4541 , 5 , 15 ), new ItemInfo ( 4542 , 10 , 20 ), new ItemInfo ( 4544 , 15 , 25 ), new ItemInfo ( 4601 , 20 , 30 ), new ItemInfo ( 8950 , 25 , 35 ), new ItemInfo ( 8076 , 30 , 40 ), new ItemInfo ( 4599 , 35 , 45 ), new ItemInfo ( 2287 , 40 , 50 ), new ItemInfo ( 8952 , 45 , 55 ), new ItemInfo ( 2679 , 50 , 60 ), new ItemInfo ( 2680 , 55 , 65 ), new ItemInfo ( 2681 , 60 , 70 ), new ItemInfo ( 2682 , 65 , 75 ), new ItemInfo ( 2684 , 70 , 75 ), new ItemInfo ( 2687 , 75 , 80 ), new ItemInfo ( 2683 , 80 , 80 ), new ItemInfo ( 2681 , 55 , 60 ), new ItemInfo ( 2685 , 60 , 65 ), new ItemInfo ( 3727 , 65 , 70 ), new ItemInfo ( 3726 , 70 , 75 ), new ItemInfo ( 3728 , 75 , 80 ), new ItemInfo ( 4594 , 80 , 80 ) }; private readonly List < ItemInfo > waterItems = new List < ItemInfo > { new ItemInfo ( 159 , 1 , 5 ), new ItemInfo ( 1179 , 5 , 15 ), new ItemInfo ( 1205 , 15 , 25 ), new ItemInfo ( 1708 , 25 , 35 ), new ItemInfo ( 1645 , 35 , 45 ), new ItemInfo ( 8766 , 45 , 55 ), new ItemInfo ( 28399 , 55 , 65 ), new ItemInfo ( 33044 , 65 , 75 ), new ItemInfo ( 27860 , 75 , 80 ), new ItemInfo ( 33445 , 80 , 80 ), new ItemInfo ( 3356 , 10 , 20 ), new ItemInfo ( 2287 , 20 , 30 ), new ItemInfo ( 27422 , 30 , 40 ), new ItemInfo ( 33176 , 40 , 50 ), new ItemInfo ( 33177 , 50 , 60 ), new ItemInfo ( 33178 , 60 , 70 ), new ItemInfo ( 33179 , 70 , 80 ), new ItemInfo ( 33180 , 80 , 80 ), new ItemInfo ( 40731 , 80 , 80 ), new ItemInfo ( 19999 , 40 , 50 ), new ItemInfo ( 5469 , 15 , 25 ), new ItemInfo ( 13923 , 30 , 40 ), new ItemInfo ( 13443 , 60 , 70 ) }; public void Initialize () { Logging . Write ( "[FoodWaterPlugin] Initialized." ); /* Should better to do run your code in OnBeforeCheckIfNeedToRunState event of ToTown state robotManager.Events.FiniteStateMachineEvents.OnBeforeCheckIfNeedToRunState += (engine, state, cancelable) => { if (Conditions.InGameAndConnectedAndAliveAndProductStartedNotInPause && !Conditions.IsAttackedAndCannotIgnore && state is ToTown) { CheckAndBuyFoodWater(); } }; */ EventsLuaWithArgs . OnEventsLuaStringWithArgs += OnSpellCastSucceeded ; CheckAndBuyFoodWater (); } public void Dispose () { EventsLuaWithArgs . OnEventsLuaStringWithArgs -= OnSpellCastSucceeded ; Logging . Write ( "[FoodWaterPlugin] Disposed." ); } public void Settings () { } private void OnSpellCastSucceeded ( string luaEvent , List args ) { /* Maybe should be more strict with conditions if (!Conditions.InGameAndConnectedAndAliveAndProductStartedNotInPause || Conditions.IsAttackedAndCannotIgnore) return; */ if ( luaEvent == "UNIT_SPELLCAST_SUCCEEDED" && args . Count > 0 && args [ 0 ] == "player" ) { CheckAndBuyFoodWater (); } } private void CheckAndBuyFoodWater () { if ( ObjectManager . Me . IsDead || ObjectManager . Me . InCombatFlagOnly ) return ; int foodCount = GetItemCount ( GetBestFood ()); int waterCount = GetItemCount ( GetBestWater ()); if ( foodCount < 5 || waterCount < 5 ) { GoToVendorAndBuy (); } } private uint GetBestFood () { var playerLevel = ObjectManager . Me . Level ; return foodItems . Where ( item => item . MinLevel <= playerLevel && item . MaxLevel >= playerLevel ) . OrderByDescending ( item => item . MinLevel ) . Select ( item => item . Entry ) . FirstOrDefault (); } private uint GetBestWater () { var playerLevel = ObjectManager . Me . Level ; return waterItems . Where ( item => item . MinLevel <= playerLevel && item . MaxLevel >= playerLevel ) . OrderByDescending ( item => item . MinLevel ) . Select ( item => item . Entry ) . FirstOrDefault (); } private int GetItemCount ( uint itemId ) { return ItemsManager . GetItemCountByIdLUA ( itemId ); } private void GoToVendorAndBuy () { /* Should use default totown state, don't forget to add vendor to npc db var foodName = ItemsManager.GetNameById(GetBestFood()); var waterName = ItemsManager.GetNameById(GetBestWater()); wManager.wManagerSetting.CurrentSetting.TryToUseBestBagFoodDrink = false; wManager.wManagerSetting.CurrentSetting.FoodAmount = 20; wManager.wManagerSetting.CurrentSetting.DrinkAmount = 20; wManager.wManagerSetting.CurrentSetting.FoodName = foodName; wManager.wManagerSetting.CurrentSetting.DrinkName = waterName; ToTown.ForceToTown = true; */ // Ищем ближайшего вендора WoWUnit vendor = ObjectManager . GetNearestWoWUnit ( ObjectManager . GetWoWUnitVendor ()); if ( vendor != null ) { // Идем к вендору и покупаем MovementManager . Go ( PathFinder . FindPath ( vendor . Position )); Interact . InteractGameObject ( vendor . GetBaseAddress ); Lua . LuaDoString ( $ "BuyItem({GetBestFood()}, 20)" ); Lua . LuaDoString ( $ "BuyItem({GetBestWater()}, 20)" ); AddToDoNotSell ( GetBestFood ()); AddToDoNotSell ( GetBestWater ()); } } private void AddToDoNotSell ( uint itemId ) { var name = ItemsManager . GetNameById ( itemId ); if (! string . IsNullOrWhiteSpace ( name ) && ! wManager . wManagerSetting . CurrentSetting . DoNotSellList . Contains ( name )) { wManager . wManagerSetting . CurrentSetting . DoNotSellList . Add ( name ); } } private void RemoveFromDoNotSell ( uint itemId ) { var name = ItemsManager . GetNameById ( itemId ); if (! string . IsNullOrWhiteSpace ( name ) && wManager . wManagerSetting . CurrentSetting . DoNotSellList . Contains ( name )) { wManager . wManagerSetting . CurrentSetting . DoNotSellList . Remove ( name ); } } private class ItemInfo { public uint Entry { get ; } public int MinLevel { get ; } public int MaxLevel { get ; } public ItemInfo ( uint entry , int minLevel , int maxLevel ) { Entry = entry ; MinLevel = minLevel ; MaxLevel = maxLevel ; } } } ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/15519-matenies-hmp/ TITLE: Matenies HMP ---------------------------------------------------------------------------------------------------- Unknown Hello can someone confirm that Auto Equip better items from Matenies HMP works on vanilla 1.12.1, since it doesnt work for me (everlok server). Thx ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/15572-disconnect-movementmanager-waypoint-timed-out/ TITLE: Disconnect = > [MovementManager] Waypoint timed out ---------------------------------------------------------------------------------------------------- Unknown Hello guys, I'm looking for a way to handle an exception. After disconnecting, I get "[MovementManager] Waypoint timed out", after Relog MovementManager changes List CurrentPath  and the route will consist of two points, my position => last position List CurrentPathOrigine. I'm looking for a way to prevent this, so that the route remains CurrentPathOrigine after Relog. I have tried many things but I cannot find a reliable method that does not fail. Calling Stop Move(); fires after Relog when movement starts, then the route will be restored, but I'm looking for a way to handle this before entering the world or prevent Waypoint timed out. I would be glad to receive any ideas. Module: Quester, problems arise only when moving on the ground, Is Hotspots = false. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/15591-about-how-to-use-offmesh-in-scripts/ TITLE: About how to use offmesh in scripts ---------------------------------------------------------------------------------------------------- Unknown Why did I add an offmesh to my copy of Stratholme on a private server (3.3.5a) but the bot doesn't seem to use the offmesh path I added, it will only automatically switch back and forth between the two obstacles to different try points (there is a door in the middle, can't be crossed) Please help me! ---------------------------------------- Unknown Hello, try to use a lower value in "Cost per yard" and activate the option "Can be used even when path success". ---------------------------------------- Unknown Okay, thank you, I'll give it a try! By the way, is Offmesh only available in  key mode? I tested it in Trial mode and it doesn't work. Also, I don't really understand the usefulness of adding offmeshConnectiongs under the Profile Editor, it doesn't seem to be saved in my custom script after adding it. ---------------------------------------- Droidz @ Droidz ---------------------------------------- Unknown To add offmesh Connectionsin your profile your should use "Easy profiles creator" (tab "Product settings" > "Tools" menu > "OffMesh Connections". You can also add it in the tab "Tools" > "OFFMESH CONNECTIONS" (this option will fix path for all products). https://wrobot.eu/forums/topic/5283-offmesh-connections/ ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/15621-about-the-request-returned-by-the-plug-in-function/ TITLE: About the request returned by the plug-in function ---------------------------------------------------------------------------------------------------- Unknown Hello , I would like to ask which function returns the value of this data ? P athF inder. F indP ath M ethod ( V ector3, V ector3) d oesn' t s eem t o g et i t c orrectly. [N] 20:38:56 - [Path-Finding] FindPath from -6846.073 ; -971.8453 ; -268.6102 ; "None" to -6885.529 ; -1011.348 ; -272.0796 ; "None" (Kalimdor) [N] 20:38:56 - [Path-Finding] Path Count: 2 (55.94048y, 0ms) [N] 20:38:57 - [Path-Finding] FindPath from -6846.073 ; -971.8453 ; -268.6102 ; "None" to -6881.919 ; -1010.978 ; -271.9863 ; "None" (Kalimdor) [N] 20:38:57 - [Path-Finding] Path Count: 2 (53.17628y, 0ms) [N] 20:38:58 - [Path-Finding] FindPath from -6846.073 ; -971.8453 ; -268.6102 ; "None" to -6878.355 ; -1010.612 ; -271.5858 ; "None" (Kalimdor) [N] 20:38:58 - [Path-Finding] Path Count: 2 (50.53531y, 0ms) [N] 20:38:59 - [Path-Finding] FindPath from -6846.073 ; -971.8453 ; -268.6102 ; "None" to -6874.79 ; -1010.245 ; -270.9844 ; "None" (Kalimdor) [N] 20:38:59 - [Path-Finding] Path Count: 8 (81.74323y, 0ms) [N] 20:39:06 - [Path-Finding] FindPath from -6846.073 ; -971.8453 ; -268.6102 ; "None" to -6878.156 ; -1013.076 ; -271.4738 ; "None" (Kalimdor) [N] 20:39:06 - [Path-Finding] Path Count: 8 (85.87653y, 0ms) [N] 20:39:07 - [Path-Finding] FindPath from -6846.073 ; -971.8453 ; -268.6102 ; "None" to -6881.286 ; -1014.815 ; -271.9715 ; "None" (Kalimdor) [N] 20:39:07 - [Path-Finding] Path Count: 2 (55.65697y, 0ms) [N] 20:39:08 - [Path-Finding] FindPath from -6846.073 ; -971.8453 ; -268.6102 ; "None" to -6884.417 ; -1016.554 ; -272.1219 ; "None" (Kalimdor) [N] 20:39:08 - [Path-Finding] Path Count: 2 (59.00379y, 0ms) ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/15642-interrupt-pvp-earth-shock/ TITLE: Interrupt PVP Earth Shock ---------------------------------------------------------------------------------------------------- Unknown I need an interrupt script for my resto shaman. Something simple like interrupting a set target focus with Earth Shock. I tried some things but couldn't get anything to work. If anyone can help or give some guidance I would be grateful. Also, what profile should I then load into Wrobot itself? I also ask ChatGTP for lua but dont think this is correct if some u guys can check it for me rly quick ! local interruptSpells = {     ["Healing Touch"] = true,     ["Tranquility"] = true,     ["Regrowth"] = true,     ["Cyclone"] = true,     ["Frostbolt"] = true,     ["Polymorph"] = true,     ["Howl of Terror"] = true,     ["Fear"] = true,     ["Drain Life"] = true,     ["Holy Light"] = true,     ["Flash of Light"] = true,     ["Greater Heal"] = true,     ["Flash Heal"] = true,     ["Mind Blast"] = true,     ["Smite"] = true,     ["Lesser Healing Wave"] = true } local frame = CreateFrame("Frame") frame:SetScript("OnUpdate", function()     local name, _, _, startTimeMS, endTimeMS, _, _, notInterruptible = UnitCastingInfo("focus")          if name and interruptSpells[name] and not notInterruptible then         local currentTime = GetTime() * 1000         local castProgress = (currentTime - startTimeMS) / (endTimeMS - startTimeMS) * 100         if castProgress >= 5 and castProgress <= 10 then             CastSpellByName("Earth Shock", "focus")             print("Interrupted " .. name .. " with Earth Shock at " .. math.floor(castProgress) .. "% cast progress.")         end     end end) ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/15645-can-wrobot-detect-invisibility-player/ TITLE: Can Wrobot detect invisibility player? ---------------------------------------------------------------------------------------------------- @ Droidz @ Droidz Actully, in the titile my question. Can Wrobot see people, who sitting in insivibility? ---------------------------------------- Unknown UP ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/15656-how-freeze-bot-while-gatherer/ TITLE: How freeze bot while gatherer ---------------------------------------------------------------------------------------------------- @ Droidz Hello, in general, the essence is. That I am trying to write some plugin, which should freeze the bot when players appear nearby (it is important to not take a pause, namely stop bot, don't move). The problem is that even if I use the option with the waiting cycle of Thread.sleep (1000); The bot still ignores this and moves along the route to collect. I tried to use different methods, but it does not help. Is it possible somehow, during the Gatherer profile, stop the bot without pause? @ Droidz I need help, because only you know, how Wrobot working... How I understood, Gatherer have high priority and if bot is not pause, it's moving along the route. Maybe is there way to stop this? ---------------------------------------- Unknown Hello, You can execute your code in the product thread (gatherer) using, for example, the "OnBeforeCheckIfNeedToRunState" event. Sample : https://wrobot.eu/forums/topic/15429-plugin-for-robotsresponse-to-player-attack/?&_rid=1#findComment-69230 ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/15690-hunter-fight-class-chimera-shot-only/ TITLE: Hunter Fight Class - Chimera Shot Only ---------------------------------------------------------------------------------------------------- Unknown Hello, so I am trying to create a fight class that will allow my hunter to stay in place and just target 2 specific npcs (within range) and cast chimera shot on them. Something like the video I made (apologies if the screen is wonky, still learning OBS Studio) I added the Chimera Shot as the only spell to use. 1 second timer, as there is no CD for it on this server, so it just has that default 1 second before casting again. I used the following line of code that I got off of google. My intention was to get the character to stand in one spot. Which it seems to have worked, and also added a code to force them to go back to the initial spot if moved, which works. However, they do not attack anything. wManager.Events.MovementEvents.OnMovementPulse += (points, cancelable) => { cancelable.Cancel = true; }; wManager.Events.MovementEvents.OnMoveToPulse += (point, cancelable) => { cancelable.Cancel = true; }; if (ObjectManager.Me.Position.DistanceTo(position) > 1 ) { // Move } EDIT : For the video, skip to 00:08 seconds. EDIT 2 : Added a video which shows someone else using a bot to do what I'm trying to do. The following error messages is what I received: test2.mp4 Mob Farm.mp4 ---------------------------------------- Unknown post the code. ---------------------------------------- Unknown What do you mean? The code that I used? I did. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/15694-how-can-i-summon-field-repair-bot-75b-to-sell-junk-and-repair-gear/ TITLE: How can I summon "Field Repair Bot 75B" to sell junk and repair gear? ---------------------------------------------------------------------------------------------------- Skemez I got a companion called "Field Repair Bot 75B" , which works like a simple blacksmith —it sells junk and repairs gear. I want to be able to summon it whenever my bags are full so I can sell trash without having to walk back to town every time. Plus, it’d be great to repair my gear. Game Version: 1.13 Vanilla Dev Info: (Id found: 46457 , Name found: , NameInGame found: Field Repair Bot 75B, Know = True, IsSpellUsable = True, IsInActionBar = True)) ---------------------------------------- Unknown i Also would like to know how to summon this aswell instead of running back to town. ---------------------------------------- @ Droidz @ Droidz You can help us please. ---------------------------------------- Unknown Hello, When you use this spell, does an NPC or GameObject appear (if so, could you provide me with the entry ID)? Or do you directly get the sales window? ---------------------------------------- Unknown It's a spell that, when used, summons an NPC. When clicked, that NPC opens the blacksmith window, which allows you to sell and repair items. Spell ID: 46457 NPC ID: (Entry: 50041 ) ---------------------------------------- fkrausewow Hello, Try with this plugin Main.cs : using System . Threading ; using wManager . Wow . Class ; using wManager . Wow . Enums ; using wManager . Wow . Helpers ; public class Main : wManager . Plugin . IPlugin { const int SpellId = 46457 ; const int NpcId = 50041 ; public void Initialize () { robotManager . Events . FiniteStateMachineEvents . OnRunState += ( engine , state , cancelable ) => { if ( state is wManager . Wow . Bot . States . ToTown ) { MovementManager . StopMove (); new Spell ( SpellId ). Launch ( true ); Thread . Sleep ( 5000 ); var npc = new Npc { ContinentId = ( ContinentId ) Usefuls . ContinentId , Name = "Field Repair Bot 75B" , Entry = NpcId , Position = wManager . Wow . ObjectManager . ObjectManager . Me . Position , Type = Npc . NpcType . Repair , Faction = Npc . FactionType . Neutral }; NpcDB . ListNpc . RemoveAll ( n => n . Active && n . Entry == npc . Entry && n . Type == npc . Type && n . ContinentId == npc . ContinentId && n . CurrentProfileNpc ); NpcDB . AddNpc ( npc , false , true ); } }; } public void Dispose () { } public void Settings () { } } ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/15699-get-the-unit-in-40yards-with-skull-marker/ TITLE: Get The unit in 40yards with skull marker ---------------------------------------------------------------------------------------------------- Unknown Is there anychance to check and get the unit in 40yards range with skull marker ? ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/15722-hello-everyone-i-have-a-question-and-need-your-assistance-thank-you/ TITLE: Hello everyone, I have a question and need your assistance. Thank you. ---------------------------------------------------------------------------------------------------- Unknown if the character has not moved for a period of time, switch the chat channel to General or World and send a "1".     How should I write this code? I hope you can all provide more help. Thank you again. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/3573-snippets-c-codes-for-fight-classes/ TITLE: Snippets C# codes for Fight Classes ---------------------------------------------------------------------------------------------------- Dlarge Snippets C# codes for Fight Classes ps: Feel free to share your tips on this post. If your message is poorly presented or contains a question, it will be deleted. ---------------------------------------- stweily Check if character/target have or not buff/debuff by spell id: Use condition type "C Sharp Code" with Value: wManager . Wow . ObjectManager . ObjectManager . Me . HaveBuff ( 69369 ) Replace " 69369 " by your buff/debuff ID. Replace " Me " by " Target " to check buff/debuff on current target (you can also replace " Me " by " Pet " to check on the pet). Add " ! " before this code to check if not have (de)buff ( http://www.tutorialspoint.com/csharp/csharp_logical_operators.htm ). To get list of player/target (de)buff id, you can go to tab "Tools" > "Development Tools" > (if you want check your target (de)buff select npc in game) > click on "Player/target buff/debuff". ---------------------------------------- Bear T.O.E. Check if character/target buff/debuff stack count by spell id: Use condition type "C Sharp Code" with Value: wManager . Wow . ObjectManager . ObjectManager . Me . BuffStack ( 44544 ) >= 1 Replace " 44544 " by your buff/debuff ID. Replace " Me " by " Target " to check buff/debuff on current target (you can also replace " Me " by " Pet " to check on the pet). ">= 1" check if stack count is "Bigger or Equal at 1", you can replace "1" by required stack count. You can also replace ">=" by "<=" to check if "Smaller or Equal", or by "==" to check if "Equal" - http://www.tutorialspoint.com/csharp/csharp_relational_operators.htm ). To get list of player/target (de)buff id, you can go to tab "Tools" > "Development Tools" > (if you want check your target (de)buff select npc in game) > click on "Player/target buff/debuff". ---------------------------------------- Razzue Check character/target buff/debuff time left by spell id: Use condition type "C Sharp Code" with Value: wManager . Wow . ObjectManager . ObjectManager . Me . BuffTimeLeft ( new List { 69369 }) >= 1000 Replace " 69369 " by your buff/debuff ID. Replace " Me " by " Target " to check buff/debuff on current target (you can also replace " Me " by " Pet " to check on the pet). ">= 1000" check if time left is "Bigger or Equal at 1000 millisecond", you can replace "1000" by required time left in millisacond. You can also replace ">=" by "<=" to check if "Smaller or Equal", or by "==" to check if "Equal" - http://www.tutorialspoint.com/csharp/csharp_relational_operators.htm ). To get list of player/target (de)buff id, you can go to tab "Tools" > "Development Tools" > (if you want check your target (de)buff select npc in game) > click on "Player/target buff/debuff". ---------------------------------------- Unknown If I use this, the time left is always zero. The development Tools output also shows: PLAYER Buff/Debuff: Retribution Aura: ID=7294, Stack=1, TimeLeft=0 ms, Owner=0 Blessing of Might: ID=19834, Stack=1, TimeLeft=0 ms, Owner=0 Seal of the Crusader: ID=20162, Stack=1, TimeLeft=0 ms, Owner=0 ---------------------------------------- Unknown Funny I recently came back after a couple of months off and had to remove the TimeLeft check in my cc because it would always be 0. Thought the bug was on my side. Using vanilla. ---------------------------------------- Unknown I am using Vanilla too. ---------------------------------------- Unknown ... vanilla doesn't have a timer on buffs/debuffs, with the exception of your own. But they don't fall under the regular aura API so you have to use Lua to get specific timers. ---------------------------------------- Unknown need to calculate number of opponents within 8 yards of current target . any tips? ---------------------------------------- Unknown if ( ObjectManager . GetWoWUnitAttackables (). Any ( x => x . Position . DistanceTo ( ObjectManager . Me . Position ) < 20 )) { MovementManager . StopMove (); Fight . StartFight ( ObjectManager . GetWoWUnitAttackables (). OrderBy ( x => x . Position . DistanceTo ( ObjectManager . Me . Position )). FirstOrDefault (). Guid ); } ---------------------------------------- Unknown so, if(ObjectManager.GetWoWUnitAttackables().Any(x=> x.Position.DistanceTo(ObjectManager.Target.Position) <= 8 )) should work? ---------------------------------------- Unknown Yeah ---------------------------------------- TheSmokie WoWUnit Extension "IsAutoAttacking" ( WOTLK ) /// /// Gets the flag if the unit is auto attacking. /// /// Returns true if the unit is auto attacking, otherwise false. public static bool IsAutoAttacking ( this WoWUnit instance ) { // Read bool result = Memory . WowMemory . Memory . ReadBoolean ( address : instance . GetBaseAddress + ( uint ) 0xA20 ); // Return return result ; } I'm not sure about the other extension offsets. ---------------------------------------- Unknown Is there any snippets for having more than 1 target? I'd like to use Swipe in AoE 2+ targets and Shred in single target ---------------------------------------- Unknown You can check this out, really good Base for a Fightclass! https://github.com/Schaka/wRobotFightclassFrameworkEnhanced ---------------------------------------- Unknown I was more looking for something implemented into the wrobot api itself so I wouldn't have to rewrite my whole fight class sorry, but that looks real nice! Maybe there's something I can use with ObjectManager like unit count that's in range of me or something? ---------------------------------------- Unknown UnitExtension: /// /// Gets the units around our unit in the given range. /// /// The range we are looking in. /// The object type we are looking for. /// Returns a list of units if we found one, otherwise a empty list. public static IEnumerable < WoWUnit > GetAttackableUnits ( this WoWUnit instance , int range , WoWObjectType objectType = WoWObjectType . Unit ) { // Get units IEnumerable < WoWUnit > results = ObjectManager . GetObjectWoWUnit (). Where ( u => u . Type == objectType && u . IsAlive && u . MaxHealth > 500 && ( u . Position . DistanceTo2D ( instance . Position ) <= range ) && u . IsAttackable && ! TraceLine . TraceLineGo ( u . Position )); // Return return results ; } Sample: bool useSwipe = ( ObjectManager . Me . GetAttackableUnits ( 5 ). Count () >= 3 ); ---------------------------------------- Unknown Thanks for this, seems way more neat than what I have going on at the min. Another issue I've ran into though is when there's more than 1 feral in the group it doesn't keep up rake anymore since it can see his rake debuff on the boss. Is there any way to make it use my personal applied debuffs rather than everyones? Here's my rake snippet: // Rake if (Rake.KnownSpell && Rake.IsSpellUsable && Rake.IsDistanceGood && !ObjectManager.Target.HaveBuff(9904) && ObjectManager.Target.BuffTimeLeft(new List { 9904 }) < 1000) { Rake.Launch(); Lua.LuaDoString(@"dRotationFrame.text:SetText(""Casting Rake"")"); return; } ---------------------------------------- Unknown You can check owners. Either use an IDE or check documentation on what Auras on enemy provide in terms of attributes/methods ---------------------------------------- Unknown (Csharp) Return Deadly Postion Stack count. public static int ReturnDeadlyPosionStacks { get { return Lua . LuaDoString (@ " local DeadlyPoison = { 'Deadly Poison' , 'Deadly Poison II' , 'Deadly Poison III' , 'Deadly Poison IV' , 'Deadly Poison V' , 'Deadly Poison VI' , 'Deadly Poison VII' , 'Deadly Poison VIII' , 'Deadly Poison IX' } local DeadlyPoisonStackCount = 0 ; for Poison = 1 , #DeadlyPoison do for i = 1 , 20 do local name , _ , _ , count = UnitDebuff ( 'target' , i ); if name and string . find ( name , DeadlyPoison [ Poison ]) then DeadlyPoisonStackCount = count ; end end end return DeadlyPoisonStackCount ; "); } } ---------------------------------------- Pudge (Csharp) - return all the Glyph a player has. private static List Glyphs() { var GlyphNames = @" local Index = {} for i = 1, GetNumGlyphSockets() do local id = select(3, GetGlyphSocketInfo(i)); if id ~= nil then local GlyphName = GetSpellInfo(id); tinsert(Index, GlyphName); end end return unpack(Index); "; return Lua.LuaDoString >(GlyphNames); } or if people do not wanna use .Contain in a list format. here is a boolen. private static bool Glyphs ( string GlyphNum ) { var GlyphNames = $@ " for i = 1 , GetNumGlyphSockets () do local id = select ( 3 , GetGlyphSocketInfo ( i )); if id ~= nil then local GlyphName = GetSpellInfo ( id ); if GlyphName and string . find ( GlyphName , "" { GlyphNum } "" ) return true ; break ; end end end return false ; "; return Lua . LuaDoString ( GlyphNames ); } ---------------------------------------- Unknown Can you share all the libraries in a list? ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/7329-avvis-c-tips-tricks-with-helpful-code-snippets/ TITLE: Avvi's C# Tips & Tricks with Helpful Code Snippets ---------------------------------------------------------------------------------------------------- @Droidz | 2017-12-30T21:00:34Z Hi all, I figured I'd post some things that I have learned during my time of developing in C#. Perhaps some of this is obvious for some of the more experienced WRobot C# writers, but for me, I had to do a lot of forum searching and experimenting to make progress on any of my work. How do I get started? Please see this post by @Droidz How can I see what Functions are available to me in the WRobot API? I recommend using some sort of decompiler in order to see what functions are available in the WRobot API. That is, use something such as dotPeek from jetbrains. See this URL: https://www.jetbrains.com/decompiler/ . Once you have this downloaded, open  the WRobot Binaries located in the (C:\WRobot\Bin) folder in dotPeek. I cannot even begin to explain how many times the recompiled helped me find useful things I could re-use. As a quick tip, I would suggest taking a look at the wManager.wManager.Wow.Helpers functions that are available. Anything listed as public static will be available to use from a Plugin/Profile/Fightclass etc. What if WRobot doesn't have an available function that I will need? WRobot doesn't have everything instantly available, so you may need to resort to using some Lua Functions to get information back from the WoW Client. An example of this that I ran into at some point was getting the number of Character Macros someone has.. Of course this is very specific, but please bear with me for the sake of this example :). WoW Lua Reference: http://wowprogramming.com/docs/api_categories Using Lua in C#: This snippet will return a List of integers and set the C# variable numberOfMacros  equal to the returned list of the DoString function. To be more specific, it will provide a list of the number of Global account Macros , and the number of Personal Character Macros. var numberOfMacros = Lua . LuaDoString < List >( "return numCharacterMacros" ); The below will return just the number Character Macros someone has. If you need a specific variable from a Lua Function, then do the following: var numPersonalMacros = Lua . LuaDoString ( "local numAccountMacros, numCharacterMacros = GetNumMacros(); return numCharacterMacros" ); The above snippet will set the C# variable numPersonalMacros equal to numCharacterMacros from the lua return value. Using a Variable in the Lua.LuaDoString. The below will return the text body of the macro that has the id of 121. var _macroID = 121 string macroBody = Lua . LuaDoString ( "return GetMacroBody(" + _macroID + ")" ); Executing Lua Code in C# This  will leave the party (if the player is in one). wManager.Wow.Helpers.Lua.RunMacroText("/run LeaveParty()"); What is the difference between Lua.LuaDoString() and RunMacroText()? The difference is in can be understand in how you think about them. Lua.LuaDoString should be seen as a way to retrieve information .. More specifically, the Lua.LuaDoString's purpose is to have a value returned to it, so that you can assign it to a C# Variable. RunMacroText can be used to do something in game . More specifically, RunMacroText should be used when trying to run some sort of in-game script (such as /cast spell). Plugin Template C#: Plugin-Template.cs I have attached a basic plugin template that can be used. In it, I have provided an example of: A Basic Implementation of the wManager.Plugin.IPlugin Class (including Settings/Initialize/Dispose) Basic loop that will occur while WRobot is running Settings that can be configured from Plugin Page A Category/Short Description for the Plugin Settings An example of Watching for Game Events. An example of OnRunState / OnAfterRunState for WRobot States Watching For Game Events Sometimes you may find that you need to wait for something to occur in game before you can take a specific action. In WoW / WRobot world, these things are called events. Below are two examples of events. The first event will occur when either the Group Loot Settings change, or a Player Enters/Joins the current Party.The second Event will occur when a System Message is received.  I recommend adding this watchForEvents Function in the Initialize function of a plugin, or somewhere where it will only be called once. For an example of this, please see my Plugin Template. private void watchForEvents() { EventsLuaWithArgs.OnEventsLuaWithArgs += (LuaEventsId id, List args) => { if (id == wManager.Wow.Enums.LuaEventsId.PARTY_MEMBERS_CHANGED) { Logging.Write("Joined Group or something about the current group was changed."); } if (id == wManager.Wow.Enums.LuaEventsId.CHAT_MSG_SYSTEM) { Logging.Write("We Received a System Message."); } }; } Finding the list of available Game Events: Each version of the game is different here, so this is where you will need to be careful. By that I mean, some versions of the game may have an event type, but a different version may not. Blizzard was not always consistent in their name accross different versions of the game, so please be careful to test against multiple versions of the game. Open DotPeek Search for " LuaEventsID " Double Click LuaEventsId in the Assembly Explorer Window. A window will open displaying a list of Events. What do each of these Events mean? WoW Event Reference: http://wowwiki.wikia.com/wiki/Event_API ( Reminder! Some of these may be different in different versions of the game. ) Watching For WRobot State Changes In addition to in game events, there are also WRobot 'states'. Similar to Game Events, WRobot states are the particular condition that WRobot is in at a specific time. For example, there is a state called 'MillingState', and another called 'Looting' that come out with WRobot. States are managed by the WRobot FiniteStateMachineEvents Engine. When a State occurs/changes/ends/etc, an event is passed to the FiniteStateMachine (pardon my wording here if this is not 100% correct). There are three main events that we can use to manage our States. State Events that occur: OnBeforeCheckIfNeedToRunState - This can be used to CANCEL an event if specific conditions are met. OnRunState - This can be used to do something just as the State is being started. OnAfterRunState - This can be used to do something just as the State has completed. Example of OnRunState and OnAfterRunState In this example we are watching for when WRobot starts the ToTown State and when it finishes it. We create a boolean that is set to true when the state is started, and then set it to false when the State is completed. I recommend adding the initializeToTownWatcher() function in the Initialize function of a plugin, or somewhere where it will only be called once. For example of this, please see my Plugin Template. bool goToTown = false ; private void initializeToTownWatcher () { robotManager . Events . FiniteStateMachineEvents . OnRunState += ( engine , state , cancelable ) => { if ( state != null && state . DisplayName == "To Town" ) { goToTown = true ; Logging . Write ( "Going to Town State has been initiated." ); } }; robotManager . Events . FiniteStateMachineEvents . OnAfterRunState += ( engine , state ) => { if ( state != null && state . DisplayName == "To Town" ) { goToTown = false ; Logging . Write ( "We have completed going To Town State." ); } }; } Example of OnBeforeCheckIfNeedToRunState In this example, we catch the state with the name of To Town and cancel it by setting the passed in cancelable parameter to true. private void cancelToTownState () { robotManager . Events . FiniteStateMachineEvents . OnBeforeCheckIfNeedToRunState += ( engine , state , cancelable ) => { if ( state != null && state . DisplayName == "To Town" ) { Logging . Write ( "We have cancelled the To Town State" ); cancelable . Cancel = true ; } }; } Where can I find other WRobot States? Each version of the WRobot is different, so some versions of WRobot may have a state type, but a different version may not. Please be careful to test against multiple versions of the game/WRobot. Open DotPeek Expand wManager Module Expand wManager.Wow.Bot.States namespace. MORE TBA.... The above is my attempt at trying to help newcomers to WRobot at writing their own plugins / fight classes / etc. If there are any questions , suggestions, or even  corrections, please do let me know in the comments and I'll be sure to add/update things as they come up! Thanks, - Avvi Edited December 30, 2017 by Avvi ---------------------------------------- Matenia Added information about WRobot States. ---------------------------------------- Avvi Just saw this post. Very good info.  Would be nice if it was pinned on page 1. ---------------------------------------- Avvi Have Been working with just the Fight Class editor and it takes an insane amount of work to get the functions to work right. Now that ive seen this guild i will remake my fightclasses using DotPeek. TY MUCH! and expect some decent fightclasses and such out of me! ---------------------------------------- Unknown bumping for visibility ---------------------------------------- @Avvi Hi @Avvi Thank you so much for this. It has helped me loads! I am still struggling with the Lua.RunMacroText. I would have thought i can use it to run a script to call an actual macro. I have the macro in game and if i type /run runmacro("Macro2") on a command line it executes the macro. However, in a Plugin with the below, i get a compile error: \Temp\f2vkakgr\f2vkakgr.0.cs(15,60) : error CS1026: ) expected \Temp\f2vkakgr\f2vkakgr.0.cs(15,66) : error CS1002: ; expected \Temp\f2vkakgr\f2vkakgr.0.cs(15,69) : error CS1002: ; expected \Temp\f2vkakgr\f2vkakgr.0.cs(15,69) : error CS1525: Invalid expression term ')' I am assuming it doesn't like the open bracket inside the brackets for RunMacroText. How would i get around that? or how would I pass slash commands in game? Which is essentially what my macro is actually doing. Thanks using System.ComponentModel; using System.Threading; using robotManager.FiniteStateMachine; using wManager.Wow.Helpers; public class Main : wManager.Plugin.IPlugin {     public void Initialize()     {         robotManager.Events.FiniteStateMachineEvents.OnRunState += delegate(Engine engine, State state, CancelEventArgs cancelable)             {                 if (state.DisplayName == "Regeneration")                 {                                          wManager.Wow.Helpers.Lua.RunMacroText("/run RunMacro("Macro2")");                     Thread.Sleep(2000);                 }             };     }     public void Dispose()     {     }     public void Settings()     {     } } ---------------------------------------- Avvi | 2018-07-24T14:22:41Z Everything after run is regular Lua, so if you want to run your macro like that, just do (Vanilla has no RunMacroText, so it would never work anyway - but more importantly, you should use an IDE to edit your code so you can see things like trying to put 4 quotation marks won't work, because your string ends at ( and then inbetween the next ")" it tries to execute Macro2 as code. See Strings .) Lua . LuaDoString ( "RunMacro('Macro2')" ); Edited July 24, 2018 by Matenia ---------------------------------------- @Matenia Thanks @Matenia Much appreciated! now i can run the bots and sit down to regen rather than looking like an idiot standing still! hurray! Thank ---------------------------------------- Unknown Hi, what state for TurnIn and PickUp? ---------------------------------------- Unknown if you ever need to find out what state the bot is in, use this code to detect figure what state you are in to help make products, robotManager.Events.FiniteStateMachineEvents.OnRunState += (engine, state, cancelable) => { Logging.WriteError("state = " + state.DisplayName.ToString()); }; ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/11050-how-to-load-the-default-plugin-settings/ TITLE: How to load the default plugin settings ---------------------------------------------------------------------------------------------------- @Droidz i have used @Droidz profile Setting backup.cs using System ; using System . IO ; using robotManager . Helpful ; using wManager ; using wManager . Plugin ; using System . Drawing ; using System . Windows . Forms ; public class Main : IPlugin { private bool _isLaunched ; public void Initialize () {} public void Dispose () {} public void Settings () { var f = new FormSettingsBackup (); f . ShowDialog (); } } public class FormSettingsBackup : Form { public FormSettingsBackup () { InitializeComponent (); Directory . CreateDirectory ( PathFolder ); } string PathFolder { get { return Application . StartupPath + @ " \ Plugins \ Settings Backup \ " ; } } private void ButtonLoadClick ( object sender , EventArgs e ) { var file = Others . DialogBoxOpenFile ( PathFolder , "General Settings file (*.xml)|*.xml" ); if (! string . IsNullOrWhiteSpace ( file )) { if ( File . Exists ( file ) && File . ReadAllText ( file ). Contains ( "" )) { var s = XmlSerializer . Deserialize < wManagerSetting >( file ); if ( s != null ) { wManagerSetting . CurrentSetting = s ; wManagerSetting . CurrentSetting . Save (); Logging . Write ( "[SettingsBackup] New setting loaded: " + file ); } else { MessageBox . Show ( "Cannot load selected file." ); Logging . WriteError ( "[SettingsBackup] Cannot load selected file: " + file ); } } else { MessageBox . Show ( "Selected file is not valid." ); Logging . WriteError ( "[SettingsBackup] Selected file is not valid: " + file ); } } } private void ButtonSaveClick ( object sender , EventArgs e ) { var file = Others . DialogBoxSaveFile ( PathFolder , "General Settings file (*.xml)|*.xml" ); if (! string . IsNullOrWhiteSpace ( file )) { var s = XmlSerializer . Serialize ( file , wManagerSetting . CurrentSetting ); if ( s ) { Logging . Write ( "Setting saved: " + file ); } else { MessageBox . Show ( "Cannot save setting." ); Logging . WriteError ( "[SettingsBackup] Cannot save setting: " + file ); } } } # region FORM private void InitializeComponent () { SuspendLayout (); // // buttonLoad // var buttonLoad = new Button { Location = new Point ( 12 , 12 ), Size = new Size ( 151 , 23 ), Text = "Load settings" , UseVisualStyleBackColor = true }; buttonLoad . Click += ButtonLoadClick ; // // buttonSave // var buttonSave = new Button { Location = new Point ( 12 , 41 ), Size = new Size ( 151 , 23 ), Text = "Save settings" , UseVisualStyleBackColor = true }; buttonSave . Click += ButtonSaveClick ; // // Form // AutoScaleDimensions = new SizeF ( 6F , 13F ); AutoScaleMode = AutoScaleMode . Font ; ClientSize = new Size ( 175 , 76 ); Controls . Add ( buttonSave ); Controls . Add ( buttonLoad ); FormBorderStyle = FormBorderStyle . FixedToolWindow ; Name = "Form1" ; ShowIcon = false ; Text = "Settings Backup" ; TopMost = true ; ResumeLayout ( false ); } # endregion FORM } but this plugin not back up the other settings like HMP. @Matenia everytime when i create a new character i have to set the HMP once. its really anonying. so is there a way to edite this profile to make it save the HMP default setting too? then i just need to click a button then all set. thanks for advance. the settings about HMP profile name: CustomPlugin-Master-xxx.Nethergarde.xml 123456789 7005 7005 7005 7005 false false false false false false true 0 0 false ---------------------------------------- Unknown Hello, try plugin like: using robotManager . Helpful ; using wManager . Plugin ; using System . Windows . Forms ; using wManager . Wow . Helpers ; using wManager . Wow . ObjectManager ; public class Main : IPlugin { public void Initialize () {} public void Dispose () {} public void Settings () { sTemp . CreateHmpSetting (); } } class sTemp : Settings { public static void CreateHmpSetting () { var filePath = AdviserFilePathAndName ( "CustomPlugin-Master" , ObjectManager . Me . Name + "." + Usefuls . RealmName ); var fileContent = @ "  < PluginSettings xmlns : xsi = "" http : //www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema""> < TransactionId > 123456789 < AutoEquipBlacklist > 7005 7005 7005 7005 < FirstAid > false < TrainFirstAid > false < Food > false < Drink > false < BlackListIds /> < Looting > false < Skinning > false < TrainingLevels /> < TrainerBlacklist /> < EscapeElite > true < EscapePercentMana > 0 < EscapePercentManaEnemies > 0 < SmartPulls > false "; Others . WriteFile ( filePath , fileContent ); MessageBox . Show ( "HMP file created" ); } } (change xml code for your settings) ---------------------------------------- Unknown it works, thanks a lot! ---------------------------------------- Unknown Hello, I tried adapting the code from earlier. My goal was to change the settings of a specific plugin using a RunCode. Is this even possible in this manner? I hope I haven't missed any forum posts where this issue was already addressed. using robotManager . Helpful ; using wManager . Plugin ; using System . Windows . Forms ; using wManager . Wow . Helpers ; using wManager . Wow . ObjectManager ; public class Main : IPlugin { public void Initialize () {} public void Dispose () {} public void Settings () { sTemp . CreateHmpSetting (); } } class sTemp : Settings { public static void CreateHmpSetting () { var filePath = AdviserFilePathAndName ( "CustomPlugin-TagAndBag-" ObjectManager . Me . Name + "." + Usefuls . RealmName ); var fileContent = @ "  < PluginSettings xmlns : xsi = "" http : //www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema""> GemeinsamesLeveln   GemeinsamesLeveln     true   false "; Others . WriteFile ( filePath , fileContent ); MessageBox . Show ( "HMP file created" ); } } [E] 15:47:32 - Compilator Error (steps cache) : c:\Projekt\WRobot\Data\temp\vya31g2p.0.cs(102,34) : error CS1513: } erwartet. c:\Projekt\WRobot\Data\temp\vya31g2p.0.cs(140,15) : error CS1518: Klasse, Delegat, Enumeration, Schnittstelle oder Struktur erwartet. c:\Projekt\WRobot\Data\temp\vya31g2p.0.cs(360,1) : error CS1022: Typ- oder Namespacedefinition oder Dateiende erwartet. [E] 15:47:33 - Compilator Error : c:\Projekt\WRobot\Data\temp\drcen3kt.0.cs(106,34) : error CS1513: } erwartet. c:\Projekt\WRobot\Data\temp\drcen3kt.0.cs(144,1) : error CS1022: Typ- oder Namespacedefinition oder Dateiende erwartet. ---------------------------------------- Unknown Can't read that code, please format it properly The error pretty clearly tells you there's a problem with setting your brackets => } I recommend you get Visual Studio or Visual Studio Code so you have at least basic syntax highlighting enough to help you to write code that will compile. ---------------------------------------- Unknown Sorry to ask about this topic again. But I've really tried for a long time to find a solution. I can't find any errors with the {}. The error also occurs when I simply copy the original code from Droidz. This code is very important to me. It's the last missing piece to complete a group quester. The goal is to swap the leader role through the plugin using a RunCode. Would you perhaps have a moment to take a look at it? If not, I understand. I'll continue searching for the solution in the meantime. ---------------------------------------- Unknown This is a separate plugin. I don't know where you're trying to paste this code. If you're trying to put this INTO an existing plugin, this will never work. The important thing is in the sTemp class, that one has all the required info/functionality for writing a file. Quite frankly, I don't think you are capable of making a product that quests as a party with next to no coding knowledge. I'll just tell you one of the obvious things, now that I can read the code: var filePath = AdviserFilePathAndName ( "CustomPlugin-TagAndBag-" ObjectManager . Me . Name + "." + Usefuls . RealmName ); What's obvious here? Either you do what Droidz did, a plugin name like CustomPlugin-TagAndBag, followed by the second argument (arguments are divided by a comma) OR you concatenate the whole string. Trying to do XML in a multiline string isn't exactly easy. You need to escape existing quotation marks or they will end the string again. This is why Droidz used double quotation marks. You can test strings here, for example . Keep in mind, that one uses a more modern version of C#. If you don't compile your own code (I told you, set up Visual Studio), you're limited to .NET Framework 4.0 (if I recall correctly), because WRobot compiles your code at runtime. using robotManager . Helpful ; using wManager . Plugin ; using System . Windows . Forms ; using wManager . Wow . Helpers ; using wManager . Wow . ObjectManager ; public class Main : IPlugin { public void Initialize () {} public void Dispose () {} public void Settings () { sTemp . CreateHmpSetting (); } } class sTemp : Settings { public static void CreateHmpSetting () { var filePath = AdviserFilePathAndName ( "CustomPlugin-TagAndBag" , ObjectManager . Me . Name + "." + Usefuls . RealmName ); // read how to do a multiline string here: https://blog.gitnux.com/code/c-sharp-multiline-string/ var fileContent = @ " < PluginSettings xmlns : xsi = "" http : //www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema""> < ChannelName > GemeinsamesLeveln < ChannelPassword > GemeinsamesLeveln < Followers /> < GroupRegen > true < GroupTrain > false "; Others . WriteFile ( filePath , fileContent ); MessageBox . Show ( "HMP file created" ); } } Again - I have no idea what context you're trying to use this in. If this doesn't work, you'll have to actually do what I said in the first place and learn. ---------------------------------------- Unknown I already have a completed quester for WOTLK. Strong classes like Paladin, Warrior, Druid, etc. can handle this on their own. For the weaker classes, I now want to run the same quester as a group. In doing so, the two group members switch roles at the predetermined points in the quester using the built-in chat command. Now, here's my question regarding the code. There's this plugin: Tag and Bag, where characters can follow the leader. For this, I want to incorporate a RunCode in my quester that changes the plugin's settings: Leader = true or Leader = false. ---------------------------------------- Unknown If I understand correctly, you're trying to have a group of 2 do a series of quests using the quester product where one member does the quest, and the other follows, and you want to be able to switch those roles at runtime. I'm not very familiar with the quester, but that seems very difficult to do, if possible at all. You might be better off making your own product at this point. I created 2 video tutorials for beginners, plugin and product, maybe that will help you. ---------------------------------------- Unknown Thank you. I will take a look at it. But my final general question to you: Isn't there a simple code that I can integrate into my Quester that changes the settings of a plugin? ---------------------------------------- Unknown Not that I know of. Communication between wRobot modules (product/FC/plugins) or between bots is not possible with simple code. Your initial idea to trigger a setting change using the client's chat is actually the best suited idea for this case I think. If your plugin is open source, then you should try and modify it directly. ---------------------------------------- Unknown | 2023-10-20T08:57:03Z Here's what you should do: add code to to TagNBagger (since it's public) to read a variable in WRobot via Via.GetVar("customName") use your quester to set that var, you can use my example randomized questers to take a look at how to do it when var is set, the internal settings of the plugin are changed FROM WITHIN the plugin, you can then reload the plugin itself if required use Var to communicate between plugins, quester, other parts of WRobot for everything you need The chat command itself isn't a bad idea either. But within the same instance of WRobot, you don't need to chat and as far as I understand, this is mainly what you're struggling with. The party mode plugin I released which TagNBagger is based on is also open source, if you need more inspiration. More info: Edited October 20, 2023 by Matenia ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/14849-run-plugin-before-engine-starts/ TITLE: run plugin before engine starts ---------------------------------------------------------------------------------------------------- Unknown Is it possible to run my plugin before Quester's GoToTown runs, for example? Fight class written in c# instead of standard plugin is good alternative ?)) ---------------------------------------- Unknown Hello, yes in quester fightclass is loaded before engine and plugins. You can't change that. If you want cancel totown task when it's running you can robotManager . Events . FiniteStateMachineEvents . OnRunningLoopState += ( state , cancelable ) => { if ( state is ToTown ) cancelable . Cancel = true ; }; ---------------------------------------- Unknown There is no OnRunningLoopState events ,do you change it to OnRunState? FiniteStateMachineEvents Members (wrobot.eu) ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/14983-properly-kill-threads/ TITLE: Properly kill threads ---------------------------------------------------------------------------------------------------- Unknown Hi everyone! How to kill properly all started by "new Thread(()=>{}).Start()" threads in my plugin? Cuz they are still running after product restarting. Sure i'm cheking stuff like (_isLaunched && Conditions.InGameAndConnectedAndProductStarted) in loop. I'm confused that threads don't kills after MuPlugin.Dispose() method ---------------------------------------- happiness7 That's normal behaviour. If you want to control the life cycle of a thread you have created, you need to keep track of it by assigning it to a variable. This way you can start it in Initialize() and then Stop it in Dispose() // Define the thread and assign it to a variable Thread myThread = new Thread (() => { }); // Start the thread myThread . Start (); // Stop the thread myThread . Abort (); ---------------------------------------- Unknown OMG it's so easy, shame on me ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/14986-tracelinetracelinego-cache/ TITLE: TraceLine.TraceLineGo cache? ---------------------------------------------------------------------------------------------------- Unknown Hi, I have noticed that TraceLine.TraceLineGo doesn't update its result immediately when called repeatedly. The best example I can give is when I try to check the LoS for a door. I go in front of a closed door, check for LoS, which returns a positive result (so, no LoS). The method takes roughly 15ms to execute. Then I open the door, but even when the door is open, TraceLine.TraceLineGo keeps returning a positive result, and seems to only update at a random time after a few seconds, sometimes minutes. I'm thinking this is a cached result because when returning wrong results, the method takes 0ms. What exactly is going on here? Does this method have a cache? If so, is there a way to not use cached results at all? Any insight is appreciated. ---------------------------------------- Unknown Temp fix, second check a traceline just slightly different from the original coords beyond the door. Hopefully there is a way to clear that cache though. ---------------------------------------- Unknown Unfortunately, among the many things I've tried, I did that. I even tried to check 10 random tracelines between the ones I wanted. You know, for science. Even then, the results were all cached somewhere, for a time at least. ---------------------------------------- Zer0 Hi, I added method TraceLine.ClearCache() (wait next update) ---------------------------------------- Unknown Thank you so much! ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/15111-issue-with-can-cure-debuff-function-always-returning-false/ TITLE: Issue with "Can cure Debuff" function always returning false ---------------------------------------------------------------------------------------------------- Unknown Hello Wrobot community, I'm having an issue with the CanPurify function in my code, and I was hoping someone could help me figure out what's going on. Currently, no matter what, the function always returns false, even when the player has a debuff that should be able to be purified. Here is the current code for the function: public bool CanPurify ( string playerName ) { var lua = $@ " canPurify = false for i = 1 , 40 do local name , _ , _ , debuffAuraType , _ , _ , _ , _ , _ = UnitDebuff ( "" { playerName } "" , i ); if ( name and debuffAuraType ) and ( debuffAuraType == 'Magic' or debuffAuraType == 'Disease' or debuffAuraType == 'Poison' ) then canPurify = true break end end return canPurify "; Logging . Write ( $ "Checking if {playerName} can be purified..." ); bool result = Lua . LuaDoString ( lua ); Logging . Write ( $ "Result: {result}" ); return result ; If anyone has any idea what might be causing this issue, or any suggestions for how I can fix it, I would really appreciate it. Thank you in advance for your help! Best regards, ---------------------------------------- Unknown Hello, In "playerName" argument you should pass arguments like "player", "target", "focus", "party1", "raid1" (if you pass real player/unit name that will no work). Your code should look like that if you want to use playerName (not tested) : public bool CanPurify ( string playerName ) { var units = ObjectManager . GetObjectWoWUnit (); units . AddRange ( ObjectManager . GetObjectWoWPlayer ()); var unitsByName = ObjectManager . GetWoWUnitByName ( units , playerName ); return CanPurify ( unitsByName . FirstOrDefault ()); } public bool CanPurify ( WoWUnit wowUnit ) { if ( wowUnit == null || ! wowUnit . IsValid ) return false ; string unit ; long currentFocus ; if ( wowUnit . IsLocalPlayer ) unit = "player" ; else if ( wowUnit . IsMyTarget ) unit = "target" ; else { currentFocus = ObjectManager . Me . FocusGuid ; ObjectManager . Me . FocusGuid = wowUnit . Guid ; unit = "focus" ; } var lua = $@ " canPurify = false for i = 1 , 40 do local name , _ , _ , debuffAuraType , _ , _ , _ , _ , _ = UnitDebuff ( "" { unit } "" , i ); if ( name and debuffAuraType ) and ( debuffAuraType == 'Magic' or debuffAuraType == 'Disease' or debuffAuraType == 'Poison' ) then canPurify = true break end end return canPurify "; if ( unit == "focus" ) ObjectManager . Me . FocusGuid = currentFocus ; Logging . Write ( $ "Checking if {wowUnit} can be purified..." ); bool result = Lua . LuaDoString ( lua ); Logging . Write ( $ "Result: {result}" ); return result ; } ---------------------------------------- Unknown Thank you very much! I will try your code later. Regarding your code, my fightclass already has a priority list established based on the people in my party or raid. So, I will not use the first part of your code, as I understand it is trying to find a wowUnit to dispel. Instead, I will pass a Wowunit player to the second function, rather than just the pseudo. Thanks! ---------------------------------------- Unknown Hello Droidz, Unfortunately, the code is not working. I am playing on WoW 3.3.5a. At the moment, I have added some print statements: csharp var lua = $@ " canPurify = false for i = 1, 40 do local name, _, _, debuffAuraType, _, _, _, _, _ = UnitDebuff(""{unit}"", i); print(""{unit}"") print(name) print(debuffAuraType) if (name and debuffAuraType) and (debuffAuraType == 'Magic' or debuffAuraType == 'Disease' or debuffAuraType == 'Poison') then canPurify = true break end end return canPurify " ; Here is the output: Thank you. ---------------------------------------- Unknown I would like to thank the Wholsome Discord for their help. It turns out that my debuffAuraType was in the third position, when it should have been in the fourth position in UnitDebuff . Here is the modified code: public bool CanPurify ( string playerName ) { var lua = $@ " canPurify = false for i = 1 , 40 do local name , _ , _ , _ , debuffAuraType , _ , _ , _ , _ = UnitDebuff ( "" { playerName } "" , i ); print ( "" { playerName } "" ) print ( name ) print ( debuffAuraType ) if ( name and debuffAuraType ) and ( debuffAuraType == 'Magic' or debuffAuraType == 'Disease' or debuffAuraType == 'Poison' ) then canPurify = true break end end return canPurify "; Logging . Write ( $ "Checking if {playerName} can be purified..." ); bool result = Lua . LuaDoString ( lua ); Logging . Write ( $ "Result: {result}" ); return result ; } public void Purify ( WoWUnit p ) { while ( CanPurify ( p . Name ) && CastHeal ( Cleanse , p , 100 )) { SpellManager . CastSpellByNameOn ( "Holy Light" , p . Name ); } } ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/15118-how-to-avoid-boss-aoe-in-fight/ TITLE: How to avoid boss AOE in fight ? ---------------------------------------------------------------------------------------------------- Unknown When the boss is casting AOE damage, in order to avoid deep damage, I hope the robot can follow a path  or auto find a way to reach a safe area. I made a plugin, but it not works, it only move very little little step  then keep fighting without moving to the right place,. can you help me ,thanks. public void OnFightLoop ( WoWUnit unit , CancelEventArgs cancelable ) { foreach ( var boss in Bosses ){ if ( unit . Name == boss && unit . IsCast && unit . InCombat ) { Logging . Write ( " Boss is casting , run now ! ); RunWhenBossCastAOE ( unit ); } } } public void RunWhenBossCastAOE ( WoWUnit boss ) { switch ( boss . Entry ) { case 28586 : { // General Bjarngrim var x = ObjectManager . Me . Position . X ; var y = ObjectManager . Me . Position . Y ; var z = ObjectManager . Me . Position . Z ; List < Vector3 > pathList = new List < Vector3 >(); for ( int i = 0 ; i < 20 ; i ++) { var newX = x ; var newY = y + i ; var newZ = z ; Vector3 tmpPos = new Vector3 ( newX , newY , newZ ); pathList . Add ( tmpPos ); } GoToSafePosition ( pathList ); break ; } } } public bool GoToSafePosition ( List < Vector3 > pathList ) { wManager . Wow . Helpers . Conditions . ForceIgnoreIsAttacked = true ; MovementManager . Go ( pathList ); wManager . Wow . Helpers . Conditions . ForceIgnoreIsAttacked = false ; return true ; } ---------------------------------------- libai i found this, Might help. use google next time. https://github.com/Talamin/Wholesome-Dungeon-Crawler/blob/master/States/AvoidAOE.cs , also i do not know if wrobot ObjectManager has this type of info but Aoe ability's and ground effect can be found as Dynamic Game Objects. Here is the code for creating your own function using wrobot Descriptors, https://www.ownedcore.com/forums/world-of-warcraft/world-of-warcraft-bots-programs/wow-memory-editing/300463-wow-3-3-5-12340-info-dump-thread.html ---------------------------------------- libai The  reason your character only moves a little step is because you're still on the fight thread, so your code only executes for one fight loop iteration. The next iteration, you're back on the normal fight loop which forces you to get in your fight class range. There are two ways I know to prevent this. 1 - Lock the thread in your method. Which in your case would mean calling MovementManager.Go(pathList); and the next line, lock the thread in a while (MovementManager.InMovement) loop. I wouldn't necessary recommend this, because you're blocking the entire fight loop and you will need mutliple conditions to set it right. 2 - Cancel the fight event. This is my preferred option, but it's more complicated to set up. The code Nax has linked you is one I've written. It uses a manager that listens to multiple events. On the ObjectManagerEvents.OnObjectManagerPulsed event, I check and record a list of all the AOEs present in the object manager range. On MovementEvents.OnMovementPulse and MovementEvents.OnMoveToPulse I make sure I don't walk into an AOE, and make sure I never cancel an escape On FightEvents.OnFightStart, I make sure I don't start any fight during an escape This code doesn't really fit your need, because it avoids AOEs that stand on the ground (like a puddle of poison), and uses a "grid" to look for a safe position. In your case, you react to a single action. What you need to do is: - Detect the moment you need to escape. - Cancel the current fight, using cancelable.Cancel = true; - Calculate a safe route. - Turn an escape flag to true (a simple boolean) - Make sure you don't start a new fight during the escape using your flag - Turn back the flag to false when your safe condition is met ---------------------------------------- Unknown Interesting stuff. ---------------------------------------- libai For anyone wondering, this is pretty much the preferred method. You could set WRobot's settings to completely ignore fights after calling Fight.StopFight as well. But this is essentially what I use to escape mobs in HMP too. Unfortunately dynamic escape while avoiding new groups of mobs is quite complicated and will probably never be 100% perfect as you need to also make sure you won't just run in circles etc. Mostly just came here to say Zer0's approach is the one I found to be working best and most reliably. ---------------------------------------- Unknown Thank you for your detailed and patient explanation. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/15133-spellmanagercastspellbynameon-async-await/ TITLE: SpellManager.CastSpellByNameOn - Async ? Await ? ---------------------------------------------------------------------------------------------------- Unknown Hello Wrobot Community, I am currently working on a script for WoW 3.3.5a private server, and I need some assistance in making my function asynchronous to ensure it is executed properly. Here's the code snippet I am using: public static bool WildGrowthHeal ( WowPlayerExtended player ) { if ( CanCast ( Main . WildGrowth , player . OriginalPlayer )) { SpellManager . CastSpellByNameOn ( "Wild Growth" , player . OriginalPlayer . Name ); Logging . WriteDebug ( $ "{player.OriginalPlayer.Name}Wild Growth" ); return true ; } return false ; } && internal static bool CanCast ( Spell spell , WoWUnit target , bool canMove = true , bool tank = false ) { // Check if the caster is not stunned, not dead, not casting, the target is alive, the spell is usable, // the distance to the target is good, and there is no line of sight issue if (! ObjectManager . Me . IsStunned && ! ObjectManager . Me . IsDead && ! ObjectManager . Me . IsCast && ! target . IsDead && spell . IsSpellUsable && spell . IsDistanceGood && ! TraceLine . TraceLineGo ( target . Position )) { if ( target . MaxHealth - target . Health != 0 || tank ) { // Log the spell cast and the target's health percentage Logging . WriteDebug ( $ "Cast: {spell.NameInGame} on {target.Name} because life had less than {target.MaxHealth - target.Health} PV and he is a {target.WowClass}" ); // Return true, indicating the spell can be cast return true ; } } // Return false, indicating the spell cannot be cast return false ; } This function checks if "Wild Growth" can be cast on a player and casts the spell if possible. However, I want to make sure that the function waits for the spell to be cast before proceeding further. I am aware that using Thread.Sleep is not the best solution, as it can block the thread and cause other issues. Instead, I would like to make this function asynchronous using async and await , but I'm not sure how to do this with the current SpellManager.CastSpellByNameOn method, which is not asynchronous. Could anyone please provide guidance on how to make this function asynchronous or suggest an alternative way to ensure that the spell is cast before the function proceeds further? Any help would be greatly appreciated Thank you in advance for your assistance! ---------------------------------------- Unknown Hello, You can use "Task.Run" to call "SpellManager.CastSpellByNameOn" (and others synchronous methods) and make your asynchronous async. But, CastSpellByNameOn cast the spell and return (it doesn't wait that the spell was cast, for that, you should use "Usefuls.WaitIsCasting()") ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/15144-cancast-function-issue-incorrectly-returning-true-when-target-is-out-of-range/ TITLE: CanCast Function Issue - Incorrectly Returning True When Target Is Out of Range ---------------------------------------------------------------------------------------------------- Unknown Hello Wrobot community, I'm currently working on a C# script for WoW 3.3.5a using the Wrobot framework. I've encountered an issue with my CanCast function, where it returns true even if the player is too far away from the target. Here's my original code: internal static bool CanCast ( Spell spell , WoWUnit target , bool canMove = true , bool tank = false ) { // Check if the caster is not stunned, not dead, not casting, the target is alive, the spell is usable, // the distance to the target is good, and there is no line of sight issue if (! ObjectManager . Me . IsStunned && ! ObjectManager . Me . IsDead && ! ObjectManager . Me . IsCast && ! target . IsDead && spell . IsSpellUsable && spell . IsDistanceGood && ! TraceLine . TraceLineGo ( target . Position ) && ! target . IsMounted ) { if ( target . MaxHealth - target . Health != 0 || tank ) { return true ; } } // Return false, indicating the spell cannot be cast return false ; } } The problem seems to be related to the spell.IsDistanceGood condition, which does not seem to be working as intended. I'd appreciate it if anyone could help me identify the issue and suggest a solution. Thank you in advance for your assistance! ---------------------------------------- Unknown It checks ingame 3D distance vs whatever the spell has as an attribute. That mostly doesn't work due to center-center calculations, hitboxes etc. Every server implements it differently too, so you just have to do your own calculation based on what you observe on your server. Good luck. ---------------------------------------- Unknown I'm eventully trying to check distance with : playerToHeal.GetDistance <= 40; But i don't know if u should use : playerToHeal.GetDistance2D <= 40; or playerToHeal.GetDistanceZ <= 40; What is the difference between classic, 2D and Z ? Thanks ---------------------------------------- Unknown | 2023-04-18T11:47:31Z Yes, 2D ignores Z axis and I would generally recommend you never use it unless you specifically know you need it. PS: Figure out if your server calculates it including hitboxes and such. Otherwise you need to calculate the distance yourself based on Position. Edited April 18, 2023 by Matenia ---------------------------------------- Unknown GetDistance2D will return the distance from you to the target, ignoring the Z axis, only useful in very specific situations. GetDistanceZ will return only the Z distance from you to the target (ignoring X and Y), again, very specific. GetDistance will return the 3D distance from you to the target. This is the one you want. ---------------------------------------- Unknown Thanks ! ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/15189-how-to-tell-hunters-pet-follow-a-path-after-eyes-of-the-beast-casted/ TITLE: How to tell hunter's pet follow a path after eyes of the beast casted? ---------------------------------------------------------------------------------------------------- Unknown Hello everyone, I want to make the Hunter's pet follow a path after casting the "Aspect of the Beast" skill. After searching through the MovementManager, I found that it seems to only control the player and I don't know how to control the pet. After extensive research, I found that I could use mouse clicks to move the pet. With the camera focused on the pet, I can click on the screen  or press keyboard like "w" to make the pet move. However, the issue with using mouse clicks is that the character doesn't always move to the exact spot I click on. Sometimes, I click far away, but the character only moves a small distance, which is strange! (I don't know if this is the only way to move the pet, if there are other methods, please let me know, thank you.) I tried calling the ClickToMove.CGPlayer_C__ClickToMove method, but I am currently facing an issue: I cannot accurately or immediately determine the vector3 list I am traversing through. Could you please help me take a look? Thank you. hunter_pet_move_by_eyes_of_the_beast.xml ---------------------------------------- Unknown Is this for Vanilla? For Vanilla clock to move to work, you need to be at 60Hz. You can use Rivatuner Statistics Server to limit your Wow.exe to 60 fps for the same effect. Otherwise the timestamps internal to the client are off and it won't work. Just iterate the list and within each step, use blocking code that only succeeds and jumps to the next step in the loop if ObjectManager.Pet.Position.DistanceTo(Vector3) < 3 ---------------------------------------- Unknown Thanks a lot ,yesVanilla it is, but nothing changed when I locked the fps to 60 by Rivatuner Statistics Server. by the way ,I want to check if mob is facing a vector3 position,how to do it? sometimes I wanna go through a path where many low level mobs around . But I should be in attacked  if them face a position where I will move to. So is there any api ok? so wowunit.isfacing api seems not work well. and movementmanager.isfacing is checksome about player itsself . ---------------------------------------- Unknown IsFacing needs a radian cone as an argument. I never got it to work well. You just need to implement the math yourself and hope that works ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/15191-pauseunpause-when-an-error-is-encountered-in-the-waypoint-timed-out-log/ TITLE: Pause/Unpause when an error is encountered in the "Waypoint timed out" log ---------------------------------------------------------------------------------------------------- Unknown hi, I'm trying to make a plugin to fix a nasty bug I've encountered on a warmane (3.3.5a) server. it happens that the character periodically freezes and if he continues to move, then he is constantly teleported back until he stops for a few seconds. I face this problem without using a bot and on this server. I found a plugin on the forum ( https://wrobot.eu/forums/topic/12149-how-to-disable-anti-stuck/?do=findComment&comment=58260&_rid=97009 ). another error is processed there and the bot stops, how can I change "stop" to "pause" and add a timer of 5-10 seconds, after which the bot will unpause and continue working? I will be grateful if you help me with advice attaching the plugin code from the topic on the forum: using System.ComponentModel; using wManager.Plugin; public class Main : IPlugin { private bool _isLaunched; public void Initialize() { robotManager.Events.LoggingEvents.OnAddLog += delegate(robotManager.Helpful.Logging.Log log) { if (log != null) { if (log.Text.Contains("[MovementManager] Think we are stuck")) robotManager.Products.Products.ProductStop(); } }; } public void Dispose() { _isLaunched = false; } public void Settings() { } } ---------------------------------------- Dmitrii Hello, you can should look like that : using System . Threading ; using wManager . Plugin ; public class Main : IPlugin { private bool _isLaunched ; public void Initialize () { _isLaunched = true ; robotManager . Events . LoggingEvents . OnAddLog += delegate ( robotManager . Helpful . Logging . Log log ) { if ( log != null ) { if ( log . Text . Contains ( "[MovementManager] Think we are stuck" )) { robotManager . Products . Products . InPause = true ; // new thread to unpause after 5 seconds new Thread ( t => { Thread . Sleep ( 5000 ); if ( _isLaunched ) robotManager . Products . Products . InPause = false ; }). Start (); } } }; } public void Dispose () { _isLaunched = false ; } public void Settings () { } } ---------------------------------------- Unknown thanks a lot, it worked using System.Threading; using wManager.Plugin; public class Main : IPlugin { private bool _isLaunched; public void Initialize() { _isLaunched = true; robotManager.Events.LoggingEvents.OnAddLog += delegate(robotManager.Helpful.Logging.Log log) { if (log != null) { if (log.Text.Contains("[MovementManager] Waypoint timed out")) { robotManager.Products.Products.InPause = true; // new thread to unpause after 5 seconds new Thread(t => { Thread.Sleep(5000); if (_isLaunched) robotManager.Products.Products.InPause = false; }).Start(); } } }; } public void Dispose() { _isLaunched = false; } public void Settings() { } } ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/15213-movementflag/ TITLE: MovementFlag ---------------------------------------------------------------------------------------------------- Unknown What is subj (1536) in Target info ? ---------------------------------------- Unknown Hello, this flag list is more complete that the WRobot list https://github.com/ajlopez4/ejt-projects/blob/master/Frost/source/Core/ObjectManager/Offsets/Constants.h#LL360C1-L410C5 1536 = 0x600 = 0x200 | 0x400 = TimeValid and Immobilized (if I make no mistake and the values are good) ---------------------------------------- Unknown Thanks! Cool sources, why wrobot isn't C++ 😉 ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/15215-polyarea/ TITLE: PolyArea ---------------------------------------------------------------------------------------------------- Unknown What kind of PolyArea increment the path weight but dont't block NPC or quest object inside ? ---------------------------------------- Unknown Hello, use POLYAREA_DANGER or POLYAREA_AVOID. ---------------------------------------- Unknown Thank, but You didn't make blacklisting npc/objects in POLYAREA_AVOID area? ---------------------------------------- Unknown Yes, sorry, my answer was wrong. Poly_avoid blacklists the area at the same time (but paths made in this area will probably be inconsistent). The solution is to directly use PathFinder . ReportArea ( Position , Radius , TypeArea ); But, this list is cleared when the bot changes continent. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/15223-get-an-items-stats-strength-int-agi-etc/ TITLE: Get an item's stats (strength, int, agi, etc) ---------------------------------------------------------------------------------------------------- Unknown Is there a way in c# (plugin code for example) to get the stats from an item (vanilla 1.12)?  For example, I loot an item, I want to compare that item's stats, such as strength, intelligence, etc. and compare it against my equipped item. Also, I have code to get the item when the character loots, I just need the code to get the stats. I'm very comfortable with c#, not so comfortable with LUA. TIA! ---------------------------------------- Unknown You need to build a tooltip reader, cache each line into a table then read the results . ---------------------------------------- Unknown I'm not entirely sure it will work for vanilla, since I've used it on TBC/Wotlk, but even then, there's no easy way to do this. The only way I know to read item stats is to create a LUA Frame, set its hyperlink to the item link you want to check, and read its regions. You can check the LUASetup() method to get an idea how this works here https://github.com/Wholesome-wRobot/Wholesome-Inventory-Manager/blob/master/Helper/Toolbox.cs After you've ran this setup, all you need is to call is ParseItemInfo(itemLink) in LUA to get your item stats. You'll have to adapt the code to whatever you want to do, obviously. ---------------------------------------- Unknown Although untested due to my current lack of a vanilla World of Warcraft installation, the following code snippet should serve as a helpful starting point for constructing the necessary functions to manage item states. public class ToolTipReader { private static string TooltipName { get ; set ; } static ToolTipReader () { TooltipName = Others . GetRandomString ( 12 ); } public static void CreateTooltip () { Lua . LuaDoString ( $@ " if not { TooltipName } then { TooltipName } = CreateFrame ( 'GameTooltip' , '{TooltipName}' , nil , 'GameTooltipTemplate' ); { TooltipName }: SetOwner ( UIParent , 'ANCHOR_NONE' ); end "); } public static void DestroyTooltip () { Lua . LuaDoString ( $ "{TooltipName} = nil;" ); } public static string [] ItemStates ( string itemLink ) { return Lua . LuaDoString < string []>( $@ " local StatsTable = {{}} { TooltipName }: ClearLines () { TooltipName }: SetHyperlink ( '{itemLink}' ) for i = 1 , { TooltipName }: NumLines () do local text = _G [ 'ItemPurseTextLeft' .. i ]: GetText () table . insert ( StateTable , text ) end return unpack ( StatsTable ); "); } } ---------------------------------------- Unknown Thanks so much for answering this, I posted, then stepped away from it for a bit, just coming back.  I'll try that out, thanks again! ---------------------------------------- Unknown Just wanted to pop in and say for Vanilla it's really worth finding some of the older wiki entries regarding Tooltip handling in general. Tooltip handling in vanilla is very different from later expansions and honestly such a mess. I don't think you can just destroy tooltips. For example, as far as I know, you can not get ToolTips to be garbage collected by just setting them back to 'nil'. They will continue to exist and you're just dumping your memory full of new tooltips eventually. You absolutely need to reuse the tooltip and clear all lines as well as assigning a new owner. As far as I remember, in Vanilla you even need to manually delete some sub texts on the tooltip because it's such a rudimentary (buggy) implementation in 1.12. The old wiki entries should have more info. A code snippet from my own TBC+ code: List containerSlot = Bag . GetItemContainerBagIdAndSlot ( bagItem . Entry ); if (! containerSlot . IsNullOrEmpty ()) { Lua . LuaDoString ( $@ " { TooltipName }: Hide (); { TooltipName }: SetOwner ( UIParent , 'ANCHOR_NONE' ); { TooltipName }: ClearLines (); { TooltipName }: SetBagItem ({ containerSlot [ 0 ]}, { containerSlot [ 1 ]}); "); ParsedItem parsedBagItem = ItemParser . ParseCurrentTooltip ( TooltipName ); ... ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/15246-targeting/ TITLE: Targeting ---------------------------------------------------------------------------------------------------- Unknown Is there a way to target from a good distance like atleast 30yards and not needing to go near the target at all to cast a spell? Thank you in advance! ---------------------------------------- Unknown Hello, that is managed by your fightclass. What fightclass do you user? Have you try another? ---------------------------------------- Unknown hi Droidz, i am making a quester profile where it would be great not to go near the mob/target and cast a skill from a distance. var mobEntry = ObjectManager.GetNearestWoWUnit(ObjectManager.GetWoWUnitByEntry(mobId)); if (mobEntry.Position.DistanceTo(ObjectManager.Me.Position) < 50f) { // Target mob if (!mobEntry.IsMyTarget) { Interact.InteractGameObject(ObjectManager.GetWoWUnitByEntry(29639, true).First().GetBaseAddress); Thread.Sleep(500); } //MovementManager.Face(ObjectManager.Target); SpellManager.CastSpellByNameLUA("Ice Shard"); Usefuls.WaitIsCasting(); wManager.wManagerSetting.AddBlackList(mobEntry.Guid, 1000 * 5 * 60); Lua.RunMacroText("/cleartarget"); DebugLog("Targeting and casting. rescued=" + _rescued); _rescued += 1; } else { var mobpos = new List() { new Vector3(7236.417f, -2756.116f, 820.3741f), new Vector3(7305.381f, -2730.507f, 821.9226f), new Vector3(7363.159f, -2719.983f, 822.0386f), new Vector3(7386.727f, -2714.902f, 813.5573f), new Vector3(7400.437f, -2760.255f, 841.5171f), new Vector3(7381.176f, -2823.062f, 834.0812f), new Vector3(7413.861f, -2878.198f, 850.9042f), new Vector3(7327.644f, -2866.435f, 851.3341f), new Vector3(7271.88f, -2838.288f, 863.6712f), }; wManager.Wow.Bot.Tasks.GoToTask.ToPosition(mobpos[Others.Random(0, mobpos.Count - 1)]); } ---------------------------------------- Unknown Do you have try with the quest type "UseSpellOn" ? ---------------------------------------- Unknown it is a quest in storm peaks called Cold Hearted. needs to mount to the frostwyrm then the skill is only available from the mount. the spell is not from the character itself. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/15266-override-bot-state-ismounted/ TITLE: Override bot state IsMounted ---------------------------------------------------------------------------------------------------- Unknown hi as the title shows, how do i override bot state IsMounted. character is InTransport but the state is also IsMounted so the problem is it doesn't proceed with fighting. Thank you! ---------------------------------------- Unknown IsMounted serves as a method rather than a state, with its primary purpose being to validate your ongoing mount status. In cases where this method provides both retrieval (Get) and modification (Set) functionalities, the potential exists to change its value to false by utilizing the syntax IsMounted = false. However, the presence of a Set capability remains uncertain. For those skilled in reverse engineering, an opportunity might arise to manipulate the underlying data by introducing an altered byte into the pointer. This could prompt the method to yield a false outcome, with the possibility of restoring the original state at a later juncture. ---------------------------------------- Unknown Hello, if you put false at IsMountedWhenInTransport, IsMounted should return false.  You can also try to disable this option https://wrobot.eu/byme/doc/html/P-wManager.wManagerSetting.IgnoreFightGoundMount.htm ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/15283-memory-vs-lua/ TITLE: Memory vs Lua ---------------------------------------------------------------------------------------------------- Unknown Hello, everyone! Why some parameters ObjectManager receives using Lua, instead memory read? For example: ObjectManager.Me.ManaPercentage ---------------------------------------- Unknown Hello, Most versions use memory reading for 'ManaPercentage'. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/15288-istaggedbyother/ TITLE: IsTaggedByOther ---------------------------------------------------------------------------------------------------- Unknown hi all. as the title says, how do i check if target or object is 'IsTaggedByOther' or if target is being attacked by party/raid member? Note: target doesn't attack or target at all like Kinetic Bomb. Thank you! ---------------------------------------- Unknown hello, try something like this, note this is pudo code (Made from my phone). public List < WoWUnit > GetUnitsAttackingPartyMembers () { var partyMembers = Party . GetParty (); var units = ObjectManager . GetObjectWoWUnit (); return units . Where ( x => x . IsAlive && x . IsAttackable && ( x . InCombat || x . InCombatFlagOnly ) && partyMembers . Any ( p => x . TargetObject ?. Target == p . Guid )) . ToList (); } ---------------------------------------- Unknown this checks the units attacking partymembers, it should be the other way around. i want to check if mobId 12345 is being targetted or attacked by party members. ---------------------------------------- Unknown public List < WoWPlayer > GetUnitsAttackingPartyMembers ( WoWUnit p ) { return Party . GetParty (). Where ( x => x . TargetObject ?. Target == p . Guid ). ToList (); } ---------------------------------------- Unknown Thank you for the help! May I also ask please how to get my character to face it's target? i am trying to make a plug.in that it will stay in a specific position i set and just face the target and use range skills. i am using wrotation and if i set "Manage character movement...." it moves towards it's target. and if wrotation if off, it doesn't face it's target hence not using any range skills. Thank you. ---------------------------------------- jiraiyasm Simple google search : https://www.google.com/search?q=wrobot+Face+target&rlz=1C1CHBF_enUS1022US1022&oq=wrobot+Face+target&aqs=chrome..69i57.3199j0j7&sourceid=chrome&ie=UTF-8 ---------------------------------------- Unknown awesome will try this out! my bad, should've used the search first. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/15303-load-c-code-from-different-file/ TITLE: load c# code from different file ---------------------------------------------------------------------------------------------------- Unknown Hi,  im relatively new to this bot and coding c# in general, so please dont mind if the question seems dumb ^^  I'd like to create a utility class for some code i need for multiple FightClasses. Looking up how this would be done in c# i found this: the util: using System ; namespace MyNamespace { public class WowUtil { [...] } } and the FightClass: using System ; [...] using MyNamespace ; public class Main : ICustomClass { }  Trying to run this i get the error "The type or namespace 'MyNamespace' could not be found. Missing using directive or assembly reference"  is this / something similar possible at all, and if yes what am i doing wrong? ^^  thanks in advance 🙂  ---------------------------------------- sataan1337 Hello, If you give WRobot a .cs file, you cannot use newer C# features (like 'using MyNamespace ; '). To use these new features, give compiled files to WRobot (dll). 'public class Main: ICustomClass' must not have a namespace for WRobot to find the class. For example, you can look at this code to see how to separate your code into several classes :   https://wrobot.eu/forums/topic/11961-fightclass-framework-for-243335a-and-more/  ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/15326-fnvs-flightmaster-and-quest-profile-source-code/ TITLE: FNV's Flightmaster and quest profile source code ---------------------------------------------------------------------------------------------------- Zer0 Dear community, I just found, I still have access to some workspaces via bitbucket (where I barely ever log in). Therefore, I'm sharing the original source as it was last commited by him here. I don't know if it's different from what was already uploaded or anything. That's why I'm sharing it in the developer forums and not plugins/quester. Last commits are from early 2018. mxsbt-vanillaflightmaster-dbcc4a5bd0e7.zip fnv316quester-quester-1-40-71d751b8482d.zip ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/15327-switch-tab-in-wrobots-ui/ TITLE: switch tab in wrobot's UI ---------------------------------------------------------------------------------------------------- Unknown Hi everyone! How to switch lefside menu ? Map tab has a memory leak, after ~5hours eat all available RAM. I want to switch it periodically to "Main". ---------------------------------------- Unknown Hello, you can go to "Product settings" tab with robotManager . Products . Products . ProductNeedSettings (); but you can't back to map tab. ---------------------------------------- Unknown nice, works fine ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/15395-how-to-get-coordinates-of-an-engineering-major/ TITLE: How to get Coordinates of an Engineering Major ---------------------------------------------------------------------------------------------------- Unknown I've been attempting to interact with a repair robot summoned through my engineering expertise, with the intention of engaging in commercial transactions. However, before proceeding, I need to obtain the precise coordinates of this repair robot. Could anyone please suggest functions that can be used to retrieve the coordinates of an NPC with a specified name in the vicinity? ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/4035-dk-starting-area-quester/ TITLE: Dk starting area Quester ---------------------------------------------------------------------------------------------------- Unknown Hello all, I decided to start making a quester profile for the DK starting zone for retail. Embarrassingly I have only gotten to the 2nd quest before having an issue. I finally got most of it figured out. The bot will accept the quest, loot the sword from the sword rack ( took a while to get it to stop after having 1 in its inventory), and then take the sword to the hotspot infront of the Runeforge and use the item. I had to make a non-questlog quest that uses the iscomplete function. The issue I am running into is after the bot creates the runforged sword, the loot log says that i received the item but it doesnt actually go into my bag. The iscomplete i used is "return ItemsManager.GetItemCountById(38607) >= 1;" but since i do not have the actual item in my bag i think this is causeing the bot to stall and not move onto the next step which is turning in the quest. I have attached the profile, i hope it is something simple that I am missing and hopefully someone can point out my mistake so i can move on and continue learning as I go. thanks in advance! TestDK1.0.xml ---------------------------------------- Unknown Hello, Try to remove "return ItemsManager.GetItemCountById(38607) >= 1;" and put true at "Auto Detect Objective Count ..." ---------------------------------------- Unknown Thanks! I will give that a shot Driodz ---------------------------------------- Unknown Did you ever try to make this profile work?  I am looking to find one that covers all the DK started quest. ---------------------------------------- Unknown Hi, look github : https://github.com/droidzfr/WRobot_Packages/tree/fccc740c611b6447361d401c2aa35bb401d6f638/Old paid files/[DTN] Zerokx/[N] 55-58 Death Knight (search in https://github.com/droidzfr/WRobot_Packages/tree/master/Old paid files ) ---------------------------------------- Unknown I saw it and tried it but got this messgae ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/7634-movement-follow-path-strafing-or-running-backwards/ TITLE: Movement: Follow path strafing or running backwards ---------------------------------------------------------------------------------------------------- Unknown Hi folks, I am working hard to improve the movement of my C# fight class based hunter. Currently I am tuning some infight moves. At the moment I have some routine which makes the toon to get away from near enemies. It works pretty well in simple situations. It walks away by simulating press/release of movement keys. This movement approach is not easy to manage when it comes to stuck detections and resolution, for example when the bot is going backward and moves against a wall. I think it would be much easier to solve this issue when the movement was managed with paths. The problem I have with paths is that the toon always follows the paths by turning the back to the mob and running forward. Is it somehow possible to make the toon follow the path strafing or going backward? ---------------------------------------- Unknown Hello, do you use last version of WRobot, I have try to resovled this problem ---------------------------------------- Unknown I am using the current version of wrobot for vanilla private server. But I am not sure whether or not I explained my question right. What I want to archieve is that I can tell my toon to follow a path to a specific position running backward instead of running forward. I don't mean to reverse a path. So instead of, for example this: wManager . Wow . Helpers . Move . MoveInject ( wManager . Wow . Enums . Keybindings . MOVEBACKWARD , false ); Thread . Sleep ( 1000 ); wManager . Wow . Helpers . Move . MoveInject ( wManager . Wow . Enums . Keybindings . MOVEBACKWARD , true ); I want to do something like this: MovementManager . GoBackward ( PathFinder . FindPath ( NewPosition ), false ); Please note the imaginary GoBackward() method. Have you an idea how to realize this? ---------------------------------------- Unknown Sorry, I read your post to quickly, use code like: wManager . Events . FightEvents . OnFightLoop += ( unit , cancelable ) => { var me = wManager . Wow . ObjectManager . ObjectManager . Me ; if ( wManager . Wow . Helpers . Conditions . InGameAndConnectedAndAliveAndProductStartedNotInPause && unit . IsValid && ! me . IsCast && unit . IsGoodInteractDistance ) // put here your conditions to running backwards { var p = robotManager . Helpful . Math . GetPosition2DOfAngleAndDistance ( me . Position , robotManager . Helpful . Math . GetAngle ( unit . Position , me . Position ), wManager . Wow . Helpers . CustomClass . GetRange - unit . GetDistance - 3 ); var z = wManager . Wow . Helpers . PathFinder . GetZPosition ( p ); if ( z != 0 ) { p . Z = z ; wManager . Wow . Bot . Tasks . GoToTask . ToPosition ( p , 3.5f , true , context => ( wManager . Wow . Helpers . Conditions . InGameAndConnectedAndAliveAndProductStartedNotInPause )); } } }; ---------------------------------------- Unknown Hey thanks! The destination coordinate calculation based on robotManager.Helpful.Math.GetPosition2DOfAngleAndDistance looks interesting. I just tried the snippet, needs more fine tuning, but could be a base for a solution. The one thing I thought about is not done with this snippet: Follow a path while walking backward or strafing. The toon is always turning arround and follwing the path looking straight away from the mob. A human player would either turn 90 degrees and strafe away (to move faster) or simply strafe away to the right or left. Turning 180 degrees around and run away with the back pointing to the mob is not done pretty often by human players. Any ideas? ---------------------------------------- Unknown Did you ever figure this out? ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/8952-pathfinder/ TITLE: PathFinder ---------------------------------------------------------------------------------------------------- Unknown Being in the instance at some point I want to turn off the patfinder and then turn it back on Tried several options but does not work since there is no documentation for wManager wManager.wManagerSetting.CurrentSetting.PathFinder = false; wManager.wManagerSetting.CurrentSetting.UsePathFinder = false; Found a problem here on the forum. It was a syntax error. It is necessary like this: UsePath s Finder But this did not solve the main problem: To move through the dungeon, I use a FollowPath. At the first pass, everything looks perfect and everything happens as I planned. But when the bot enters the next time in the dungeon, it starts from the last point of the first FollowPath. And in order to run along the short path the bot runs into the door that can not be opened until the final boss is alive. In total, the profile uses 3 followers, but only the first one works incorrectly. disabling the pathfinder solved the problem with the door but now the bot is trying to run to the last point "through the walls" ---------------------------------------- Unknown Hello, use quest type "follow path" and put lower search radius don't resolve this problem? ---------------------------------------- Unknown Solved the problem with "Reset" action But there is still a problem with the resurrection if death is inside the dungeon. There are several ways to implement this through various checks. But I encounter a trivial problem with the fact that in the event of death, not the code of the quester does not execute, but its main code, and therefore, in any case, first he tries to resurrect himself by running to the corpse and he does not care about all the conditions. Perhaps there is a way to force a bot to execute code in the thread or check the condition instead of trying to resurrect in the usual way? ---------------------------------------- Unknown very sorry for bringing this topic back to live, but I have been seaching the forum for solution and have no result. I have exactly the same problem you had. May I know you solved the problem with " Reset" action? I'm using gatherer profile, and I have no idea how to use the quester profile. I know there is very little hope you still see this post but I want to try my luck. thx ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/9769-gototask-conditionexit/ TITLE: GoToTask conditionExit ---------------------------------------------------------------------------------------------------- @Droidz @Droidz can you explain a little how this works? I built my own helper function, because it doesn't seem to work the way I want ti to. Basically I want GoToTask to abort if Conditions.IsAttackedAndCannotIgnore and a bunch of other stuff evaluates to true. But it seems to instantly cancel, if it evaluates to false, so I don't really understand. ---------------------------------------- Matenia Hello, this is sample code with defaut condition: GoToTask . ToPosition ( Vector3 . Zero , 3.5f , false , context => Conditions . InGameAndConnectedAndAliveAndProductStartedNotInPause && ! Conditions . IsAttackedAndCannotIgnore ); ---------------------------------------- Unknown Sorry for necropost, but anybody used subj? It's no difference in GoToTask behavior: GoToTask.ToPosition(pos, 3.5f, false, context => true); and GoToTask.ToPosition(pos, 3.5f, false, context => false); in both cases bot successfully runs until reaches destination and ignores fight during run. How to correct use GoToTask.ToPosition with interrupting when bot attacked? ---------------------------------------- Unknown Hello, I'm supprise that with => false method move the character. To interrupting when bot attacked use GoToTask . ToPosition ( pos , 3.5f , false , context => ! Conditions . IsAttackedAndCannotIgnore ); ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/11821-casting-spell-on-wowunit-without-targeting-player-or-mob/ TITLE: Casting Spell on WoWUnit Without Targeting (Player OR Mob) ---------------------------------------------------------------------------------------------------- @Smokie Howdy y'all! My C# is finally at the point where I am starting to be able to develop full products (profiles, fightclasses, etc.). I'm working on a fightclass template (which I'll post once functional) that people can adapt for any class they want (I'm developing it for my Disc Priest, so it already has to be able to do some niche stuff). @Smokie  gave some great code in this post  on how to cast spells on yourself and party members (maybe other players, too, I haven't tested).  SpellManager . CastSpellByNameOn ( "Rejuvenation" , p . Name ); SpellManager . CastSpellByNameOn ( "Rejuvenation" , "PlayerName" ); SpellManager . CastSpellByNameOn ( "Rejuvenation" , ObjectManager . Me . Name ); "Really any code with a name string will work" That code works fantastically for players! But mobs share names and so require us to use their LuaId, which, to my knowledge, isn't retrievable using Wrobot methods/properties (if I'm wrong, please set me straight). I actually can't even figure out how to get the LuaId using Lua and the only way I've seen anyone attempt to implement this functionality did so (a long time ago, most of the code is unusable, actually). public static bool CastSpell ( Spell spell , WoWUnit unit , bool force ) { // Handle bullshit units if ( unit == null ||  ! unit . IsValid || unit . IsDead ||  ! spell . KnownSpell ||  ! spell . IsSpellUsable ) { return false ; } // Check If Toon is Wanding if ( spell . Name == "Shoot" && IsAutoRepeating ( "Shoot" )) { return true ; } // Fuck off if toon is already casting and (force == false) if ( ObjectManager . Me . Casting () &&  ! force ) return false ; // Stop moving if spell needs to be cast if ( spell . CastTime > 0 ) MovementManager . StopMoveTo ( false , Usefuls . Latency + 500 ); // Force cast spell if (force == true) if ( force ) Lua . LuaDoString ( "SpellStopCasting();" ); // Cast AoE spells by location if ( AreaSpells . Contains ( spell . Name )) { Lua . LuaDoString ( "CastSpellByName(\"" + spell . Name + "\")" ); ClickOnTerrain . Pulse ( unit . Position ); } else { // Rely on Auto Self Cast WoWUnit temp = ObjectManager . Target ; bool onSelf = unit . Guid == ObjectManager . Me . Guid ; // Face unit to cast if (! onSelf ) { MovementManager . Face ( unit ); _disableTargeting = true ; TargetUnit ( unit ); } // Default to self casting SpellManager . CastSpellByNameOn ( spell , ObjectManager . Me . Name ); // Handle non-self targets if (! onSelf ) { if ( temp . Guid == 0 ||  ! temp . IsValid ) { Lua . LuaDoString ( "ClearTarget();" ); // This clears the current target...which defeats the purpose, yea? } else { TargetUnit ( temp ); } // Interact.InteractObjectis also given as a possibility, but, as I understand it, that would also change targets _disableTargeting = false ; } } return true ; } I don't understand the use of Locktargeting and so can't figure out how to remove code rot or whether or not this should actually work as a "Mouseover Cast"- type cast (for classes/situation where focusing on a new WoWUnit would be undesirable but applying a dot or whatever is necessary). Hoping someone can help me figure it out! ---------------------------------------- Unknown For that method to work, you need to set  Pacific wowunit as unit1, unit 2 etc in your code, I don’t have my laptop on my so I can’t really help but give each wowunit it’s own number and go from there.  Ps: I don’t remember you at all, I don’t remember a lot ..... I was drunk a lot more then I thought. ---------------------------------------- Unknown Hahaha, it was someone else's topic, I've just been cannibalizing code from all over for a couple months now. "Learning C# By Botting", I'm here to say, should be developed as a teaching technique.  ---------------------------------------- Unknown If I give them designations in my code, don't I run into the same issue (that I can't get their LuaId to use for the CastSpellOn method? ---------------------------------------- Stresse No tested, but use code like: public static bool CastSpell ( Spell spell , WoWUnit unit , bool force ) { // Handle bullshit units if ( unit == null || ! unit . IsValid || unit . IsDead || ! spell . KnownSpell || ! spell . IsSpellUsable ) { return false ; } // Check If Toon is Wanding if ( spell . Name == "Shoot" && IsAutoRepeating ( "Shoot" )) { return true ; } // Fuck off if toon is already casting and (force == false) if ( ObjectManager . Me . IsCast && ! force ) return false ; // Stop moving if spell needs to be cast if ( spell . CastTime > 0 ) MovementManager . StopMoveTo ( false , Usefuls . Latency + 500 ); // Force cast spell if (force == true) if ( force ) Lua . LuaDoString ( "SpellStopCasting();" ); // Cast AoE spells by location if ( AreaSpells . Contains ( spell . Name )) { Lua . LuaDoString ( "CastSpellByName(\"" + spell . NameInGame + "\")" ); ClickOnTerrain . Pulse ( unit . Position ); } else { // Face unit to cast if (! unit . IsLocalPlayer ) MovementManager . Face ( unit ); if ( unit . IsLocalPlayer || unit . Type == WoWObjectType . Player ) SpellManager . CastSpellByNameOn ( spell . NameInGame , unit . Name ); if ( unit . IsMyTarget ) SpellManager . CastSpellByNameOn ( spell . NameInGame , "target" ); else { var old = ObjectManager . Me . MouseOverGuid ; ObjectManager . Me . MouseOverGuid = unit . Guid ; SpellManager . CastSpellByNameOn ( spell . NameInGame , "mouseover" ); ObjectManager . Me . MouseOverGuid = old ; } } return true ; }  ---------------------------------------- Unknown What's the difference between SpellManager.CastSpellByNameOn("Rejuvenation", p.Name); and Interact.InteractGameObject(player.GetBaseAddress); Spell.Launch(); Interact.ClearTarget(); ? ---------------------------------------- Unknown Where did You seen Enumerable in my question? 😄 ---------------------------------------- Unknown So what inside of CastSpellByNameOn ? ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/13309-looking-for-assistance-with-a-method-idea/ TITLE: Looking for assistance with a method idea ---------------------------------------------------------------------------------------------------- Unknown | 2021-07-27T18:02:50Z Hey everyone, I am in need of some big brained math experts to possibly help me translate some information to a C# method. I have here some bits and pieces of the Ovale Spell Priority addon, and I like the idea that used for the Shadow Priest's DoTs to check if the target will die in a certain time?: TargetDeadIn ( more 6 ) Looking into the Lua files, I find the function inside Condition.lua : TargetDeadIn = function ( condition ) local deadAt = getTargetDead () if condition [ 1 ] == "more" then return 0 , addTime ( deadAt , - condition [ 2 ]) else return addTime ( deadAt , - condition [ 2 ]), nil end end , as well as local function getTargetDead () local second = math . floor ( Ovale . maintenant ) if targetGUID ~= UnitGUID ( "target" ) then lastSaved = nil targetGUID = UnitGUID ( "target" ) savedHealth = {} end local newHealth = UnitHealth ( "target" ) if UnitHealthMax ( "target" )== 1 then return Ovale . maintenant + 10000 end if second ~= lastSaved and targetGUID then lastSaved = second local mod10 = second % 10 local prevHealth = savedHealth [ mod10 ] savedHealth [ mod10 ] = newHealth if prevHealth and prevHealth > newHealth then lastSPD = 10 /( prevHealth - newHealth ) -- print("dps = " .. (1/lastSPD)) end end -- Rough estimation return Ovale . maintenant + newHealth * lastSPD end If you have any input, I would love to see what you have to say, and thanks for reading! Edited July 27, 2021 by Apexx ---------------------------------------- Apexx could you be more specific what the point is behind this? You want to estimate if it´s worth to reapply your Dots on a Target? ---------------------------------------- Unknown That is what the function above checks for, yes. ---------------------------------------- Apexx hmm, your Spells have a Base Damage per Tick. I would take the Basedamage and compare it to the actual health. Let´s say you have a Target with 1000 Health, but the Basedamage of your ShadowWord: Pain is 300 per Tick (total of 5 Ticks) it´s not worth to cast it. On the other side, when you "wand" the target down like every SPriest does while leveling, a DoT comes in Hand. So in General, there are different Ways to Achieve what you want: 1. Read the dmg Output out of Combatlog of the Spell you desire and compare this against the enemy health 2. Calculate the Base Damage of the Spell you want to see and compare this against the enemy health 3. Limit your Dot´s, compared to the Health again, flat to the kind of Mob you are Facing (Normal Grind, Trash in Dungeon, Bossfight in Dungeon) 4. Maybe some more... Actually i try to understand the Point of the Addon above. In the AIO we did Point 3. We checked for the kind of Target we have actually and this is the Trigger for the Rotation. Like in ShadowWord:Pain (Bossfight: Ignore Health, Trashmobs in Dungeon: 5%, Grindmobs outside Dungeon 30% <-- Because we Wand them down). Hope i could give you a rough idea what i am talking about. If you need something more specific, let me know. ---------------------------------------- Talamin | 2022-01-30T20:17:13Z Looking back at this thread today and here is a rough method that I came up with: public float TargetTimeToDie ; private double damagePerSecond ; private double targetPreviousHealth ; private Timer timerDPS = new robotManager . Helpful . Timer ( 1000 ); private void FightEvents_OnFightLoop ( WoWUnit unit , System . ComponentModel . CancelEventArgs cancelable ) { if ( timerDPS . IsReady ) { if ( ObjectManager . Target . Health < targetPreviousHealth ) { //How much damage was done since the last second //Helpers.LogDebug($"targetCurrentHealth({ObjectManager.Target.Health}) - previousHealth({previousHealth})"); damagePerSecond = System . Math . Abs ( targetPreviousHealth - ObjectManager . Target . Health ); TargetTimeToDie = ( float ) System . Math . Round ( ObjectManager . Target . Health / damagePerSecond , 1 ); Helpers . LogDebug ( $ "Target will die in ~{TargetTimeToDie} second(s)." ); } targetPreviousHealth = ObjectManager . Target . Health ; } } Usage (Maybe you do not want to use large cooldowns on the target if they will die in such time. Or do not place totems, etc..): if ( TargetTimeToDie < 10.0f ) return ; Edited January 30, 2022 by Apexx ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/13623-fight-mob-seem-bugged-what-does-it-do/ TITLE: "[Fight] Mob seem bugged" What does it do? ---------------------------------------------------------------------------------------------------- Unknown Hey guys, I'm working on a product and sometimes, for various reasons, I'll come across a bugged mob or a mob that cannot be reached (ex: the Volatile Mutation that is in a cage, in the Draenei starting zone). The WRobot Fight method seems to at least detect that there is a problem. I call Fight.StartFight(guid), the character moves to the mob, and if it's bugged, after a while, I'll get a debug message in the log stating "[Fight] Mob seem bugged". Then it stops the fight... and then my product tries to fight it again. No Blacklist message or anything. I've looked everywhere in the forums and can't find anything about it. I've seen a few logs where after this message, the mob gets blacklisted, so I assume this part is handled by the WRobot default products. So in short, when a mob is detected as bugged, is there any way to trigger a guid blacklist? Or maybe it fires an event and I missed it? Thanks in advance. ---------------------------------------- Zer0 You can use log event and if that message happens blacklist it. ---------------------------------------- Unknown Thanks for the answer. I thought about that, and that would work but I hope there's a more elegant solution out there. ---------------------------------------- Zer0 I think blacklist events exist, but I don't recall if this case is covered by them. There is a blacklist of GUIDs (which in "real" wow are truly random and NOT re-used like on most p-servers) attached directly to the objectmanager iirc. It's either a list or a map that you can manually add those GUIDs to and they will never be considered in the OM, so for WRobot it's as if those mobs don't even exist. I believe I used this in my free AV plugin for blacklisting AV mobs too. ---------------------------------------- Unknown Blacklist events do exist and I checked them, but the "mob seems bugged" thing doesn't fire anything, as far as I know. I confirm that there is a GUID blacklist in wManager, and that's what I'm using, but I need to do it dynamically. I can also confirm that Trinity does not generate GUIDs on the fly, it just extracts preset GUIDs from the database for each creature/game object instance. But I suspect not every private server uses the same GUID for each npc , especially if they run on different cores so that would be unreliable. ---------------------------------------- Zer0 Then the best you can do is read log events and react to your current target when it happens. That should do the trick for now. Don't use the regular blacklist either (wManager.wManagerSetting.AddBlackList - this isn't realiable), it has to be the property directly on the ObjectManager class as seen here . I realize log events won't help much with identifying the mob correctly, but hopefully this will do the trick as your bot is still targeting the mob, so that you can blacklist it and then stop the fight manually afterwards. ---------------------------------------- Unknown That's a really cool trick for the ObjectManager blacklist, thanks ---------------------------------------- Unknown Just Theory Crafting but you may want to see if the lua function UnitCanAttack returns a value on the target, if it shows the target can not attack, you could use OnInteract or on FightsStart event to run a blacklist mob. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/13632-how-to-deal-with-not-attack-a-mob-appoint-in-combat/ TITLE: How to deal with not attack a mob appoint in combat ---------------------------------------------------------------------------------------------------- Unknown In combat, some  mob don't need to attack,How to deal with not attack a   mob appoint in combat, ---------------------------------------- Unknown Blacklist mobs id or set a list of entry id for the mobs that you want to target. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/13638-how-to-talk-to-all-npcs-in-the-area/ TITLE: How to talk to all NPCs in the area ---------------------------------------------------------------------------------------------------- Unknown How to talk to all NPCs in the area,I want to talk to all NPCs in the area. If I don't want to talk, continue to talk to other NPCs. o ask for your help!!! ---------------------------------------- Unknown Hello, you can try to use quester product (with quest type interactwith) ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/13652-how-to-realize-stealth-function/ TITLE: How to realize stealth function ---------------------------------------------------------------------------------------------------- Unknown How to realize stealth function!Need to unlock Lua, ---------------------------------------- Unknown Yes, you need a piece of code, read it from memory。 float ys = -40.0f; int processId = (int) wManager.Wow.Memory.WowMemory.Memory.GetProcess().Id; MemoryRobot.Memory memory = newMemoryRobot.Memory(processId); memory.WriteFloat (0x00987941, ys); int processID = (int)Wmanager.Wow.Memory.WowMemory.Memory.GetProcess().Id; MemoryRobot.Memory memory = New MemoryRobot.Memory(processId); I found this thing on the Internet, but I won't use it ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/13672-continentid/ TITLE: ContinentId ---------------------------------------------------------------------------------------------------- Unknown Sorry for my English. Is it possible to find out the continent of an arbitrary point? ---------------------------------------- Unknown This shows the continent where I am now. Need a continent of the point where the character is moving There is an idea to check NPCDB or TaxiDB for the nearest one and look at the continent there, but I don't like the optimization of this method ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/13720-how-to-write-the-c-code-to-judge-the-game-disconnection/ TITLE: How to write the c# code to judge the game disconnection ---------------------------------------------------------------------------------------------------- Unknown How to write the c# code to judge the game disconnection ---------------------------------------- Unknown Hello, easy way is to use wManager . Wow . Helpers . Conditions . InGameAndConnected ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/13731-draw-vector3-path-on-wrobot-map-from-a-plugin/ TITLE: Draw Vector3 Path on WRobot map from a plugin ---------------------------------------------------------------------------------------------------- Talamin I am developing a WRobot plugin that assists in making granular edits to Vector3 paths while in-game.  Right now I can add nodes, delete nodes, reposition existing nodes, and display the complete Vector3 path overlay in the client using Radar3D.DrawLine() and Radar3D.DrawCircle(): I would like to draw my path to the WRobot map the same way that the Gatherer Profile Editor does. Is this possible to do from within a plugin? ---------------------------------------- Unknown I believe there's a minimap function similar to Radar3D. Look into UserControlMinimap and MiniMapGenerator. ---------------------------------------- happiness7 Hi, good job. To draw on map you need to use https://wrobot.eu/byme/doc/html/F-wManager.Wow.Forms.UserControlMiniMap.LandmarksMiniMap.htm (it will also draw on 3d radar) ---------------------------------------- Unknown Fantastic!  UserControlMiniMap does exactly what I was looking for.  This works great!  Thank you both. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/13768-get-system-message-text/ TITLE: Get system message text ---------------------------------------------------------------------------------------------------- Unknown As title says, can one tell me pls how to get system message text, like this one? ---------------------------------------- Unknown Hello, I am sorry I haven't found easy way to do that. You can try to hook the lua method that write system message ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/13828-external-keypress/ TITLE: External keypress? ---------------------------------------------------------------------------------------------------- Unknown Hi there, I'm quite a bit new into coding and stumbled upon a problem. Is there a way for wrobot to send global keypress? I have software that reads my F1 keypress even when minimized. var p = System.Diagnostics.Process.GetProcessesByName("mysoft"); foreach (var process in p) { robotManager.Helpful.Keyboard.PressKey(process.MainWindowHandle, System.Windows.Forms.Keys.F1); } Using this doesn't work / works only on wow process. Would appreciate help for newbie. ---------------------------------------- Unknown Hello, your code seems good, you have try with another key (or in another process) (sometime the specials keys like F1 works badly)? ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/14302-how-to-lock-onto-a-target-when-mobs-are-running-away/ TITLE: How to lock onto a target when mobs are running away ---------------------------------------------------------------------------------------------------- Unknown Hi, right now i have a piece of code which targets the closest mob to me but then sometimes they move or even run away when low hp and my bot just targets a new mobs which isn't the behavior i would like it to have. I really want to be able to lock onto the target and chase it to death. Right now i have this code but it doesn't lock sadly, i'm trying to figure out how to do it for 2 days but couldn't find any smart way to do it... var focusUnit = ObjectManager . GetNearestWoWUnit ( focusMobsList ); if ( focusUnit . IsValid && ObjectManager . Target . Guid != focusUnit . Guid ) { Logging . WriteDebug ( string . Format ( "[PriorityTarget] Focus Unit - {0} (distance: {1})." , focusUnit . Name , focusUnit . GetDistance )); if ( ObjectManager . Target . IsValid ) Lua . LuaDoString ( "ClearTarget();" ); cancelable . Cancel = true ; var m = Fight . StartFight ( focusUnit . Guid , false ); } I can't find a smart way to modify my condition so it would only go inside if the previous target is dead... If someone have an idea or a hint, i'm welcoming any ideas...! Thanks a lot ---------------------------------------- Unknown Hello, you can try (it's not recommended to use this code, it can add bugs) : wManager . Events . FightEvents . OnFightEnd += delegate ( Int128 guid ) { var o = ObjectManager . GetObjectByGuid ( guid ); if ( o != null && o . IsValid && o . Type == WoWObjectType . Unit && // o.Entry == 1234 && // By Entry ID ????? new WoWUnit ( o . GetBaseAddress ). IsAlive ) { Fight . StartFight ( guid , false ); } }; ---------------------------------------- Unknown Oh i have to look at that, i'm gonna try and i'll update once i tested !! Thanks a lot man ! ---------------------------------------- Unknown I think it is working however, it sometimes Blacklist some mobs from the pack during 60sec i have no idea why, i'll try to look around what's the reason for the bot to blacklist a mob which is right next to meand shooting me. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/14392-tbc-stack-overflow-table-too-big-to-unpack/ TITLE: TBC - stack overflow (table too big to unpack) ---------------------------------------------------------------------------------------------------- Unknown I'm refactoring my inventory plugin from the grounds up and there's still one lasting issue that I can't seem to figure out after days of investigating. For context, I'm testing in dungeons, with high drop rates and I occasionally get a LUA error "stack overflow (table too big to unpack)". I can't trace back to its origin. I have only 3 LUA calls that unpack tables on return in the entire plugin. I'm positive they're not the issue, so something else is happening. I've noticed that it happens mostly on group rolls (but not only) and not on all characters. My only way to confirm this is by using BugGrabber and BugSack to get the time stamp of the LUA error, and outputting the time stamp in the chat before each LUA call, but even that is not very reliable since you don't get milliseconds precision, only seconds. The LUA call I make when rolling is the following: Lua . LuaDoString ( $ "ConfirmLootRoll({rollId}, 2)" ); It's exactly the same as before the rework (which was working flawlessly). As you can see, it's extremely simple. the rollId parameter is always checked in the log and always correct. I've never had this issue before, so any input is appreciated. Have you ever seen this issue? What could cause it? Is there any way at all to reliably detect which LUA call in the plugin is faulty? ---------------------------------------- Zer0 Hi, The bot uses unpack Lua function only to extract Lua events. When you catch LuaEvent does your code take time ? (maybe try to lock one thread to try to reproduce the problem, if it's the problem try to run the slow code in a new thread. In dungeons, he has probably more events that in open world). You can also try to put lower value at : wManager . wManagerSetting . CurrentSetting . EventsLuaWithArgsWaitTime wManager . Wow . Helpers . EventsLua . RefreshMs (~150 by default) ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/14418-db2reader/ TITLE: DB2Reader ---------------------------------------------------------------------------------------------------- Unknown What exact for wManager.Wow.Helpers.DB2Reader exists? I haven't found examples or documentation (( ---------------------------------------- Unknown Hello, It depends on the version of Wow, but in WOTLK by sample : using System . Runtime . InteropServices ; using wManager . Wow . Patchables ; namespace wManager . Wow . Helpers { /// /// Class WoWLock /// public class WoWLock { private readonly LockDbcRecord _lockDbcRecord0 ; private static DBC < LockDbcRecord > _lockDBC ; private WoWLock ( uint id ) { if ( _lockDBC == null ) _lockDBC = new DBC < LockDbcRecord >( 0x00AD40F4 - 0x400000 ); _lockDbcRecord0 = _lockDBC . GetRow (( int ) id ); } /// /// By id. /// /// The id. /// WoWLock. public static WoWLock FromId ( uint id ) { return new WoWLock ( id ); } /// /// Get record. /// /// The record. public LockDbcRecord Record { get { return _lockDbcRecord0 ; } } [ StructLayout ( LayoutKind . Sequential )] public struct LockDbcRecord { // 1 + 4*8 = 33 fields public uint Id ; [ MarshalAs ( UnmanagedType . ByValArray , SizeConst = 8 )] public uint [] KeyType ; [ MarshalAs ( UnmanagedType . ByValArray , SizeConst = 8 )] public uint [] LockType ; [ MarshalAs ( UnmanagedType . ByValArray , SizeConst = 8 )] public uint [] Skill ; [ MarshalAs ( UnmanagedType . ByValArray , SizeConst = 8 )] public uint [] Action ; } } } Which DB do you want to read? ---------------------------------------- Unknown I didn't heart yet about db2, just investigate ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/14659-amount-of-not-looted-mobs/ TITLE: amount of not looted mobs ---------------------------------------------------------------------------------------------------- Unknown Hi everybody! How to get amount of not looted mobs yet ? During mass-killing ) ---------------------------------------- Unknown Is any info in Looting state about nearest dead mobs maybe? ---------------------------------------- Unknown For anyone to be able to help you, we'd need logs Html file. ---------------------------------------- Unknown No You don't, for hinting me about ObjectManager.GetWoWUnitLootable().Count() ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/14660-chat_msg_system/ TITLE: CHAT_MSG_SYSTEM ---------------------------------------------------------------------------------------------------- Unknown How to read message text in EventsLua.AttachEventLua("CHAT_MSG_SYSTEM", () => {})? Chat.Messages.Count is zero. ---------------------------------------- Unknown using robotManager . Helpful ; using System ; using System . Collections . Generic ; using wManager . Plugin ; using wManager . Wow . Helpers ; public class Main : IPlugin { public void Initialize () { EventsLuaWithArgs . OnEventsLuaStringWithArgs += ChatEvent ; } public void Dispose () { EventsLuaWithArgs . OnEventsLuaStringWithArgs -= ChatEvent ; } public void Settings () { throw new NotImplementedException (); } private static void ChatEvent ( String EventName , List < String > Args ) { if ( EventName . ToString () == "CHAT_MSG_SYSTEM" ) { for ( int i = 0 ; i < Args . Count - 1 ; i ++) { Logging . WriteDebug ( $ "Args{i} = {Args[i].ToString()}" ); } } } } try this. Main.cs ---------------------------------------- Unknown tyvm! btw, EventsLuaWithArgs . OnEventsLuaStringWithArgs += ChatEvent ; can't work, but EventsLuaWithArgs.OnEventsLuaStringWithArgs += (e, a) => {}; with same procedure code works fine. I'm confuzed ) ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/14692-killandloot-easyquestclass/ TITLE: KillAndLoot EasyQuestClass ---------------------------------------------------------------------------------------------------- Unknown Can I manage next HotSpots point? Sometimes bot choose not the nearest hostspot ---------------------------------------- Unknown Hello, you can't change that (but this may change depending the type of product/profile used) ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/14716-latencyminlatencymax/ TITLE: LatencyMin/LatencyMax ---------------------------------------------------------------------------------------------------- Unknown Hello everyone, especially DroidZ! How works subj under the hood? It used for like Usefuls.Latency => return Random(LatencyMin, LatencyMax) or Thread.Sleep(Random(LatencyMin, LatencyMax)) or smth? If Engine.StartEngine method has default 16fps framerate, so LatencyMax should be less than 625ms ? I want to understand, how to tune LatencyMin & Engine.framerate for lower CPU using, meanwhile fighting with lowest latency between hits. ---------------------------------------- Unknown Hello, It's more for network latency than the delay to interact with the game. In the bot, before/after action, I generally use code like "Sleep(Usefuls.Latency + XXms)". Actual code used to get "Latency" : /// /// Gets the latency (between and , to get real latency use ). /// /// The latency. public static int Latency { get { lock ( _lockLatency ) { try { var real = LatencyReal ; if ( real > wManagerSetting . CurrentSetting . LatencyMax ) real = wManagerSetting . CurrentSetting . LatencyMax ; if ( real < wManagerSetting . CurrentSetting . LatencyMin ) real = wManagerSetting . CurrentSetting . LatencyMin ; return real ; } catch ( Exception e ) { Logging . WriteError ( "Latency: " + e ); return 0 ; } } } } private static readonly Object _lockLatencyReal = new Object (); /// /// Gets the real latency (home+world)). /// /// The real latency. public static int LatencyReal { get { lock ( _lockLatencyReal ) { try { if (! _timerLatency . IsReady || ! Conditions . InGameAndConnectedAndAlive ) return _lastLatency ; _timerLatency = new Timer ( 30 * 1000 ); var result = Lua . LuaDoString ( "local _, _, lag = GetNetStats(); return lag;" ); if ( result > 0 ) _lastLatency = result ; return _lastLatency ; } catch ( Exception e ) { Logging . WriteError ( "LatencyReal: " + e ); return 0 ; } } } } ---------------------------------------- Unknown So the only option for lower CPU consuming is engine's framerate ? Besides ingame performance ---------------------------------------- Unknown You can use low FPS in game. But you need to use optimised fightclass/plugins/profile (try to call lua codes between lock/unlockframe ) You can also change settings : https://wrobot.eu/byme/doc/html/F-wManager.wManagerSetting.ReadObjectManagerFTS.htm https://wrobot.eu/byme/doc/html/F-robotManager.MemoryClass.Hook.SleepTimeWaitCalled.htm https://wrobot.eu/byme/doc/html/F-wManager.wManagerSetting.EventsLuaWithArgsWaitTime.htm And use code like robotManager . Events . FiniteStateMachineEvents . OnAfterRunState += ( engine , state ) => { Thread . Sleep ( 10 ); }; ---------------------------------------- Unknown What is default values of them ? ---------------------------------------- Unknown What is default values of them ? - nvm, I can read it )) What for engine.framerate then? ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/14776-onpathfinderfindpathresult/ TITLE: OnPathFinderFindPathResult ---------------------------------------------------------------------------------------------------- Unknown I subscribe to subj event, and surprised for minumum 2 times calling it for simple path task wManager.Wow.Bot.Tasks.GoToTask.ToPosition(new Vector3(-5470.455, -2890.753, 350.0887, "None")); [N] 06:56:21 - [Path-Finding] FindPath from -5466.455 ; -2879.753 ; 350.0887 ; "None" to -5470.455 ; -2890.753 ; 350.0887 ; "None" (Azeroth) [N] 06:56:21 - [Path-Finding] Path Count: 3 (15.88784y, 111ms) [D] 06:56:21 - [myDebug] OnPathFinderFindPathResult [N] 06:56:21 - [Path-Finding] FindPath from -5466.455 ; -2879.753 ; 350.0887 ; "None" to -5470.455 ; -2890.753 ; 350.0887 ; "None" (Azeroth) [N] 06:56:21 - [Path-Finding] Path Count: 3 (15.88784y, 0ms) [D] 06:56:21 - [myDebug] OnPathFinderFindPathResult Isn't should be once? ---------------------------------------- Unknown Hello, It's going to be complicated to solve this problem without having all the code. Do you run your code several times (several threads)? You stop it well (when the bot is stopped). ---------------------------------------- Unknown Just ran it in development tools window for clean test. Ingame it throws sometime 4-5 events for one ToGo point during usual questing or gathering or any else pathing. ---------------------------------------- Hierophant Green When I run wManager . Wow . Bot . Tasks . GoToTask . ToPosition ( new Vector3 (- 5470.455 , - 2890.753 , 350.0887 , "None" )); in dev tools I get only one pathfinder call. If bot don't found path, in some case there can call pathfinder server several times. ---------------------------------------- Unknown Yeap, with other charachter's position it runs once o_O. Ok nvm then ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/14844-longmovego/ TITLE: LongMoveGo ---------------------------------------------------------------------------------------------------- Unknown What's the code inside subj? It interrupts by fight as well as GoToTask.ToPosition() As far as I noticed is automount ---------------------------------------- Unknown Hello, These methods are to use to go to destination with flying mount when you haven't path to follow (bot will try to avoid obstacles). ---------------------------------------- Unknown Bot successfully avoiding obstacles with simple GoToTask.ToPosition(x,y,x,"Flying") method. What the difference? ---------------------------------------- Unknown GoToTask methods are high-levels. They use the various methods of movement to make it easier to use. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/14921-implement-own-mount-routine/ TITLE: Implement own mount routine ---------------------------------------------------------------------------------------------------- Unknown hello community! I'm trying to implement following method in druid FC: when condition met bot has to use flying mount, else ground mount. There is following logic: I'm subscribing to OnPathFinderFindPath event and checking if I need to use flying path to destination point. If so then I'm setting destination flying and calling LongMove.LongMoveGo(destination). private static void checkIfNeedFlyingPath ( Vector3 from , Vector3 to , string continentNameMpq , CancelEventArgs cancelable ) { if ( NeedToUseFlyingPath ( to )) { to . SetFlying (); UseFlightForm (); Logging . WriteNavigator ( $ "LongMove to {to}" ); LongMove . LongMoveGo ( to ); cancelable . Cancel = true ; } }  Function that check if I need to fly. private static bool NeedToUseFlyingPath ( Vector3 dest ) { RotationLogger . Debug ( $ "Calling NeedToUseFlyingPath({dest})" ); if (! FlightForm . IsKnown () || Me . IsDead || Me . IsSwimming || Usefuls . ContinentNameMpq == "Azeroth" ) { RotationLogger . Debug ( $ "NeedToUseFlyingPath() precondition failed!" ); return false ; } float dist = Me . Position . DistanceTo ( dest ); RotationLogger . Debug ( $ "[Movement] Distance to point {dist}" ); if ( dist >= FCSettings . CurrentSetting . MinDistanceToFly && ( Logging . Status == "To Town" || Logging . Status == "Farming" || Logging . Status == "Looting" || ToTown . GoToTownInProgress || dist >= FCSettings . CurrentSetting . DistanceToFly )) { RotationLogger . Debug ( $ "[Movement] Need to use flying path to {dest}" ); return true ; } RotationLogger . Debug ( $ "[Movement] Need to use ground path to {dest}" ); return false ; }  The problem that this method is not stable. Sometimes it works fine, sometimes especially after farming state bot literally walks by the ground in flying form, then he might continue flying. I couldn't get where does he get this ground points when there is LongMove between 2 points 🙂 When I use built-in flying mechanics everything works decent. But I don't know how to implement similar flight mechanics. ---------------------------------------- Unknown I’d suggest inputting your own state to over rude default states. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/14929-fake-load-assembly/ TITLE: fake load assembly ---------------------------------------------------------------------------------------------------- Unknown Hi everyone! I'm trying to change product inside plugin with running quester profile or just inside quester profile with following code: new Thread(() => { wManager.Plugin.PluginsManager.DisposeAllPlugins(); robotManager.Products.Products.DisposeProduct(); robotManager.Products.Products.LoadProducts("Gatherer"); robotManager.Helpful.Gatherer.Bot.GathererSetting.CurrentSetting.ProfileName = "123.xml"; robotManager.Products.Products.ProductStart(); }).Start(); But robotManager.Helpful.Gatherer is not accessible, cuz Gatherer never started before and assembly not loaded yet. Adding smth like Products.LoadProductsWithoutInit() won't help. Is exist any solution instead of making fake profile with Gatherer preload? ---------------------------------------- Unknown Hello, It is new Thread (() => { wManager . Plugin . PluginsManager . DisposeAllPlugins (); robotManager . Products . Products . DisposeProduct (); robotManager . Products . Products . LoadProducts ( "Gatherer" ); Gatherer . Bot . GathererSetting . CurrentSetting . ProfileName = "123.xml" ; robotManager . Products . Products . ProductStart (); }). Start (); (your line 5 is bad) ---------------------------------------- Unknown Doesn't matter its mistake in post. For clarity: when I run fake profile like: then assembly Gatherer.dll have time to load. Same successful result, if I manually select Gatherer product in UI, then select back Quester "my_profile_with_thread_of_product_change.xml" ---------------------------------------- Unknown I'm not sure to understand all. But my previous code should work, even if the product settings interface is not up to date (one time, if you have loaded several time gatherer dll you will get error). Why you need to do that ? Why not use relogger application or Schedule product ? ---------------------------------------- Unknown Nope, ur code isn't work, test it please as Quester profile. Shedule and relogger has no needed condition to switch profiles. Also relogger need to restart game. ---------------------------------------- Unknown error text is: Compilator Error : c:\Data\temp\2q51l50f.0.cs(107,23) : error CS0103: The name 'Gatherer' does not exist in the current context ---------------------------------------- Unknown new Thread (() => { robotManager . Helpful . ArgsParser . GetArgs . Profile = "123.xml" ; robotManager . Helpful . ArgsParser . GetArgs . Product = "Gatherer" ; wManager . Plugin . PluginsManager . DisposeAllPlugins (); robotManager . Products . Products . DisposeProduct (); robotManager . Products . Products . LoadProducts ( "Gatherer" ); robotManager . Products . Products . ProductStart (); }). Start (); ---------------------------------------- Unknown That works, thanks a lot for a trick ) ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/14971-objectmanager-methods/ TITLE: ObjectManager methods ---------------------------------------------------------------------------------------------------- Unknown ObjectManager methods get values from cache (which updates every frame) or reading from game's memory every call? ---------------------------------------- Unknown it updates on a ms of 150 miliseconds ---------------------------------------- Unknown where can i change it? ---------------------------------------- Unknown run this as a int var wManagerSetting . CurrentSetting . ReadObjectManagerFTS ---------------------------------------- Unknown Wrobot pulse method for readingobjects public static void Pulse () { try { if ( Pulsator . \u 0002 == null ) { if ( 3 != 0 ) { ObjectManager . \u 0002 (); } } else { for (;;) { if ( Memory . WowMemory . ThreadHooked && Memory . WowMemory . Memory . IsValidAndOpenProcess () && Usefuls . InGame ) { if ( 4 != 0 ) { ObjectManager . \u 0002 (); } } else { Dictionary < ulong , WoWObject > objectDictionary = new Dictionary < ulong , WoWObject >(); if (! false ) { ObjectManager . ObjectDictionary = objectDictionary ; } } if ( wManagerSetting . CurrentSetting . ReadObjectManagerFTS <= 1000 ) { Thread . Sleep ( 1000 / wManagerSetting . CurrentSetting . ReadObjectManagerFTS ); } } } } catch ( Exception ex ) { string str = \u 0006 \u 2003 \u 2000. \u 0002 (- 1731816084 ); Exception ex2 = ex ; Logging . WriteError ( str + (( ex2 != null ) ? ex2 . ToString () : null ), true ); Pulsator . \u 0002 = null ; } } ---------------------------------------- Unknown Thank You, got it ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/5507-changing-botbase/ TITLE: Changing Botbase ---------------------------------------------------------------------------------------------------- Unknown Hello, I'm trying to change my Botbase(in Plugin) from Party bot to another. I found somethink like this: Products.DisposeProduct(); Products.LoadProducts("Automaton"); After this trying additional Products.ProductRestart(); etc but it dosen't work. Bot stopped or freezed? Any1 know how to do this? ---------------------------------------- Unknown Hello, i tried this also by a plugin but i have figured out that it's abit difficult. You need to create your own thread because if you dispose product your plugin also stop working(maybe there's another method to do it but i haven't found it yet). Here's an example how do you create your own thread: public static bool _isLaunched1; public static bool AllowAbort; Dictionary threadDict = new Dictionary (); public void Initialize() { MemoryBool(true); Thread th1 = new Thread(() => Thread1()); th1.Name = Convert.ToString(TableID); th1.Start(); threadDict.Add("Thread1", th1); Logging.Write("Thread started."); } public void Dispose() { if (!MemoryBool()) { Logging.Write("Abort thread."); SwitchProduct(StartedRotationName()); if (AllowAbort) { threadDict["Thread1"].Abort(); } } } public void Settings() { } public void Thread1() { Logging.Write("Initialize thread."); _isLaunched1 = true; var timer = new Timer(1500); timer.ForceReady(); while (_isLaunched1) { try { if (Conditions.ProductIsStartedNotInPause && timer.IsReady //&& !ObjectManager.Me.IsDead //optional ) { Pulse1(); timer.Reset(); } } catch { } Thread.Sleep(65); } } //may change address if not available or use System.Runtime.Caching.MemoryCache or write settings public bool MemoryBool() { if (Memory.WowMemory.Memory.ReadInt32((uint) GetWoWBase() + 0x7322CA) == 1) { return true; } return false; } public void Pulse1(); { Logging.Write("Tick"); } and the key to switch products: //Need own thread to work //=> Products.ProductStop();/Products.DisposeProduct(); aborts the main thread and method has nothing to continue public void SwitchProduct(string name) { if (Products.ProductName != name && Products.IsStarted) { Logging.Write("Switch to " + name); MemoryBool(true); Products.ProductStop(); Products.LoadProducts(name); Logging.Write("stop & load product"); Thread.Sleep(200); Products.ProductStart(); Logging.Write("product start & abort old"); MemoryBool(false); Thread.Sleep(1500); threadDict["Thread1"].Abort(); //abort of current thread } } if you need support, feel free to pm me ---------------------------------------- Unknown Thanks mate for reply! When I back to home then I test this :) ---------------------------------------- Unknown ah forget the complicated code, i've found a better way to do it for e.g: public void Initialize() { Logging.Write("Plugin started."); Thread.Sleep(7000); SwitchProduct("Grinder"); } public void Dispose() { Logging.Write("Disposed"); } public void Settings() { } public void SwitchProduct(string name) { if (Products.ProductName != name && Products.IsStarted) { var t = Task.Run(async delegate { await Task.Delay(500); Logging.Write("Switch to " + name); Products.ProductStop(); Products.LoadProducts(name); Logging.Write("stop & load product"); Thread.Sleep(200); Products.ProductStart(); Logging.Write("product start"); Thread.Sleep(1500); }); t.Wait(); } } I think it's better ;) Edit: using System.Threading.Tasks; is also needed ---------------------------------------- Unknown Works perfectly! Thanks! ---------------------------------------- Unknown @reaperl as a novice at this, would you say its best to run most plugins as async or on other threads? ---------------------------------------- @Jasabi @Jasabi For plugins there's no best. It depends on the situation. Most of the time you won't need it anyway for plugins because it's not so complex and stucks don't happen that often while running. I think also that every plugin run anyway on it's own thread. For e.g. if you use async with a method it will run independent (it doesn't block the main thread on its own processing) so other stuff can continue and the second one what you have mention is multithreading. The both are "almost" the same but with multithreading you have your seperate thread which can execute its own code. ---------------------------------------- Unknown hello i cant` understand this code i need to switch to party after quest is finish ? ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/8271-5-bot-dungeon-accept/ TITLE: 5 bot dungeon Accept ---------------------------------------------------------------------------------------------------- Unknown Hi I'm currently leveling 5 druids to level 80 on a 3.3.5 server. I'm running 1 feral tank, 3 feral dps and 1 resto druid. I'm mostly running grinder on my tank and then party on the other 4 druids which is working really good. I've done a few dungeons with them and that works really good aswell, but then I manually have to controll the druid tank. My goal with this team was to be able to run dungeon/quester profiles on my main druid and then have the 4 druids assist him. Running the dungeons manually on the main character works fine so I surviving is not an issue, problem is for example, searching and also joining the dungeon. I've setup the team so that I can use party chat to send commands to the other bots for example "Drink" and all the bots start drinking. Looking at the party bot it does not have many options so it looks like all the logics will have to be done within the main character so for example if it's going to search dungeon the main character searches for dungeon and it then send a party command "Pick Role" and all druids pick a role and when it detetects queue pop(which will be instant becuase of 5 characters) it will send party command "Accept Dungeon". This feel doable with some LUA perhaps? Help me with this one if it's even possible. The problem I then face is how does it know which dungeon profile to run, I can create dungeon profile for all the dungeons within the random dungeon finder BUT it needs to detect which one it is and then run quester profile accordingly. Is there anyway todo this? Any help is greatly apprecuited! I have not touched any LUA except some basic commands in fight classes and I've never even looked at c++ code. So if c++ or lua is needed some great pointers where to look for guidance would be great! Thank you! ---------------------------------------- Unknown you can try to make auto accept dungeon plugin, like i did in Battleground helper . For this you have to listen Lua event LFG_PROPOSAL_SHOW, and when it fires, call AcceptProposal() function, or, if it disabled, click accept button programmatically. To discover name of button, type /fstack command, join dungeon queue, and when confirm dialog popup, put cursor above button and read it name. Plugin code should be like this: using wManager . Wow . Enums ; using wManager . Wow . Helpers ; using System . Collections . Generic ; public class Main : wManager . Plugin . IPlugin { public void Initialize () { EventsLuaWithArgs . OnEventsLuaWithArgs += MyLuaHandler ; } public void Dispose () { EventsLuaWithArgs . OnEventsLuaWithArgs -= MyLuaHandler ; } private void MyLuaHandler ( LuaEventsId id , List args ) { if ( id == LuaEventsId . LFG_PROPOSAL_SHOW ) { Lua . LuaDoString ( "AcceptProposal()" ); // or Lua.LuaDoString("Button_name_you_found:Click()"); } } public void Settings () { // no settings } } Of course, you can handle other events too (like invite accept and role select) ---------------------------------------- Unknown Thank you! I kinda managed to auto accept it by running party command chat plugin to my other 4 characters, but this looks more reliable. But it brings me to a problem I stumbled upon, how do I search for random dungeon or specific dungeon in the first place as the leader? If I want to keep queuing dungeons after I'm finished with one. ---------------------------------------- Unknown There are alot of LFG functions and LFG events (check started with "LFG"). Read documentation, try functions in developer tools, and write code like in pattern above. Much of functions and events undocummented, maybe you can find better source with google ---------------------------------------- Unknown I've managed to queue and join a dungeon with my entire party but once I get in i can find what dungeon it is by return (wManager.Wow.Helpers.Usefuls.ContinentId == (int)wManager.Wow.Enums.ContinentId.GruulsLair); I believe but how would I go on about starting a specific quest depending on what dungeon it was?? Also I tried open some plugin with source files but I just get error on wMananger, does it need to be compiled or should I add some library first? Finding no info on how to make plugins ---------------------------------------- Unknown I think you can call GetInstanceInfo . For example, if you use lua events listener (i never tried, but maybe it possible in grinding profile too), you can call it after PLAYER_ENTERING_WORLD event: private void MyLuaHandler ( LuaEventsId id , List args ) { switch ( id ) { case LuaEventsId . LFG_PROPOSAL_SHOW : Lua . LuaDoString ( "AcceptProposal()" ); break ; case LuaEventsId . PLAYER_ENTERING_WORLD : StartInstance (); break ; default : break ; } } private void StartInstance () { string [] dungeonInfo = Lua . LuaDoString < string []>( "return GetInstanceInfo()" ); // name=dungeonInfo[0] type=dungeonInfo[1] difficulty=dungeonInfo[2] ... if ( dungeonInfo [ 1 ] == "party" ) { // here you can check dungeon name switch ( dungeonInfo [ 0 ]) { case "Gruul's Lair" : start_quest_1 break ; case "another name" : start_quest_2 break ; ... default : break ; } } } ---------------------------------------- Unknown That sounds like a good plan, but how and where would you use this piece of code? I know how to send lua snippets of code by the lucamacro commands in quester but where would you use this big piece of code? Make a plugin for it? Can the plugins talk to the quester profile? by changing as you writing "start_quest_1" or is that the profiles it will start? ---------------------------------------- Unknown So how to accept party? ---------------------------------------- Unknown Sorry to revive an old thread but I'm having issues with the script above recognizing the queue popping up. using wManager.Wow.Enums; using wManager.Wow.Helpers; using System.Collections.Generic; public class Main : wManager.Plugin.IPlugin { public void Initialize() { EventsLuaWithArgs.OnEventsLuaWithArgs += MyLuaHandler; } public void Dispose() { EventsLuaWithArgs.OnEventsLuaWithArgs -= MyLuaHandler; } private void MyLuaHandler(LuaEventsId id, List args) { if (id == LuaEventsId.LFG_PROPOSAL_SHOW) { Lua.LuaDoString("LFDDungeonReadyDialogEnterDungeonButton:Click()"); } } public void Settings() { // no settings } } Is it possible there's a different event other than LFG_PROPOSAL_SHOW ? if so how would I go about finding it? on 3.3.5 ---------------------------------------- Unknown This is what i used to handle taking proposal, public static void AcceptProposalHandler ( LuaEventsId id , List args ) { if ( id == LuaEventsId . LFG_PROPOSAL_SHOW ) { Lua . LuaDoString ( "AcceptProposal();" ); } } You are going to need a way to check if you are in the que or not. public static bool Qued ( string GetLFGType ) { return Lua . LuaDoString ( "local mode, submode = GetLFGMode(LE_LFG_CATEGORY_LFD); if mode == '" + GetLFGType + "' then return true; end" ); } we are both working on the same project, wanna work together on this? two brains better then one LOL Message me if your up for it. ---------------------------------------- Unknown Guys, are you Alive? Did you create something to accept dung? ---------------------------------------- @ cometttor @ cometttor Source Code (Plugin) using robotManager . Helpful ; using System ; using System . Collections . Generic ; using System . Windows ; using wManager . Plugin ; using wManager . Wow . Helpers ; public class Main : IPlugin { public void Initialize () { EventsLuaWithArgs . OnEventsLuaStringWithArgs += AcceptDungeon ; } public void Dispose () { EventsLuaWithArgs . OnEventsLuaStringWithArgs -= AcceptDungeon ; } public void Settings () { MessageBox . Show ( "No Settings." ); } private void AcceptDungeon ( String EventName , List < String > Args ) { try { if ( EventName . ToString () == "LFG_PROPOSAL_SHOW" ) { Lua . LuaDoString ( "AcceptProposal();" ); } } catch ( Exception ex ) { Logging . WriteError ( "Main > AcceptDungeon > " + ex . StackTrace ); } } } ---------------------------------------- @ cometttor how Can i Use that? ---------------------------------------- @ cometttor will be grateful for some explaination thanks in advance, Adrian ---------------------------------------- Unknown What do you need explained? ---------------------------------------- Unknown there is I code which should be used in right place. im total amateur and I just watned to know how can i Use it. If its not too professional or too complicated for you - please, mase some desciprtiom how to add this code to my wrobot. ---------------------------------------- Unknown Create a new text file. Copy/paste the code into it. Rename the file something like DungeonAccept.cs (make sure you change the extension). Move the file to your wrobot plugin folder. ---------------------------------------- Unknown thank you ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/11681-how-to-get-rolled-item-as-wowitem/ TITLE: How to get Rolled item as WowItem? ---------------------------------------------------------------------------------------------------- Unknown Hi! I'm trying to create a plugin that automaticly needs on the rolled item if the bot needs it otherwise greeds/passes/DE. But I've got problem that I can't always find the ID from the item. Right now I'm getting the item's name from " GetLootRollItemInfo" and I then I use this code to get it as a WowItem.  WoWItem item = ObjectManager.GetObjectWoWItem().FirstOrDefault(i => i.Entry == ItemsManager.GetIdByName(name)); This does not always work, I sometimes get the ID 0. This would also not work on items with random enchants because they all have same item ID but not same stats. I have seen there is itemlink aswell but I can't find much information about it, GetLootRollItemLink. If you have any piece of advice how to get the rolled item as a wowItem it would be great because then I don't have to change any of the other code.  Best Regards A.Z ---------------------------------------- Unknown Hello, you play in what version? ---------------------------------------- Unknown Wrath, 3.3.5 ---------------------------------------- Unknown | 2019-10-29T15:54:30Z Do you need to roll based on ID? Sounds a bit like double work to first convert to ID? Can't you just make the roll based on item name? Another solution is to get itemlink from the frame itself. You can use framestack to figure out what frame it is, then you can both get stats as well as item id from that. ? Edit: I obviously didn't mean itemlink, I meant tooltip lol Edited October 29, 2019 by Ordush ---------------------------------------- Unknown I'm using weightstats in deciding if the item is needed or not before needing/passing on the item. Problem is when I get items such as "....of the hawk,bear,tiger " etc because they all have the same item ID but different "random enchants". It's surely an idea to get the stats from the frame itself, I'll have a look! Thanks!  Edit: I missunderstood your first part I believe. The reason I want to make it into an WowItem class is because I can skip modifying parts of the code I already made. ---------------------------------------- Unknown | 2019-10-29T16:06:09Z I understand, are you only able to roll based on ID? Because if not, then the 0 ID bug, can be avoided simply by using name. ? You could make a table with the item name and stats, if the stats meets your satisfactory, then roll need on the item otherwise greed/disenchant. Edit: Tables (Lua) is about the same as 'arrays' in c#. ? Edited October 29, 2019 by Ordush ---------------------------------------- Unknown Where would I find/create these tables? It would require me to download the entire item database and keep in a table? Right now the code only takes the argument WowItem which is a problem since I don't know how to create a WowItem from the name or ID.  Thank you, my lua knowledge is very limited to only the wow lua api right now, only been doing c#. ---------------------------------------- Unknown | 2019-10-29T16:37:32Z You create these tables yourself, and no you don't need to download anything. You actually might not even need to make a table, it was just some way for you to keep your stuff sorted. Get the stats from the tooltip, compare these stats with your weight, if the stats comes out as something you'd roll on, then roll on that item. Do you HAVE to make it an wow item? Can you not skip this alltogether? I personally haven't used wrobot to roll. Edited October 29, 2019 by Ordush ---------------------------------------- Unknown How i can create WoWItem from itemlink? GetLootRollItemLink. I need code like:  WoWItem itemRollLink = Lua . LuaDoString ( "local link = GetLootRollItemLink(" + args [ 0 ]+ "); return link" ); Please ---------------------------------------- @ happiness7 Really good job, but i only needed wowitem from itemlink for modification "Butler" plugin. Thanks anyway 🙂 ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/12082-detect-if-target-is-mounting-up/ TITLE: Detect if Target is mounting up ---------------------------------------------------------------------------------------------------- Unknown Hello, I'm working on a WRotation fight class for a Shaman, that is set on /follow and always targets the Main Char. I want it to look like its a multiboxing char, that uses totems and heals. I cant figure a way for the Shaman to mount up when the Main Char Mounts up. I already Tried "Target Casting Spell by Name" ... This doesnt work. I guess this is due to the mount is considered an item and not a Spell. This seems like an easy task, but smh I cant find a solution. Any Ideas? ---------------------------------------- Unknown Have you tried buffname? ---------------------------------------- Unknown Try reinstalling wrobot into a new folder, because party is supposed to auto mount up if leader does it. ---------------------------------------- Unknown Yes this works, but not the way I want to. I want to make both chars use their Mounts at the same time, so it looks like its controled by a multiboxing macro. Im not using Party, im using WRotation. Party often looks "fake" and the Party-controled char is attacking the Mob. I don't want that ---------------------------------------- @Matenia Try using this plugin by @Matenia : ---------------------------------------- Unknown hello, In "Dev... tools" tab "Tools" click on button "Target info". Check "CastingSpellId" and "CastingSpell", if this don't help you can only check when character is mounted with "IsMounted". You can use it in fightclass editor with "CSharp condtion" like: wManager . Wow . ObjectManager . ObjectManager . Target . IsMounted // OR wManager . Wow . ObjectManager . ObjectManager . Target . CastingSpell . Name == "Name in Engish" // OR wManager . Wow . ObjectManager . ObjectManager . Target . CastingSpellId == 1234 ---------------------------------------- Unknown I understand now what it is he wants. He wants both of them to mount up at the same exact time, and not get the second char to cast mount when the other char has cast it. He basically wants it to look like he is mutli-boxing. The only way you can do that is by using chat commands, reading from an external file etc. I'd suggest you take a look at chat commands it's somewhere here on the forum Then you make player A write in chat then cast mount player B cast mount if chat message. That way you will get as close as mounting at the same time as you can. ---------------------------------------- Unknown This is exactly what I need, although this might become obvious, even if you use your own Channel or whispers...  Thanks fhe help! ---------------------------------------- @Matenia Im going to look into that. Looks promising! ---------------------------------------- Unknown Is it possible to use something similar to get a bot to only cast if the targets name matches one specified as a condition, I am able to get it to cast at the target!! That's not the problem, the issue is that it checks all party members for specified conditions and the  player name is not one of the conditions so it repeat casts on the named target as it returns true. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/12435-help-affected-by-certain-spell/ TITLE: [HELP] Affected by certain spell ---------------------------------------------------------------------------------------------------- Unknown So, I'm trying to make my bot react using OnFightLoop when I get hit but certain spell but I cannot find a way. Currently, for the debuffs I use: ObjectManager.Me.HaveBuff Which it works well, but is there a way to know if the bot is affected by certain spell that doesn't apply a debuff? ---------------------------------------- Unknown Hello, The better is to use lua for that ---------------------------------------- Unknown Hello, thanks for your answer, could you give me a small example? And can this be combined with CSharp? ---------------------------------------- Unknown What do you want to do if you are affected by a certain spell? You want check a special spell or check by example if your character is stun? ---------------------------------------- Unknown Let's say the character has been afected by certain AOE spell, then I want to move to stop receiving damage. I'm doing it currently for spells like Blizzard, but again, with AOE spells that dont have a debuff I don't really know how to do it. ---------------------------------------- Unknown I couldn't give a code that works, people here are more specialized in that. But I think you should look at the lua event side (wManager.Wow.Helpers.EventsLuaWithArgs.OnEventsLuaStringWithArgs) Run this code to dump lua event in wrobot log: wManager . Wow . Helpers . EventsLuaWithArgs . OnEventsLuaStringWithArgs += delegate ( string eventid , List args ) { try { //if (eventid != "COMBAT_LOG_EVENT_UNFILTERED" && eventid != "COMBAT_LOG_EVENT") // return; var argsString = new System . Text . StringBuilder (); var first = true ; foreach ( var a in args ) { if ( first ) first = false ; else argsString . Append ( " , " ); argsString . Append ( a ); } robotManager . Helpful . Logging . Write ( "[L] " + eventid + " > " + argsString . ToString ()); } catch { } }; ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/12461-authenticate-your-intellectual-property/ TITLE: Authenticate Your Intellectual Property ---------------------------------------------------------------------------------------------------- Matenia I stumbled across a website the other day, while looking for an alternative to Rocketr to process payments, and validate plugins, fight classes, etc. when I found, cryptlex ( Powerful software licensing API) . Quick Start Using LexActivator with C# After working with the code a bit, I wanted to share a demo project, along with a demo product online, as well as license keys if anyone would like to test it out for themselves. This project may have bugs and may not work 100%. I am hoping if other programmers check out the code they can offer ideas, comments, and even constructive criticism using this method. There is a "WRobot" directory in the attached zip file that stores the files required to run the LexActivator C# wrapper as well as the plugin and the product.dat file. Extract the files into their appropriate directory. VirusTotal CryptlexAuthenticator.zip ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/12492-miscellaneous-code-idea-developers-only/ TITLE: miscellaneous Code Idea (Developers only) ---------------------------------------------------------------------------------------------------- Unknown | 2020-09-08T17:42:09Z Hello, this is just thread where i post miscellaneous Code  to help others get idea or fix to there problems. Note some code works, some doesnt. its mainly for educational perspectives. Quest Checker private static bool IsQuestCompleted ( int questID ) { Lua . LuaDoString ( "ExpandQuestHeader(0)" ); int QuestCount = Lua . LuaDoString (@ "return select(1, GetNumQuestLogEntries())" ); for ( int i = 1 ; i <= QuestCount ; i ++) { var QuestInfo = Lua . LuaDoString < List >( string . Format (@ "return GetQuestLogTitle(" + i + ")" )); if ( QuestInfo [ 4 ] == "1" || QuestInfo [ 5 ] == "1" ) continue ; string QuestStatus = null ; if ( QuestInfo [ 6 ] == "1" ) QuestStatus = "completed" ; else if ( QuestInfo [ 6 ] == "-1" ) QuestStatus = "failed" ; else QuestStatus = "in progress" ; if ( QuestInfo [ 8 ] == Convert . ToString ( questID ) && QuestStatus == "completed" ) { return true ; } } return false ; } Edited September 8, 2020 by TheSmokie ---------------------------------------- Unknown This code i made for running normal instances, come out to sell items to "traveler's tundra mammoth" Quester >  Custom Script. using robotManager . Helpful ; using wManager . Wow . Helpers ; using wManager . Wow . Bot . Tasks ; using wManager . Wow . ObjectManager ; using System . Linq ; using System . Threading ; using System . Collections . Generic ; using wManager . Wow . Enums ; using System ; using System . ComponentModel ; using System . IO ; using System . Configuration ; public static class Main_Thread { public static List Sellitems = new List (); public static WoWPlayer Me = ObjectManager . Me ; public static void Start () { wManager . wManagerSetting . CurrentSetting . CloseIfPlayerTeleported = false ; wManager . wManagerSetting . CurrentSetting . Save (); Lua . LuaDoString (@ "SetDungeonDifficulty(1);" ); } public static void OnSeemStuck () { if (! wManager . wManagerSetting . IsBlackListedZone ( new Vector3 ( Me . Position . X , Me . Position . Y , Me . Position . Z , "None" ))) { wManager . wManagerSetting . AddBlackListZone ( new Vector3 ( Me . Position . X , Me . Position . Y , Me . Position . Z , "None" ), 2.00f , true ); Logging . Write ( "[Unstuck Blacklisting]: " + Me . Position . X . ToString () + Me . Position . Y . ToString () + Me . Position . Z . ToString ()); } } public static void ToPosition ( Vector3 vector ) { GoToTask . ToPosition ( vector ); } public static void MoveWhileDead () { var badCorpsePos = new Vector3 (- 3361.787f , 4665.568f , - 22.70184f ); var enterDungeonPos = new Vector3 (- 3361.623f , 4643.492f , - 101.047f ); Logging . Write ( "[EnterCorpse] Started." ); wManager . Events . OthersEvents . OnPathFinderFindPathResult += ( from , to , path , mpq , success ) => { if ( ObjectManager . Me . IsDead && to . DistanceTo ( badCorpsePos ) < 10 ) { path . Clear (); path . AddRange ( PathFinder . FindPath ( enterDungeonPos )); } }; } public static void Mammoth () { string Mount_Name = "Traveler's Tundra Mammoth" ; if ( GoToTask . ToPosition ( new Vector3 (- 3361.868f , 4759.114f , - 101.3954f ))) { if (! ObjectManager . Me . HaveBuff ( Mount_Name )) { SpellManager . CastSpellByNameLUA ( Mount_Name ); Usefuls . WaitIsCasting (); } } } public static void Sellingitems () { List < WoWItemQuality > quality = new List < WoWItemQuality > { WoWItemQuality . Common , WoWItemQuality . Poor , WoWItemQuality . Rare , WoWItemQuality . Epic , WoWItemQuality . Uncommon }; int Mount_Vendor_ID = 32641 ; var Mount_Vendor = ObjectManager . GetWoWUnitByEntry ( Mount_Vendor_ID ). FirstOrDefault ( i => i . Entry == Mount_Vendor_ID ); if ( Mount_Vendor . IsValid && Mount_Vendor != null ) { Interact . InteractGameObject ( Mount_Vendor . GetBaseAddress ); foreach ( WoWItem item in Bag . GetBagItem ()) { if (! Selling_Settings . CurrentSetting . DONOT . Contains ( item . GetItemInfo . ItemName )) { Sellitems . Add ( item . GetItemInfo . ItemName ); Vendor . SellItems ( Sellitems , Selling_Settings . CurrentSetting . DONOT , quality ); Thread . Sleep ( 100 ); } } Thread . Sleep ( 10 ); } } public static void DoNotSellITems ( string item ) { Selling_Settings . Load (); if (! Selling_Settings . CurrentSetting . DONOT . Contains ( item )) { Selling_Settings . CurrentSetting . DONOT . Add ( item ); Selling_Settings . CurrentSetting . Save (); } } } [ Serializable ] public class Selling_Settings : Settings { [ Setting ] [ DefaultValue ( null )] [ Category ( "C:_Other Functions_" )] [ DisplayName ( "Items to delete" )] [ Description ( "It will attempt to DELETE the Items in interval" )] public List DONOT { get ; set ; } private Selling_Settings () { DONOT = new List (); } public static Selling_Settings CurrentSetting { get ; set ; } public bool Save () { try { return Save ( AdviserFilePathAndName ( "Selling_Settings" , ObjectManager . Me . Name + "." + Usefuls . RealmName )); } catch ( Exception e ) { Logging . WriteError ( "Selling_Settings > Save(): " + e ); return false ; } } public static bool Load () { try { if ( File . Exists ( AdviserFilePathAndName ( "Selling_Settings" , ObjectManager . Me . Name + "." + Usefuls . RealmName ))) { CurrentSetting = Load < Selling_Settings >( AdviserFilePathAndName ( "Selling_Settings" , ObjectManager . Me . Name + "." + Usefuls . RealmName )); return true ; } CurrentSetting = new Selling_Settings (); } catch ( Exception e ) { Logging . WriteError ( "Selling_Settings > Load(): " + e ); } return false ; } } ---------------------------------------- Unknown Note : this is not the code used in selector, the reward selection in selector is more advanced, but i think this will help make the whole quest reward problem go away for a lot of devs. enjoy. using wManager . Wow . Helpers ; using System . ComponentModel ; using System . Threading ; public static class Quester_rewards { public static void Select () { wManager . Events . OthersEvents . OnSelectQuestRewardItem += delegate ( CancelEventArgs cancelable ) { cancelable . Cancel = true ; gossip (); Thread . Sleep ( 100 ); if ( Lua . LuaDoString ( "if QuestFrameRewardPanel:IsVisible() then return true else return false end" )) Selecter (); }; } public static void Selecter () { int questRewards = Lua . LuaDoString ( "return GetNumQuestChoices()" ); if ( questRewards == 0 ) { Lua . LuaDoString ( "QuestFrameCompleteQuestButton:Click();" ); Thread . Sleep ( 100 ); } else RunLua (); } public static void gossip () { Lua . LuaDoString (@ " if ( not QuestFrameRewardPanel : IsVisible () or QuestFrameRewardPanel : IsVisible () == nil ) then local gossipTable = { GetGossipActiveQuests ()} local numOptions = table . getn ( gossipTable )/ 4 local nameIndex , completeIndex = 1 , 4 for i = 1 , numOptions do if gossipTable [ completeIndex ] == 1 then SelectGossipActiveQuest ( i ) CompleteQuest (); end nameIndex , completeIndex = nameIndex + 4 , completeIndex + 4 end return "); } public static void RunLua () { Lua . LuaDoString (@ " local numberOfQuestRewards = GetNumQuestChoices () local mostValuableQuestItemIndex , mostValuableQuestItemValue , bestQuestItemIndex , bestQuestItemArmorWeight = 1 , 0 , - 1 , - 1 local armorWeights = { Plate = 4 , Mail = 2 , Leather = 1 , Cloth = 0 } local equipmentSlotLookup = { INVTYPE_HEAD = { "" HeadSlot "" , nil }, INVTYPE_NECK = { "" NeckSlot "" , nil }, INVTYPE_SHOULDER = { "" ShoulderSlot "" , nil }, INVTYPE_CLOAK = { "" BackSlot "" , nil }, INVTYPE_CHEST = { "" ChestSlot "" , nil }, INVTYPE_WRIST = { "" WristSlot "" , nil }, INVTYPE_HAND = { "" HandsSlot "" , nil }, INVTYPE_WAIST = { "" WaistSlot "" , nil }, INVTYPE_LEGS = { "" LegsSlot "" , nil }, INVTYPE_FEET = { "" FeetSlot "" , nil }, INVTYPE_SHIELD = { "" SecondaryHandSlot "" , nil }, INVTYPE_ROBE = { "" ChestSlot "" , nil }, INVTYPE_2HWEAPON = { "" MainHandSlot "" , "" SecondaryHandSlot "" }, INVTYPE_WEAPONMAINHAND = { "" MainHandSlot "" , nil }, INVTYPE_WEAPONOFFHAND = { "" SecondaryHandSlot "" , "" MainHandSlot "" }, INVTYPE_WEAPON = { "" MainHandSlot "" , "" SecondaryHandSlot "" }, INVTYPE_THROWN = { "" RangedSlot "" , nil }, INVTYPE_RANGED = { "" RangedSlot "" , nil }, INVTYPE_RANGEDRIGHT = { "" RangedSlot "" , nil }, INVTYPE_FINGER = { "" Finger0Slot "" , "" Finger1Slot "" }, INVTYPE_HOLDABLE = { "" SecondaryHandSlot "" , "" MainHandSlot "" }, INVTYPE_TRINKET = { "" Trinket0Slot "" , "" Trinket1Slot "" } } for questItemIndex = 1 , numberOfQuestRewards do local itemName , itemLink , itemRarity , itemLevel , itemMinLevel , itemType , itemSubType , itemStackCount , itemEquipLoc , itemTexture , itemSellPrice = GetItemInfo ( GetQuestItemLink ( "" choice "" , questItemIndex )) if itemRarity >= 3 then return end local itemId = itemLink : match ( "" | Hitem :(% d +) "" ) local isItemEquippable = IsEquippableItem ( itemId ) local _ , _ , _ , _ , isItemUsable = GetQuestItemInfo ( "" choice "" , questItemIndex ) if itemSellPrice > mostValuableQuestItemValue then -- Keep track of which item is most valuable : mostValuableQuestItemIndex = questItemIndex mostValuableQuestItemValue = itemSellPrice end if isItemEquippable == 1 and isItemUsable ~= nil then -- NPC is offering us an item we can actually wear : local currentEquippedItemLinksInSlots = {} local currentWorstEquippedItemInSlot = nil -- Figure out what we already have equipped : for _ , itemSlot in ipairs ( equipmentSlotLookup [ itemEquipLoc ]) do if itemSlot ~= nil then local currentEquippedItemLinkInSlot = GetInventoryItemLink ( "" player "" , GetInventorySlotInfo ( itemSlot )) if currentEquippedItemLinkInSlot == nil then -- Of the n item slots available , at least one of them has nothing equipped . Ergo , it is the worst : currentWorstEquippedItemInSlot = nil break else local _ , _ , _ , currentEquippedItemLevelInSlot , _ , _ , currentEquippedItemSubTypeInSlot = GetItemInfo ( currentEquippedItemLinkInSlot ) if currentWorstEquippedItemInSlot == nil or currentWorstEquippedItemInSlot . itemLevel > currentEquippedItemLevelInSlot then currentWorstEquippedItemInSlot = { itemLink = currentEquippedItemLinkInSlot , itemLevel = currentEquippedItemLevelInSlot , itemSubType = currentEquippedItemSubTypeInSlot } end end end end if currentWorstEquippedItemInSlot == nil then bestQuestItemIndex = questItemIndex else if itemLevel > currentWorstEquippedItemInSlot . itemLevel then if armorWeights [ itemSubType ] ~= nil then if armorWeights [ itemSubType ] > bestQuestItemArmorWeight then bestQuestItemIndex = questItemIndex bestQuestItemArmorWeight = armorWeights [ itemSubType ] end elseif currentWorstEquippedItemInSlot . itemSubType == itemSubType then bestQuestItemIndex = questItemIndex bestQuestItemArmorWeight = - 1 end end end end end if bestQuestItemIndex < 0 then bestQuestItemIndex = mostValuableQuestItemIndex end GetQuestReward ( bestQuestItemIndex ) "); } } ---------------------------------------- Unknown Faster way of getting people to sigh your guild charter. var PlayersAroundMe = ObjectManager . GetObjectWoWPlayer (). Where ( c => c . Position . DistanceTo ( ObjectManager . Me . Position ) < 30 && c . Faction == ObjectManager . Me . Faction && c . IsAlive ); ItemsManager . UseItem ( "Guild Charter" ); foreach ( var Toon in PlayersAroundMe ) { ObjectManager . Me . Target = Toon . Guid ; bool PlayerHasNoGuild = Lua . LuaDoString (@ " local GuildName = GetGuildInfo ( 'target' ); if GuildName == nil then return true ; else return false ; end "); Thread . Sleep ( 100 ); if ( PlayerHasNoGuild ) { Chat . SendChatMessageWhisper ( "Can you please sigh my guild Chart, pretty please :)" , Toon . Name ); Thread . Sleep ( 100 ); Lua . LuaDoString ( "OfferPetition();" ); Thread . Sleep ( 100 ); Logging . Write ( "Petition Offered to :" + Toon . Name ); } } ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/12575-tbc-find-next-not-dead-position/ TITLE: (tbc) Find next not dead position ---------------------------------------------------------------------------------------------------- Unknown Hi, i am currently in the process of automate my dungeon setup, and wonder if there is a way to detect if i am staying in poisen/fire/... and move to the next not burning area ? Same for keeping distance (spread) if bosses require that like the hellfire instances ? ---------------------------------------- 0xbadbac0n Hello, if it is for one dunjon maybe you can try to blacklist zone, or compare zone and move if you are in bad zone. Otherwise I think with events lua or gameobject entry id ---------------------------------------- Unknown Hm, will throw some debug logs on lua events and game objects. I mainly about bosses who spawn fires etc to move the character to the closest save location :) ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/12646-detect-target-immunities-ie-immune-to-diseases/ TITLE: Detect Target Immunities (ie: Immune to Diseases) ---------------------------------------------------------------------------------------------------- Unknown | 2020-11-09T00:24:56Z I was surfing the forums, and Google for about 20 minutes looking for anything to help me figure this out. I am writing a fight class using C#, and Lua. For the first time I ran into a problem where the combatants I was fighting with were immune to my "Devouring Plague" and was left wasting mana, because each mob was immune to diseases. Is there anything to catch such a thing? Thank you! Edit* Mob entity: https://wotlkdb.com/?npc=32400 There's no real information regarding immunizes. Edited November 9, 2020 by Apexx ---------------------------------------- Apexx I hardcode lists and partially rely on user feedback. Now you could parse combat log events, store the results per mob entry and maybe even serialize them. That way, you're good to go. Unfortunate though, if mobs are immune for only a few seconds and you never use certain spells anymore because they temporarily immuned thanks to a buff. Although I guess you could write some smart detection for a "buff state" in combination with the school/spell. Spell school can be ready from spell info and combatlog iirc. ---------------------------------------- Apexx This is how I do it (TBC). Although as Matenia pointed out, some mobs might only be temporary immune to a school. That being said, I'd rather handle those rare exceptions than random immunities that differ from server to server. EventsLuaWithArgs . OnEventsLuaWithArgs += LuaEventsHandler ; private void LuaEventsHandler ( LuaEventsId id , List args ) { if ( args [ 11 ] == "IMMUNE" )) { Logging . Write ( $ "{ObjectManager.Target.Name} is immune to {args[9]}" ); // Your code to handle spell ban // args[9] is the name of the spell } } ---------------------------------------- Unknown Perfect! Thank you very much, I will try this out soon. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/12662-cancel-current-state/ TITLE: Cancel current state ---------------------------------------------------------------------------------------------------- Unknown Hello, is it possible to cancel current bot state(i need to cancel ToTown), on lua "MAIL_FAILED" event? When bot send items to mule and mule have his mail full, too many attemps auto mutes your account with message  "Your mail and chat prievelegies has been suspended due Game Master review", or something like that . For a while this was not a problem, but recently some servers start ban because of this. Nevermind, fixed it, should try more before creating tread. Delete pls. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/12727-question-plugin-help/ TITLE: Question : Plugin help ---------------------------------------------------------------------------------------------------- Unknown Hello, is there a way to make a plugin load before hitting start on a product? and have it keep running while product has stopped? ---------------------------------------- Unknown Hello, No you cannot start plugin with product, but you can keep running when product is stopped. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/12843-does-wrobot-unlock-lua/ TITLE: Does WRobot unlock lua? ---------------------------------------------------------------------------------------------------- Unknown Hi guys, im considering purchase the bot for 2.4.3 server. I would like to code my own things inside the game with lua. I see this is like similar to honorbuddy, it is a memory bot that give us a C# api which looks cool maybe in future I use this. But right now my main concens is, can I simply use WRobot to inject into wow.exe and Unlock the lua completely, to make My own addons with all the functions unlocked and thats it? Thanks in advance and sorry if its an obvius question i tried to find a feature list and I didnt see any explicit mention to Lua Unlocking raw wow which is the feature I want. ---------------------------------------- Unknown No, it doesn't unlock Lua completely. ---------------------------------------- Unknown | 2021-02-17T21:24:17Z Thanks you man, this is exactly what I was looking for. Also seems like WR offers a wide C# api. My plan is to develop pvp scripts to Play with them on real time, I dont know if this is viable with WRobot. Im worried the bot is not designed for that and it will have performance issues or it will be not confortable to play with it like it was with honorbuddy. Any idea about this topic? Edited February 17, 2021 by s1m421 typo ---------------------------------------- Unknown You're not going to get rotations the way that you want. Not unless you write a very sophisticated profile - otherwise you will run into problems with performance. Also more likely than not, reacting to combat log events to death instant spells etc is not going to work. ---------------------------------------- Unknown why is spellreaction not going to work? I want to code something like warrior pvp rotation, like seriusly well made. does this bot has any performance issues? seems to be the most overpower framework ive found to detect spell cast begin, where is the spell going, code proper logic and response to events, like interrupt, reflect only if the spell is going to me (i guess ill figure out how to get this info from your tool which even allows me to read custom mem regions), etc.. i am going to find any barrier you can anticipate me? ---------------------------------------- Unknown Because wrobot isn't inside the client directly and things like reading Lua events are done frame by frame on another thread. So if there's a 50-100ms delay to even receive the event and then more delay to accept your requests, you won't be able to counter instant spells with instant spells. If you're capable of accessing WoW directly in memory (including Lua events and such info as spell targets - which to my knowledge the client has no info on, except maybe patch 5.x), you don't really need wrobot. You'll be able to do a lot but not in the same way as if you were in-process injected ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/12844-moveduringcombat-jumping/ TITLE: MoveDuringCombat jumping. ---------------------------------------------------------------------------------------------------- Unknown Hi, Profile does not matter, fightclass is AIO. I use default settings to this plugin and my char jumping all the time. You can see in attachmemnt it's behaviour. I don't think that settings in plugin suggest to jump so many times while combat. Please, watch my video. You doing great job guys. jumping_all_the_time.mp4 ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/12845-does-this-project-support-pvp/ TITLE: Does this project support pvp? ---------------------------------------------------------------------------------------------------- Unknown Hi guys, im kinda new here. What I meant to ask with the title is more about how is the tool working with the game, is it confortable to play alongside with it or it makes the gameplay annoying? Im looking for options to develop pvp rotations to Play with the dll injected similar to what Ive done with Honorbuddy. Honorbuddy was well designed for that and it was performing flawless, fast reaction to events, smooth performance, keeping the game integrity so player can actually play without any limitation. I want to know if there is any limitation or annoying thing about WRobot if there are any. Thanks in advance. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/12869-wowplayerattackable-returns-wrong-values/ TITLE: WoWPlayer.Attackable returns wrong values? ---------------------------------------------------------------------------------------------------- Unknown Hi guys, Im trying to make pvp stuff for my own use with the bot Ive noticed for example when I try to loop objectmanager to get Players arround me (not npc/units, real players). unit.Attackable should return true in duel for example or in arenas. but na it is not returning true, so I guess is wrong return value. Which would be the sense if adding Attackable extension if its same as checking faction or enemy. they are not enemies, we both same faction, but we are rivals sometimes like in arena, crossfaction bg or duels. so attackable should adapt to any situation that the unit become attackable imo. Thanks ---------------------------------------- Unknown Hi, use lua Lua . LuaDoString < bool >( "return UnitCanAttack('player', 'target')" ) ---------------------------------------- @Droidz Hi @Droidz I already did that, the issue is that I actually need to control enemies Around me, not my particular target. I need to search all wow players around me and then filter them by ally and enemy. Target by wow api works good (a bit slow but works as intended). The thing is I need this to be able to check for Every Objectmanager unit that I find by memory reading, I cannot target each one of them, I need to get this value from the nontarget unit like I get IsPartyMember, IsAlive, etc... Thanks ---------------------------------------- Unknown WoWPlayer player1 = ...; bool canAttack = false ; var f = wManager . Wow . ObjectManager . ObjectManager . Me . FocusGuid ; wManager . Wow . ObjectManager . ObjectManager . Me . FocusGuid = player1 . Guid ; if ( wManager . Wow . ObjectManager . ObjectManager . Me . FocusGuid == player1 . Guid ) canAttack = Lua . LuaDoString ( "return UnitCanAttack('player', 'focus')" ); wManager . Wow . ObjectManager . ObjectManager . Me . FocusGuid = f ; Logging . WriteDebug ( "Can attack = " + canAttack + " > " + player1 ); try code like (no tested) ---------------------------------------- Unknown makes sense, i apreciate you take the time this code is an alternative to work with 2 units, target and focus, I like it. but, is there any way to work with more than 2 units at once? like anyway to loop thru all units around localplayer and store them into friend and enemy list using similar method? loop each one, focus each one and check? something like localplayer range 40, each tick, focus all them quick and determine who is friend and who is enemy? ---------------------------------------- s1m421 var playersAttackable = new List < wManager . Wow . ObjectManager . WoWPlayer >(); foreach ( var player in wManager . Wow . ObjectManager . ObjectManager . GetObjectWoWPlayer ()) { bool canAttack = false ; var f = wManager . Wow . ObjectManager . ObjectManager . Me . FocusGuid ; wManager . Wow . ObjectManager . ObjectManager . Me . FocusGuid = player . Guid ; if ( wManager . Wow . ObjectManager . ObjectManager . Me . FocusGuid == player . Guid ) canAttack = Lua . LuaDoString ( "return UnitCanAttack('player', 'focus')" ); wManager . Wow . ObjectManager . ObjectManager . Me . FocusGuid = f ; if ( canAttack ) playersAttackable . Add ( player ); Logging . WriteDebug ( "Can attack = " + canAttack + " > " + player ); } You can change focus several time ---------------------------------------- Unknown Thanks you alot, this is extremly useful ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/13033-wotlk-raid-group-info/ TITLE: [WOTLK] Raid group info ---------------------------------------------------------------------------------------------------- Unknown | 2021-05-03T15:59:40Z Hi everyone, is there a efficent way to get the raid group number of a raid member or the whole raid? Edited May 3, 2021 by iMod ---------------------------------------- Unknown | 2021-05-10T16:07:02Z Thanks for your anwer. I'm currently using public static int ? GetGroupNumber ( this WoWUnit instance ) { // Create lua command string luaCommand = $@ " for i = 1 , GetNumRaidMembers () do name , rank , groupNumber = GetRaidRosterInfo ( i ); if ( name == '{instance.Name}' ) then return groupNumber ; end end "; // Get index number of the unit int result = Framelock . Lock (() => { // Return return Lua . LuaDoString ( command : luaCommand ); }); // Failed? if ( result == 0 ) { // Return return null ; } // Return return result ; } But I will compare both methods and check what performs better. Edited May 10, 2021 by iMod ---------------------------------------- Unknown Thanks I modified my version above and will test it later. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/13059-can-wrobot-catch-unit_spellcast_succeeded-with-arguments/ TITLE: Can WRobot catch UNIT_SPELLCAST_SUCCEEDED with arguments? ---------------------------------------------------------------------------------------------------- Unknown I'm trying to catch the UNIT_SPELLCAST_SUCCEEDED event for Auto Shots. I've tried EventsLua . AttachEventLua ( "UNIT_SPELLCAST_SUCCEEDED" , c => HandleAutoAttackEvent ( c )); It does work, but for all spells, and I'm only interested in my own auto attacks (so at least, I know this event is the correct one). EventsLuaWithArgs . OnEventsLuaStringWithArgs += AutoShotEventHandler ; This one is the one I would need, but it doesn't catch any UNIT_SPELLCAST_SUCCEEDED.  It only catches COMBAT_LOG_EVENT_UNFILTERED and COMBAT_LOG_EVENT events. I'm on TBC, I've been told that in WotLK, EventsLuaWithArgs.OnEventsLuaStringWithArgs does catch UNIT_SPELLCAST_SUCCEEDED. Does anyone know how I can do that? ---------------------------------------- Zer0 I use EventsLuaWithArgs.OnEventsLuaStringWithArgs for pretty much everything. It definitely logs all events. However, if you're using something based on my framework, where I copied this functionality, I specifically only registered it with COMBAT_LOG_EVENT_UNFILTERED, whereas Droidz' functionality uses RegisterAllEvents(). Also, have you made sure you're actually getting the event for auto shot in the client? Afaik, at least in TBC, it was never fired. ---------------------------------------- Unknown Thanks for the answer. I do get the event in the client. I have tried this: Lua . LuaDoString ( $@ " AIOAutoHunt = CreateFrame ( 'Frame' ) AIOAutoHunt : RegisterEvent ( "" UNIT_SPELLCAST_SUCCEEDED "" ) AIOAutoHunt : SetScript ( 'OnEvent' , function ( self , event , unit , spell ) if unit == 'player' and spell == 'Auto Shot' then DEFAULT_CHAT_FRAME : AddMessage ( spell ); end end ) "); and it catches my auto attacks successfully (I get the message in the chat every time an auto shot is fired). I'm not using your framework, I'm using WRobot's EventsLuaWithArgs.OnEventsLuaStringWithArgs (wManager.Wow.Helpers). So I guess something else is wrong, but I'm not sure what. ---------------------------------------- Unknown Also fore reference, I've tried logging all the events private void AutoShotEventHandler ( string id , List args ) { Logger . Log ( $ "******************** {id} ********************" ); for ( int i = 0 ; i < args . Count ; i ++) { Logger . Log ( $ "{i} -> {args[i]}" ); } Logger . Log ( $ "******************** END ********************" ); } You can have a look at the log joined to this post and see what happens (the character is only auto attacking). 23 mai 2021 11H40.log.html ---------------------------------------- Zer0 Hey, I tested this code he works for me: wManager . Wow . Helpers . EventsLuaWithArgs . OnEventsLuaStringWithArgs += ( eventid , args ) => { if ( eventid == "UNIT_SPELLCAST_SUCCEEDED" ) Logging . WriteDebug ( "[EVENT] " + args [ 0 ] + " > " + args [ 1 ]); }; It is not the case for you? ---------------------------------------- Unknown It doesn't work for me. I've ran more tests. I thought it was an issue with my WRobot so I've downloaded a fresh install. No plugin, no addons. Same problem. I have also tried with 2 different TBC clients (Excalibur/Netherwing), same result on both clients. I only get COMBAT_LOG_EVENT_UNFILTERED and COMBAT_LOG_EVENT out of EventsLuaWithArgs.OnEventsLuaStringWithArgs. On both clients I'm still able to catch the event directly with LUA. ---------------------------------------- Unknown It is french client but this works for me. WBjxgEyiOk.mp4 ---------------------------------------- Unknown I don't doubt your words. If it works for you, then it works, but I feel like I've tried everything, and I'm still having this issue. So, to recap what I've tried: Catching the event with no args works: EventsLua . AttachEventLua ( "UNIT_SPELLCAST_SUCCEEDED " , c => HandleAutoAttackEvent ( c )); ... private void HandleAutoAttackEvent ( object context ) { Logger . Log ( "AUTO" ); } Catching the event directly in the client works: Lua . LuaDoString ( $@ " AIOAutoHunt = CreateFrame ( 'Frame' ) AIOAutoHunt : RegisterEvent ( "" UNIT_SPELLCAST_SUCCEEDED "" ) AIOAutoHunt : SetScript ( 'OnEvent' , function ( self , event , unit , spell ) if unit == 'player' and spell == 'Auto Shot' then DEFAULT_CHAT_FRAME : AddMessage ( spell ); end end ) "); Catching events with args only returns COMBAT_LOG_EVENT and COMBAT_LOG_EVENT_UNFILTERED EventsLuaWithArgs . OnEventsLuaStringWithArgs += ( eventid , args ) => { if ( eventid == "UNIT_SPELLCAST_SUCCEEDED" ) Logging . WriteDebug ( "[EVENT] " + args [ 0 ] + " > " + args [ 1 ]); }; ------ OR ------ EventsLuaWithArgs . OnEventsLuaStringWithArgs += AutoShotEventHandler ; ... private void AutoShotEventHandler ( string id , List args ) { Logger . Log ( $ "******************** {id} ********************" ); for ( int i = 0 ; i < args . Count ; i ++) { Logger . Log ( $ "{i} -> {args[i]}" ); } Logger . Log ( $ "******************** END ********************" ); } I'm using a freshly installed WRobot (no plugin) and I've ran those tests on 2 different WoW clients (no addon). I've made sure I compiled my FightClass with the fresh WRobot dlls as references. Do you have any idea what could possibly be different between your setup and mine? Could it be caused by the client? Something in my code? ---------------------------------------- Unknown I have found what the issue is. So my AIO first selects a rotation class in Main.Initialize(), and then launches the Initialize() method of the selected class (which also derives from the IClassRotation interface), for example Hunter.Initialize(). For some reason, subscribing to OnEventsLuaStringWithArgs inside Hunter.Initialize() only gets me COMBAT_LOG EVENT and COMBAT_LOG_EVENT_UNFILTERED. I've moved the code to Main.Initialize() and it works perfectly now. I have no idea why it happens like that, but I'm glad it's fixed. Thanks everyone for your help ? ---------------------------------------- Unknown It is strange, I don't understand what can happen. I will add logs in case of error in one of the calls wManager . Wow . Helpers . EventsLuaWithArgs . OnEventsLuaStringWithArgs += ( eventid , args ) => { Logging . WriteDebug ( "[EVENT] 1" ); }; wManager . Wow . Helpers . EventsLuaWithArgs . OnEventsLuaStringWithArgs += ( eventid , args ) => { throw new Exception ( "eeee" ); }; wManager . Wow . Helpers . EventsLuaWithArgs . OnEventsLuaStringWithArgs += ( eventid , args ) => { Logging . WriteDebug ( "[EVENT] 3" ); }; 3 is never invoked at home. I hope that the logs will help to resolve problems like this. ---------------------------------------- Droidz For your information, I used to subscribe to OnEventsLuaStringWithArgs in 2 places. First in Hunter.Initialize() and then in the constructor of another class called Cast.Cast() in both places I could only get COMBAT_LOG_EVENT and COMBAT_LOG_EVENT_UNFILTERED. now that I've moved the hunter autoshot event catcher to the Main.Initialize() method, I can get all events from there. For the sake of testing I've logged the Cast.Cast() event catcher and I still only catch COMBAT_LOG_EVENT and COMBAT_LOG_EVENT_UNFILTERED (Which in this case doesn't matter because I don't need anything else) I hope it helps. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/13087-convert-xy-to-xyz/ TITLE: Convert XY to XYZ ---------------------------------------------------------------------------------------------------- Unknown Hi, I would like to make a program that "convert" old leveling guides to quester profile. The problem is, these guides use XY coords (0 to 100) which is zone coords. I would like to know how can I get the XYZ coords used ine the quest editor (without using it). How can I do ? Regards, Ludo ---------------------------------------- Unknown You need to get the Map.dbc and then there's a formula to calculate from the sizes. I can't access my bitbucket account atm, but there's a thread on ownedcore, where I got the info a while ago. https://www.ownedcore.com/forums/world-of-warcraft/world-of-warcraft-bots-programs/wow-memory-editing/382867-ask-covert-map-x-y-coordinates-world-x-y-z-coordinates-2d-3d.html ---------------------------------------- Unknown Hi, Thanks for reply, but after searchs, i do not understand it better. I know pretty much anything about the .dbc file. Even with your link,  I don't get how to convert XY to XYZ. Apologies ? ---------------------------------------- Unknown Hello, use https://wrobot.eu/byme/doc/html/M-wManager.Wow.Helpers.PathFinder.GetZPosition.htm ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/13120-manage-character-movement/ TITLE: Manage Character Movement ---------------------------------------------------------------------------------------------------- Unknown How to overwrite FC movement in questing/grinding/gather mode. Is there any event i can use for that? ---------------------------------------- Unknown That not what i want. What i want is take control of the movement of the FC and replace with my own movement. ---------------------------------------- Unknown Some FCs have specific movements, lilke a rogue moving behind a target, or a hunter backing up to be in shoot range. This is something you can't prevent, unless you modify the code of the FC. If it's a simpler XML routine, then as long as you're under the FC set range, you're free to move. ---------------------------------------- Unknown i understand that but the thing is i want to take control of the bot combat movement.Instead of letting the bot move to target i want my own move to target logic and no i dont want XML file i prefer raw C# code which i can have full control of my stuff.Btw i dont want to use the MovementPulse event which i think is a bad idea because it might cause some issue.I guess the only way to do that is probably replace the farming state with ur own state. ---------------------------------------- Unknown exactly, if you want control over the incombat movement without depending on the standard movement you have to build your own combat state where you can handle the movement to the target, after engaging combat. ---------------------------------------- Unknown Well, then show him how you would solve this, I already gave my opinion about this! ---------------------------------------- Unknown I did try this but it end up badly. I using the state approach thought. ---------------------------------------- Unknown Yes i do know how FSM works and i already did several plugin by myself. I only want to know the best approach for the issue i facing.Btw thx for the help thought. ---------------------------------------- Unknown It could be that you will face some new Problems here and there. The Movement is called on several points inside Quester/Grinder and other Products. The only reliable way is to use your own product where you have full control over your movement (for example if you want to use keystroke movement instead of ctm). ---------------------------------------- Unknown Create entire new product it take a lot of time and i dont have much time for that atm.I would like to do that but that not a option for me atm :). ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/13183-how-to-store-the-goods-of-specified-quality-into-the-bank/ TITLE: How to store the goods of specified quality into the bank? ---------------------------------------------------------------------------------------------------- Unknown Is there any RunMacroLua command that can do this? Now I only know the following command: deposit all items in the bank. I want to deposit items of specified quality in the bank.thx. /run for t = 0,GetNumGuildBankTabs() do for b = 0, 1 do for s = 0, GetContainerNumSlots(b) do SetCurrentGuildBankTab(t)UseContainerItem(b,s) end end end ---------------------------------------- Unknown Sorry about my English. I mean: there are green, blue and purple items in the backpack. I just want to deposit the purple items in the bank. How should the runmacrolua command be written? ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/13360-convert-ingame-guid-to-int128-guid/ TITLE: Convert ingame guid to int128 guid ---------------------------------------------------------------------------------------------------- Unknown how to convert combat log guid to int128 guid ? ---------------------------------------- Unknown What do you mean? Guid128 has a constructor that takes Int128 and the ToString method parses it to ingame GUID names. Whatever you want to do, you can work with that. If you want to parse the string to a Guid 128, you would need to fill the respective bits of a 128 bit integer. I haven't done that so have no example code ---------------------------------------- Unknown Yes i know what u mean but what i want is how to convert ingame guid to hex128bit. Nvm i found my answer on other forum. ---------------------------------------- Unknown Then please post the answer here as well. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/13373-set-movement-state/ TITLE: Set Movement State ---------------------------------------------------------------------------------------------------- Unknown @Droidz can u allow us to set MovementManager.InMovement (true/false) and MovementManager.InMovementLoop (true/false) ? because i want to build my own movement manager instead of using the default movement manager. The reason i ask for this is because there is too many stuff using that two function. ---------------------------------------- Unknown Buy a sub and maybe he'll think about it.............. ---------------------------------------- Unknown I am a sub but is not on this account. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/13382-correct-code-for-debuff/ TITLE: correct code for debuff ---------------------------------------------------------------------------------------------------- Unknown hi anyone can help me have the correct setting for the fight class im making please. my FC doesn't cast Corruption because it already sees another lock's corruption as it's own. I highlighted the possible line that needs to be changed to it will buff Corruption to it's target. Thank you. if (Corruption.IsSpellUsable && Corruption.KnownSpell && Corruption.IsDistanceGood && SpellManager.GlobalCooldownTimeLeft() == 0 && !ObjectManager.Target.Rooted && !ObjectManager.Target.HaveBuff("Corruption") && ObjectManager.Me.HaveBuff("Life Tap")) { Corruption.Launch(); return; } ---------------------------------------- jiraiyasm Add something like this, but you should think about moving all the casting checks into one Function and do the Checks only once. if ( Corruption . IsSpellUsable && Corruption . KnownSpell && Corruption . IsDistanceGood && SpellManager . GlobalCooldownTimeLeft () == 0 && ! ObjectManager . Target . Rooted && ObjectManager . Me . HaveBuff ( "Life Tap" )) { if (! DebuffCheckOwner ( "Corruption" ) { Corruption . Launch (); return ; } } public static bool DebuffCheckOwner ( Spell spell , bool owner = true ) { List < Aura > DebuffList = ObjectManager . Target . GetAllBuff (); Aura aura = null ; if ( owner ) { aura = DebuffList . FirstOrDefault ( s => s . GetSpell . Name == spell . Name && s . Owner == ObjectManager . Me . Guid ); if ( aura != null ) { return true ; } } return false ; } ---------------------------------------- @ Talamin Thank you so much for the help. i am still very new to this area.  i tried having my lock to use grand spellstone but it doesn't "Left click" the spellstone to the weapon. i just based this on the snipets for rogue also. private void EnchantWeapon() { bool hasMainHandEnchant = Lua.LuaDoString (@"local hasMainHandEnchant, _, _, _, _, _, _, _, _ = GetWeaponEnchantInfo() if (hasMainHandEnchant) then return '1' else return '0' end"); if (!hasMainHandEnchant) { IEnumerable MP = InstantPoisonDictionary .Where(i => i.Key <= ObjectManager.Me.Level && ItemsManager.HasItemById(i.Value)) .OrderByDescending(i => i.Key) .Select(i => i.Value); if (MP.Any()) { MHPoison = MP.First(); ItemsManager.UseItem(MHPoison); Thread.Sleep(10); Lua.LuaDoString("/click PickupInventoryItem(16)"); Thread.Sleep(5000); return; } } } private static Dictionary InstantPoisonDictionary = new Dictionary { { 79, 41196 }, }; may i ask please how to check if the required item is available in the bag before casting the spell especially needed for casting buffs. Thank you @ Talamin ---------------------------------------- Unknown The easiest way is: ItemsManager . GetItemCountByIdLUA ( 12345 ) > 0 Instead of 12345 you have to enter a proper Item ID ---------------------------------------- @ jiraiyasm Yes it indeed worked. Thank you so much! ---------------------------------------- @ Sye24 hi @ Sye24 is it possible for my characters to move away from the ground debuff that doesn't show as a debuff on the player? will this snipet below work? wManager.Events.FightEvents.OnFightLoop += (unit, cancelable) => { var me = wManager.Wow.ObjectManager.ObjectManager.Me; var target = wManager.Wow.ObjectManager.ObjectManager.Target; if (me.IsAlive && target.IsAlive && !me.IsCast && me.HaveBuff("Buff name")) { wManager.Wow.Helpers.Keybindings.PressKeybindings(wManager.Wow.Enums.Keybindings.STRAFELEFT, 1000 * 3); // strage left during 3 secondes } }; the debuff IDs are 69019 and 68863 which both hits the characters but no debuffs appears on them as they explode from the ground. Thank you. ---------------------------------------- @ Sye24 @ Sye24 , may i ask how to make the string array option for the plug.in please? thank you. ---------------------------------------- @ jiraiyasm is it okay if i can ask for the code for this plugin? thank you. ---------------------------------------- Unknown im making a fightclass for DK, how do i get it to use Death and Decay skills to be casted? it only use the skill but doesn't actually click on the ground. ---------------------------------------- Unknown tried using these code SpellManager.CastSpellByIDAndPosition(49936, ObjectManager.Target.Position ClickOnTerrain.Pu lse(ObjectManager.Target.Position) ; but i get an error on vstudio. any way to correct these? Thank you. ---------------------------------------- Unknown yes i used those references already but still getting errors. ---------------------------------------- Unknown Bool - Boolean structure type that represents a Boolean value, which can be either true or false. Void - Is a reference type of data type and used to specify the return type of a method in C#. If you don't understand the above, start here: https://www.youtube.com/watch?v=GhQdlIFylQ8 I do not know what spell 49936 is as it says it has been removed on Wowhead. Remove the SpellManager..... line from the if condition since it's not a boolean (bool). instead of DnD.Launch(); use ClickOnTerrain.Spell(43265, ObjectManager.Target.Position, false, false); if you want to check if the Target is on your DnD, then do something like this in the if condition (bool):  ObjectManager.Target.BuffCastedByAll(DnD.Name).Contains(ObjectManager.Me.Guid) if you want to cast it on the Target if it isn't on your DnD then add a "!" to it. The "!" is a negation. AKA the opposite (bool): !ObjectManager.Target.BuffCastedByAll(DnD.Name).Contains(ObjectManager.Me.Guid) I forget if the debuff is the same as the spell. If it is, the last few lines will work. ---------------------------------------- Unknown thanks for the help. i haven't tried it yet as i got busy. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/13583-how-to-find-an-npc/ TITLE: How to find an NPC ---------------------------------------------------------------------------------------------------- Unknown On a private server ,On a private server, reset the name, ID, location and conversation content of the NPC in the dungeon. How can I use WR to find him ---------------------------------------- Unknown What server is this? ---------------------------------------- Unknown A private server. To reset the dungeon, you need to find an NPC to buy a scroll, but the NPC's name, ID, shape and conversation content are random. How can I find him ---------------------------------------- Unknown With out knowing the server name , I can not do any test or provide any help. Your best bet would to clear your npc every restart. ---------------------------------------- Unknown Can WR detect the "重置副本" on the top of the NPC to identify it ---------------------------------------- Unknown Wrobot it self is just a path finder / extensive api. If you want something you have to build it. Or at least give us the name of the server so we can somewhat try to help. ---------------------------------------- Unknown Can WR realize all NPCs in the dialogue area ---------------------------------------- Unknown Not by default, you’d have to build a plug-in for it. ---------------------------------------- Unknown You can use lua script to scan all the dialogue. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/13610-how-do-i-find-the-quest-id-of-a-quest-you-can-just-turn-in/ TITLE: How do I find the quest ID of a quest you can just turn in ---------------------------------------------------------------------------------------------------- Unknown Hello. I'm trying to get the ID of a quest that you just have completed automatically, and just turn in. Sort of like the eggomatic in Gadgetzan. ---------------------------------------- Unknown Wowhead.com if it's already done. ---------------------------------------- Unknown It is a custom quest on the Ascension server. The Beast Nest and Hidden Cache ones. :) ---------------------------------------- Unknown using wow api GetQuestLogTitle ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/3118-wotlksource-getspecialization/ TITLE: [Wotlk][Source] GetSpecialization ---------------------------------------------------------------------------------------------------- Droidz Since there is no method to get the specialization of the character in wotlk i took another way to find it out. It wont be 100% accurate if you use mixed talends but for the most spec's it should work. /// /// Returns the talent tree with the most invested points /// /// Returns the tree index public static int GetSpecialization() { KeyValuePair highestPointTree = new KeyValuePair (0, 0); // Process talent trees for (int i = 1; i <= 3; i++) { // Get current talent points int treePointValue = Lua.LuaDoString ($"local _, _, talentPoints = GetTalentTabInfo({i}); return talentPoints;"); // Bigger than old value? if (treePointValue > highestPointTree.Value) { // Set new value highestPointTree = new KeyValuePair (i, treePointValue); } } // Return return highestPointTree.Key; } This will give you the the talent tree with the most invested points. Now you just need to define each talent tree based on the wow class For example DK: if(ObjectManager.Me.WowClass != WoWClass.DeathKnight) { throw new NotSupportedException("You need to be a DK to use this rotation."); } // Get the main talent tree int mainTalent = GetSpecialization(); // Choose the right rotation switch (mainTalent) { case 1: { // Set rotation this._rotation = new Blood(); Logging.WriteDebug("Choosing Blood rotation."); break; } case 2: { // Set rotation this._rotation = new Frost(); Logging.WriteDebug("Choosing Frost rotation."); break; } case 3: { // Set rotation this._rotation = new Unholy(); Logging.WriteDebug("Choosing Unholy rotation."); break; } default: { this._rotation = null; throw new NotSupportedException("Your spec is not supported."); } } This is just a small and fast coded example but hope it helps some ppl. Greez iMod ---------------------------------------- Unknown To help-out you could also use lua to do the same thing with less lines of code : public static string GetSpec () { string SpecName = @ " local highest_tab, highest = 0, 0; for i=1, 3 do local name, _, points = GetTalentTabInfo(i); if points > highest then highest = points; highest_tab = i; highest_name = name end end return highest_name" ; return Lua . LuaDoString < string >( SpecName ); } ---------------------------------------- @iMod While i was working on my own copy of AIO, i made a simple way to check spec by string, its more Accurate then the method @iMod used, public static class ToolHelper_Rotation { public static void Spec () { string MainTalents = GetSpec (); if ( ObjectManager . Me . WowClass == WoWClass . Priest ) { switch ( MainTalents ) { case ( "Shadow" ): { MessageBox . Show ( "Your spec is Shadow" ); break ; } case ( "Holy" ): { MessageBox . Show ( "Your spec is Holy" ); break ; } case ( "Disco" ): { MessageBox . Show ( "Your spec is Disco" ); break ; } default : { MessageBox . Show ( "Your spec is Shadow" ); break ; } } } } public static string GetSpec () { string SpecName = @ " local highest_tab , highest = 0 , 0 ; for i = 1 , 3 do local name , _ , points = GetTalentTabInfo ( i ); if points > highest then highest = points ; highest_tab = i ; highest_name = name end end return highest_name "; return Lua . LuaDoString ( SpecName ); } } ---------------------------------------- Unknown Nice to see some progress even on that pc of old code ;) One thing i don't understand is how can it be more accurate if you still loop over the tabs and take the one with the highes points? Is is because you read out the name? If so how about multi language can that cause some issues? I know its just a sample code but you may should check if its not a priest because you don't got any else block. (2cents) ---------------------------------------- Unknown i simple just used priest for a fightclass, i havent really use much, my code gets the highest talents spec instead of if 2 talent trees etc. ---------------------------------------- Unknown My code does the same if i'm not total wrong. It just gets the highes talent and returns a "Number/ID" instead of the name. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/4120-convertering-honorbuddy-questing-profiles/ TITLE: Convertering Honorbuddy Questing Profiles ---------------------------------------------------------------------------------------------------- Unknown So i was looking into some of the Honorbuddy profiles and was wondering if it was possible to convert some of their questing profiles. I tried loading it up with Easy Quests Editor but it didnt work but I found a schema (.XSD) file that links to the profiles. I think this could be used to translate their profiles into usable ones for WRobot. I'm extremely new at this sort of thing so I may be completely wrong but figured it was worth a shot! Attached is the Schema file (along with the same file converted to a .txt for viewing purposes) and the quester profile I was looking into converting. Let me know if it is possible or if I'm a complete idiot for thinking this would be able to help in converting the two LOL Thanks!! QuestProfileSchema.txt QuestProfileSchema.xsd [A - Quest] EK 12-58 [Kick].xml ---------------------------------------- Unknown No. ---------------------------------------- Unknown lol alrighty then ---------------------------------------- Unknown If you use the converter you will get the quest pulses, locations, ID's.  But the quest pulse order queue has so much stuff!! Thats a 4,000 step profile, i would probably trim it back down to <1000 steps in a Wrobot profile. Other problem is it looks like it calling custom hooks and pluggins to complete some of the more scripted quests. You can certainly see what and where the bot will go... you are better off writing it from scratch IMHO.. maybe using this as a guide. ---------------------------------------- Unknown yea thats what I was thinking as well, definitely a good reference to go off of and even use it to skip a lot of searching for info/order of quests to build your own profile. Thanks for the input! 'Til next time eeny ---------------------------------------- Unknown Hello, WRobot don't use XSD schema, but he serialize class "Quester.Profile.EasyQuestProfile" (in "Quester.dll"). You can write your own converter, but he miss some informations in HB quest profiles, and the struct  is very different. You can also found an converter in tools of "Easy quest creator", but it is not complet. ---------------------------------------- @Droidz We have a readymade quests pack made by the honorbuddy community, with so many developers in WROBOT because we did not create a project to create a converter of this stuff to run 100% AFK like it worked in honorbuddy? Let's not let all this knowledge be lost. Have we managed to convert 100%? @Droidz That would bring a lot of new players to Wrobot. https://github.com/SVNtoGit/Kicks/tree/master/Questing Profile Pack ---------------------------------------- Unknown i would be interested in buying profiles that have been converted and are working from Kicks github! Would be the only reason i would fun 1+ bots ---------------------------------------- Unknown Also i left it out, im only interested in MOP and below ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/11423-how-to-find-out-if-an-item-is-soulbound-or-not/ TITLE: How to find out if an item is soulbound or not? ---------------------------------------------------------------------------------------------------- Unknown Hio! How to find out if an item is soulbound or not? I saw that there are some Descriptors with contain flags, which may give some info about it. I assume it is a bit vector. But which bit gives me the required infos? Also for random items, how do i get the full name? cheers! ---------------------------------------- Unknown I found it out. Im using the lua API now to do both. Unfortunately, there is no API call to sell specific bag items, is there? ---------------------------------------- Unknown https://wowwiki.fandom.com/wiki/API_UseContainerItem So when you open the vendor, then your bags and use that Lua API, it will sell the item. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/11658-how-to-handle-returning-a-full-lua-table/ TITLE: How To Handle Returning A Full Lua Table ---------------------------------------------------------------------------------------------------- Unknown Howdy y'all! I'm working on a little plugin to help me recruit to get that 8th Guild Bank slot (because, you know, I'm a bit spoiled ? ). I pulled the following from a pure Lua project I had been working on to do this recruitment (more) manually. Problem is, there are a shit ton of queries (and not a predictable number) and I can't think of a sane way of doing it individually. Feels like there must be a way to take the table and turn it into a Dictionary (or just get rid of the damn indexes and turn it into a list of strings)...but I can't figure out how. Can anyone help?  -- Everything here is Horde-specific; the plugin will have both local ClassyRaceAchievementIDs= {5163,5165,5160,6625,5161,5162,5164} local Races = {"Blood Elf","Goblin","Orc","Pandaren","Tauren","Troll","Undead"} local Classes = {"Death Knight","Demon Hunter","Druid","Hunter","Mage","Monk", "Paladin","Priest","Rogue","Shaman","Warlock","Warrior"} local RaceAchievementIDs= {[5163]="Blood Elf", [5165]="Goblin", [5160]="Orc", [6625]="Pandaren", [5161]="Tauren", [5162]="Troll", [5164]="Undead"} local queries={} for i=1,#ClassyRaceAchievementIDs do local id = ClassyRaceAchievementIDs[i] local numCriteria= GetAchievementNumCriteria(id) local raceStr= RaceAchievementIDs[id] for c=1,numCriteria do local criteriaString, criteriaType, completed, quantity, reqQuantity, charName, flags, assetID, quantityString, criteriaID, eligible = GetAchievementCriteriaInfo(id,c) local classStr if tContains(Classes,criteriaString) then for i=1,#Classes do if Classes[i] == criteriaString then classStr=Classes[i] end end end local query="r-\""..raceStr.."\" c-\""..classStr.."\" 120" if completed==false then tinsert(queries, query) end end end return queries ---------------------------------------- Stresse hi, No tested, bu like that: var result = new Dictionary < int , string >(); var r = Lua . LuaDoString < List >(@ " local ClassyRaceAchievementIDs = { 5163 , 5165 , 5160 , 6625 , 5161 , 5162 , 5164 } local Races = { "" Blood Elf "" , "" Goblin "" , "" Orc "" , "" Pandaren "" , "" Tauren "" , "" Troll "" , "" Undead "" } local Classes = { "" Death Knight "" , "" DemonHunter "" , "" Druid "" , "" Hunter "" , "" Mage "" , "" Monk "" , "" Paladin "" , "" Priest "" , "" Rogue "" , "" Shaman "" , "" Warlock "" , "" Warrior "" } local RaceAchievementIDs = {[ 5163 ]= "" Blood Elf "" , [ 5165 ]= "" Goblin "" , [ 5160 ]= "" Orc "" , [ 6625 ]= "" Pandaren "" , [ 5161 ]= "" Tauren "" , [ 5162 ]= "" Troll "" , [ 5164 ]= "" Undead "" } local queries ={} for i = 1 ,# ClassyRaceAchievementIDs do local id = ClassyRaceAchievementIDs [ i ] local numCriteria = GetAchievementNumCriteria ( id ) local raceStr = RaceAchievementIDs [ id ] for c = 1 , numCriteria do local criteriaString , criteriaType , completed , quantity , reqQuantity , charName , flags , assetID , quantityString , criteriaID , eligible = GetAchievementCriteriaInfo ( id , c ) local classStrif tContains ( Classes , criteriaString ) then for i = 1 ,# Classes do if Classes [ i ] == criteriaStringthen classStr = Classes [ i ] end end end local query = "" r - \" """..raceStr..""\"" c - \" """..classStr..""\"" 120 "" if completed == false then tinsert ( queries , id ) tinsert ( queries , query ) end end end return unpack ( queries ) "); if ( r . Count % 2 == 0 ) { for ( int i = 0 ; i < r . Count ; i += 2 ) { int q ; if ( robotManager . Helpful . Others . ParseInt ( r [ i ], out q )) result . Add ( q , r [ i + 1 ]); } } ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/11811-need-help-with-pathing-method/ TITLE: Need Help With Pathing Method ---------------------------------------------------------------------------------------------------- @Droidz Hi y'all! I'm trying to figure out the various methods WRobot has for finding paths. I'm working on a profile to do the Tanaan Jungle "Tiny Terrors" and can't seem to put together a decent method for the bot to get as far as it can with the flying mount, but then using a (more) precise method to navigate to the NPC. For example string name = "Chaos Pup" Vector3 location = new Vector3 ( 3265.077 , 394.3333 , 116.3515 , "None" ); int npcID = 94638 ; This NPC is in a cave. If I use... List < Vector3 > pos = wManager . Wow . Helpers . PathFinder . FindPath ( ObjectManager . Me . Position , location ); MovementManager . Go ( pos ); ...it generates a ground-only path to the NPC, which looks pretty bot-like, but does seemto actually navigate to the NPC. If I use... MountTask . Mount ( true , MountTask . MountCapacity . Fly ); MovementManager . StopMove (); LongMove . StopLongMove (); GoToTask . ToPosition ( position ); ...the bot flies above the location and then smashes itself into the mountain repeatedly (which, obviously, looks even more like a bot and doesn't reach the desired location). Is there a simple solution that I'm missing? My current method for navigating is (and forgive me, this is cannibalized from somewhere on the forum)... public static void GoTo ( Vector3 position , float minDist = 10 , float minDistFly = 100 , int maxFlyTimeMins = 30 ) { var dist = ObjectManager . Me . Position . DistanceTo ( position ); bool canFly = Lua . LuaDoString ( "return IsFlyableArea()" ); if ( dist > minDistFly && canFly ) { Log ( "Making a long move to " + position ); MovementManager . StopMove (); LongMove . StopLongMove (); MountTask . Mount ( true , MountTask . MountCapacity . Fly ); //LongMove.LongMoveGo(position, maxFlyTimeMins * 60 * 1000, minDistFly); LongMove . LongMoveGo ( position ); } else if ( dist > minDist ) { Log ( "Making a short move to " + position ); MovementManager . StopMove (); LongMove . StopLongMove (); GoToTask . ToPosition ( position ); } } ...but I need to make this adaptable so it can handle the occasional indoor location...does anyone have any ideas (or, I mean, I have to imagine this functionality is probably already somewhere in WRobot(?)so perhaps @Droidz  can point me in the right direction? Sorry, I did try to find it in the forums (maybe I'm not using the right search terms?). I've been coding for WRobt for awhile (still getting used to C#), but this is my first foray into Profiles (actually it's kinda my first attempt to make a full product that isn't a plugin). ---------------------------------------- Stresse Hello, try to use vector3 type "Flying": Vector3 location = new Vector3(3265.077, 394.3333, 116.3515, "Flying"); GoToTask.ToPosition(location); if npc is indoor, don't put npc position but try to put outdoor position near the door ---------------------------------------- Unknown Awesome! I'll give it a shot once servers are back up. Is there a way to check if a coordinate/npc is indoors (seems like there must be, since we can "Ignore indoor/outdoor nodes" while gathering)? Because then I could do something like public static void TakeOptimalRoute ( Vector3 position ) { List < Vector3 > roughPath = wManager . Wow . Helpers . PathFinder . FindPath ( Location ); Vector3 transitionPoint = new Vector3 (); for ( int i = 0 ; i < roughPath . Count ; i ++) { Vector3 coo = roughPath [ i ]; if coo . IsIndoors () // Or however I would do a check to see if the destination is indoors { transitionPoint = roughPath [ i - 1 ]; } } if ( transitionPoint != new Vector3 ()) { GoToTask . ToPosition ( transitionPoint . IsFlying ()); //And that might fix my orignal problem, too? Sorry, just looked into Vector3 properties GoToTask . ToPosition ( location . IsGround ()); } } ---------------------------------------- Unknown You can check if npc is out/indoor but you cannot check position directly. IsFlying() and IsGround() return bool (you cannot use it in "GoToTask.ToPosition()") Not tested, but you can try by distance (build are generally small): const float OutdoorDistance = 30 ; public static void TakeOptimalRoute ( Vector3 position ) { if ( position . IsFlying ()) { GoToTask . ToPosition ( position ); return ; } List < Vector3 > roughPath = wManager . Wow . Helpers . PathFinder . FindPath ( position ); Vector3 transitionPoint = Vector3 . Empty ; float distance = 0 ; for ( int i = roughPath . Count - 1 - 1 ; i >= 0 ; i --) { distance += roughPath [ i ]. DistanceTo2D ( roughPath [ i + 1 ]); if ( distance >= OutdoorDistance ) { transitionPoint = roughPath [ i ]; break ; } } if ( transitionPoint != Vector3 . Empty ) { transitionPoint . SetFlying (); GoToTask . ToPosition ( transitionPoint ); GoToTask . ToPosition ( position ); } else GoToTask . ToPosition ( position ); } ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/11823-async-func-in-dll/ TITLE: Async func in DLL ---------------------------------------------------------------------------------------------------- Unknown Hello, I need to run a new AsyncClass (). MainAsync (). GetAwaiter (). GetResult (); in Initialize () or in any other part of the code. The problem is when initializing with this method, wrobot and wow crashes. I simply dried up my knowledge and Google as well ;( I will be grateful for the answer! ---------------------------------------- DoptFree Hi, I don't used asynchronous programming with WRobot. Create new thread to run your code. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/11856-how-to-utilize-demon-hunter-glide-maneuverability/ TITLE: How To Utilize Demon Hunter Glide & Maneuverability ---------------------------------------------------------------------------------------------------- Unknown So far any effort I have made to utilize the Demon Hunters' maneuverability has looked incredibly bot-like. The following code is my attempt to find a suitably-far point to move to (to prevent the bot from using the Glide ability, only to immediately turn back because it didn't remove a waypoint passed while flying. The problem is that, without a way to determine whether or not the bot is on the ground or up in the air, there really isn't a good way to handle cases where the bot might overshoot a waypoint (or perform a simple turn while gliding). Seems like if I could figure out how to tell when the DH is in the air, it would be possible to have it skip/remove any waypoints if the bot passes withing N yards of its X, Y coordinates. How can I do this? Current Code public void DemonHunterGlide () { wManager . Events . MovementEvents . OnMovementPulse += ( path , cancelable ) => { var furthestPointInLoS = path . Where ( p => ! TraceLine . TraceLineGo ( ObjectManager . Me . Position , p , wManager . Wow . Enums . CGWorldFrameHitFlags . HitTestAll )). OrderBy ( p => ObjectManager . Me . Position . DistanceTo ( p )). LastOrDefault (); var distance = ObjectManager . Me . Position . DistanceTo ( furthestPointInLoS ); Logging . Write ( "Distance = " + distance + ", Point = " + furthestPointInLoS . ToString ()); Logging . Write (@ "Beginning Demon Hunter ""Glide"" ability with a jump" ); wManager . Wow . Helpers . Move . JumpOrAscend (); Thread . Sleep ( 500 ); Logging . Write (@ "Jump" ); wManager . Wow . Helpers . Move . JumpOrAscend (); Thread . Sleep ( 500 ); Logging . Write (@ "Jump" ); wManager . Wow . Helpers . Move . JumpOrAscend (); FelRush . Launch (); Logging . Write (@ "Done" ); }; }  ---------------------------------------- Unknown Hello, try to check ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/11884-creating-my-own-states/ TITLE: Creating my own states ---------------------------------------------------------------------------------------------------- Unknown Hi! I've written a few states for my wrobot project but I would like to slightly modify a few of the current ones such as Regen and ressurect. Is there any possibility to find the state source code so I could recreate the state but with a few modifications? ---------------------------------------- Unknown You will need to decompile and read through the obfuscated code. Then you'll need to remove the state from the FSM and add your own state in its place. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/11888-toggle-manage-character-movement-setting-in-wrotation/ TITLE: Toggle "Manage Character Movement" Setting in WRotation ---------------------------------------------------------------------------------------------------- Unknown I'm trying to add a toggle to my fightclass to enable/disable character movement with a hotkey.  I'm looking to enable/disable WRotation -> Product Settings -> Manage Character Movement while the rotation is running?  If this is possible, which is the C# variable that this setting maps to?  I wasn't able to find a definitive answer in the WRobot API or the forums. I'm using this in the context of PQR/WRotation where a melee player might occasionally toggle this setting on to "stick" to mobs. ---------------------------------------- Unknown Hello, no tested but like that: public static bool ManageMovement () { if ( robotManager . Products . Products . ProductName == "WRotation" ) { string errorsCSharp ; if ( wManager . Wow . Helpers . RunCodeExtension . RunScript ( robotManager . Helpful . RunCode . CodeType . CSharp , @ "robotManager.Helpful.Var.SetVar(""ManageMovementWRotation"", WRotation.Bot.WRotationSetting.CurrentSetting.ManageMovement);" , "" , out errorsCSharp )) { return robotManager . Helpful . Var . Exist ( "ManageMovementWRotation" ) && robotManager . Helpful . Var . GetVar ( "ManageMovementWRotation" ); } } return false ; } (try to call this code only one time at start (and cache value) to avoid performance problem) ---------------------------------------- Unknown Thank you, I really appreciate your help!  I am integrating this inside of Matenia's 1.12.1 fightclass framework for a melee class.  I've declared your function ManageMovement() , and executed it inside the Initialize() subroutine, which executes its contents once at the beginning as you suggest.  Am I correct in inferring that your code is meant to toggle the value of WRotation.Bot.WRotationSetting.CurrentSetting.ManageMovement when boolean variable ManageMovementWRotation is toggled? This does not seem to work--  I am, however, able to access the correct boolean value of WRotation.Bot.WRotationSetting.CurrentSetting.ManageMovement according to the setting in WRotation -> Product Settings -> Manage Character Movement .  I'm just not able to toggle it while wRotation is running. ---------------------------------------- Unknown Are you sure it's not toggeling? You won't see it change, because if you change the values within your config instead of using the interface, the switches doesn't turn untill you restart wrobot. ? ---------------------------------------- Unknown Thanks for chiming in!  I am aware that the wrobot application winform switch element ' Manage Character Movement ' shouldn't toggle in response to the state of WRotation.Bot.WRotationSetting.CurrentSetting.ManageMovement being toggled,  not unless wrobot is stopped and started again. I'm not 100% clear on what of Droidz's suggestion does, in particular: wManager.Wow.Helpers.RunCodeExtension.RunScript(robotManager.Helpful.RunCode.CodeType.CSharp, @"robotManager.Helpful.Var.SetVar(""ManageMovementWRotation"", WRotation.Bot.WRotationSetting.CurrentSetting.ManageMovement);", "", out errorsCSharp)) Does this create variable ManageMovementWRotation that becomes an alias of WRotation.Bot.WRotationSetting.CurrentSetting.ManageMovement ?  Toggling the ManageMovementWRotation variable in turn toggles the WRotation setting?  I'm a bit confused as I don't have a clear understanding of what wManager.Wow.Helpers.RunCodeExtension.RunScript is doing. ---------------------------------------- Unknown It does about the same, but gives you an error message if any errors happens. ---------------------------------------- Unknown From what I understand, the code: wManager.Wow.Helpers.RunCodeExtension.RunScript(robotManager.Helpful.RunCode.CodeType.CSharp, @"robotManager.Helpful.Var.SetVar(""ManageMovementWRotation"", WRotation.Bot.WRotationSetting.CurrentSetting.ManageMovement);", "", out errorsCSharp) ..creates variable ManageMovementWRotation , and assigns it the value of WRotation.Bot.WRotationSetting.CurrentSetting.ManageMovement .  How does this change the value of WRotation.Bot.WRotationSetting.CurrentSetting.ManageMovement while wrobot is running? ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/11953-need-help-with-using-an-item-at-a-location/ TITLE: Need help with using an item at a location. ---------------------------------------------------------------------------------------------------- Unknown I having nothing but problems with a profile quest in Eversong Woods (WoTLK). I have the previous 45 or so quests working fine, but this one is the simplest of them all but nothing I have tried works. The quest ("Whitebark's Memory") requires that you use an item ("Old Whitebark's Pendant") next to a giant runestone, which spawns "Whitebark's Spirit" that you have to fight until he turns into an NPC that you turn the quest into. I have used UseItemOn in the editor with numerous hotspots all around the runestone, but no matter which location I enter, it goes to the same spot each time and just stands there, not using the item. I know I am at a valid location and verified the item is in the bags, because I can manually click on the item and it continues the quest. I have also tried OverridePulseCSharpCode and FullCSharpCode, creating a separate quest in the profile to pulse this step, but nothing works. The only runestone that shows up in the GameObject dump as - Scorched Grove Runestone: 181260 (0 ; 0 ; 0 ; "None", 10407.02y) but using its ID or name in the editor doesn't work either plus that location leads me to believe maybe it might not actually be it. if (wManager.Wow.Helpers.ItemsManager.GetItemCountByIdLUA(28209) == 1); { var position1 = new Vector3(8206.86f, -6337.222f, 64.50987f); // Directly in front of Runestone - Character stops somewhere in the vicinity each time, but never at the location specified. var position2 = new Vector3(8211.855f, -6336.466f, 64.50996f); // Where Whitebark's Spirit will be standing to interact with. int npcID = 19456; // Whitebark's Spirit NPC ID wManager.Wow.Bot.Tasks.GoToTask.ToPosition(position1); //ItemsManager.UseItem(28209); ItemsManager.UseItem("Old Whitebark's Pendant"); // This actually worked only 1 time I started the bot at the precise location instead of a test distance away but it would not interact with the NPC. wManager.Wow.Bot.Tasks.GoToTask.ToPositionAndIntecractWithNpc(position2, npcID); wManager.Wow.Helpers.Quest.CompleteQuest(); return true; } return true; Any ideas? WhiteBarksMemory.xml ---------------------------------------- Unknown Just don't enter an object to use the item at, the bot will just use it at any position you enter into the hotspots. ---------------------------------------- Unknown There is no object to use the item on and I have always left the "Object" box in the editor blank. As you can see from the code above, I am simply attempting to travel to the location and use the item. I have also tried RunMacroTask("/use Old Whitebark's Pendant"); - which the macro works fine if I type it into the client, but not from the bot. ---------------------------------------- Unknown I finally figured it all out....it appears when you accept this quest, it was showing "Complete" when I dumped current quests (and apparently this quest does not report objectives), so it did not pulse the next step and went straight to turn in. Since there was no turn in NPC, it just stood there. I had to create an "IsComplete" condition that the NPC was Alive and Not Attackable. then it properly went to the position, used the item, was automatically attacked by Whitebark and once the bot fought it down to 35%, he turned green and satisfied the condition for pulsing next step to turn in. Although if you have the bot set to ignore being attacked, this would fail. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/12011-quest-the-gift-that-keeps-on-giving/ TITLE: Quest : the gift that keeps on giving ---------------------------------------------------------------------------------------------------- bio33 Hello, I am in need of a little help with a quest complete condition, for the dk quest, “the gift that keeps on giving” the player throws thing item on the ground to make ghouls, (friendly units.) I need a condition that detects the ones that player makes, createdby.play == 5 ---------------------------------------- Unknown Hey, try to use wManager . Wow . ObjectManager . ObjectManager . Me . PetNumber >= 5 ---------------------------------------- Unknown (check in dev tools the value of "PetNumber" ) ---------------------------------------- @Droidz @Droidz The code didnt work, it is a pet from what the dev tools say but everything i tried didnt work, item : dev tools info on unit : Name: Scarlet Ghoul (Entry: 28845 ) GetDynamicFlags = 0 GetUnitDynamicFlags = None WowClass = Warrior IsLocalPlayer = False IsBlacklisted = False Position = 2418.741 ; -5938.905 ; 96.63226 ; "None" PositionWithoutType = 2418.741 ; -5938.905 ; 96.63226 ; "None" PositionRelativeWithoutType = 2418.741 ; -5938.905 ; 96.63226 ; "None" Health = 2450 MaxHealth = 2450 MyCharacterInFrontHim = False HealthPercent = 100 HealthRatio = 1 IsGoodInteractDistance = True InteractDistance = 4.3 CombatReach = 0.9 IsSwimming = False IsFlying = False IsStunned = False AggroDistance = 0 Rotation = 1.775268 Pitch = 0 CreatureTypeTarget = Humanoid FactionTemplate = wManager.Wow.Helpers.WoWFactionTemplate Mana = 0 MaxMana = 0 ManaPercentage = 100 Rage = 0 MaxRage = 100 RagePercentage = 0 Focus = 0 MaxFocus = 0 FocusPercentage = 0 Energy = 0 MaxEnergy = 100 EnergyPercentage = 0 Chi = 0 MaxChi = 0 ChiPercentage = 0 Runes = 0 MaxRunes = 6 RunesPercentage = 0 RunicPower = 0 MaxRunicPower = 100 RunicPowerPercentage = 0 SoulShards = 2450 MaxSoulShards = 0 SoulShardsPercentage = 0 Eclipse = 0 MaxEclipse = 0 EclipsePercentage = 0 UnitClassification = normal IsElite = False IsWorldBoss = False HolyPower = 1000 MaxHolyPower = 0 HolyPowerPercentage = 0 Alternate = 0 MaxAlternate = 0 AlternatePercentage = 0 DarkForce = 100 MaxDarkForce = 0 DarkForcePercentage = 0 LightForce = 0 MaxLightForce = 0 LightForcePercentage = 0 ShadowOrbs = 0 MaxShadowOrbs = 0 ShadowOrbsPercentage = 0 BurningEmbers = 1000 MaxBurningEmbers = 0 BurningEmbersPercentage = 0 DemonicFury = 0 MaxDemonicFury = 0 DemonicFuryPercentage = 0 ArcaneCharges = 0 MaxArcaneCharges = 0 ArcaneChargesPercentage = 0 Faction = 2 DisplayId = 25000 GetMove = False SpeedMoving = 0 GetDistance = 3.402057 GeHitBoxtDistance = 1.002057 GetDistance2D = 3.400037 GetDistanceZ = 0.1172256 IsAlive = True IsDead = False IsLootable = False IsTaggedByOther = False TaggedByMe = False IsTapDenied = False IsMyPet = True HasTarget = False IsTargetingMe = False IsTargetingMyPet = False IsTargetingPartyMember = False IsTargetingMeOrMyPet = False IsTargetingMeOrMyPetOrPartyMember = False IsMyTarget = True IsMyPetTarget = False IsPartyMemberTarget = False IsMeOrMyPetTarget = True IsMeOrMyPetOrPartyMemberTarget = True Target = 0 TargetObject = (Object) : 0 : 0x00000000 : 0 : 0 Level = 56 IsBoss = False PetNumber = 0 Name = Scarlet Ghoul DBCacheRow = 429415616 UnitFlags = PlayerControlled UnitNPCFlags = None Skinnable = False IsNpcSpiritHealer = False IsNpcRepair = False IsNpcVendor = False IsFlightMaster = False IsNpcInnkeeper = False IsNpcVendorFood = False IsAuctioneer = False IsNpcTrainer = False IsNpcWildPets = False Summon = 0 CreatedBy = 32 CreatedBySpell = 52490 SummonedBy = 32 IsPet = True PetOwnerGuid = 32 InCombat = False InCombatFlagOnly = False InCombatWithMe = False CastingSpellId = 0 CastingSpell = (Id found: 0, Name found: , NameInGame found: , Know = False, IsSpellUsable = False) CastingTimeLeft = 0 IsCast = False CanInterruptCasting = False IsMounted = False MountDisplayId = 0 TransportGuid = 0 InTransport = False Reaction = Friendly IsTracked = False IsOnTaxi = False NotSelectable = False IsAttackable = False PlayerControlled = True Silenced = False Rooted = False Influenced = False Confused = False Pacified = False Fleeing = False Possessed = False NpcMarkerId = 0 NpcFlightMastrerIsDiscover = True NpcMarker = None IsOutdoors = False IsIndoors = True IsPartyMember = False IsPartyLeader = False GetBaseAddress = 492847576 IsValid = True GetDescriptorStartAddress = 492851680 Guid = 17379391445961550717 Type = Unit Entry = 28845 Scale = 1 MinInteractDistance = 4.3 MaxInteractDistance = 50 ---------------------------------------- TheSmokie hi, you can try this method ObjectManager.GetObjectWoWUnit().Count(u => u.IsMyPet && u.Name == "Scarlet Ghoul") == 5 ---------------------------------------- Unknown Thanks mate! ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/12086-spelllaunch-causing-frame-jutters-w-framelock/ TITLE: spell.launch() causing frame jutters w/ framelock ---------------------------------------------------------------------------------------------------- Unknown I'm writing a simple combat routine for an Enhancement shaman in 5.4.8 and am running into an issue that I'm hoping someone can provide a bit of insight.  I'm using Marsbars' video as a framework.  I have a while loop that runs when _IsRunning is true and invokes a function that has cascading 'if' statements that checks which spell to run.  Before the combat routine function is called, I lock the frame and immediately unlock the frame after running spell.Launch(). The issue is that every time a spell is launcher, the client locks up for 1/3 of a second.  I've added a simple timer to time how long the .launch() function is taking and it appears to be taking ~300 ms per invocation which makes sense why I'm seeing frame jutter as everything needs to execute faster than 16.67 ms. ... var watch = System.Diagnostics.Stopwatch.StartNew(); FlameShock.Launch(); Logging.WriteFight("Iteration took " + watch.ElapsedMilliseconds + "ms"); ... [F] 12:18:13 - Iteration took 306ms [F] 12:18:13 - [Spell] Cast Stormstrike (Stormstrike) Is there a better way to invoke the use of spells?  Am I way off base and in over my head with how I'm implementing my combat routine? ---------------------------------------- Unknown Yeah, message me, I’ll help. ---------------------------------------- Unknown I’m completely baffled that everyone in there mother wants to use a ingame lua inject banner ---------------------------------------- Unknown Spell.Launch does a lot more than a simple Lua . LuaDoString ( $ "CastSpellByName('{spell.NameInGame}()'" ); So you might wanna try the latter ---------------------------------------- Unknown Thanks for the pointer!  I figured it was doing quite a bit if one invocation was taking 300 ms on a 6700k. ---------------------------------------- Unknown Depends on what you're doing inside the framelock. From what you showed in your example just launching the spell with no checks besides that took 300ms. If you optimize your stuff, you should be able to keep iterations below 50ms for all spells. ---------------------------------------- Unknown I'm planning on leaving most interrupt logic out and having that be manually done.  I'm also planning on having a manual toggle between single-target and AoE so there shouldn't be too much positional check stuff going on. As far as the above, I'm attempting to invoke spells using Lua instead of spell.launch now.  Just to make sure I have it working, I've added a Lua.LuaDoString("CastSpellByName('Lava Lash')"); That always runs unconditionally.  I've verified that is spelled correctly on my current game client but it does not cast. I've also tried the following: wManager.Wow.Helpers.SpellManager.CastSpellByNameLUA("Lava Lash"); wManager.Wow.Helpers.SpellManager.CastSpellByIdLUA(60103); ---------------------------------------- Unknown Never mind I'm a complete idiot.  I was building the dll to the wrong directory, rookie mistake.  Everything is working way better now and iterations through my basic combat logic are taking 7-8 ms. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/12095-calculate-distance-between-totem-and-player-target/ TITLE: Calculate distance between totem and player target ---------------------------------------------------------------------------------------------------- Unknown How would I go about determining the distance between one of my totems and my target?  I want to be able to ensure that the distance between my Searing Totem and my current target is less than 30 to ensure that the totem can hit my current target. ---------------------------------------- thebk150 Find totem in objectmanager by name or entry, then confirm it's your pet (IsMyPet property) and check unit.Position.DistanceTo(ObjectManager.Target.Position) <= 30 ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/12104-fight-class-spells-casting-in-wrong-order/ TITLE: Fight Class spells casting in wrong order ---------------------------------------------------------------------------------------------------- Unknown I've created a basic fight class in C# and I'm running into an issue where it casts spells in the wrong order.  Does anyone have any experience with this?  I had originally tried using frame lock and locking the frame before invoking CombatRotation() and then unlocking the frame as soon as it returned but that didn't fix the issue and caused other performance issues. The issue appears to be the worst when multiple spells are off cooldown.  For example, when I first go into a fight with all of my burst spells, they are almost all invoked in the wrong order. Here's the actual logic I'm using for CombatRotation() and how I'm casting spells. public void CombatRotation () { // Fire Elemental Totem if ( burstMode && FireElementalTotem . IsSpellUsable ) { SpellManager . CastSpellByNameLUA ( "Fire Elemental Totem" ); return ; } // Elemental Mastery if ( burstMode && ElementalMastery . IsSpellUsable ) { SpellManager . CastSpellByNameLUA ( "Elemental Mastery" ); return ; } // Feral Spirit if ( burstMode && FeralSpirit . IsSpellUsable ) { SpellManager . CastSpellByNameLUA ( "Feral Spirit" ); return ; } // Ascendance if ( burstMode && Ascendance . IsSpellUsable ) { SpellManager . CastSpellByNameLUA ( "Ascendance" ); return ; } // Stormlash Totem if ( burstMode && StormlashTotem . IsSpellUsable ) { SpellManager . CastSpellByNameLUA ( "Stormlash Totem" ); return ; } // Flame Shock if ( aoeMode && FlameShock . IsSpellUsable && FlameShock . IsDistanceGood && ( ObjectManager . Target . BuffTimeLeft ( "Flame Shock" ) < 15000 )) { SpellManager . CastSpellByNameLUA ( "Flame Shock" ); return ; } // Fire Nova if ( aoeMode && FireNova . IsSpellUsable && ( ObjectManager . Target . HaveBuff ( "Flame Shock" ))) { Lua . LuaDoString ( "CastSpellByName('Fire Nova')" ); return ; } // Searing Totem if ( SearingTotem . IsSpellUsable && ! ObjectManager . Me . TotemExist ( TotemType . Fire )) { SpellManager . CastSpellByNameLUA ( "Searing Totem" ); return ; } // Chain Lightning - MW5 if ( aoeMode && ChainLightning . IsSpellUsable && ChainLightning . IsDistanceGood && ObjectManager . Me . BuffStack ( "Maelstrom Weapon" ) == 5 ) { Lua . LuaDoString ( "CastSpellByName('Chain Lightning')" ); return ; } // Lightning Bolt - MW5 if ( LightningBolt . IsSpellUsable && LightningBolt . IsDistanceGood && ObjectManager . Me . BuffStack ( "Maelstrom Weapon" ) == 5 ) { SpellManager . CastSpellByNameLUA ( "Lightning Bolt" ); return ; } //Stormstrike if ( Stormstrike . IsSpellUsable && Stormstrike . IsDistanceGood ) { SpellManager . CastSpellByNameLUA ( "Stormstrike" ); return ; } // Flame Shock if ( FlameShock . IsSpellUsable && FlameShock . IsDistanceGood && (! ObjectManager . Target . HaveBuff ( "Flame Shock" ) || ( ObjectManager . Target . BuffTimeLeft ( "Flame Shock" ) < 10000 ))) { SpellManager . CastSpellByNameLUA ( "Flame Shock" ); return ; } // Lava Lash if ( LavaLash . IsSpellUsable && LavaLash . IsDistanceGood ) { SpellManager . CastSpellByNameLUA ( "Lava Lash" ); return ; } // Unleash Elements if ( UnleashElements . IsSpellUsable && UnleashElements . IsDistanceGood ) { SpellManager . CastSpellByNameLUA ( "Unleash Elements" ); return ; } // Earth Shock if ( EarthShock . IsSpellUsable && EarthShock . IsDistanceGood && (( SpellManager . GetSpellCooldownTimeLeft ( "Stormstrike" ) > 1.5 ) || ( SpellManager . GetSpellCooldownTimeLeft ( "Lava Lash" ) > 1.5 ))) { SpellManager . CastSpellByNameLUA ( "Earth Shock" ); return ; } } ---------------------------------------- Unknown You need to play in the order you want it to go. 1, 2, 3 3 being spammed if 1 , 2 are on cd. ---------------------------------------- Unknown Hello, try to lock wow frame (you can do it only because you don't sleep thread, you will get better reactivity) public void CombatRotation () { try { wManager . Wow . Memory . WowMemory . LockFrame (); // Fire Elemental Totem if ( burstMode && FireElementalTotem . IsSpellUsable ) { SpellManager . CastSpellByNameLUA ( "Fire Elemental Totem" ); return ; } // Elemental Mastery if ( burstMode && ElementalMastery . IsSpellUsable ) { SpellManager . CastSpellByNameLUA ( "Elemental Mastery" ); return ; } // Feral Spirit if ( burstMode && FeralSpirit . IsSpellUsable ) { SpellManager . CastSpellByNameLUA ( "Feral Spirit" ); return ; } // Ascendance if ( burstMode && Ascendance . IsSpellUsable ) { SpellManager . CastSpellByNameLUA ( "Ascendance" ); return ; } // Stormlash Totem if ( burstMode && StormlashTotem . IsSpellUsable ) { SpellManager . CastSpellByNameLUA ( "Stormlash Totem" ); return ; } // Flame Shock if ( aoeMode && FlameShock . IsSpellUsable && FlameShock . IsDistanceGood && ( ObjectManager . Target . BuffTimeLeft ( "Flame Shock" ) < 15000 )) { SpellManager . CastSpellByNameLUA ( "Flame Shock" ); return ; } // Fire Nova if ( aoeMode && FireNova . IsSpellUsable && ( ObjectManager . Target . HaveBuff ( "Flame Shock" ))) { Lua . LuaDoString ( "CastSpellByName('Fire Nova')" ); return ; } // Searing Totem if ( SearingTotem . IsSpellUsable && ! ObjectManager . Me . TotemExist ( TotemType . Fire )) { SpellManager . CastSpellByNameLUA ( "Searing Totem" ); return ; } // Chain Lightning - MW5 if ( aoeMode && ChainLightning . IsSpellUsable && ChainLightning . IsDistanceGood && ObjectManager . Me . BuffStack ( "Maelstrom Weapon" ) == 5 ) { Lua . LuaDoString ( "CastSpellByName('Chain Lightning')" ); return ; } // Lightning Bolt - MW5 if ( LightningBolt . IsSpellUsable && LightningBolt . IsDistanceGood && ObjectManager . Me . BuffStack ( "Maelstrom Weapon" ) == 5 ) { SpellManager . CastSpellByNameLUA ( "Lightning Bolt" ); return ; } //Stormstrike if ( Stormstrike . IsSpellUsable && Stormstrike . IsDistanceGood ) { SpellManager . CastSpellByNameLUA ( "Stormstrike" ); return ; } // Flame Shock if ( FlameShock . IsSpellUsable && FlameShock . IsDistanceGood && (! ObjectManager . Target . HaveBuff ( "Flame Shock" ) || ( ObjectManager . Target . BuffTimeLeft ( "Flame Shock" ) < 10000 ))) { SpellManager . CastSpellByNameLUA ( "Flame Shock" ); return ; } // Lava Lash if ( LavaLash . IsSpellUsable && LavaLash . IsDistanceGood ) { SpellManager . CastSpellByNameLUA ( "Lava Lash" ); return ; } // Unleash Elements if ( UnleashElements . IsSpellUsable && UnleashElements . IsDistanceGood ) { SpellManager . CastSpellByNameLUA ( "Unleash Elements" ); return ; } // Earth Shock if ( EarthShock . IsSpellUsable && EarthShock . IsDistanceGood && (( SpellManager . GetSpellCooldownTimeLeft ( "Stormstrike" ) > 1.5 ) || ( SpellManager . GetSpellCooldownTimeLeft ( "Lava Lash" ) > 1.5 ))) { SpellManager . CastSpellByNameLUA ( "Earth Shock" ); return ; } } catch ( Exception e ) { Logging . WriteError ( "Error: " + e ); } finally { wManager . Wow . Memory . WowMemory . UnlockFrame (); } } ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/12115-load-pathxml-to-list/ TITLE: Load path.xml to List ---------------------------------------------------------------------------------------------------- Unknown How to get saved path from code? ---------------------------------------- @sowelu Hello @sowelu , I need some more info on what your trying to do, ---------------------------------------- Unknown I want get list of Vecror3 points from file. File have been recorded with Gatherer. ---------------------------------------- Unknown Open the file with notepad++ ---------------------------------------- Unknown I need it with C# code for plugin. ---------------------------------------- Unknown Want to pm me your discord and we can jump into a chat? ---------------------------------------- Unknown I think there should be function for .xml path parsing. ---------------------------------------- Unknown Found old code. Have fixed some errors. Seems working now. public List < Vector3 > GetPathFromXml ( string path ) { List < Vector3 > xpath = new List < Vector3 >(); try { FileStream fs = new FileStream ( path , FileMode . Open ); StreamReader stream = new StreamReader ( fs , Encoding . UTF8 ); string content = stream . ReadToEnd (); XmlDocument doc = new XmlDocument (); doc . LoadXml ( content ); var result = doc . GetElementsByTagName ( "Vectors3" ); var item = result . Item ( 0 ); foreach ( XmlNode n in item . ChildNodes ) { var X = n . Attributes [ 0 ]. Value ; var Y = n . Attributes [ 1 ]. Value ; var Z = n . Attributes [ 2 ]. Value ; string type = n . Attributes . Count == 3 ? "None" : n . Attributes [ 3 ]. Value ; Vector3 v3 = new Vector3 ( float . Parse ( X ), float . Parse ( Y ), float . Parse ( Z ), type ); xpath . Add ( v3 ); } Logging . WriteError ( " Xml file parsed !" + path ); } catch ( Exception e ) { Logging . WriteError ( e . ToString ()); } if ( xpath . Count == 0 ) Logging . WriteError ( "No points in path" ); return xpath ; } ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/12152-boolen-string-dictionary-array/ TITLE: Boolen, string Dictionary array ---------------------------------------------------------------------------------------------------- Unknown I am trying to redo my PvPtools with adding custom states but i am having a little problem with buying item via string , boolen. i am trying to use my settings bool to buy the item if the settings is true. but i am not understanding how to get it to buy the item while using a boolen. error : parameter 'number' of 'Vendor.BuyItem(string, int)', i understand i need a string + int amount but how do i get it to check before buying using boolen? public static class AllianceGems { private static Dictionary < string , bool > Mains = new Dictionary < string , bool > { { "Majestic Zircon" , true }, }; public static void BuyingGems () { foreach ( var item in Mains ) { Vendor . BuyItem ( item ); } } } ---------------------------------------- Unknown Hi, public static class AllianceGems { private static Dictionary < string , bool > Mains = new Dictionary < string , bool > { { "Majestic Zircon" , true }, }; public static void BuyingGems () { foreach ( var item in Mains ) { if ( item . Value ) Vendor . BuyItem ( item . Key , 20 ); } } } If you want use list with ammount to buy: using System ; using System . Collections . Generic ; using wManager . Wow . Helpers ; public static class AllianceGems { private static List < System . Tuple < bool , string , int >> Mains = new List < System . Tuple < bool , string , int >> { // BuyOrNot, ItemName , BuyNumber new Tuple < bool , string , int >( true , "Majestic Zircon" , 20 ), }; public static void BuyingGems () { foreach ( var item in Mains ) { if ( item . Item1 ) Vendor . BuyItem ( item . Item2 , item . Item3 ); } } } Final code look like: using System . Collections . Generic ; using robotManager . Helpful ; using wManager . Wow . Helpers ; using Buy = System . Tuple < bool , string , int >; public static class AllianceGems { private static List < Buy > Mains = new List < Buy > { // Item1, Item2 , Item3 // BuyOrNot, ItemName , BuyNumber new Buy ( true , "Majestic Zircon" , 20 ), }; public static void BuyingGems () { foreach ( var item in Mains ) { if ( item . Item1 ) { var currentCount = ItemsManager . GetItemCountByNameLUA ( item . Item2 ); if ( currentCount < item . Item3 ) { Logging . Write ( "Buy " + item . Item2 ); Vendor . BuyItem ( item . Item2 , item . Item3 - currentCount ); } } } } } ---------------------------------------- @Droidz @Droidz You're Awesome ! ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/12165-manipulations-in-character-selection-menu/ TITLE: Manipulations in character selection menu ---------------------------------------------------------------------------------------------------- Unknown Hey I need help resolving a few issues. 1) How can I delete a character using a robot? Click this button, paste string "delete", => if okey:isenable then click okay I think it should be like what api should be used, can anyone know? I think it’s not difficult, a couple of clicks and paste the desired text, I just don’t know what the frames are called in the menu so that and where to find it api 2) How can I, being in Logout, select the character I need? 3) Is it possible to create a new character with random nickname? Thx ---------------------------------------- Pudge Extract GlueXML from your client's MPQ find out what everything is called and then use those names. ---------------------------------------- Unknown Thanks for the answer, I extracted this document and found the name of the button, but how do I activate it?  "CharacterSelectDeleteButton". I tried to use Lua.LuaDoString("CharacterSelectDeleteButton:Click()") in dev tools but nothing ---------------------------------------- Pudge That should work. Lua.LuaDoString takes some extra arguments like "notInGame" or something, so maybe try those ---------------------------------------- Unknown You are the best! It work's) Lua.LuaDoString("CharacterSelectDeleteButton:Click();", true); ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/12213-manage-auction-house/ TITLE: Manage auction house ---------------------------------------------------------------------------------------------------- Unknown Hi there! Trying to make own AH product. And there is a question. How do I get list of items currently sailing by me? I've tried AuctionHelpers.GetBrowsePageItems() But looks like it only works for "Browse" tab of AH. So i cannot get list of elements when I'm on " Auction" tab. Is there built-in function? Or it could be resolved only by lua? ---------------------------------------- Unknown https://marsbars.gitlab.io/unoffical-wrobot-api-docs/api/index.html ---------------------------------------- Unknown Thanks. But I've already checked wManager lib and I didn't see anything suits my need. Anyway looks like the only method is using lua. ---------------------------------------- Unknown I know this does not have AH fuctions, but this will help a lot > https://wowwiki.fandom.com/wiki/Lua_functions ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/12236-solved-target-switching-using-grinder-in-vanilla-1121-5785/ TITLE: [Solved] Target Switching using Grinder in Vanilla 1.12.1 5785 ---------------------------------------------------------------------------------------------------- Garub | 2020-06-09T04:47:31Z I have put together a few vanilla fightclasses which are working well with the Party and WRotation addons.  I've stitched them in C# using Matenia's framework and a patchwork of other code gleaned from this site. I have a tank class, a healing class and a dps class.  They are configured thusly: tank - uses Grinder product to follow a path, pick targets and murder things. healer - uses Party product to follow and heal tank dps - uses Party product to follow and assist tank While using the Grinder product, I need to give the tank the ability to switch from its current target to taunt units that are attacking/targeting partymembers in mid-fight.  Currently the behavior is Acquire target Kill target Attack & kill remaining adds Goto 1. When I am manually driving the tank using WRotation, I can manually pick targets at will.  I am able to switch from my current target to another without any constraints.  The healer follows and heals, the dps follows and assists.  The tank even rushes to assist partymembers AFTER the current target dies thanks to the Party product. The problem is that when I use the Grinder product, I am unable to get my tank fightclass to switch targets DURING the fight to taunt adds off the others.  I am currently attempting this from the fightclass .DLL. I have a series of functions inside the TANK FIGHTCLASS to ascertain if there are targets that need to be taunted off partymembers. public static void CMD_Priotarg () { WoWUnit target = GetHighPriorityUnit ( 25 ); // Returns GUID of 1st mob within 25 yds that is targeting a partymember if ( target != null && target . Guid >= 0UL && target . IsAlive && target . GetDistance <= 25 ) { LuaPrint ( target . Name + " is attacking a partymember. Switching!" ); CombatUtil . TargetUnit ( target ); MovementManager . Face ( target ); } } If there's a mob that is targeting party members and needs to be taunted off them, GetHighPriorityUnit() spits out the mob's WoWUnit GUID and I use Matenia's CombatUtil.TargetUnit() function to switch to it.  I have the CMD_Priotarg() function bound to a hotkey defined by the fightclass.  It is currently working with WRotation. I followed these two threads for guidance. https://wrobot.eu/forums/topic/7658-prioritize-low-hp-targets/ https://wrobot.eu/forums/topic/7681-left-click-unit/ This does not work if I am using the Grinder product.  The issue is that Grinder owns the targeting.  I've put the function above in a subroutine that ticks alongside the rotation in Matenia's framework .  When it is triggered and GetHighPriorityUnit() returns a valid WoWUnit GUID, the tank will switch targets to that mob's GUID for a second, then immediately snap back to the original target. So I found this thread "OK, that probably means that I should be doing this via a fightloop event," I thought. That thread referenced a few event driven fightloop code examples that are much more elegant than my CMD_Priotarg() example.  But they all yield the same unwanted behavior.  WRobot still acquires the new target and immediately switches back to the original target: public void Initialize () { try { ... FightEvents . OnFightLoop += new FightEvents . FightTargetHandler ( Methods . FightEvents_OnFightLoop_Taunt ); ... } } ... private static void FightEvents_OnFightLoop_Taunt ( WoWUnit unit , CancelEventArgs cancelable ) { // If running Grinder, Gatherer or Automaton, switch to targets that are targeting partymembers if (( OffensiveWarrior . productCategory == "Grinder" || OffensiveWarrior . productCategory == "Automaton" || OffensiveWarrior . productCategory == "Gatherer" ) && woWPlayer . IsPartyMember ) { unit = Methods . GetHighPriorityUnit ( 8 ); // gets all units attacking you // if a mob is attacking a partymember and we haven't switched targets in the last 5sec if ( unit != null && unit . Guid > 0UL && Methods . LastTargetSwitch . AddSeconds ( 5 ) < DateTime . Now ) { Methods . LuaPrint ( "FightEvents_OnFightLoop: switchTarget" ); CombatUtil . TargetUnit ( attacker ); Methods . LastTargetSwitch = DateTime . Now ; } } } This results in the same snap back targeting behavior while running Grinder.  Works fine when using the WRotation product. TL;DR: I can reliably get a fightclass to switch targets after combat has been initiated when using the WRotation product.  Can the same be done with the Grinder product?  If not, is a workaround possible? Edited June 9, 2020 by srazdokunebil Problem was solved. ---------------------------------------- Unknown i would use mouse over to cast poly on the other mob. ---------------------------------------- Unknown | 2020-06-07T06:09:04Z If you're using the fightloop, you need to move to the target and switch it constantly. That's not how you wanna do this. You wanna stop the fight and restart it with the new mob. Look at my PartyHelper plugin, code is right there. Edit: Smokie, before desperately trying to increment your post count at all cost, maybe read what the OP is actually asking. Edited June 7, 2020 by Matenia ---------------------------------------- Unknown ..parsing AssistLeader() in FightAssist.cs from PartyHelper : public static void AssistLeader () { WoWPlayer leader = ObjectManager . GetObjectWoWPlayer (). FirstOrDefault ( p => p . Name == PartyFollow . LeaderName ); if ( leader == null || leader . Target == 0 || ObjectManager . Me . Target == leader . Target || leader . TargetObject . IsDead || leader . TargetObject . Reaction >= Reaction . Friendly || ! leader . TargetObject . IsAttackable || ! IsCloseEnoughToLeader () || Me . HaveBuff ( "Food" ) || Me . HaveBuff ( "Drink" ) || wManagerSetting . IsBlackListed ( leader . Target ) || Logging . Status == "Regeneration" ) { return ; } Fight . StopFight (); ObjectManager . Me . Target = leader . Target ; Fight . StartFight ( leader . Target , false ); } I simply transcribed the Fight.StopFight() and Fight.StartFight() functions into FightEvents_OnFightLoop_Taunt() : public static void FightEvents_OnFightLoop_Taunt ( WoWUnit unit , CancelEventArgs cancelable ) { // If running Grinder, Gatherer or Automaton, switch to targets that are targeting partymembers if (( OffensiveWarrior . productCategory == "Grinder" || OffensiveWarrior . productCategory == "Automaton" || OffensiveWarrior . productCategory == "Gatherer" )) { unit = Methods . GetHighPriorityUnit ( 8 ); // returns WOWUnit GUID of closest unit attacking a partymember // if a mob is attacking a partymember and we haven't switched targets in the last 5sec if ( unit != null && unit . Guid > 0UL && Methods . _lastTargetSwitch . AddSeconds ( 8 ) < DateTime . Now ) { Methods . LuaPrint ( "FightEvents_OnFightLoop_Taunt switching target to: " + unit . Guid ); Fight . StopFight (); ObjectManager . Me . Target = unit . Guid ; Fight . StartFight ( unit . Guid , false ); Methods . _lastTargetSwitch = DateTime . Now ; } } } This works flawlessly.  Thank you Matenia! ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/12280-help-with-some-trigonometry/ TITLE: Help with some trigonometry, ---------------------------------------------------------------------------------------------------- Unknown Hello, i am trying to figure out how to get a facing target from the vector3, the angle, and targets vector3. We have the following data: - Our Vector3 Position (X, Y, Z) (100, 100, 0) - Our Current Facing Angle (Pitch, Yaw) (90, 180) - Targets Vector3 Position (X, Y, Z) (200, 200, 0) How do we calculate the Angle (Pitch, Yaw) that I would need to reach to be facing our target. I just need the math function to take the input and output the info i need. the rest i can do. -Smokie ---------------------------------------- Unknown I believe this should work: /// /// Used to get the facing from two positions based on the origin rotation. /// /// The 1. position. /// The 2. position. /// The origin rotation. /// Negative radian on the right; positive on the left. public float FacingCenter ( WoWPoint from , WoWPoint to , float originRotation ) { var face = NormalizeRadian ( Atan2Rotation ( from , to ) - originRotation ); if ( face < Math . PI ) return - face ; return NormalizeRadian ( originRotation - Atan2Rotation ( from , to )); } /// /// Used to normalize the input radian. /// /// The radians to normalize. public float NormalizeRadian ( float radian ) { if ( radian < 0.0 ) return ( float ) (-(- radian % ( 2.0 * Math . PI )) + 2.0 * Math . PI ); return radian % 6.283185f ; } /// /// Used to calculate atan2 of to positions. /// /// Position 1. /// Position 2. /// Radians to add. /// public static float Atan2Rotation ( WoWPoint from , WoWPoint to , float addRadian = 0 ) { return ( float ) Math . Atan2 ( to . Y - from . Y , to . X - from . X ) + addRadian ; } /// /// Used to calculate new position by parameter. /// /// The position to calculate from. /// The rotation of the object in radians. /// The radius to add. /// public static WoWPoint CalculateNewPosition ( WoWPoint from , float rotation , float radius ) { return new WoWPoint ( Math . Sin ( rotation ) * radius + from . X , Math . Cos ( rotation ) * radius + from . Y , from . Z ); } ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/12329-runcode-class/ TITLE: RunCode class ---------------------------------------------------------------------------------------------------- Unknown Does anyone know how the RunCode class works? I want to be able to let a user enter some C# similar to the quester runcode step. The RunCode class has some Compile methods but none for running that I could decifer. Any help would be appreciated ❤️ ---------------------------------------- Marsbar Hi, like that: var CodeToRun = "var r = 1 + 1;" ; string _sourceCodeIQuesterCondition = @ " using System ; using System . Collections . Generic ; using System . ComponentModel ; using System . Configuration ; using System . IO ; using System . Linq ; using System . Threading ; using robotManager ; using robotManager . FiniteStateMachine ; using robotManager . Helpful ; using wManager . Wow . Class ; using wManager . Wow . Helpers ; using wManager . Wow . ObjectManager ; using Timer = robotManager . Helpful . Timer ; using wManager . Wow . Enums ; public class Main { public static void Pulse () { [ RUNCODE ]; } } "; string error ; if (! robotManager . Helpful . RunCode . CompileAndInvokeStaticMethod ( RunCode . CodeType . CSharp , _sourceCodeIQuesterCondition . Replace ( "[RUNCODE]" , CodeToRun ), "Main" , "Pulse" , out error )) Logging . WriteError ( error ); ---------------------------------------- Unknown Exactly what I was looking for, thank you. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/12331-forwarding-lua-events-in-c/ TITLE: Forwarding lua events in C# ---------------------------------------------------------------------------------------------------- Unknown Hi there! Does anybody know Is there way to make fight class listen to Lua events? Especially COMBAT_LOG_EVENT_UNFILTERED. Yeah I know there is EventsLuaWithArgs.OnEventsLuaStringWithArgs but it pretty often skips COMBAT_LOG_EVENT_UNFILTERED and even when it fires it doesn't return any args cuz I have to use CombatLogGetCurrentEventInfo () function to get a payload. How can I subscribe COMBAT_LOG_EVENT_UNFILTERED with args using c#? Thank you. ---------------------------------------- scsfl Pro tip: There are no events being skipped. If you look at my framework it works perfectly. If you're running patch 6.x or higher, you need your own combatlog parser. Create a lua frame that subscribes to the event, get the payload, store it in a table and periodically empty the table and read the contents "line by line". ---------------------------------------- Unknown Can I ask one more dumb question please. Ok I did lua string that initialize lua frame and I'm able to store the payload in table each time event fired. luaString = @ " local function OnEvent ( self , event ) local args = { } eventInfo = { CombatLogGetCurrentEventInfo ()} for key , value in pairs ( eventInfo ) do table . insert ( args , tostring ( value )) end args = ( table . concat ( args , ',' )) print ( args ) -- debug end local f = CreateFrame ( 'Frame' ) f : SetAttribute ( name , 'CLEU' ) f : RegisterEvent ( 'COMBAT_LOG_EVENT_UNFILTERED' ) f : SetScript ( 'OnEvent' , OnEvent ) "; Also I've got a C# function that which takes CLEU args as parameter. Is there way to call this function inside luaString? In other words I need to send args to a function every time event fired. The only thing comes in mind is to create chat frame inside lua string, sent CLEU args to this frame and read this frame using EventsLuaWithArgs.OnEventsLuaStringWithArgs. But It looks awful ? ---------------------------------------- scsfl Don't create a frame locally and you'll find you can actually access globally. It's Lua 101. ---------------------------------------- Unknown Brilliant advice man! I'm very appreciating your help. var luaString = @ " function OnEvent ( self , event ) local args = { } eventInfo = { CombatLogGetCurrentEventInfo ()} for key , value in pairs ( eventInfo ) do table . insert ( args , tostring ( value )) end _G . args = ( table . concat ( args , ',' )) end print ( 'frame works' ) f = CreateFrame ( 'Frame' ) f : SetAttribute ( name , 'CLEU' ) f : RegisterEvent ( 'COMBAT_LOG_EVENT_UNFILTERED' ) f : SetScript ( 'OnEvent' , OnEvent ) "; Now I'm able to access _G.args from OnEventsLuaStringWithArgs ? . Thanks ? ---------------------------------------- Unknown argsForCombatLogEventPuller = { } There you go, that would've been more than enough. You don't have to assign it to the global pseudo table. ---------------------------------------- Unknown Fixed. Thank you for code review. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/12334-help-requested-create-simple-addon-to-communicate-with-custom-plugin/ TITLE: Help Requested - Create simple addon to communicate with custom plugin ---------------------------------------------------------------------------------------------------- Unknown I would like to create a simple addon with a basic frame that can be dragged around the screen, and will show strings of text from my plugin. I am not quite sure how to communicate between the addon and Wrobot's plugin. Thank you in advance! ---------------------------------------- Apexx Here is all you need, take a look at the Plugin! ---------------------------------------- @Talamin Thank you @Talamin ---------------------------------------- Apexx Shoot me a PM, I can give you the custom code used in most of my Profiles if you are interested. The link above works too! ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/4964-dungeon-profile-issue/ TITLE: Dungeon profile issue ---------------------------------------------------------------------------------------------------- @Droidz So i made a big profile to farm a dungeon. It works great till my character dies at some point of the dungeon, then character is at the start of the dungeon. But bot wont reset to 1st step, but instead will try to go to lets say step 10 path, and will run into the wall, since its a big dungeon. Any idea how to make him reset the profile to step 1 if he dies? Log for ex, after death he continues with next step, what i want is him to start from step 1 instead, same thing when he disconnects and reconnect. [D] 08:57:25 - [Quester] RunCode[46]: xxx [F] 08:57:28 - [Spell] Cast (onself) Swiftmend (Swiftmend) 08:57:28 - [Fight] Player Attacked by [F] 08:57:29 - [Spell] Cast Bear Form (Bear Form) [F] 08:57:32 - [Spell] Cast Thrash (Thrash) [F] 08:57:34 - [Spell] Cast (onself) Rejuvenation (Rejuvenation) [F] 08:57:35 - [Spell] Cast (onself) Regrowth (Regrowth) [F] 08:57:37 - [Spell] Cast Bear Form (Bear Form) [D] 08:57:38 - [Fight] Fight stopped 08:57:38 - [Resurrect] Player dead [F] 08:57:38 - [Spell] Cast Cat Form (Cat Form) [F] 08:57:40 - [Spell] Cast (onself) Rejuvenation (Rejuvenation) [F] 08:57:42 - [Spell] Cast Cat Form (Cat Form) 08:57:46 - [Resurrect] Player retrieve corpse [D] 08:57:49 - [Quester] If[47] [D] 08:57:49 - [Quester] RunCode[51]: [D] 08:57:53 - [Quester] New step (52): GoTo10th>Pulse Since my profile is in a big while true loop, i thought maybe its possible to do smth like this: Is it possible? But i would need "else go to step 1" i think? and there is no else action avalible? @Droidz ---------------------------------------- mich125 Hello, I cannot help you without your profile, but you can try to run this code when your profile start (one time): robotManager . Events . LoggingEvents . OnAddLog += delegate ( robotManager . Helpful . Logging . Log log ) { if ( log != null && log . Text . Contains ( "[Resurrect] Player retrieve corpse" )) { new System . Threading . Thread (() => robotManager . Products . Products . ProductRestart ()). Start (); } }; (this code stop/start quester when you retrieve your corpse) ---------------------------------------- Unknown Damn this did the trick:D works perfectly now thx bro! ---------------------------------------- Unknown Or: EventsLuaWithArgs . OnEventsLuaWithArgs += ( LuaEventsId id , List args ) => { if ( id == wManager . Wow . Enums . LuaEventsId . PLAYER_DEAD ) { Lua . LuaDoString ( "StaticPopup1Button1:Click();" ); robotManager . Products . Products . ProductRestart (); } }; ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/5078-plugin-for-attacking-specific-mobs/ TITLE: Plugin for attacking specific mobs? ---------------------------------------------------------------------------------------------------- Unknown Hello, I'm currently gathering dreamleaf using WROBOT with Sky Golem so I have the option "Do not attack while mounted in Sky Golem" on. But what I want is a plugin or whatevers needed to let my bot get off Sky Golem and attack the mob that spawns after herbing those random dreamleaf nodes that drops extra dreamleafs. Can anybody help me with this matter? Thanks in advance ---------------------------------------- testingz Hello, Try this plugin: GatheringMobSpawns.cs using System . Collections . Generic ; using System . Windows . Forms ; using robotManager . Helpful ; using wManager . Wow . Bot . States ; public class Main : wManager . Plugin . IPlugin { public void Initialize () { var grinderState = new Grinding { EntryTarget = new List { 98232 , 98234 , 98235 , 98233 } }; // http://www.wowhead.com/npc=98232/withered-hungerer , http://www.wowhead.com/npc=98234/nightmare-creeper , http://www.wowhead.com/npc=98235/frenzied-fox, http://www.wowhead.com/npc=98233/withered-hungerer robotManager . Events . FiniteStateMachineEvents . OnBeforeCheckIfNeedToRunState += ( engine , state , cancelable ) => { if ( state != null && state . DisplayName == "Farming" ) { if ( grinderState . NeedToRun ) { grinderState . Run (); cancelable . Cancel = true ; } } }; Logging . Write ( "[GatheringMobSpawns] Loadded." ); } public void Dispose () { Logging . Write ( "[GatheringMobSpawns] Disposed." ); } public void Settings () { MessageBox . Show ( "[GatheringMobSpawns] No settings for this plugin." ); } } ---------------------------------------- Unknown Thanks, Droidz!! ---------------------------------------- Unknown Hello, I downloaded that and I put it in "wrobot / plugins" but when I open the bot I can't activate it, what can I do? thanks! ---------------------------------------- notme Just enable the plugin in plugins tab it should show up as GatheringMobSpawns.cs and set it to on. The second thing is this is plugin created to kill specific mobs with ids like new List { 98232 , 98234 , 98235 } }; To make the bot kill other kind of mob you must find the id on wowhead and add it to list. For now that list let the bot attack 3 mobs : www.wowhead.com/npc=98232 www.wowhead.com/npc=98234 www.wowhead.com/npc=98235 To add mob you must go to wowhead find the mob id and add it to that list directly into the plugin code. ---------------------------------------- Unknown oooh nvm, i got it ty!! ---------------------------------------- Unknown Please add Mob 98233 which s the one in Suramar for all the others. :) Ps: I already did this in the cs file. thX! ---------------------------------------- Unknown I didn't think this plugin was working but then I disabled the option to ignore fighting while in sky golem and travel form and now it seems like this is working great. Looks like it ignores other mobs and is just attacking withered hungerers on my starlight farm. Thanks :)! ---------------------------------------- @Droidz Thank you. Edit: Does this interfer with setting the option "Ignore fights while in travel form/shredder" ? I have just activated the plugin and the bot ignored a Nightmare Creeper.. @Droidz Edit2: Done, thanks. Will test it out right now ---------------------------------------- @Droidz You have to disable the option "ignore fighting while in sky golem and travel form". ---------------------------------------- Unknown Actually i disabled "ignore figthing etc." but the bot still attacks mobs. 27 feb 2017 15H38 - QknmXRv.log.html ---------------------------------------- k4njin My message was to @testingz and was about the plugin? ---------------------------------------- Unknown Yes yes! Sry, just quoted to post my problem, but i made another thread since i have another one related to this :D edit: Actually, i have checked "ignore fighting etc." in mount and in gathering options too, but seems working fine. If someone needs here's my log 27 feb 2017 18H30.log.html ---------------------------------------- Unknown Does anyone know how to setup loot distance? Not search radius in wrobot options, but exactly loot radius. I need it to avoid looting every mob in 300 radius. And if I turn off "Loot mobs" option bot doesn't loot spawned mobs (e.g. withered hungerer). ---------------------------------------- Unknown So you need to loot only mobs from the list and not any other? :D ---------------------------------------- Unknown Yeah, it would be perfect :) ---------------------------------------- Unknown yes that works so ---------------------------------------- Unknown Does this also work during stealth? I have noticed it works very well with the mobs that spawn on gathering procs on nodes, but attacking mobs on the path (e.g felfire basilisk) when being stealthed, does not seem to work. I've switched to attack first, but then the bot also goes out of stealth with a few withered and some other non-minable basilisk and I dont want that. What fix do you recommend? I have not found one so far that does the described (ignore all other mobs as usual, but include felfire basilisks during run.  Is any of that influenced by attack  before being attack here? I've added the ID and link into the .cs file http://www.wowhead.com/npc=101868/felfire-basilisk Edit: Seems to magically work now ---------------------------------------- Unknown Erm, I don't get, does option "Loot mobs" should be turned ON? ---------------------------------------- Unknown if you want to loot a mob then loot mobs has to be turned on, naturally, yes. ---------------------------------------- Unknown Plugin works super good with mob wich you need to attack, but you need to add http://www.wowhead.com/npc=98233/withered-hungerer for Suramar proc. If you farm  Foxflower and you have a few enemies near spot bot try to attack fox and after few fail attack bot switch to another target. But if you dont have enemies and agro bot try to attack only fox and follow gather :) For fox need anorher good solution (follow the fox before it disappears for example) i am sorry for my bad english ---------------------------------------- Unknown it seems that plugin works not really correct with option "ignore while in travel form" bot gather herb and continue runnin, but if he was attacked right after gathering - he begin to fight, what he didnt with ignore option ---------------------------------------- Unknown Awesome thanks alot! This works like a charm :) ---------------------------------------- Unknown is there a way to make the plugins hit every foxflower from frenzied fox instead of attacking ? got a plugins like that with HB, i dont know if is possible with this bot ---------------------------------------- Unknown if i using this for fishing npc spawns after lure use in Legion, bot only attack after 2-4 fished and dont loot dead npc in fisherbot mode how to fix `? ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/6346-check-whether-an-item-is-usable/ TITLE: Check whether an item is usable ---------------------------------------------------------------------------------------------------- Unknown Heya, I have a working script that will use a Mana Agate when on 10% mana and create a new one. The issue is Mana Agate has a cooldown. How do I check whether it is off cooldown? I google a bit and came up with this, but something is off: bool spellName = Lua.LuaDoString ("start, duration, enable = GetActionCooldown(37); return enable;"); if (ObjectManager.Me.ManaPercentage < 10 && ItemsManager.HasItemById(5514) && spellName) { ItemsManager.UseItem(5514); Thread.Sleep(Usefuls.Latency + 1300); } ---------------------------------------- Unknown Hello, with code like: string s = wManager . Wow . Helpers . ItemsManager . GetItemSpell ( 5514 ); if (! string . IsNullOrWhiteSpace ( s )) { bool isUsable = wManager . Wow . Helpers . SpellManager . SpellUsableLUA ( s ); } ---------------------------------------- Unknown I'm a C# virgin, please bear with me. It says that isUsable doesn't exist in the current context. Does that mean that 'string.IsNullOrWhiteSpace(s)' returned true? Here's my code: string s = wManager.Wow.Helpers.ItemsManager.GetItemSpell(5514); if (!string.IsNullOrWhiteSpace(s)) { bool isUsable = wManager.Wow.Helpers.SpellManager.SpellUsableLUA(s); } if (ObjectManager.Me.ManaPercentage < 10 && ItemsManager.HasItemById(5514) && isUsable) { ItemsManager.UseItem(5514); Logging.WriteDebug("Using Mana Agate"); Thread.Sleep(Usefuls.Latency + 1500); } ---------------------------------------- Unknown isUsable is declared in the "if" so everything outside the "if" can't see the variable string s = wManager . Wow . Helpers . ItemsManager . GetItemSpell ( 5514 ); bool isUsable = false ; if (! string . IsNullOrWhiteSpace ( s )) { // Set isUsable = wManager . Wow . Helpers . SpellManager . SpellUsableLUA ( s ); } if ( ObjectManager . Me . ManaPercentage < 10 && ItemsManager . HasItemById ( 5514 ) && isUsable ) { ItemsManager . UseItem ( 5514 ); Logging . WriteDebug ( "Using Mana Agate" ); Thread . Sleep ( Usefuls . Latency + 1500 ); } Give it a try. ---------------------------------------- Unknown Is this how Csharp works? Wow, that's strange... Nevertheless, still no go --> not all code paths return a value ---------------------------------------- Unknown BTW, why are we using SpellUsable when we want to check if an ITEM is usable? --- Mana Agate has a CD ---------------------------------------- Unknown Yes thats how csharp works :D can't find some strange stuff. If you are walking in the left room you are not able to see what happens in the right one. Well if you need a return value string s = wManager . Wow . Helpers . ItemsManager . GetItemSpell ( 5514 ); bool isUsable = false ; if (! string . IsNullOrWhiteSpace ( s )) { // Set isUsable = wManager . Wow . Helpers . SpellManager . SpellUsableLUA ( s ); } if ( ObjectManager . Me . ManaPercentage < 10 && ItemsManager . HasItemById ( 5514 ) && isUsable ) { ItemsManager . UseItem ( 5514 ); Logging . WriteDebug ( "Using Mana Agate" ); Thread . Sleep ( Usefuls . Latency + 1500 ); } // Return return isUsable ; Maybe because its a spell at the end and handled like this way. I'm not that familar with items so i can't say that much. ---------------------------------------- Unknown Omg, you're right, I accidentaly deleted return true. Back to Csharp, I'm quite familiar with AutoIt and when you declare a variable it can be reached from anywhere in the whole script, that's why i'm so confused. :) Now i tried finding out the issue but it seems even though I have the item and the item is usable it returns false: string s = wManager.Wow.Helpers.ItemsManager.GetItemSpell(5514); bool isUsable = false; if (!string.IsNullOrWhiteSpace(s)) { isUsable = wManager.Wow.Helpers.SpellManager.SpellUsableLUA(s); } else { Logging.WriteDebug("Error1"); } if (isUsable) //(ObjectManager.Me.ManaPercentage < 10 && ItemsManager.HasItemById(5514) && isUsable) { ItemsManager.UseItem(5514); Logging.WriteDebug("Using Mana Agate"); Thread.Sleep(Usefuls.Latency + 1500); } else { Logging.WriteDebug("Error2"); } ---------------------------------------- Unknown C# is a object oriented programming language and not a script language. Just use the developer tool in the bot and test your c# conditions with it and you will find out what returns false. ---------------------------------------- Unknown isUsable returns false ---------------------------------------- Unknown replace isUsable = wManager . Wow . Helpers . SpellManager . SpellUsableLUA ( s ); with isUsable = Lua . LuaDoString ( string . Format ( "local isUsable, notEnoughMana = IsUsableItem({0}); return isUsable;" , s )); and give it a try ---------------------------------------- Unknown IsUsableItem does not seem to exist in Vanilla. The closest to I was able to find for vanilla is GetActionCooldown Not sure how to structure it though. ---------------------------------------- Unknown Oh Vanilla, sorry then i'm out ;) I have no clue about Vanilla. ---------------------------------------- Unknown Oh damn... I thought we were on to sth... well, thanks anyways ---------------------------------------- Unknown I think we need to use GetActionCooldown --> http://wowprogramming.com/docs/api/GetActionCooldown ---------------------------------------- @Droidz @Droidz Alright, so updated your script but it still says it's not usable for some reason: string s = wManager.Wow.Helpers.ItemsManager.GetItemSpell(5514); if (!string.IsNullOrWhiteSpace(s)) { bool isUsable = wManager.Wow.Helpers.SpellManager.SpellUsableLUA(s); if (isUsable) { Logging.WriteDebug("Usable"); } else { Logging.WriteDebug("Not usable"); } } ---------------------------------------- @Droidz @Droidz @iMod guys save me, this is now not related to vanilla or retail. I solved the problem using Timer but for that to work I had to scrap the static bool Pulse and put everything under the main routine. It works great, unfortunately, something got probably wrong with Dispose since when I click the stop button in the bot GUI, it crashes. HELP! using System ; using System . Collections . Generic ; using System . Linq ; using System . Text ; using System . Threading . Tasks ; using System . ComponentModel ; using System . Diagnostics ; using System . Threading ; using robotManager . Helpful ; using robotManager . Products ; using wManager . Wow . Helpers ; using wManager . Wow . ObjectManager ; using Timer = robotManager . Helpful . Timer ; public class CustomProfile : Custom_Profile . ICustomProfile { private const int CastEverySeconds = 120 ; private bool _isRunning ; private Timer _timer ; public void Pulse () { try { while ( wManager . Wow . Helpers . Conditions . ProductIsStarted ) { if ( wManager . Wow . Helpers . Conditions . InGameAndConnectedAndAliveAndProductStartedNotInPause ) { try { if (! ObjectManager . Me . HaveBuff ( "Arcane Intellect" ) && ! ObjectManager . Me . InCombat && ! ObjectManager . Me . IsMounted && SpellManager . SpellUsableLUA ( "Arcane Intellect" )) { SpellManager . CastSpellByNameLUA ( "Arcane Intellect" , true ); Logging . WriteDebug ( "Buffed [Arcane Intellect]" ); Thread . Sleep ( Usefuls . Latency + 1500 ); } if (! ObjectManager . Me . HaveBuff ( "Ice Armor" ) && ! ObjectManager . Me . IsMounted && SpellManager . SpellUsableLUA ( "Ice Armor" ) && ! ObjectManager . Me . InCombat ) { SpellManager . CastSpellByNameLUA ( "Ice Armor" ); Logging . WriteDebug ( "Buffed [Ice Armor]" ); Thread . Sleep ( Usefuls . Latency + 1500 ); } if (! ObjectManager . Me . HaveBuff ( "Dampen Magic" ) && ! ObjectManager . Me . InCombat && ! ObjectManager . Me . IsMounted && SpellManager . SpellUsableLUA ( "Dampen Magic" )) { SpellManager . CastSpellByNameLUA ( "Dampen Magic" , true ); Logging . WriteDebug ( "Buffed [Dampen Magic]" ); Thread . Sleep ( Usefuls . Latency + 1500 ); } if (! ItemsManager . HasItemById ( 5514 ) && ! ObjectManager . Me . InCombat && ! ObjectManager . Me . IsMounted && SpellManager . SpellUsableLUA ( "Conjure Mana Agate" )) { SpellManager . CastSpellByNameLUA ( "Conjure Mana Agate" ); Logging . WriteDebug ( "Conjure Mana Agate" ); Thread . Sleep ( Usefuls . Latency + 2000 ); } if ( ItemsManager . HasItemById ( 5514 ) && ! ObjectManager . Me . IsMounted && ObjectManager . Me . ManaPercentage < 15 && ( _timer == null || _timer . IsReady )) { ItemsManager . UseItem ( 5514 ); _timer = new Timer ( CastEverySeconds * 1000 ); Logging . WriteDebug ( "Using Mana Agate" ); Thread . Sleep ( Usefuls . Latency + 1500 ); } } catch ( Exception e ) { try { Dispose (); } catch { } Logging . WriteError ( "Buffer > Pulse(): " + e ); Products . ProductStop (); } } Thread . Sleep ( Usefuls . Latency + 1000 ); } } catch ( Exception e ) { Logging . WriteError ( "CustomProfile > Pulse(): " + e ); } } public void Dispose () { try { Dispose (); } catch ( Exception e ) { Logging . WriteError ( "CustomProfile > Dispose(): " + e ); } } } ---------------------------------------- @Seminko @Seminko It crashes because you are looping the Dispose method(you call Dispose from Gui and this method calls itself again & again). Just remove Dispose(); in method "public void Dispose()". ---------------------------------------- @reapler Omg, that's it! Thanks @reapler ! ---------------------------------------- Unknown hello,did you solved this issue? ---------------------------------------- Unknown I use timer for these. So basically this: if ( ItemsManager . HasItemById ( 5514 ) && ! ObjectManager . Me . IsMounted && ObjectManager . Me . ManaPercentage < 15 && ( _timer == null || _timer . IsReady )) { ItemsManager . UseItem ( 5514 ); _timer = new Timer ( CastEverySeconds * 1000 ); Logging . WriteDebug ( "Using Mana Agate" ); Thread . Sleep ( Usefuls . Latency + 1500 ); } ---------------------------------------- Unknown I know this post is from 2017 but i thought this may help GetItemInfo ( itemID or "itemString" or "itemName" or "itemLink" ) Lua . LuaDoString ( "if GetItemCooldown('Hearthstone') == 0 then return true else return false end" ) you can use this method also Lua.LuaDoString ("if GetItemCooldown("+"Hearthstone"+") == 0 then return true else return false end") it works within a string. tested ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/7597-c-walking/ TITLE: C# Walking ---------------------------------------------------------------------------------------------------- Unknown How can i make the Bot walk to a specific location in the Questeditor using FullCSharpCode. I tried this. But the Bot then walks to this Position even when This step is not active. public sealed class TheEmblazonedRunebladeForge : QuestClass { public TheEmblazonedRunebladeForge() { Name = "The Emblazoned Runeblade"; QuestId.Add (12619); Step.AddRange(new[] { 1, 0, 0, 0, 0 }); GoToTask.ToPosition(new robotManager.Helpful.Vector3(2505.567f, -5562.78f, 420.6452f)); wManager.Wow.Helpers.ItemsManager.UseItem(38607); System.Threading.Thread.Sleep(1000 * 11); } } For example. This Snipped is from the DK starting Zone where the Players has to Pick up a Battle-Worn Sword and then use it at the Runeforge. My Profile starts at the Lich King but before accepting the Quest the Bot runs to "GoToTask.ToPosition(new robotManager.Helpful.Vector3(2505.567f, -5562.78f, 420.6452f));" Then returns to the LichKing and accepts the Quest. The same happens for the Quest "The Emblazoned Runeblade" which will be optained from Instructor Razuvious. EDIT : I now tried the following. The Bot now keeps just standing still and seems to skip Step 4 Log & Questprofile attched 8 Nov 2017 16H59.log.html [A] 55-62 Deathknight-Start.xml ---------------------------------------- Unknown Hello, for that use quest type "UseItemOn" (if you don't add npc/gameobject wrobot will use item at all hotspots) ---------------------------------------- Unknown I already tried that. The Bot then just stand at the Runeforge on my hotspot and does nothing ---------------------------------------- Unknown Hello, use quest type "OverridePulseCSharpCode" with the code: if (! wManager . Wow . Helpers . ItemsManager . HasItemById ( 38607 )) { GoToTask . ToPositionAndIntecractWithGameObject ( new robotManager . Helpful . Vector3 ( 2491.9 , - 5636.3 , 420.6 ), 190584 ); System . Threading . Thread . Sleep ( 1000 ); } else { GoToTask . ToPosition ( new robotManager . Helpful . Vector3 ( 2491.9 , - 5636.3 , 420.6 )); wManager . Wow . Helpers . ItemsManager . UseItem ( 38607 ); MovementManager . StopMove (); System . Threading . Thread . Sleep ( 1000 * 11 ); } return true ; Sample: dktest.xml ---------------------------------------- Unknown | 2020-06-02T09:34:39Z I made a custom code for 3rd - 4th quest for DK starting area, here you go if anyone is wondering this quest. Disclamer : i just learn how to use this method of doing quests less then a hour ago, so if there a random bug, please let me know. The Emblazoned Runeblade: public sealed class TheEmblazonedRuneblade : QuestClass { public TheEmblazonedRuneblade () { Name = "The Emblazoned Runeblade" ; QuestId . Add ( 12619 ); Step . AddRange ( new [] { 1 , 0 , 0 , 0 , 0 }); } public override bool IsComplete () { return Quest . IsObjectiveComplete ( 1 , QuestId . FirstOrDefault ()); } public override bool Pulse () { if ( ItemsManager . HasItemById ( 38607 )) { if ( GoToTask . ToPosition ( new Vector3 ( 2494.718f , - 5640.34f , 420.6466f ))) { ItemsManager . UseItem ( 38607 ); MovementManager . StopMove (); Thread . Sleep ( 1000 * 11 ); } } GoToTask . ToPositionAndIntecractWithGameObject ( new Vector3 ( 2491.9 , - 5636.3 , 420.6 ), 190584 ); return true ; } } Runeforging: Preparation For Battle: public sealed class RuneforgingPreparationForBattle : QuestClass { public RuneforgingPreparationForBattle () { Name = "The Emblazoned Runeblade" ; QuestId . Add ( 12842 ); Step . AddRange ( new [] { 1 , 0 , 0 , 0 , 0 }); } public override bool IsComplete () { return Quest . IsObjectiveComplete ( 1 , QuestId . FirstOrDefault ()); } public override bool Pulse () { ItemsManager . EquipItemByName ( "Runed Soulblade" ); GoToTask . ToPosition ( new Vector3 ( 2507.303f , - 5559.092f , 420.6502f )); if (! Lua . LuaDoString ( "return TradeSkillFrame:IsVisible()" )) { SpellManager . CastSpellByNameLUA ( "Runeforging" ); Craft ( "Rune of Cinderglacier" ); ItemsManager . UseItem ( "Runed Soulblade" ); Usefuls . WaitIsCasting (); Lua . LuaDoString ( "TradeSkillFrame:Hide()" ); return true ; } return true ; } public static void Craft ( string RecipeName ) { Lua . LuaDoString ( string . Format (@ " for i = 1 , GetNumTradeSkills () do local name , _ , _ , _ = GetTradeSkillInfo ( i ) if ( name == '{0}' ) then DoTradeSkill ( i ) end end ", RecipeName )); } } The Endless Hunger: public sealed class TheEndlessHunger : QuestClass { public TheEndlessHunger () { Name = "The Endless Hunger" ; QuestId . Add ( 12848 ); Step . AddRange ( new [] { 1 , 0 , 0 , 0 , 0 }); } public override bool IsComplete () { return Quest . IsObjectiveComplete ( 1 , QuestId . FirstOrDefault ()); } public override bool Pulse () { if ( ObjectManager . Me . InCombat ) { Fight . StartFight ( ObjectManager . Target . Guid ); return true ; } GoToTask . ToPositionAndIntecractWithGameObject ( new Vector3 ( 2481.146f , - 5585.025f , 415.6641f ), 191582 ); return true ; } } Edited June 2, 2020 by Smokie ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/10043-library-in-python/ TITLE: Library in Python ---------------------------------------------------------------------------------------------------- Unknown Hello everyone, I'm learning to program and I'm starting with Python, I would like to know if there is any library I can use from Python that works in wow, I wanted to try to make my own programs. ---------------------------------------- Garub Hello, I don't planned to add python support, but look IronPython ---------------------------------------- Unknown In what language is wrobot made? C? C#? C++? If I wanted to create my own program (similar to wrobot) I would have to learn lua and c? ---------------------------------------- Garub wRobot is written in C# and C++ (for the pathfinder). You'd have to learn those and then learn to reverse engineer binaries and how to do memory reading/writing. ---------------------------------------- @Droidz What is pathfinder? I will continue to learn Python, I am evolving well, I hope that one day @Droidz will create a good support for python, until I will be able to create my own pluguins for Wrobot. I searched for some library in Python to read and write in memory, I still have not found it. My wish is to create a small program just for combat routines, one day I get there kkkkkkkkkkkk. ---------------------------------------- Unknown Worldwide trend in the use of PYTHON. PYTHON support for WROBOT would be great. ---------------------------------------- Unknown No. It's not easy to implement and it makes no sense. Plus the trend is to use it for science, education and in machine learning, not real software development. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/10995-how-to-stop-fight-class-from-shape-shiftingstealthing-immediately-after-skingather/ TITLE: How To Stop Fight Class From Shape-shifting/Stealthing Immediately After Skin/Gather ---------------------------------------------------------------------------------------------------- Unknown Howdy y'all! The title pretty much says it, but, at the moment, the second the bot is done harvesting an herb/mineral/skinning node/object, it will immediately go to stealth mode or change into ________ (at the moment it's Moonkin, since I'm going Boom) form...even if there is another mob to skin right next to it and even though the bot is then going to immediately mount (change into Flight Form). I imagine it's a c# condition to add to the fightclass? Problem is I don't know the bot states and can't figure out how this would be done. ---------------------------------------- Unknown hello, it is xml fightclass? if yes you can try to use spell option "Timer" or "Combat only" ---------------------------------------- @Droidz @Droidz Except once it's in combat, it's too late to stealth. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/11007-add-waterroads-myself/ TITLE: Add water/roads myself ---------------------------------------------------------------------------------------------------- @Droidz Hello @Droidz can you give an example of how to add water/roads to the pathfinder myself? I know how to use the functions, my problem is - do I need to manually map everything out? Do I swim in the water and add plenty of small vectors (with 5 yard radius or similar)? How does this work for roads? Basically for Arathi Basin, I want to add water and roads, to help with pathfinding. I'm developing my own battlegrounder that is smart and doesn't require profiles atm, so this would be good. ---------------------------------------- Matenia Hello, I use plugin like: Roads Record.cs But you can use offmeshconnection tools ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/11047-cant-figure-out-why-wr-doesnt-want-my-plugin/ TITLE: Can't Figure Out Why WR Doesn't Want My Plugin... ---------------------------------------------------------------------------------------------------- Unknown Hey y'all! I'm actually SUPER bummed, because I've basically been working on this all day (learning c# as I go + I'm a bit slow...don't make fun of me). I finally had it all fixed down to only throwing one error...and now the bot won't even load the plugin. Can anyone see what's wrong? (All the log says is "Error to load plugin PATH\lootoggle.cs") using robotManager . Helpful ; using System . Threading ; using robotManager . Products ; using wManager . Wow . Enums ; using wManager . Wow . Helpers ; using wManager . Wow . ObjectManager ; using System ; using System . Collections . Generic ; using System . IO ; using System . ComponentModel ; using robotManager ; public class Lootoggle : wManager . Plugin . IPlugin { private bool _isLaunched ; private bool _isLooting ; private int KillTime ; private int LootTime ; private int timeToKill ; private int timeToLoot ; public void Initialize () { _isLaunched = true ; _isLooting = true ; LootoggleSettings . Load (); timeToKill = LootoggleSettings . CurrentSetting . KillMinutes * 60 * 1000 ; timeToLoot = LootoggleSettings . CurrentSetting . LootMinutes * 60 * 1000 ; Logging . Write ( "[Lootoggle] Started." ); pluginLoop (); } public void Dispose () { _isLaunched = false ; Logging . Write ( "[Lootoggle] Disposed." ); } public void Settings () { LootoggleSettings . Load (); LootoggleSettings . CurrentSetting . ToForm (); LootoggleSettings . CurrentSetting . Save (); } public void pluginLoop () { while ( Products . IsStarted && _isLaunched ) { if ( _isLooting ) { wManager . wManagerSetting . CurrentSetting . LootMobs = _isLooting ; Log ( "Bot will loot for " + LootTime + "." ); Thread . Sleep ( timeToLoot ); Logging . Write ( "Disabling looting and continuing..." ); _isLooting = ! _isLooting ; } if (! _isLooting ) { wManager . wManagerSetting . CurrentSetting . LootMobs = _isLooting ; Logging . Write ( "Bot will now stop looting and only kill for " + KillTime + "." ); Thread . Sleep ( timeToKill ); _isLooting = ! _isLooting ; } } } [ Serializable ] public class LootoggleSettings : Settings { [ DefaultValue ( 3 )] [ Category ( "General Settings" )] [ DisplayName ( "Kill Time" )] [ Description ( "How long (in minutes) should bot should kill shit?" )] public int KillMinutes { get ; set ; } [ DefaultValue ( 1 )] [ Category ( "General Settings" )] [ DisplayName ( "Loot Time" )] [ Description ( "How long (in minutes) should bot should loot before toggling looting back off." )] public int LootMinutes { get ; set ; } private LootoggleSettings () { KillMinutes = 3 ; LootMinutes = 1 ; ConfigWinForm ( new System . Drawing . Point ( 300 , 400 ), "Lootoggle " + Translate . Get ( "Settings" )); } public static LootoggleSettings CurrentSetting { get ; set ; } /* Save/Load Functions */ public bool Save () { try { return Save ( AdviserFilePathAndName ( "Lootoggle" , ObjectManager . Me . Name + "." + Usefuls . RealmName )); } catch ( Exception e ) { Logging . WriteError ( "LootoggleSettings > Save(): " + e ); return false ; } } public static bool Load () { try { if ( File . Exists ( AdviserFilePathAndName ( "Lootoggle" , ObjectManager . Me . Name + "." + Usefuls . RealmName ))) { CurrentSetting = Load < LootoggleSettings >( AdviserFilePathAndName ( "Lootoggle" , ObjectManager . Me . Name + "." + Usefuls . RealmName )); return true ; } CurrentSetting = new LootoggleSettings (); } catch ( Exception e ) { Logging . WriteError ( "LootoggleSettings > Load(): " + e ); } return false ; } } } ---------------------------------------- Stresse public class Lootoggle : wManager . Plugin . IPlugin The class has to be called Main. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/11053-creating-a-dataset/ TITLE: Creating a DATASET ---------------------------------------------------------------------------------------------------- Unknown I would like to request the creation of a DATASET (simple) combat in arena, for future statistical studies of combat. My suggestion of model: It would be very important to be the combat log of the fights in the arena. A CVS file could be made available, and made available weekly by email or downloaded on the site. ((As I said in other posts, I'm studying Python and want to create a plugin with artificial intelligence for my undergraduate thesis.)) I want everyone to know that I request this request with humility, I do not want them to think that I am demanding, I am humbly asking if it is possible that my request be made, I thank you for the time you spent for reading my post. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/11065-cant-seem-to-get-a-timer-to-function-in-my-plugin/ TITLE: Can't Seem To Get A Timer To Function In My Plugin... ---------------------------------------------------------------------------------------------------- Unknown Hi y'all! So I'm working on a plugin for area farming (where looting every corpses looks bot as fuck). I'm going to include the whole code (just in case there is something there causing the error. You'll note I've commented out a lot of the code so that I'm mostly just focussing on why I can't seem to get the timers to work...I've been looking at other developer's code and I can't figure out how my usage is different. using robotManager . Helpful ; using System . Threading ; using robotManager . Products ; using wManager . Wow . Enums ; using wManager . Wow . Helpers ; using wManager . Wow . ObjectManager ; using System ; using System . Collections . Generic ; using System . IO ; using System . ComponentModel ; using robotManager ; public class Main : wManager . Plugin . IPlugin { private bool _isLaunched ; private bool _isLooting ; private bool _lootingTimedOut ; private bool _killingTimedOut ; private bool _lootingCompleted ; private bool _killingCompleted ; private bool _lootingDone ; private bool _killingDone ; private static int killingMaxTime ; private static int killingMaxTimeMilli ; private static int lootingMaxTime ; private static int lootingMaxTimeMilli ; //private var lootableCorpses; private static int maxCorpses ; // private List lootableCorpses; private static int lootableCorpseCount ; private List < WoWUnit > lootableCorpses = new List < WoWUnit >(); // = ObjectManager.ObjectList().Where(u => u != null && u.IsValid && u.IsDead && u.IsLootable); // private List //var lootableCorpses = new List(); public static void Log ( string text ) { Logging . Write ( "[Lootoggle] " + text ); } private static List < WoWUnit > GetLootableCorpses () { List < WoWUnit > result = new List < WoWUnit >(); try { foreach ( WoWObject wo in ObjectManager . ObjectList ) { WoWUnit o ; switch ( wo . Type ) { case WoWObjectType . Unit : o = new WoWUnit ( wo . GetBaseAddress ); break ; default : continue ; } if ( o != null && o . IsValid && o . IsDead && o . IsLootable ) { result . Add ( o ); } } } catch ( Exception arg ) { Logging . WriteError ( "GetLootableCorpses error " + arg , true ); } return result ; } public void Initialize () { _isLaunched = true ; _isLooting = true ; LootoggleSettings . Load (); maxCorpses = LootoggleSettings . CurrentSetting . maxCorpses ; Log ( "Started." ); pluginLoop (); } public void Dispose () { _isLaunched = false ; Log ( "Disposed." ); } public void Settings () { LootoggleSettings . Load (); LootoggleSettings . CurrentSetting . ToForm (); LootoggleSettings . CurrentSetting . Save (); // Log("[Lootoggle] Settings saved."); } static robotManager . Helpful . Timer KillingTimer = new robotManager . Helpful . Timer ( killingMaxTimeMilli ); static robotManager . Helpful . Timer LootingTimer = new robotManager . Helpful . Timer ( lootingMaxTimeMilli ); public void StartLooting () { wManager . wManagerSetting . CurrentSetting . LootMobs = _isLooting = true ; Log ( "Resetting looting timer to " + lootingMaxTime + "." ); LootingTimer . Reset (); LootingTimer . Reset (); } public void StopLooting () { wManager . wManagerSetting . CurrentSetting . LootMobs = _isLooting = false ; Log ( "Resetting killing timer to " + killingMaxTime + "." ); KillingTimer . Reset (); LootingTimer . Reset (); } public void LogLootingEvents () { Log ( "Corpses: " + lootableCorpseCount + "/" + maxCorpses + " Countdown: " + KillingTimer + "Downtime" + "/" + killingMaxTime ); Thread . Sleep ( 100 ); } // public void watchForEvents() // { // // Adding this mostly just to keep track of loot in logs. // EventsLuaWithArgs.OnEventsLuaWithArgs += (LuaEventsId id, List args) => // { // if (id == "LOOT_CLOSED") // { // Log("Looting completed."); // }  // }; // } // public void pluginLoop () { KillingTimer = new robotManager . Helpful . Timer ( killingMaxTimeMilli ); KillingTimer . ForceReady (); LootingTimer . Reset ( lootingMaxTimeMilli ); KillingTimer . Reset ( killingMaxTimeMilli ); while ( Products . IsStarted && Conditions . InGameAndConnectedAndAliveAndProductStartedNotInPause ) { lootableCorpses = GetLootableCorpses (); lootableCorpseCount = lootableCorpses . Count ; Log ( "There are " + lootableCorpseCount + " lootable corpses." ); _lootingTimedOut = LootingTimer . IsReady ; _lootingCompleted = ( lootableCorpseCount < 1 ); _lootingDone = ( _lootingTimedOut || _lootingCompleted ); // Log(LootingTimer.IsReady); _killingTimedOut = KillingTimer . IsReady ; _killingCompleted = ( lootableCorpseCount >= maxCorpses ); _killingDone = ( _killingTimedOut || _killingCompleted ); Log ( "Looting Time left: " + LootingTimer . TimeLeft ()); Log ( "Countdown Time: " + LootingTimer . CountDowntime ); Log ( "Killing Time left: " + KillingTimer . TimeLeft ()); Thread . Sleep ( 2000 ); /* while (_isLooting) { Log("Time left: " + LootingTimer.TimeLeft()); Log("IS LOOTING"); } while (!_isLooting) { Log("Time left: " + KillingTimer.TimeLeft()); if (KillingTimer.IsReady) { Log("Killing timer is ready"); } if (!KillingTimer.IsReady) { Log("Killing timer is NOT ready"); } Log("NO LOOTING"); } //Log("Killing done: " + _killingDone); } //List lootableCorpses = new List() {}; */ } } /* while (Products.IsStarted && _isLaunched) { while (_isLooting) { if (_lootingDone) { if (_lootingCompleted) { Log("Bot has finished looting available corpses."); } if (_lootingTimedOut) { Log("Bot has been looting for " + killingMaxTime + " minutes. (If you get this message often, you may want to adjust your settings.)"); } // Eventually I'd like to rework this to have the bot auto-adjust based on conditions. StopLooting(); } } while (!_isLooting) { if (_killingDone) { if (_killingCompleted) { Log("There are more than " + maxCorpses + " lootable mobs. Switching to looting."); } if (_killingTimedOut) { Log("Bot hasn't looted in over " + killingMaxTime + " minutes. Time to loot those corpses!"); } StartLooting(); } } } */ [ Serializable ] public class LootoggleSettings : Settings { [ DefaultValue ( 3 )] [ Category ( "General Settings" )] [ DisplayName ( "Max Kill Time" )] [ Description ( "Maximum time bot will spend in pure killing mode between loot breaks" )] public int killingMaxTime { get ; set ; } [ DefaultValue ( 3 )] [ Category ( "General Settings" )] [ DisplayName ( "Max Loot Time" )] [ Description ( "Maximum time bot will spend looting before switching to looting phase" )] public int lootingMaxTime { get ; set ; } [ DefaultValue ( 40 )] [ Category ( "General Settings" )] [ DisplayName ( "Max Corpses" )] [ Description ( "Maximum number of lootable mobs bot will let lie before auto switching to looting (particularly helpful with group-farming)." )] public int maxCorpses { get ; set ; } private LootoggleSettings () { killingMaxTime = 3 ; lootingMaxTime = 1 ; maxCorpses = 40 ; ConfigWinForm ( new System . Drawing . Point ( 300 , 400 ), "Lootoggle " + Translate . Get ( "Settings" )); } public static LootoggleSettings CurrentSetting { get ; set ; } public bool Save () { try { return Save ( AdviserFilePathAndName ( "Lootoggle" , ObjectManager . Me . Name + "." + Usefuls . RealmName )); } catch ( Exception e ) { Logging . WriteError ( "LootoggleSettings > Save(): " + e ); return false ; } } public static bool Load () { try { if ( File . Exists ( AdviserFilePathAndName ( "Lootoggle" , ObjectManager . Me . Name + "." + Usefuls . RealmName ))) { CurrentSetting = Load < LootoggleSettings >( AdviserFilePathAndName ( "Lootoggle" , ObjectManager . Me . Name + "." + Usefuls . RealmName )); return true ; } CurrentSetting = new LootoggleSettings (); } catch ( Exception e ) { Logging . WriteError ( "LootoggleSettings > Load(): " + e ); } return false ; } } } ---------------------------------------- Unknown Hello, it is hard to help you, first problem for me is: while ( Products . IsStarted && Conditions . InGameAndConnectedAndAliveAndProductStartedNotInPause ) { replace it by: while ( Products . IsStarted ) { if ( Conditions . InGameAndConnectedAndAliveAndProductStartedNotInPause ) { try to clean your code (remove unused part) and give more detail about your problem ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/11103-how-do-the-beforestates-and-nextstates-work/ TITLE: How do the BeforeStates and NextStates work? ---------------------------------------------------------------------------------------------------- @Droidz Mainly targeted @Droidz but if anyone else has input, you're welcome to contribute. The state interface has BeforeStates and NextStates. My question is when do they run and does their "Need To Run" condition get checked? If you add the state into the list of before or after states are they in the main engine list of states or are they only considered if the state you added the before/afterstates to, is triggered? ---------------------------------------- Matenia Hello, like that (in simplified): bool RunState ( State currentState ) { if ( currentState . NeedToRun ) { foreach ( var beforeState in currentState . BeforeStates ) { RunState ( beforeState ); } currentState . Run (); foreach ( var nextState in state . NextStates ) { RunState ( nextState ); } return true ; } return false ; } ---------------------------------------- Unknown Ah okay, thanks. One more thing though does the RunState ( beforeState ); check the beforeStates NeedToRun or does it just run it anyway? ---------------------------------------- Marsbar Method check if needtorun return true (it is the method than I shared code) ---------------------------------------- Unknown Oh yeah sorry lol. Thanks ---------------------------------------- Unknown I sort of talked about this in my post: ---------------------------------------- Unknown Yeah I saw that, very useful. I was more wondering about the actual states interface implementation of Before/NextStates rather than the events though. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/11124-class-specific-quest/ TITLE: class specific quest ---------------------------------------------------------------------------------------------------- Unknown im using the easy quest editor to make quest profiles because im a noob, and since im a noob at it i now need a bit of help. I've got a quest set to only be done by a warlock, yet it does it on all other classes too, how do i fix this? i know using ObjectManager . Me . WowClass == WoWClass . Warlock in the If command works, but why isnt it enough setting it to the class in the actual quest? ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/11161-female-race-in-wotlk-leading-to-problems/ TITLE: Female Race in Wotlk leading to problems ---------------------------------------------------------------------------------------------------- Unknown | 2019-05-04T12:57:04Z Hey guys, with a male it works perfectly. http://prntscr.com/nkauye Has anyone an idea how to fix that? I just cant get it to true eventhough she clearly is a draenei Edited May 4, 2019 by Bambo ---------------------------------------- Unknown Here this is the same code executed on a male draenei: http://prntscr.com/nkaxfj ---------------------------------------- @Dreamful Could be a thing of my local private server. @Dreamful can not reproduce the bug ---------------------------------------- Unknown Hello, what result give lua ? /run print(UnitName("player").." is a "..UnitRace("player")) ---------------------------------------- Unknown I tested seem to work for me ---------------------------------------- Unknown The problem only seems to occur on my local server sorry ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/11190-a-wish-for-implementation-of-two-useful-methods/ TITLE: A wish for implementation of two useful methods ---------------------------------------------------------------------------------------------------- Unknown Would be super if you could implement NpcMarker and IsGoodInteractDistance for the type WoWGameObject? Thanks :) ---------------------------------------- @Memus Hello @Memus to interact with object, you can use one if these run code methods. wManager . W  ow . B  ot . Tasks . GoToTask . ToPosition ( new Vector3 ( x , y , z )); wManager . Wow . Helpers . Interact . InteractGameObject ( ObjectManager . GetWoWGameO  bjectByEntry ( object ID ). FirstOrDefault (). GetBaseAddress ) Or wManager . Wow . Bot . Tasks . GoToTask . ToPositionAndInte  cractWithGameObject ( pos , objectId ); Both should work fine. ---------------------------------------- @Memus Thanks, but please read my post again ? ---------------------------------------- Unknown In quester there is a option to interact with object and npc at a distance you set. ---------------------------------------- Unknown Yeah, but that's not what I'm after. 1. I wan't to see if an object has a quest available with the NpcMarker property. 2. I wan't to know if we're within interact distance of the object to interact and accept the quest. GetDistance isn't reliable since objects can vary ALOT in size. For ex. 4 yards might be perfect for smaller object but unreachable for bigger objects (if the objects radius is wider that 4 yards). An alternative to implementing IsGoodInteractDistance for WoWGameObject can be if WRobot can tell us the size (radius) of the object so we can implement it ourselves. Clearer now? :) ---------------------------------------- Unknown I opened this theme!is realy actual becouse exist servers with  max 4 yards for interract distance and wrobot when go to repair - stuck becouse he stop moving on 5 yards and have "bad interract distance " spam ---------------------------------------- Unknown You're mixing WoWUnit up with WoWGameObject type. ---------------------------------------- Unknown Nothing on this? Since both WoWUnit and WoWGameObject are derived from WoWObject maybe IsGoodInteractDistance and NpcMarker should be declared and implemented by WoWObject? Both are clearly visualized in-game. Highlighted cogwheel cursor and big exclamation/question mark above object. ---------------------------------------- Unknown For suggestions go to bug tracker area and Theresa option to suggest options. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/11222-decursingcleansing-in-c/ TITLE: Decursing/cleansing in C# ---------------------------------------------------------------------------------------------------- Unknown Hello all, Has anyone built a C# script that automatically removes curses/poison or magic? I have been unable to find any examples of this Thanks! ---------------------------------------- Unknown Did you try searching? Your answer is on the forums. ---------------------------------------- Unknown Yes, all I could find was some Lua code, but nothing in C# that I could use ---------------------------------------- Unknown Hey, this is a bit different. This looks for a specific debuff I am looking for function that can search through the debuffs for curse/magic etc. and then cast, I would not have the spell IDs of all the world afflictions ---------------------------------------- Unknown Best bet is to add each spell ---------------------------------------- Unknown That's why you should run a little bit of LUA in your C#. There isn't an in built C# function for this. LUA is definitely the best way as it returns the specific debuff type. ---------------------------------------- Unknown Thanks, Im trying the following public bool hasDisease = false; hasDisease = Lua.LuaDoString ("for i=1,40 do local texture, count, debuffType = UnitDebuff('player', i); if debuffType == 'Disease' then return true break; end end"); if (hasDisease && SpellManager.SpellUsableLUA("Abolish Disease") && ObjectManager.Me.ManaPercentage > 10 && !ObjectManager.Me.HaveBuff("Abolish Disease")) { Interact.InteractGameObject(ObjectManager.Me.GetBaseAddress); AbolishDisease.Launch(); Lua.LuaDoString("ClearTarget();"); hasDisease = false; } But that does not seem to work ---------------------------------------- Unknown fightclass ---------------------------------------- Unknown What expansion are you on? Your LUA looks incorrect. Using https://vanilla-wow.fandom.com/wiki/API_UnitDebuff as an example, debufftype would be the 5th property, not the 3rd like in your example. In lua you need to declare all the other properties before the one you want so you could do local _, _, _, _, debuffType = UnitDebuff('player', i) ---------------------------------------- Unknown Thanks, I am on WOTLK ---------------------------------------- Unknown The parameters you're using in your Lua are vanilla. ---------------------------------------- Marsbar For those that come later: The following work for WOTLK hasDisease = Lua . LuaDoString ( "for i=1,40 do local _, _, _, _, debuffType = UnitDebuff('player', i); if debuffType == 'Disease' then return true; end end" ); if ( hasDisease && SpellManager . SpellUsableLUA ( "Abolish Disease" ) && ObjectManager . Me . ManaPercentage > 10 && ! ObjectManager . Me . HaveBuff ( "Abolish Disease" ) && ! ObjectManager . Me . InCombatFlagOnly ) { Interact . InteractGameObject ( ObjectManager . Me . GetBaseAddress ); AbolishDisease . Launch (); Lua . LuaDoString ( "ClearTarget();" ); hasDisease = false ; } ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/11223-c-getdistance-gameobject-farmaction/ TITLE: C# GetDistance (GameObject) && FarmAction ---------------------------------------------------------------------------------------------------- Unknown Hello everyone. I want to make a GetDistance on my nearest object like in the tools : Nearest GameObject informations: Name: Vietérule (Entry: 2041 ) IsBlacklisted = False CreatedBy = 0 DisplayId = 677 FlagsInt = 0 Flags = 0 Position = 4333,47 ; 3002,03 ; 124,227 ; "None" Name = Vietérule GetDistance = 108,2044 --> I want this one ^^ For me I use : wManager.Wow.ObjectManager.ObjectManager.Me.IsGoodInteractDistance; But for an object, i don't know how it's working. Something like : var distance = wManager.Wow.ObjectManager.WoWObject.GetDistance(ObjectID); If someone know that ^^" (I'm beginner in C#) And the other question is : Which class can i use for use gathering ? I want By the distance active gathering the plant with this the nearest ID. If u have the answers, i will love u forever ! Salmo ^^ ---------------------------------------- Unknown Someone know how to resolv this problem ? Line : ObjectManager . GetWoWGameObjectByEntry ( neantineId ). First (). Entry ) Error on compliation pluggin : My usings : using System ; using System . ComponentModel ; using System . IO ; using robotManager ; using robotManager . Helpful ; using wManager . Wow . Helpers ; using wManager . Wow . ObjectManager ; using wManager . Events ; using wManager . Plugin ; using wManager . Wow ; using wManager . Wow . Bot . States ; using wManager . Wow . Bot . Tasks ; using wManager . Wow . Enums ; using wManager . Wow . Forms ; using wManager . Wow . Forms . ProfileMaker ; ---------------------------------------- Unknown ObjectManager . GetObjectWoWGameObject (). Where (o => o. Entry == 1234 ). OrderBy (o => o. GetDistance ). FirstOrDefault (); ---------------------------------------- Unknown Thank for this code, but when i want to put this code in pluggin, he don"t find : o. Entry or .Where, .position .GetDistance ... Do u know how to implement this method in pluggins ? ---------------------------------------- Unknown You need to add Linq to the using declarations (imports)... ---------------------------------------- Unknown Yes it's what I do for the other, but i don"t find the link for .entry ^^" Something like ? wManager . Wow . ObjectManager . WoWObject .Entry ---------------------------------------- Unknown Ok i'm fucking idiot, I was trying to apply the Get: for the attribut on my method ... Better way to use it on the object ... Thanks for help ! ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/11224-wrobot-predefined-settings/ TITLE: wRobot predefined settings ---------------------------------------------------------------------------------------------------- Unknown Hello, Is there a file in wRobot folder I can edit to set a default FightClass?   Like an XML / Configuration file in which I can write and select a FightClass. Thanks, Inaru ---------------------------------------- Unknown Hey Inaru, You can use this, ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/11228-is-lualuadostring-using-a-lock/ TITLE: Is Lua.LuaDoString using a lock? ---------------------------------------------------------------------------------------------------- @Droidz Hey @Droidz is Lua.LuaDoString using a lock? I'm trying to figure something out. When I lock frames, my entire combat iterations works very fast. When I don't freeze them, it's very slow (about 8 times slower, even when putting a lock on ObjectManager.Locker). I have optimized my framework quite a lot in recent times and still don't understand why things can take as long as they do sometimes. I thought it might have something to do with me utilizing multi threading. Just trying to understand wRobot better and I happen to use a lot of Lua instead of reading from memory directly. ---------------------------------------- Unknown I was wondering this question also, I thought it was because my pc is a few cans shy of a vista but I’m wondering now. ---------------------------------------- TheSmokie Hello, (when you don't use lock frame) Lua is slow because WRobot need to inject code in wow (that run in next frame refresh). If you call 5 times lua (on 1 thread) you need to wait ~5 wow frames, ~80ms with 60 fps. You can: - lockframe (it is a easier way, and in some case better) - avoid to use lua (but a lot of wrobot api methods use lua it is hard to know what methods you can use or not) - try to avoid useless lua call (by sample if you use "if (lua.do("is ok") && me.health < 10 && me.havetarget)" replace it by "if (me.havetarget && me.health < 10 && lua.do("is ok"))" - combine your lua scripts (if you use several lua calls in one condition try to combine it to one call) ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/11244-c-stopfollowing-path-gathering/ TITLE: C# Stopfollowing Path [Gathering] ---------------------------------------------------------------------------------------------------- @Droidz Hello @Droidz I have do some C# code in a pluggin for check distance farming and stop go to the node by his ground Vector3 but. But when i use my plugin i have a problem : The bot try to go the node AND to follow the path with gathering in the same time. You know how i can stop the following path, clean the node and restart the following path by the pluggin ? Thx ? ---------------------------------------- Unknown I was wondering this also. ---------------------------------------- @Droidz Well in fact with juste a while it's done .. ^^" Edit : Well in fact no ... xD @Droidz ---------------------------------------- Unknown Seems to be sleep.thread who make go out of the thread ang go gathering ---------------------------------------- Unknown Can you provide you’re plugin so I can have a lookie? I might be able to help ---------------------------------------- Unknown Sure, I use Gathering profile "Néantine.xml" with. The bot go to the node, but when he start to gather, he start to follow path at the same time... Maybie do some event in a while for stay in .. But i don"t know how to do that ? GatheringHelp.cs Néantine.xml ---------------------------------------- duthibaut It is same problem like here: https://wrobot.eu/bugtracker/battleground-debuff-r1251/?do=findComment&comment=5834 Your plugin run code not on the same thread that your current product thread, in your code at the same time you do 2 tasks ---------------------------------------- Unknown Thanks ? I take a look ! ---------------------------------------- Unknown Working like a charm, just need to see how go out the thread ? Thanks a lot ! ---------------------------------------- Unknown | 2019-05-18T14:44:24Z I think its : Thread.Abort() Buut.... Read this just in case: https://stackoverflow.com/questions/14131608/how-to-terminate-a-thread-in-c Good luck. Edited May 18, 2019 by Inaru ---------------------------------------- Unknown Thanks for this reply, but ... Thread is an object ?  this line don"t compile, i need to create a object thread and .abort after ? public void GoToFarm() { _isLaunched = true; wManager.Wow.Helpers.Chat.SendChatMessage("Initialize", wManager.Wow.Enums.ChatTypeId.SAY); glaurierId = 181279; var glaurierObject = ObjectManager.GetNearestWoWGameObject(ObjectManager.GetWoWGameObjectByEntry(glaurierId)) ; while (_isLaunched) { try { var distance = ObjectManager.GetNearestWoWGameObject(ObjectManager.GetWoWGameObjectByEntry(glaurierId)).GetDistance; if (ObjectManager.GetNearestWoWGameObject(ObjectManager.GetWoWGameObjectByEntry(glaurierId)).GetDistance < 200) { robotManager.Events.FiniteStateMachineEvents.OnBeforeCheckIfNeedToRunState += (engine, state, cancelable) => { if (state is wManager.Wow.Bot.States.Farming && !state.NeedToRun) { wManager.Wow.Bot.Tasks.GoToTask.ToPositionAndIntecractWithGameObject(ObjectManager.GetNearestWoWGameObject(ObjectManager.GetWoWGameObjectByEntry(glaurierId)).Position, ObjectManager.GetNearestWoWGameObject(ObjectManager.GetWoWGameObjectByEntry(glaurierId)).Entry); Thread.Sleep(5000); wManager.Wow.Helpers.Chat.SendChatMessage("In the new thread", wManager.Wow.Enums.ChatTypeId.SAY); } }; } //wManager.Wow.Helpers.Chat.SendChatMessage("Je suis sorti", wManager.Wow.Enums.ChatTypeId.SAY); } //wManager.Wow.Bot.Tasks.GoToTask.ToPositionAndIntecractWithGameObject(ObjectManager.GetNearestWoWGameObject(ObjectManager.GetWoWGameObjectByEntry(glaurierId)).Position, ObjectManager.GetNearestWoWGameObject(ObjectManager.GetWoWGameObjectByEntry(glaurierId)).Entry); catch (Exception e) { Logging.WriteError("[GatheringHelp]: " + e); } } } public void Initialize() { Thread newThread = new Thread(new ThreadStart(GoToFarm)); } ---------------------------------------- Unknown What is the error in the compiler? ---------------------------------------- Unknown don't put code in loop, you need to call this code only one time ---------------------------------------- @Inaru @Inaru Only an assignation, a call or an increment in wait and expressions of object "new" can be use like an instruction @Droidz nothing change well i delete the while(_islaunched) {} , he skipp all the node ? ---------------------------------------- Unknown I think it is problem with "new ThreadStart" but you don't need to create new thread you can call "GoToFarm()" directly ---------------------------------------- Unknown | 2019-05-18T15:26:10Z Try with..... GoToFarm(){ new Thread(() => // Your code here }).Start(); } And in initialize just do GoToFarm() Edited May 18, 2019 by Inaru ---------------------------------------- @Droidz I do like this : @Droidz public void Initialize() { _isLaunched = true; wManager.Wow.Helpers.Chat.SendChatMessage("Initialize", wManager.Wow.Enums.ChatTypeId.SAY); glaurierId = 181279; var glaurierObject = ObjectManager.GetNearestWoWGameObject(ObjectManager.GetWoWGameObjectByEntry(glaurierId)) ; GoToFarm(glaurierId); } public void GoToFarm(int glaurierId) { try { var distance = ObjectManager.GetNearestWoWGameObject(ObjectManager.GetWoWGameObjectByEntry(glaurierId)).GetDistance; if (ObjectManager.GetNearestWoWGameObject(ObjectManager.GetWoWGameObjectByEntry(glaurierId)).GetDistance < 200) { robotManager.Events.FiniteStateMachineEvents.OnBeforeCheckIfNeedToRunState += (engine, state, cancelable) => { if (state is wManager.Wow.Bot.States.Farming && !state.NeedToRun) { wManager.Wow.Bot.Tasks.GoToTask.ToPositionAndIntecractWithGameObject(ObjectManager.GetNearestWoWGameObject(ObjectManager.GetWoWGameObjectByEntry(glaurierId)).Position, ObjectManager.GetNearestWoWGameObject(ObjectManager.GetWoWGameObjectByEntry(glaurierId)).Entry); Thread.Sleep(5000); wManager.Wow.Helpers.Chat.SendChatMessage("In the new thread", wManager.Wow.Enums.ChatTypeId.SAY); } }; } } catch (Exception e) { Logging.WriteError("[GatheringHelp]: " + e); } } He do as well but stay in "In the new thread" (say in chat). I try this now @Inaru !! ---------------------------------------- @Inaru Thx @Inaru and @Droidz I set some recusivity in my thread and it's working just fine as well ? public void Initialize() { _isLaunched = true; wManager.Wow.Helpers.Chat.SendChatMessage("Initialize", wManager.Wow.Enums.ChatTypeId.SAY); glaurierId = 181279; var glaurierObject = ObjectManager.GetNearestWoWGameObject(ObjectManager.GetWoWGameObjectByEntry(glaurierId)) ; GoToFarm(glaurierId); } public void GoToFarm(int glaurierId) { robotManager.Events.FiniteStateMachineEvents.OnBeforeCheckIfNeedToRunState += (engine, state, cancelable) => { try { var distance = ObjectManager.GetNearestWoWGameObject(ObjectManager.GetWoWGameObjectByEntry(glaurierId)).GetDistance; if (ObjectManager.GetNearestWoWGameObject(ObjectManager.GetWoWGameObjectByEntry(glaurierId)).GetDistance < 200) if (state is wManager.Wow.Bot.States.Farming && !state.NeedToRun) { glaurierId = 181279; wManager.Wow.Bot.Tasks.GoToTask.ToPositionAndIntecractWithGameObject(ObjectManager.GetNearestWoWGameObject(ObjectManager.GetWoWGameObjectByEntry(glaurierId)).Position, ObjectManager.GetNearestWoWGameObject(ObjectManager.GetWoWGameObjectByEntry(glaurierId)).Entry); Thread.Sleep(5000); wManager.Wow.Helpers.Chat.SendChatMessage("In the new thread", wManager.Wow.Enums.ChatTypeId.SAY); GoToFarm(glaurierId); } } catch (Exception e) { Logging.WriteError("[GatheringHelp]: " + e); } }; ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/11246-minimapgeneratorminimapimage/ TITLE: MiniMapGenerator.MinimapImage ---------------------------------------------------------------------------------------------------- @Droidz | 2019-05-17T09:43:12Z I'm wondering if I can create my own instance of the Map that's built into WRobot. I want to manually be able to focus it to a place but I'm not sure how to add it into a window. @Droidz When playing around I did something like this: MiniMapGenerator . MinimapImage map = new MiniMapGenerator . MinimapImage ( "Eastern Kingdoms" , 200 , 200 , ( int ) npc . PositionX - 100 , ( int ) npc . PositionX + 100 , ( int ) npc . PositionY - 100 , ( int ) npc . PositionY + 100 ); MiniMapGenerator . LandmarkMiniMap b = new MiniMapGenerator . LandmarkMiniMap ( new robotManager . Helpful . Vector3 ( npc . PositionX , npc . PositionY , npc . PositionZ ), "1234" , System . Drawing . Color . Purple ); MiniMapGenerator . LandmarksMiniMap c = new MiniMapGenerator . LandmarksMiniMap (); c . Add ( b ); map . Generate (); Any ideas? Edited May 17, 2019 by Marsbar ---------------------------------------- Marsbar Hello, I think it is more easy to use " MiniMapGenerator.PathImage", sample: void RefreshMap ( object objs ) { try { var prm =( List ) objs ; double zoom = prm [ 0 ]; double actualWidth = prm [ 1 ]; double actualHeight = prm [ 2 ]; lock ( _lockShowMap ) { var landmarksMiniMapCache = GenerateLandmarks ( zoom ); var image = new MiniMapGenerator . PathImage ( Usefuls . ContinentNameMpq , ObjectManager . ObjectManager . Me . Position , landmarksMiniMapCache , ( float ) zoom ); image . Generate ( actualWidth , actualHeight ); if ( image . Result != null ) { // Save img: if (! string . IsNullOrWhiteSpace ( _saveTo )) { try { image . Result . Save ( _saveTo , ImageFormat . Jpeg ); } catch { } _saveTo = "" ; } // Show img: var hbmp = image . Result . GetHbitmap (); try { var ret = Imaging . CreateBitmapSourceFromHBitmap ( hbmp , IntPtr . Zero , Int32Rect . Empty , BitmapSizeOptions . FromEmptyOptions ()); ret . Freeze (); Dispatcher . Invoke ( DispatcherPriority . Background , new Action (() => MapImage . Source = ret )); //Dispatcher.BeginInvoke( // DispatcherPriority.Send, // new Action(() => MapImage.Source = null)); //Dispatcher.BeginInvoke( // DispatcherPriority.Send, // new Action(() => MapImage.Source = ret)); } finally { DeleteObject ( hbmp ); } } image . Dispose (); } } catch { } } ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/11317-devloper-bounty/ TITLE: Devloper BOunty - ---------------------------------------------------------------------------------------------------- Unknown Calling any developer! Looking to hire a developer for a project! i am looking for 2 things currently 1) First Aid custom script, or fullssharp code, or really anyway to level "first aid" inside of a quester profile. Should be able to level any other profession  aswell. 2) I am looking for either Plugin, or Custom Script, which will directly relate to my profile. Ingame Interface if you will - Nothing crazy hard, Something like Checkboxes (ON And OFF), On - which would check X steps inside the profile, or giving back. Thanks! ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/11318-1121-healbot-fightclass-target-free-lua-spellcast-error/ TITLE: 1.12.1 healbot fightclass target-free LUA spellcast error ---------------------------------------------------------------------------------------------------- Unknown I'm amending a holy priest healBot fightclass profile for vanilla 1.12.1, and I'm stuck.  As it stands now, I am able to run the code as an non-compiled .cs fightclass.  I've even added a rudimentary decurse engine.  However, I am irritated that the bot needs to use Interact.InteractGameObject to actively target myself and other players in order to cast heals and other beneficial spells.  My goal is to cast spells on partymembers without having to switch targets. I've searched the forums and found a few promising avenues: 1) Focus frame method: [Holy - Paladin] The Holy Grail 17.06.22b Built for 3.3.5a/2.4.3. Source link .  This healbot uses the focus frame to cast spells on the intended target.  Unfortunately, since I am building for 1.12.1 client, there is no focus.Guid functionality.  There are addons that provide /focus functionality, but AFAIK those are not addressable from wrobot.  Dead end for now. 2) Execute LUA code: 5006-cast-spell-without-targeting User iMod points out that this is possible, but didn't specifically state whether he's tested this in 1.12.1.  I tried the following code snippet: ( I altered the LUA string to not rely on string interpolation as in iMod's example, since I am running .cs source and not compiling to .DLL ) if ( target . Guid == ObjectManager . Me . Guid ) { // Cast on self Lua . LuaDoString ( "CastSpellByID (2061, \"player\")" ); } That returned the following error in the wow console: ERROR : [ string "Yofewupyo.lua" ]: 13 : attempt to call global 'CastSpellByID' ( a nil value ) I get the same error in the wow console when using c# code instead, as Droidz suggests wManager . Wow . Helpers . SpellManager . CastSpellByIdLUA ( 2061 , "player" ); I also got rid of all addons, still no joy: [ string "esurut.lua" ]: 13 : attempt to call global 'CastSellByID' ( a nil value ) Any idea why I'm getting this error?  Thanks for your time! ? ---------------------------------------- Unknown There is no such thing as "CastSpellByID" in vanilla. ? ---------------------------------------- Unknown Thanks for the quick reply!  It's too bad that the unoffical API docs don't have version specificity.  Is it possible at all to cast spells onto a friendly unit without targeting them in vanilla? ---------------------------------------- Unknown This is not a wrobot thing. This is a wow thing. ? You can always check the wow wiki and use the "history" button to see if stuff is in Vanilla or not. I don't think it's possible, been a while since i did healing stuff for vanilla though. ? There are workarounds to cast spells using "id" by using GetSpellInfo() https://wowwiki.fandom.com/wiki/API_GetSpellInfo?oldid=1291791 Using this you can use CastSpellByName(GetSpellInfo(551)) replace 551 with any spell ID HOWEVER CastSpellByName only has an "on self" argument, which means you can either cast it on yourself or on your target. It's useful for stuff like selfbuffing, dispelling, decursing etc. since you won't need to relieve your target. Next thing: You can use TargetLastTarget to achieve "Healing target without targeting them". In a sense, you will be targeting your party member, casting your spell then targeting whatever you targeted before this. (This will look like you never changed target). ? https://wowwiki.fandom.com/wiki/API_TargetLastTarget?oldid=21935 ---------------------------------------- Unknown It Works! Unfortunately, none of those LUA functions worked from the 1.12.1 client.  Several functions including GetSpellInfo(), invoked in the game client from a /script macro (not from the c# scrript) returns a LUA error complaining that the function doesn't exist.  Maybe it's me making a mistake, or I have a Frankenstein copy of 1.12.1.  Who knows. I was, however, able to get CastSpellByName() to play ball: public static void SetMouseoverUnit ( WoWUnit unit ) { wManager . Wow . Memory . WowMemory . Memory . WriteUInt64 ( ( uint ) wManager . Wow . Memory . WowMemory . Memory . MainModuleAddress + 0x74E2C8 , unit . Guid ); } public static void CastOn ( WoWUnit unit , Spell spell ) { float i = spell . CastTime ; i = i * 1000 + 1500 ; int myint = Convert . ToInt32 ( i ); Logging . WriteDebug ( "Casting " + spell . Name + " on " + unit . Name + " ..Cast time == " + i + " Type = " + myint ); SetMouseoverUnit ( unit ); //WORKED: string cast = (@"TargetUnit(""mouseover""); CastSpellByName(""Flash Heal""); TargetLastTarget();"); string cast1 = (@ "TargetUnit(""mouseover""); CastSpellByName(""" ); string cast2 = (@ """); TargetLastTarget();" ); Lua . LuaDoString ( cast1 + spell . Name + cast2 ); Thread . Sleep ( myint ); } The bad: Yep, this code is ugly.  But it gets the job done. *shrug* wRobot's cs parser version doesn't do '@' verbatim strings, and I'm not yet inclined to make a whole .csproj of this thing, so please excuse the string fuckery at the bottom. I've found *no* c# or LUA method that could derive whether I am casting.  I've gone through the forums, pored over code and determined that, while using 1.12.1 + wRobot: ObjectManager.Me.IsCast always returns false every possible LUA function capable of determining my casting state returns an error ..so that why I'm using a Thread.Sleep here. The Good: It works, casting heals on myself and partymembers without switching targets. The mouseover workaround was pointed out by reapler & Matenia in the following thread . Thank you so much for your help! ---------------------------------------- Unknown Again use the wiki to see what works for Vanilla. I just noticed my link was from 2008 (TBC) so no GetSpellInfo does not work. ? ---------------------------------------- Unknown Fyi, you can use ObjectManager.Me.CastingSpell to check for a name in vanilla. https://github.com/Schaka/VanillaFightclassFramework already has everything you could need to determine casts, switching targets, etc. ---------------------------------------- Unknown Oho!  That's a game changer..  I might have to setup Visual Studio to compile this into a DLL now.  Thanks for the heads up, Matenia. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/11335-how-can-i-force-a-fight/ TITLE: How can I force a fight? ---------------------------------------------------------------------------------------------------- Unknown Related to the bug : This bug annoys me to no end. The bot , when on its way to quest enemies/objectives just basically runs into other hostile mobs which not only is very bot-like in terms of behavior, but also stress-inducing to watch ? . Since I'm working on a Fight Class in C#, I thought I might as well give it a try and fix it directly in the FC for now. I've created a simple radar which is able to detect the closest hostile units around every 500ms. When the closest unit is under a certain distance, I target it. But then I can't seem to start a fight. Fight.StartFight(); doesn't work (it says that the Target is not valid), I've tried a lot of other stuff, like manually setting Fight.InFight to true, but nothing seems to work and the bot keeps walking. Is there a way for me to interrupt the pathing and start a fight? Any help would be very appreciated. ---------------------------------------- Zer0 | 2019-05-31T16:25:45Z Would something like this work? if ( ObjectManager . GetWoWUnitAttackables (). Any ( x => x . Position . DistanceTo ( ObjectManager . Me . Position ) < 20 )) { MovementManager . StopMove (); Fight . StartFight ( ObjectManager . GetWoWUnitAttackables (). OrderBy ( x => x . Position . DistanceTo ( ObjectManager . Me . Position )). FirstOrDefault (). Guid ); } Edit: Untested, just a suggestion, also changed getwowunit to attackables Edit2: looking at the above the if statement i have is bad, you probably already have a filter though Edited May 31, 2019 by Marsbar ---------------------------------------- Unknown Hey, thanks for the quick answer. The problem was that I didn't know you could pass a WowUnit.Guid argument to the overloaded StartFight function. Now I feel stupid :). Also I'm new to C# and decompiling dll, so don't judge me too harshly. I do have a filter and it works pretty well so far. So now the detection works, but there's still bugs to fix. Especially when looting nearby hostiles, the bot will start moving erratically between 'I wanna go loot" and "I wanna start a fight". I'll look into it tomorrow. Quick question : I put the detection into a method ( private void AggroRadar() ), that is executed every 500ms. If I instantiate an object inside my method ( WoWUnit closestUnit = new WoWUnit(1234); ), is it destroyed once the method is over, or am I causing a memory leak? Thanks a lot for your help! ---------------------------------------- Unknown Ok, so I'll keep posting here for updates in case anyone's around and is willing to provide a little help. I've made it into a plugin and it's working very well so far, although it still needs a lot of testing. Basically the plugin creates a background task which updates every 500ms and checks for close units. I've made the Range of the radar, the lvl of the enemies and the option to attack passive enemies into settings. The detection works very well and the bots enters combat without issue, now. So far the bugs I have are : - When the bot is on its way to a NPC vendor in Town and is interrupted by a fight caused by a radar detection, the bot then states that "the NPC couldn't be reached" and then blacklists the vendor. I'm clearing the blacklist when it happens as a quick fix but it's ugly and potentially harmful. Any idea? - Same problem with looting. When the bot is on its way to loot a corps and is interrupted by a radar detection, it states that it can't reach the corpse and blacklists it. I don't think it's the worst bug, but I'd like to get it fixed anyway. ---------------------------------------- Unknown Check for looting events and currently running the totown state and deactivate your radar for the time being. ---------------------------------------- Unknown That would indeed fix the issue, but also kill the purpose of the plugin. I really like the idea that the radar is still on when a toTown or looting event is on. So far it's only inactive when the player is flagged in combat or on a taxi. ---------------------------------------- Unknown Maybe cancel those 2 states if your radar triggers? then it shouldn't blacklist and after combat attempt them again? ---------------------------------------- Unknown | 2019-06-03T14:09:46Z That wouldn't work. The problem is GoToTask being aborted (and returning false) leads to the ToTown state being cancelled. Edited June 3, 2019 by Matenia ---------------------------------------- Unknown | 2019-06-03T13:22:05Z Ah, well I see that it takes the general setting wManagerSetting.CurrentSetting.BlackListIfNotCompletePath into account so maybe turn that off temporarily? That is, if that setting is what's causing the blacklists Edited June 3, 2019 by Marsbar ---------------------------------------- Unknown I will try that and let you guys know how it went. Thank you both! ---------------------------------------- TheSmokie For some reason, even turning wManagerSetting.CurrentSetting.BlackListIfNotCompletePath to false (and in the UI) doesn't do the trick and the vendor still gets blacklisted. I've found a workaround though. It's a bit shaky but so far it's working as intended. Works for both Vendor and Repair. Maybe there's a way to hook blacklist events directly? If not I'll clean up the code and use this for now. private string vendorNpc = "" ; // Manage blacklist (inside Initialize()) robotManager . Events . LoggingEvents . OnAddLog += delegate ( Logging . Log log ) { ManageNpcBlacklist ( log ); }; private void ManageNpcBlacklist ( Logging . Log log ) { if ( log . Text . Contains ( "[ToTown] Go to vendor" )) { vendorNpc = log . Text . Substring ( 22 ); vendorNpc = vendorNpc . Remove ( vendorNpc . Length - 9 ); } if ( inRadarCombat && log . Text . Contains ( "[ToTown] Unable to reach the vendor, blacklist it 120 minutes (you can disable this NPC in NPC DB tab 'Tools')." )) { foreach ( var n in NpcDB . ListNpc ) { if ( n . Name == vendorNpc ) { Logging . WriteDebug ( "Removing " + n . Name + " from vendor Blacklist" ); n . BlackList (- 1 ); } } } } ---------------------------------------- @Droidz I've asked @Droidz in the past to add blacklist events, I don't think it has happened (or maybe I missed it). Precisely because I didn't want to go down the house that you did. Your solution likely is the best one though. ---------------------------------------- Unknown I'm getting very close to what I want. There's one more bug that I can't seem to shake off. When the bot detects an enemy to attack, I run : MovementManager . StopMove (); Fight . StartFight ( closestUnit . Guid ); Then, if the bot is not in combat range, it starts moving erratically back and forth. I think it's still running its current move to the next node, as well as its move in range towards the enemy, both at the same time, or one after the other, or they keep interfering with each other, I don't know. I've tried setting Fight.InFight to true, I've tried checking the movements events, I've tried different things with MovementManager and it's led to nothing so far. I'm probably missing something very obvious, so any input will be much appreciated. ---------------------------------------- Zer0 Hello, blacklist events is in "wManager.Events.OthersEvents" And try ---------------------------------------- Unknown Thanks for the blacklist events, I'll check that out. Unfortunately, your solution still doesn't work. To give you more info, the bot goes erratic up until I actually am flagged in combat. Then it's back to normal. ---------------------------------------- Unknown I've recorded a video demonstrating the bug. It seems like the bot is conflicted between moving to its next node and moving toward the enemy. Hope it helps. pullbug.webm ---------------------------------------- TheSmokie My best guess is that you're currently running between 2 waypoints. Try adding a MovementManager.StopMoveTo(false, 500) Check if MovementManager.CurrentMoveTo is being overwritten and potentially call MovementManager.CurrentPath.Clear() ---------------------------------------- Unknown Thanks a lot for your help, but I'm still really stuck here. Here's what I tried : Logging . Write ( "[Z.E.Radar] Enemy too close (" + closestUnit . GetDistance + "), attacking : " + closestUnit . Name ); // Start Fight Logging . WriteDebug ( MovementManager . CurrentMoveTo . ToString ()); MovementManager . StopMove (); Logging . WriteDebug ( MovementManager . CurrentMoveTo . ToString ()); MovementManager . StopMoveTo ( false , 500 ); Logging . WriteDebug ( MovementManager . CurrentMoveTo . ToString ()); MovementManager . CurrentPath . Clear (); Logging . WriteDebug ( MovementManager . CurrentMoveTo . ToString ()); Fight . StartFight ( closestUnit . Guid ); And here's my log : 21:18:07 - [Z.E.Radar] Enemy too close (48,20433), attacking : Kolkar Scout [D] 21:18:07 - -776,1435 ; 1188,599 ; 98,48631 ; "None" [D] 21:18:07 - -776,1435 ; 1188,599 ; 98,48631 ; "None" [D] 21:18:07 - -776,1435 ; 1188,599 ; 98,48631 ; "None" [D] 21:18:07 - -776,1435 ; 1188,599 ; 98,48631 ; "None" 21:18:12 - [Fight] Player Attacked by Kolkar Scout (lvl 31) I'm really getting confused here. Nothing seems to work, yet it looks like it shouldn't be an issue at all. Any idea what is going on? I've also noted that once I'm actually in combat (for example my pet attacks or is attacked), the bot starts acting normally again. To me it seems like when I force engage a fight, unless I'm actually "In fight" in the game, the bot tries to take back control and follow its normal path, and I can't find a way to cancel it. ---------------------------------------- Unknown Start fight, then cancel all movement, then start fight again. Maybe force fight by setting Fight.InFight = true; maybe add a MovementManager.MoveTo(closestUnit.Position) for good measure. I have no idea how any of the interals work together. ---------------------------------------- Unknown It looks like two working modules are sending different kind of orders to the player toon. Maybe you should suspend one and let other do the job. Now one is stating go left the other go right and well it looks like wrobot in action ^^. ---------------------------------------- Unknown From my observation, once you launch Fight.startFight(), the next line of code isn't executed until the fight is over. I've tried setting Fight.InFight to true in many different places, and it doesn't work, unfortunately. I've also tried MovementManager.MoveTo(closestUnit.Position), but the bot takes over and tries to get back on its traveling path as soon as it starts moving to its target. I've also hooked the wManager.Events.MovementEvents.OnMoveToPulse event and maybe there's some hope in there but it's getting really complicated for such a simple task. I'm running out of ideas here. Do you think there is a way to temporarily deactivate the profile path, or the profile altogether? ---------------------------------------- Unknown To me, it seems that it's a conflict within the same "module", actually. The MoveTo one. The bot is sending conflicting information to it when I try to force a fight. It's going "Go fight. Oh wait, no, go travel, no wait, go fight, no wait, go travel...". I'm pretty new to wRobot and I don't know the ins and outs of its engine, so if you have any more concrete info about all this, feel free to share :). I'm willing to share the file if needed, since I'll release it for free once it's done. ---------------------------------------- Unknown That would be a nice addition to the Community ? ---------------------------------------- Unknown I found a solution. It's not the most elegant and a bit too crafty to my taste, but it works pretty well so far. Again, if anyone has a better idea, please let me know. I have done a ton of tests and I had to search and guess into the API until I found useful pieces of code. What happens is pretty much what I suspected. When you call Fight.startFight on an enemy NPC that is not in the DB (profile) and that is not attacking you, the bot starts a new Move thread to approach the unit. After a second, during the approach, the bot thinks it's still traveling, despite Fight.InFight being true and starts a second Move thread to return to its travel path. Then the 2 threads run at the same time until somehow you're flagged in combat and the bot interrupts the travel Move thread. Here's what I've done : First : MovementManager . StopMove (); Fight . StartFight ( closestUnit . Guid ); Then the Event hook takes over whenever a new path is created during a pull. I pause the one that is not going to the enemy in a loop for the entire fight. Then, when the fight is over, I stop every movement and launch a new movement thread that will re-calculate the travel path. This last part is not absolutely necessary, but it keeps the bot from running back to its original place after every fight, which looks unnatural. In case you wonder, I tried to use cancelable.Cancel = true;... no dice, it makes the bot move eternally in a direction after reaching the first node, post-fight. wManager . Events . OthersEvents . OnPathFinderFindPath += ( Vector3 from , Vector3 to , string continentNameMpq , CancelEventArgs cancelable ) => { if ( inRadarCombat && Fight . InFight && enemyToFight . Position != to ) { while ( Fight . InFight && enemyToFight . IsAlive && inRadarCombat ) { Thread . Sleep ( 250 ); } MovementManager . StopMove (); MovementManager . StopMoveTo (); MovementManager . LaunchThreadMovementManager (); Thread . Sleep ( 2000 ); } }; It works for both melee and ranged. I'll keep testing and adjusting. Feel free to share your inputs if any. Also if anyone wants to test the plugin, please let me know. I should mention I'm developing it on a TBC server. No idea if it would work on other versions. ---------------------------------------- Mickenberg After further investigation, turns out there's a simpler way to handle the issue. Much cleaner, and works way better. It is confirmed that when you try to aggro a NPC that is not explicitly listed in the profile, AND when you're in a movement loop, the bot just tries to get back in the loop. The 3D radar helped a lot to understand what was going on. I still have a few (hopefully) minor bugs, and then I can release the plugin. Thanks again for your help, everyone. // Pull hook robotManager . Events . FiniteStateMachineEvents . OnBeforeCheckIfNeedToRunState += ( engine , state , cancelable ) => { if ( state . DisplayName == "Movement Loop" && inRadarCombat ) { cancelable . Cancel = true ; } }; ---------------------------------------- Unknown Version 1.0.0 is out ---------------------------------------- Unknown Hi guys, Although the radar works. Engaging in a clean radar fight is still quite a hassle and triggers a cascading amount of issues that I have to quick fix (blacklisting vendors and flightmasters, messing with running states...). I'm really looking to have a better, more reliable system. I have looked around in the forum and other places but I didn't find exactly what I wanted. So here's my question. Is it possible to add a State to the wRobot engine when the plugin initializes, and would it be a good idea? A whole new state that would be called RadarFight for example and that would have a very high priority. Does a state only run based on a set of conditions, or can you trigger one (Run(), or NeedToRun()) manually? Also what happens if two states have the same priority? I'm getting a bit desperate here, and I'm not sure if I can go any deeper than that. The lack of documentation is starting to be a real problem, so any help will be very much appreciated. ---------------------------------------- Zer0 I'd say states are the way to go, that way other things won't interfere. Have a look at the grinder product example . Since it's a product when it loads the Bot it adds all the relevant states and has it's own grinder state. That should be enough of an example to craft your own. ---------------------------------------- Zer0 Maybe just add your radar as its own state. That would, however, make it so the ToTown state running wouldn't allow your state to be triggered. Like Mars said, look at the grinder product example to see how exactly Droidz' FSM works. Then take a look at my free PartyHelper plugin on how to add states to wRobot. ---------------------------------------- Unknown Following your advice, I have been playing a bit with the State idea, yesterday. Both the grinder example and the PartyHelper plugin have been of tremendous help. Thank you again, both of you. Although things are getting clearer, I have a few questions and instead of running in circles and slowly losing faith for a week, I'm gonna ask directly. FYI, I'm conducting all my tests using the Grinder engine, and occasionally the Automaton. When I start the bot; my character needs to go to Town and has enemies on its way. Here's my observation: It seems like 2 engines are running at the same time. Let's say engine1, which only has "NPCScanState" and which refreshes every 3 seconds or so. After I add my RadarFight state with a higher weight to it, while the ToTown state is running, on enemy detection, the RadarFight state triggers and the bot tries to attack the mob, but seems to be confused and wanting to go back to its ToTown state. Basically same problem as before. And engine2, which has all the other states (IsAttacked, Pause, ToTown, MovementLoop etc...). After I add the RadarFight to this one with a high weight, when the bot is on its way to town and detects an enemy to fight, the RadarFight state doesn't trigger at all. BUT, if I get attacked and the weight of RadarFight is higher than the weight of IsAttacked, the RadarFight state takes over and things works perfectly. Does that make sense to you? It seems like engine2 only checks for states to run when engine 1 is somehow interrupted. Any idea how to overcome this? ---------------------------------------- Zer0 I guess that makes sense. IsAttacked checks for enemies targeting you (or you being on theit threat list in higher expansions) and tries to fight back. Maybe activate "don't fight back" in wRobot settings?: Also I believe NPCScanState is started with the "newThread()" method (static) on the class, so it would make sense it's running in an additional thread to start a fight. Unfortunately I don't know all the inner workings of wRobot. ---------------------------------------- Unknown I've managed to add my own state properly and it's working well in normal traveling conditions, but during the ToTown state, even when the Radarfight state NeedToRun is True and has a higher priority than the ToTown state, it doesn't trigger (unless isAttacked gets triggered, then the ToTown state is halted, and the Radarfight state takes over, since it has a higher priority than isAttacked). How come the IsAttacked state forces the ToTown state to pause, but not my RadarFight state? I'm trying a lot of things, but so far, no dice. Any idea? To expand on this, it seems like during the ToTown state, the engine isn't even checking for other states, unless actually attacked. Is there a way to force a state check? ---------------------------------------- @Droidz Ask @Droidz My best guess is IsAttacked has another thread that stops ToTown or something ---------------------------------------- Unknown I think it is linked to this piece of code in the NeedToRun() method of the ToTown state: if (! wManager . Wow . Helpers . Conditions . InGameAndConnectedAndAliveAndProductStartedNotInPause || wManager . Wow . Helpers . Conditions . IsAttackedAndCannotIgnore ) { return false ; } So I need to work my way around that. Anyway, I shot a message to Droidz. Thanks for your insight. ---------------------------------------- Unknown You can set Conditions.ForceIgnoreIsAttacked to true for the the duration of your state. That conditions evaluates to false then. ---------------------------------------- Unknown Hah, pretty counter-intuitive, but smart ? . Unfortunately the problem is the same. The bot doesn't even seem to check if other states should be running and just keeps walking, even though my RadarFight state does indeed need to run (I'm checking in the log right on enemy detection). ---------------------------------------- @Marsbar That's what I thought. I don't know how IsAttacked handles this, maybe the GoToTask used to get to the vendor inside the ToTown state has a exitCondition for getting in combat. Usually the exit condition for GoToTask is checking if the bot is running (not pause) and not being attacked. So that makes sense. The bot SHOULDN'T check for other states while one state is still running. That's how FiniteStateMachine works. Maybe remove the ToTown state from the machine and build your own wrapper state that will abort the ToTown state (which should work by calling MovementManager.StopMove) if you pass/change a variable to your ToTownWrapper. What you want to do won't really work without hacks. All of our code is more or less hacked together because we're changing wRobot's default behavior. @Marsbar , for his training plugin even removes wRobot's training state and adds his own. ---------------------------------------- Unknown Yep. The more I dive into the bottom of the code, the more I realize I would indeed have to hack the original behavior pretty hard, which is not really my intention, mainly for maintenance reasons. I guess I'll leave it at that and focus on other things for now. Thanks again for your help. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/11335-how-can-i-force-a-fight/?&page=2 TITLE: How can I force a fight? ---------------------------------------------------------------------------------------------------- Unknown Version 1.0.0 is out ---------------------------------------- Unknown Hi guys, Although the radar works. Engaging in a clean radar fight is still quite a hassle and triggers a cascading amount of issues that I have to quick fix (blacklisting vendors and flightmasters, messing with running states...). I'm really looking to have a better, more reliable system. I have looked around in the forum and other places but I didn't find exactly what I wanted. So here's my question. Is it possible to add a State to the wRobot engine when the plugin initializes, and would it be a good idea? A whole new state that would be called RadarFight for example and that would have a very high priority. Does a state only run based on a set of conditions, or can you trigger one (Run(), or NeedToRun()) manually? Also what happens if two states have the same priority? I'm getting a bit desperate here, and I'm not sure if I can go any deeper than that. The lack of documentation is starting to be a real problem, so any help will be very much appreciated. ---------------------------------------- Zer0 I'd say states are the way to go, that way other things won't interfere. Have a look at the grinder product example . Since it's a product when it loads the Bot it adds all the relevant states and has it's own grinder state. That should be enough of an example to craft your own. ---------------------------------------- Zer0 Maybe just add your radar as its own state. That would, however, make it so the ToTown state running wouldn't allow your state to be triggered. Like Mars said, look at the grinder product example to see how exactly Droidz' FSM works. Then take a look at my free PartyHelper plugin on how to add states to wRobot. ---------------------------------------- Unknown Following your advice, I have been playing a bit with the State idea, yesterday. Both the grinder example and the PartyHelper plugin have been of tremendous help. Thank you again, both of you. Although things are getting clearer, I have a few questions and instead of running in circles and slowly losing faith for a week, I'm gonna ask directly. FYI, I'm conducting all my tests using the Grinder engine, and occasionally the Automaton. When I start the bot; my character needs to go to Town and has enemies on its way. Here's my observation: It seems like 2 engines are running at the same time. Let's say engine1, which only has "NPCScanState" and which refreshes every 3 seconds or so. After I add my RadarFight state with a higher weight to it, while the ToTown state is running, on enemy detection, the RadarFight state triggers and the bot tries to attack the mob, but seems to be confused and wanting to go back to its ToTown state. Basically same problem as before. And engine2, which has all the other states (IsAttacked, Pause, ToTown, MovementLoop etc...). After I add the RadarFight to this one with a high weight, when the bot is on its way to town and detects an enemy to fight, the RadarFight state doesn't trigger at all. BUT, if I get attacked and the weight of RadarFight is higher than the weight of IsAttacked, the RadarFight state takes over and things works perfectly. Does that make sense to you? It seems like engine2 only checks for states to run when engine 1 is somehow interrupted. Any idea how to overcome this? ---------------------------------------- Zer0 I guess that makes sense. IsAttacked checks for enemies targeting you (or you being on theit threat list in higher expansions) and tries to fight back. Maybe activate "don't fight back" in wRobot settings?: Also I believe NPCScanState is started with the "newThread()" method (static) on the class, so it would make sense it's running in an additional thread to start a fight. Unfortunately I don't know all the inner workings of wRobot. ---------------------------------------- Unknown I've managed to add my own state properly and it's working well in normal traveling conditions, but during the ToTown state, even when the Radarfight state NeedToRun is True and has a higher priority than the ToTown state, it doesn't trigger (unless isAttacked gets triggered, then the ToTown state is halted, and the Radarfight state takes over, since it has a higher priority than isAttacked). How come the IsAttacked state forces the ToTown state to pause, but not my RadarFight state? I'm trying a lot of things, but so far, no dice. Any idea? To expand on this, it seems like during the ToTown state, the engine isn't even checking for other states, unless actually attacked. Is there a way to force a state check? ---------------------------------------- @Droidz Ask @Droidz My best guess is IsAttacked has another thread that stops ToTown or something ---------------------------------------- Unknown I think it is linked to this piece of code in the NeedToRun() method of the ToTown state: if (! wManager . Wow . Helpers . Conditions . InGameAndConnectedAndAliveAndProductStartedNotInPause || wManager . Wow . Helpers . Conditions . IsAttackedAndCannotIgnore ) { return false ; } So I need to work my way around that. Anyway, I shot a message to Droidz. Thanks for your insight. ---------------------------------------- Unknown You can set Conditions.ForceIgnoreIsAttacked to true for the the duration of your state. That conditions evaluates to false then. ---------------------------------------- Unknown Hah, pretty counter-intuitive, but smart ? . Unfortunately the problem is the same. The bot doesn't even seem to check if other states should be running and just keeps walking, even though my RadarFight state does indeed need to run (I'm checking in the log right on enemy detection). ---------------------------------------- @Marsbar That's what I thought. I don't know how IsAttacked handles this, maybe the GoToTask used to get to the vendor inside the ToTown state has a exitCondition for getting in combat. Usually the exit condition for GoToTask is checking if the bot is running (not pause) and not being attacked. So that makes sense. The bot SHOULDN'T check for other states while one state is still running. That's how FiniteStateMachine works. Maybe remove the ToTown state from the machine and build your own wrapper state that will abort the ToTown state (which should work by calling MovementManager.StopMove) if you pass/change a variable to your ToTownWrapper. What you want to do won't really work without hacks. All of our code is more or less hacked together because we're changing wRobot's default behavior. @Marsbar , for his training plugin even removes wRobot's training state and adds his own. ---------------------------------------- Unknown Yep. The more I dive into the bottom of the code, the more I realize I would indeed have to hack the original behavior pretty hard, which is not really my intention, mainly for maintenance reasons. I guess I'll leave it at that and focus on other things for now. Thanks again for your help. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/11370-check-isattack/ TITLE: Check IsAttack ---------------------------------------------------------------------------------------------------- Unknown Hello guys, Some of u know how to check if the bot is attacked by a mob in C#? Thanks ? ---------------------------------------- Unknown I try something like : public void SkipNodesIfFight () { robotManager . Events . FiniteStateMachineEvents . OnBeforeCheckIfNeedToRunState += ( engine , state , cancelable ) => { if ( state is wManager . Wow . Bot . States . IsAttacked ) { _isFight = true ; wManager . Wow . Helpers . Chat . SendChatMessageWhisper ( "IsFight" , "namespeudo" ); Thread . Sleep ( 10000 ); Initialize (); } else { _isFight = false ; wManager . Wow . Helpers . Chat . SendChatMessageWhisper ( "NotISFight" , "namespeudo" ); Thread . Sleep ( 10000 ); } Thread . Sleep ( 10000 ); }; } But never say "IsFight" when a mob attack me ? ---------------------------------------- Unknown for this code to work you'd need to make it run inside Initialize (); ---------------------------------------- Unknown May be wManager.Wow.ObjectManager.ObjectManager.GetUnitAttackPlayer().Count < = 0 works for you? ---------------------------------------- Unknown I try this ---------------------------------------- Unknown wManager.Wow.ObjectManager.ObjectManager.GetUnitAttackPlayer().Count < = 0  working fine ? thanks ! ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/11416-quester-gotostep/ TITLE: Quester GoToStep ---------------------------------------------------------------------------------------------------- Unknown Hey! For a project of mine I would like to set the GoToStep action parameter programatically, how can I do that? Actually, how can I execute any action programatically? Cheers! ---------------------------------------- Unknown I’d need a lot more detail to be able to help you. ---------------------------------------- Unknown The Quester module executes steps, there is a step called GoToStep, which I believe just takes a number. I want to jump to a variable step at a certain point but I don't know how to run code in that action. So I thought I could execute the GoToStep step from some internal call, I found the enum in the API but not a function to execute an arbitrary step. ---------------------------------------- spacecowboy Take a look here ---------------------------------------- Unknown Thanks a lot! ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/11486-wotlk-get-world-coordinates-from-map-coords/ TITLE: [WOTLK] Get World Coordinates From Map Coords ---------------------------------------------------------------------------------------------------- Unknown Hello guys, i wanted to ask how i can get World Coords from Map Coords + Zone? i just found the Lua Function: GetWorldLocFromMapPos but it was introduced with patch 5.0.4 or so, so does not work with 3.3.5a. Do someone have any idea? Thanks ---------------------------------------- fengshibang //https://www.ownedcore.com/forums/world-of-warcraft/world-of-warcraft-bots-programs/wow-memory-editing/382790-zones-coordinates-world-zone-coordinates.html //somehow (ObjectManager.Me.Position.Y - x1) / (x2 - x1) is the character's on-map X position (notice the Y) //reversing that formula, you can get playerX (world position) based on all y values, it's utterly confusing and makes no sense to me private Vector3 CalculateMapCoords ( string luaUnit ) { float mapX = Lua . LuaDoString ( $@ " local x , y = GetPlayerMapPosition ( '{luaUnit}' ); return x ; "); float mapY = Lua . LuaDoString (@ " local x , y = GetPlayerMapPosition ( '{luaUnit}' ); return y ; "); return CalculateFromMapPosition ( mapX , mapY ); } private Vector3 CalculateFromMapPosition ( float mapX , float mapY ) { var x1 = 2041.67f ; var x2 = 895.833f ; var y1 = 1627.08f ; var y2 = 862.5f ; var playerX = - mapY * y1 + mapY * y2 + y1 ; var playerY = - mapX * x1 + mapX * x2 + x1 ; return new Vector3 ( playerX , playerY , PathFinder . GetZPosition ( new Vector3 ( playerX , playerY , 100 ))); } Coordinates in there are hardcoded for warsong gulch. It's up to you to adjust this ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/11559-release-simple-log-format/ TITLE: [release] simple log format ---------------------------------------------------------------------------------------------------- Kamogli Hello, i got the idea from someone else and thought it would be a good idea to release the source code for people who wish to log there fightclass / plugins to be able to help find bugs faster and help people fix problems with there product. enjoy Class.cs using System ; using System . IO ; using robotManager . Helpful ; public class Main : wManager . Plugin . IPlugin { public void Initialize () { Log ( "Hello, welcome to pornhub." ); } public void Dispose () { } public void Settings () { } private void Log ( String lines ) { System . IO . Directory . CreateDirectory (@ " Plugins \FileName\logs\" ); string logpath = Path . Combine ( Environment . CurrentDirectory , @ "Plugins\FileName\logs\", " Logger " + DateTime.Now + " . txt "); try { System . IO . StreamWriter file = new System . IO . StreamWriter ( logpath , true ); file . WriteLine ( lines + "\n" ); file . Close (); } catch ( Exception e ) { Logging . Write ( "[Logger] Error logging" + e ); } } } ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/3762-how-to-make-rotation-spam-next-button/ TITLE: How to make rotation spam next button ---------------------------------------------------------------------------------------------------- Unknown So I am playing a class with all instants and 400 ping, so I would like my fightclass to spam the next button until it is pressed.  How would I do that? Maybe not a full out spam, but start looking for next button to press a couple hundred milliseconds early. I tried : cooldownc = Lua . LuaDoString ( "start, duration, enabled = GetSpellCooldown('Black Arrow'); return start;" ); if ( cooldownc == 0 && BlackArrow . IsDistanceGood && BlackArrow . KnownSpell ) { BlackArrow . Launch (); return ; } Instead of : if ( BlackArrow . IsSpellUsable && BlackArrow . IsDistanceGood && BlackArrow . KnownSpell ) { BlackArrow . Launch (); return ; } But it breaks the rotation and gets out of order because there is so much spamming it backs up.  I tried adding sleeps but they didn't help much, rotation was suboptimal. using System ; using System . Threading ; using robotManager . Helpful ; using robotManager . Products ; using wManager . Wow . Class ; using wManager . Wow . Helpers ; using wManager . Wow . ObjectManager ; public class Main : ICustomClass { public float Range { get { return 30f ; } } private bool _isLaunched ; private WoWUnit _lastTarget ; public void Initialize () { _isLaunched = true ; Logging . Write ( "Lock1.0 Started" ); Rotation (); } public void Dispose () { _isLaunched = false ; Logging . Write ( "Lock1.0 Stop in progress." ); } public void ShowConfiguration () { Logging . Write ( "Lock1.0 No setting for this Fight Class." ); //MessageBox.Show("[My fightclass] No setting for this Fight Class."); } public Spell BlackArrow = new Spell ( "Black Arrow" ); public Spell KillCommand = new Spell ( "Kill Command" ); public Spell ChimShot = new Spell ( "Chimera Shot" ); public Spell MultiShot = new Spell ( "Multi-Shot" ); public Spell AimedShot = new Spell ( "Aimed Shot" ); public Spell ExpShot = new Spell ( "Explosive Shot" ); public Spell SteadyShot = new Spell ( "Steady Shot" ); public Spell KillShot = new Spell ( "Kill Shot" ); public Spell HunterMark = new Spell ( "Hunter's Mark" ); public Spell SerpSting = new Spell ( "Serpent Sting" ); public Spell BeastWrath = new Spell ( "Bestial Wrath" ); public Spell RapidFire = new Spell ( "Rapid Fire" ); public Spell Readiness = new Spell ( 23989 ); public Spell CallPet = new Spell ( "Call Pet" ); public int SerpID = 49001 ; public int HuntID = 19423 ; internal void Rotation () { Logging . Write ( "Lock1.0 Is started." ); while ( _isLaunched ) { try { if (! Products . InPause ) { if (! ObjectManager . Me . IsDeadMe ) { //buffRotation(); if ( Fight . InFight && ObjectManager . Me . Target > 0 && ObjectManager . Me . SpeedMoving == 0 && ! ObjectManager . Me . GetMove ) { CombatRotation (); } else if ( ObjectManager . Me . Target == 0 ) { } } } } catch ( Exception e ) { Logging . WriteError ( "[My fightclass] ERROR: " + e ); } Thread . Sleep ( 10 ); // Pause 10 ms to reduce the CPU usage. } Logging . Write ( "[My fightclass] Is now stopped." ); } Aura GetAuraByPlayer ( int ID ) { Aura final = new Aura ( 0 ); Aura [] TargetAuras = ObjectManager . Target . GetAllBuff (). ToArray (); foreach ( Aura i in TargetAuras ) { if ( i . IsValid () && i . Owner == wManager . Wow . ObjectManager . ObjectManager . Me . Guid && i . SpellId == ID ) { final = i ; return i ; } } return final ; } internal void CombatRotation () { Aura SerpAura = GetAuraByPlayer ( SerpID ); Aura HuntAura = GetAuraByPlayer ( HuntID ); int cooldown ; int cooldownb ; int cooldownc ; int cooldownd ; int cooldowne ; int cooldownf ; int cooldowng ; int cooldownh ; int cooldowni ; int cooldownj ; if (! ObjectManager . Pet . IsValid ) { CallPet . Launch (); return ; } if ( HunterMark . IsSpellUsable && HunterMark . IsDistanceGood && HunterMark . KnownSpell ) { if (! ObjectManager . Target . HaveBuff ( "Hunter's Mark" )) { HunterMark . Launch (); return ; } } cooldown = Lua . LuaDoString ( "start, duration, enabled = GetSpellCooldown('Bestial Wrath'); return start;" ); if ( BeastWrath . IsSpellUsable && BeastWrath . IsDistanceGood && BeastWrath . KnownSpell ) { BeastWrath . Launch (); return ; } if ( RapidFire . IsSpellUsable && RapidFire . KnownSpell ) { if (! ObjectManager . Me . HaveBuff ( "Rapid Fire" )) { RapidFire . Launch (); return ; } } if ( SerpSting . IsDistanceGood && SerpSting . KnownSpell ) { if ( SerpAura . SpellId == 0 ) { SerpSting . Launch (); return ; } } cooldownc = Lua . LuaDoString ( "start, duration, enabled = GetSpellCooldown('Black Arrow'); return start;" ); if ( BlackArrow . IsSpellUsable && BlackArrow . IsDistanceGood && BlackArrow . KnownSpell ) { BlackArrow . Launch (); return ; } cooldowni = Lua . LuaDoString ( "start, duration, enabled = GetSpellCooldown('Explosive Shot'); return start;" ); if ( ExpShot . IsSpellUsable && ExpShot . IsDistanceGood && ExpShot . KnownSpell ) { ExpShot . Launch (); return ; } cooldownd = Lua . LuaDoString ( "start, duration, enabled = GetSpellCooldown('Chimera Shot'); return start;" ); if ( ChimShot . IsSpellUsable && ChimShot . IsDistanceGood && ChimShot . KnownSpell ) { ChimShot . Launch (); return ; } cooldowne = Lua . LuaDoString ( "start, duration, enabled = GetSpellCooldown('Kill Command'); return start;" ); if ( KillCommand . IsSpellUsable && KillCommand . IsDistanceGood && KillCommand . KnownSpell ) { KillCommand . Launch (); return ; } cooldownf = Lua . LuaDoString ( "start, duration, enabled = GetSpellCooldown('Multi-Shot'); return start;" ); if ( MultiShot . IsSpellUsable && MultiShot . IsDistanceGood && MultiShot . KnownSpell ) { MultiShot . Launch (); return ; } cooldowng = Lua . LuaDoString ( "start, duration, enabled = GetSpellCooldown('Aimed Shot'); return start;" ); if ( AimedShot . IsSpellUsable && AimedShot . IsDistanceGood && AimedShot . KnownSpell ) { AimedShot . Launch (); return ; } cooldownh = Lua . LuaDoString ( "start, duration, enabled = GetSpellCooldown('Kill Shot'); return start;" ); if ( KillShot . IsSpellUsable && KillShot . IsDistanceGood && KillShot . KnownSpell && ObjectManager . Target . HealthPercent < 20 ) { KillShot . Launch (); return ; } cooldownj = Lua . LuaDoString ( "start, duration, enabled = GetSpellCooldown('Readiness'); return start;" ); Logging . WriteDebug ( cooldownj . ToString ()); if ( Readiness . IsSpellUsable && Readiness . KnownSpell ) { Readiness . Launch (); return ; } if ( SteadyShot . IsSpellUsable && SteadyShot . IsDistanceGood && SteadyShot . KnownSpell ) { SteadyShot . Launch (); return ; } } } that is what my rotation looks like, a bunch of those if statements ---------------------------------------- Unknown Hello, try to change all " spellInstance.Launch(); " Launch params: Spell . Launch ( bool stopMove , bool waitIsCast , bool ignoreIfCast , string luaUnitId ) Use params like: spell . Launch ( spell . CastTime > 0 , false ); ---------------------------------------- Unknown Thanks for this code! ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/9685-need-some-help-with-c/ TITLE: Need some help with C# ---------------------------------------------------------------------------------------------------- Unknown Hello. I have a bit programming skill and try now change one fight class profile. I dont understand here new SpellState("Power Word: Shield", 20, context => DiscPriestaSettings.CurrentSetting.PowerWordShield && Fight.InFight && ObjectManager.Me.GetMove, true, true, false, false, true, true, true, true, 0, false, false, false, false, false, false, wManager.Wow.Helpers.FightClassCreator.YesNoAuto.Yes, "", "player", true, true, false), a lot of "false" and "true". Where i can find description of function SpellState()? And where i can find all functions and methods of "ObjectManager."? Thank you. ---------------------------------------- Unknown wrong area this isn't tutorial. Moved to right area ---------------------------------------- Unknown Hello, public SpellState ( string spellName , int priority , BooleanDelegate condition , bool isBuff = false , bool inCombatOnly = true , bool castIfInMount = false , bool castIfMeDead = false , bool checkIfKnow = true , bool checkIfSpellUsable = true , bool checkSpellDistance = true , bool needInView = true , int timer = 0 , bool notSpellIsLuaScript = false , bool debug = false , bool targetFriends = false , bool aoeSpell = false , bool aoeSpellMePos = false , bool oncePerTarget = false , YesNoAuto canMoveDuringCast = YesNoAuto . Auto , string description = "" , string castOn = "" , bool lockFrame = true , bool waitDuringCasting = true , bool notSpellIsCSharpCode = false , bool notSpellIsVBCode = false , bool notSpellIsLuaBotCode = false ) But if you use c# to create your fightclass it is not recommended to use this, you can found sample here https://wrobot.eu/forums/topic/12-how-to-create-an-fight-class-developer-only/ ---------------------------------------- Unknown hello, where can i find all functions or methods of GoToTask.ToPosition(!!!here!!!); ? ---------------------------------------- Unknown https://marsbars.gitlab.io/unoffical-wrobot-api-docs/api/wManager.Wow.Bot.Tasks.GoToTask.html ---------------------------------------- Unknown Thanks a lot! ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/10157-having-trouble-getting-to-the-bot-to-loop-in-the-way-i-want/ TITLE: having trouble getting to the bot to loop in the way I want... ---------------------------------------------------------------------------------------------------- Unknown I am trying to get the bots logic to loop through a little better in the sense of checking itself after each fight, I would like to have it stop itself after each fight for check of (do I have a pet, is my hp/mp above X %) that kinda thing so far I've tried something like internal void Rotation () { while ( _running ) { try { if (! ObjectManager . Me . IsDeadMe ) { if (! ObjectManager . Pet . IsAlive ) { PSpawn (); //Pet spawner return ; } Buff (); if ( Fight . InFight && ObjectManager . Me . Target > 0 ) { Pull (); CombatRotation (); } ..................... which seems to help but not quite full proof, so just wondering is there a better way to basically have it reinitialize, or just have a section of code it executes after it exits combat each time ? ---------------------------------------- Unknown internal void Rotation () { while ( _running ) { try { if (! ObjectManager . Me . IsDeadMe ) { if (! ObjectManager . Pet . IsValid && ! ObjectManager . Me . IsMounted ) { // Thread.Sleep(300); Fight . StopFight (); MovementManager . StopMove (); PSpawn (); // pet spawner } Buff (); if ( Fight . InFight && ObjectManager . Me . Target > 0 ) { Pull (); CombatRotation (); } ..................... its not after the fight but seems to have fixed it just carrying out to the next target without resummoning ? ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/10163-conflict-with-pluginprofile-how-to-prio-plugin-over-profile/ TITLE: Conflict with Plugin/Profile & how to prio plugin over profile ---------------------------------------------------------------------------------------------------- Unknown Hey there! I'm working on my own Quester profile and on my own Plugin,  the plugin functionality is to check if I'm running low on ammo and if so go to the vendor and buy them. This plugin works however when I'm trying it with a character that still has steps to do in the profile it will get into the while (arrows < amount) but on the next pulse/tick it will continue to do whatever the profile tells it to do so it's never executing the code to go to the vendor and buy the ammo. So what I want to achieve is that it "pauses" / ignores the profile and actually runs the plugin code first and when that is finished continue the profile. Any help? ---------------------------------------- Unknown Add a state with higher priority than the quester (similar to ToTown). You can look at the source of the free PartyHelper Plugin for how to do that ---------------------------------------- Unknown Do you got a link? I can't find it myself. ---------------------------------------- Unknown https://wrobot.eu/files/category/177-plugins-multiversion/ ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/10188-using-dll-in-quest-profiles/ TITLE: Using .dll in Quest profiles ---------------------------------------------------------------------------------------------------- Unknown im trying to get my quest profiles work with a .dll. With .cs files it works without any problems but after converting them to .dll it doesnt work anymore. My .dll: using robotManager.Helpful; namespace Testdll { public class MyTestScript { static MyTestScript() { Logging.Write("Init"); } public static void Test() { Logging.Write("Test1"); } } } Added them into the Script Tag in .xml: Trying to call my testfunction with RunCode in Quester: Both are not working MyTestScript.Test(); Testdll.MyTestScript.Test(); Error in Wrobot: wjnzco2s.0.cs(13,3) : error CS1056: Unexpected character '�' wjnzco2s.0.cs(13,1) : error CS0116: A namespace cannot directly contain members such as fields or methods wjnzco2s.0.cs(13,4) : error CS1513: } expected Do i miss something or is it attented to not work with .dll? ---------------------------------------- naviomg Pretty sure you can't have your own namespace. But I'm also not sure if DLLs work to begin with ---------------------------------------- Unknown ahhh true, might be the namespace problem, will test again. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/10198-question-on-edit-dll/ TITLE: Question on edit .dll ---------------------------------------------------------------------------------------------------- Unknown Hi All, I'm not very good with programming but I do have a file and i'm in Visual Studio messing around doing trial and error. After saving the file in Visual Studio will the file change the .dll file as well? Thanks, Young ---------------------------------------- Unknown No, you need to build the project again ---------------------------------------- Unknown Would you recommend starting fresh then? The only reason I wanted to edit a previous project (.dll) is because I thought it would be easier to understand.' Thanks ---------------------------------------- Unknown You can achieve that by de compiling the dll with a tool like dotPeak. Avvi explained this in a thread: This allows you to take a look at the code, but not applying changes to the source dll ---------------------------------------- Unknown Did you decompile the .dll ? .NET Decompiler for example. Its possible if you did that some of the code wasnt decompiled if it was C++ for example. If you change something you need to compile it and the new .dll will get saved into your bin folder. But if you just "save" in VS, then no it wont change ---------------------------------------- Unknown Thank you ---------------------------------------- Unknown NP if u have issues let me know. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/10205-how-to-open-junkboxes/ TITLE: How to open Junkboxes? ---------------------------------------------------------------------------------------------------- Unknown Hi there, been trying to get a custom code snippet that will open all my junkboxes in inventory. Tried this so far: Lua . LuaDoString ( "CastSpellByName('Pick Lock')" ); ItemsManager . UseItem ( 16883 ); Usefuls . WaitIsCastingAndLooting (); ItemsManager . UseItem ( 16883 ); The problem here is though that "UseItem" will cast a rightclick, but to use Pick Lock I need a left click on the Junkbox. Anyone got a good idea how to solve this? ---------------------------------------- Unknown | 2018-10-03T16:19:53Z Bag . PickupContainerItem ( 16883 ); Try that? also, rather than doing luadostring: SpellManager . CastSpellByNameLUA ( "Pick Pocket" ); Edited October 3, 2018 by Marsbar ---------------------------------------- Unknown Thanks, tried PickupCointainerItem already but not working, seems like its a click + drag. ---------------------------------------- Lobbert SpellManager . CastSpellByNameLUA ( "Pick Lock" ); var junkBoxLocation = Bag . GetItemContainerBagIdAndSlot ( 16883 ); Lua . LuaDoString ( "PickupContainerItem(" + junkBoxLocation [ 0 ]+ "," + junkBoxLocation [ 1 ]+ ")" ); Tested this time, should work. ---------------------------------------- Unknown Thanks, working now! ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/10220-customize-resurrect-path/ TITLE: Customize resurrect path ---------------------------------------------------------------------------------------------------- Unknown Hey, got a problem with a dungeon profile: The "corpse" is before the dungeon portal and not behind it when dying inside. Because of this the bot will stand in front of the dungeon and try to resurrect. Is it possible to modify this in any way? Or even set a custom path? (Becaus in this case the "resurrect path would always be the same) ---------------------------------------- Unknown You can subscribe to state events, read for the resurrect state and then execute your own code. There's a thread in developer assistance on how to do that ---------------------------------------- Unknown Where is "in developer assistance on how to do that" . Link pls ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/10231-lua-c-zone-of-party-members/ TITLE: Lua / C# Zone of party members ---------------------------------------------------------------------------------------------------- Unknown Hello. I need code for checking party members (not raid) zone. I was looking in forum, many free plugins, profiles, wow api but not find any sollution ---------------------------------------- Unknown Hello, You can try to use lua functions  UnitPosition and  GetWorldLocFromMapPos(x, y) ---------------------------------------- Unknown I found https://wow.gamepedia.com/API_UnitPosition it can return mapid. its added in Patch 6.0.2 . But i need some like this for wotlk ? ---------------------------------------- Unknown oh.. you reaply in one second before my post ? ---------------------------------------- Unknown Maybe i can grab it from UI info frame? ---------------------------------------- happiness7 Search in interface code source https://github.com/MOUZU/Blizzard-WoW-Interface ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/10237-craftingauction-house-documentation/ TITLE: Crafting/Auction house Documentation ---------------------------------------------------------------------------------------------------- Unknown Hello. I'm looking for methods that would help me make some crafting plugin. I found some profiles posted here and some snipets but is there any documentation or api? ---------------------------------------- Unknown No documentation. You can decompile the binaries to look at methods. Other than that, look at free plugins and code snippets here to see what's possible. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/10255-keeping-track-of-time-stop-watch-possible/ TITLE: Keeping track of time / Stop watch possible? ---------------------------------------------------------------------------------------------------- Unknown Hey there, is it possible to somehow keep track of how much time has passed in a quester profile? ---------------------------------------- Unknown Use relogger. It tracks that kinda stuff. ---------------------------------------- Unknown Sorry, might have stated that wrong. I'd like to keep track of time wihtin a quester profile, like getting start time at the beginning of the profile, then doing stuff and checking at the end how much time has passed. ---------------------------------------- Unknown Var.SetVar("startTime", Datetime.Now); ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/10292-how-to-check-if-target-is-in-a-vehicle/ TITLE: How To Check If Target Is In a Vehicle ---------------------------------------------------------------------------------------------------- Unknown The title says it all. How do I check if my target is in a vehicle? ---------------------------------------- Unknown Hello, wManager.Wow.ObjectManager.ObjectManager.Target.InTransport ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/10297-add-mount-in-quest-profile-help/ TITLE: add mount in Quest profile help ---------------------------------------------------------------------------------------------------- Unknown Hi all , i new in this forum and Create profile for my private server and i have question about add mound afted learn him to my Quest profile I use code from this topic I add Step Run code wManager.wManagerSetting.CurrentSetting.GroundMountName = "Warhorse";    (Paladin,spell already have) but lines in settings  GroundMountName is empty Server 3.3.5a WOLTK ---------------------------------------- Unknown Do you have "Save General Settings modified by the profile" enabled? Otherwise all changes are just for the running session and will be erased after pressing stop. Kind Regards. ---------------------------------------- Unknown I tried to add this option, it seems to work, but the line is still empty Thanks ---------------------------------------- Unknown wManager.Wow.Forms.UserControlTabGeneralSettings.ReloadGeneralSettings(); Call this function once after modifying settings. Updates the wRobot UI ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/10364-include-safe-list-by-id-in-cs-foreach-iteration/ TITLE: Include safe-list by ID in CS foreach Iteration? ---------------------------------------------------------------------------------------------------- Unknown So from a great plugin called Butler Im trying to add a bit more functionality to what is trashes. Id like to include a safelist by item ID. The below code is what I have so far. Obviously item.GetItemInfo.ItemID==12345 isnt valid, but I think its clear what Im trying to do. If itemID of 12345 is found on the safelist, then do not continue onto destruction. Even if I can get a clue as to how to fill in a single item here, I can create an array later to fill in other IDs. private void PulseDestroy () { if ( ButlerSettings . CurrentSetting . DestroyGray ) { foreach ( WoWItem item in bagItems ) { if ( item . GetItemInfo . ItemRarity == 0 || item . GetItemInfo . ItemRarity == 1 && ! item . GetItemInfo . ItemID == 12345 ) { while ( ObjectManager . Me . InCombat || ObjectManager . Me . IsDead ) { Thread . Sleep ( shortDelay );} List < int > BagAndSlot = Bag . GetItemContainerBagIdAndSlot ( item . Entry ); Logging . Write ( ButlerPrefix + "destroying \"" + item . GetItemInfo . ItemName + "\"" ); Lua . LuaDoString ( string . Format ( "PickupContainerItem({0}, {1}); DeleteCursorItem()" ,( object ) BagAndSlot [ 0 ],( object ) BagAndSlot [ 1 ]), false ); Thread . Sleep ( shortDelay ); } } } } ---------------------------------------- Unknown | 2018-11-13T17:07:33Z Hello you can use a hashset for this purpose like this: private HashSet safeList = new HashSet { 12345 , 12346 , } private void ProtectItem ( WoWItem item ) { safeList . Add ( item . GetItemInfo . ItemId ); } private void ProtectItem ( int itemId ) { safeList . Add ( itemId ); } private void PulseDestroy () { if ( ButlerSettings . CurrentSetting . DestroyGray ) { foreach ( WoWItem item in bagItems ) { if (( item . GetItemInfo . ItemRarity == 0 || item . GetItemInfo . ItemRarity == 1 ) && ! safeList . Contains ( item . GetItemInfo . ItemId )) { while ( ObjectManager . Me . InCombat || ObjectManager . Me . IsDead ) { Thread . Sleep ( shortDelay ); } List BagAndSlot = Bag . GetItemContainerBagIdAndSlot ( item . Entry ); Logging . Write ( ButlerPrefix + "destroying \"" + item . GetItemInfo . ItemName + "\"" ); Lua . LuaDoString ( string . Format ( "PickupContainerItem({0}, {1}); DeleteCursorItem()" , ( object ) BagAndSlot [ 0 ],( object ) BagAndSlot [ 1 ]), false ); Thread . Sleep ( shortDelay ); } } } } Edited November 13, 2018 by reapler ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/10385-check-for-hostiles-units-behind-player/ TITLE: Check For Hostiles Unit(s) Behind Player ---------------------------------------------------------------------------------------------------- Unknown Hi, I am having problems understanding IsBehind. I would like to check if there are any mobs behind me. I am trying to add a backpedal feature to my fight class, but I don't think I am getting it correct. Here's what I tried: var EnemiesBehind = new List < WoWUnit >(); EnemiesBehind . AddRange ( ObjectManager . GetWoWUnitHostile (). Where ( u => u . IsValid && ! u . InCombat && u . IsAlive && u . IsBehind ( Player . Position , 180.0f ) && u . GetDistance <= Settings . BackpedalScanRange ). OrderBy ( o => ObjectManager . Me . Position . DistanceTo ( o . Position ))); if ( EnemiesBehind != null && EnemiesBehind . Count > 0 ) { MyFunctions . LogDebug ( "Enemy, (" + EnemiesBehind . FirstOrDefault (). Level + ")" + EnemiesBehind . FirstOrDefault (). Name + " found behind you, skipping backpedal!" ); Var . SetVar ( "CanBack" , false ); return ; } Any help is much appreciated! Thank you! Image Reference: ---------------------------------------- Pudge I may have something here if anyone is interested. It still needs more testing though. Code: private void FightEventsOnFightStart ( WoWUnit wowUnit , CancelEventArgs cancelable ) { try { if ( Settings . Backpedal ) Var . SetVar ( "CanBack" , true ); } catch ( Exception ex ) { MyFunctions . LogWrite ( "FightEventsOnFightStart() Exception:" + Environment . NewLine + ex . ToString (), true ); } } private async void FightEventsOnFightLoop ( WoWUnit wowUnit , CancelEventArgs cancelable ) { Random _rand = new Random (); bool _playerAggro = false ; bool _playerStuck = false ; #region Backpedal if ( Settings . Backpedal && // Make sure Include Backpedal is TRUE in Settings (! Player . IsPartyMember || ObjectManager . Me . IsInGroup ) && // Let's not backpedal in groups! Var . Exist ( "CanBack" ) && // Make sure our Variable exists Var . GetVar ( "CanBack" ) && // Make sure the Variable is TRUE Player . InCombat && // Make sure Player is in combat ! Player . IsIndoors && // Skip if Player is indoor ! Player . IsCast && // Make sure the Player is NOT casting Target . IsAlive && // Make sure the Target is valid Target . IsTargetingMe && // Make sure the Unit is Targeting the player ! wowUnit . IsCast && // We don't want to backpedal from a casting target! MyFunctions . TargetInCooldownLevelRange ()) // Target level is > Settings CD lvl { try { // Player.IsFacing(Vector3 targetPosition, [float arcRadians = 0.2]) // Player.IsFacing(u.Position, 1.5f) // 1.5 radians = 85.9 degrees || Arc Length = 37.5yd || Sector Area = 468.75 yd^2 var EnemiesInFrontPlayerNearTarget = ObjectManager . GetWoWUnitHostile (). Where ( u => u . IsValid && u . IsAlive && ! u . InCombat && Player . IsFacing ( u . Position , 1.5f ) && Player . Target != u . GetBaseAddress && u . Position . DistanceTo ( Target . Position ) <= Settings . BackpedalScanRadius && ( u . Reaction == Reaction . Hated || u . Reaction == Reaction . Hostile || u . Reaction == Reaction . Unfriendly )). OrderBy ( o => Player . Position . DistanceTo ( o . Position )). ToList (); var EnemiesBehindPlayer = ObjectManager . GetWoWUnitHostile (). Where ( u => u . IsValid && u . IsAlive && ! u . InCombat && ! Player . IsFacing ( u . Position , 1.5f ) && Player . Target != u . GetBaseAddress && u . Position . DistanceTo ( Player . Position ) <= ( Settings . BackpedalScanRadius + ( Settings . BackpedalScanRadius / 2 )) && ( u . Reaction == Reaction . Hated || u . Reaction == Reaction . Hostile || u . Reaction == Reaction . Unfriendly )). OrderBy ( o => Player . Position . DistanceTo ( o . Position )). ToList (); if ( EnemiesInFrontPlayerNearTarget != null && EnemiesInFrontPlayerNearTarget . Count > 0 ) { foreach ( WoWUnit unit in EnemiesInFrontPlayerNearTarget . Take ( 3 )) { MyFunctions . LogDebug ( "Backpedal -> Enemy (Front): " + unit . Level + "-" + unit . Name + " (Distance: " + System . Math . Round ( Player . Position . DistanceTo ( unit . Position ), 3 ) + "yd" ); } WoWUnit NearestFrontUnit = EnemiesInFrontPlayerNearTarget . FirstOrDefault (); if ( EnemiesBehindPlayer != null && EnemiesBehindPlayer . Count < 1 ) { var timer = new robotManager . Helpful . Timer ( _rand . Next ( 3000 , 4000 )); var timerCheckDistance = new robotManager . Helpful . Timer ( _rand . Next ( 1500 , 2250 )); Vector3 PlayerStartPos = Player . Position ; int EnemyCountBegin = MyFunctions . HostileUnitsInRange ( 100.0f ); MyFunctions . LogDebug ( "Backpedal -> Found no enemies behind you. Begin Backpedal" ); if ( wowUnit != NearestFrontUnit && ! _playerAggro ) { Move . Backward ( Move . MoveAction . DownKey ); while (! _playerStuck && (! timer . IsReady || wowUnit . Position . DistanceTo ( NearestFrontUnit . Position ) <= Settings . BackpedalScanRadius )) { if ( Player . GetMove && wowUnit . IsCast ) { MyFunctions . LogDebug ( "Backpedal -> Your target is casting; Stopping movement" ); Var . SetVar ( "CanBack" , false ); break ; } if ( MyFunctions . HostileUnitsInRange ( 100.0f ) != EnemyCountBegin ) { MyFunctions . LogDebug ( "Backpedal -> Enemy count changed, you may have aggro'd something; Stopping movement" ); Var . SetVar ( "CanBack" , false ); break ; } if ( timerCheckDistance . IsReady && Player . Position . DistanceTo ( PlayerStartPos ) < 1 ) just over a 1.5 sec . { MyFunctions . LogDebug ( "Backpedal -> Player might be stuck; Stopping movement" ); _playerStuck = true ; Var . SetVar ( "CanBack" , false ); break ; } if ( Player . Position . DistanceTo ( NearestFrontUnit . Position ) > Settings . BackpedalScanRadius ) { MyFunctions . LogDebug ( "Backpedal -> Distance is greater than " + Settings . BackpedalScanRadius + " yards; Stopping movement" ); Var . SetVar ( "CanBack" , false ); break ; } if ( Settings . BackpedalScanRadius > 0 && Player . Position . DistanceTo ( PlayerStartPos ) > Settings . BackpedalScanRadius ) { MyFunctions . LogFight ( "Backpedal -> Player has moved more than " + Settings . BackpedalScanRadius + " yards; Stopping movement" ); Var . SetVar ( "CanBack" , false ); break ; } if ( TraceLine . TraceLineGo ( wowUnit . Position )) { MyFunctions . LogFight ( "Backpedal -> Your target is out of line of sight; Stopping movement" ); Var . SetVar ( "CanBack" , false ); break ; } Thread . Sleep ( 100 ); return ; } } } else if ( EnemiesBehindPlayer != null && EnemiesBehindPlayer . Count > 0 ) { foreach ( WoWUnit unit in EnemiesBehindPlayer ) { MyFunctions . LogDebug ( "Backpedal -> Enemy (Back): " + unit . Level + "-" + unit . Name + " (Distance: " + System . Math . Round ( Player . Position . DistanceTo ( unit . Position ), 3 ) + "yd" ); } MyFunctions . LogDebug ( "Backpedal -> Skipping movement" ); Var . SetVar ( "CanBack" , false ); return ; } } } catch ( Exception ex ) { MyFunctions . LogWrite ( "FightEventsOnFightLoop -> Backpedal Exception:" + Environment . NewLine + ex . ToString (), true ); } } } ---------------------------------------- Matenia Hello, you need to use IsBehind like that: u . IsBehind ( ObjectManager . Me . Position , ObjectManager . Me . Rotation ); ObjectManager . Me . IsBehind ( u . Position , u . Rotation ); you can also use: MovementManager . IsFacing ( Me . Position , Me . Rotation , u . Position , 2.20f ) ---------------------------------------- @Droidz Hey @Droidz thank you again! ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/10424-force-bot-to-attack-tagged-mobs/ TITLE: Force bot to attack tagged mobs? ---------------------------------------------------------------------------------------------------- Unknown Hi, So I'm currently working on a 'tag and bag' plugin (an adaptation of Matenia's 'PartyHelperPlugin' which I will be releasing with source code when I'm finished -- credits to Matenia for base code & advice on how to get started ? ). The way this plugin functions is very similar to Matenia's plugin, however the leader does not invite the followers, they never join a party together, and consequently, to the best of my knowledge there is no way to use Lua SendAddonMessage, so that functionality is not being used. (EDIT: After doing some research I believe I can use SendAddonMessage thru the whisper channel, so that's a plus ? ) I have everything working aside from a NullReferenceException that occurs when the leader is not targeting anything - but I think I can figure that one out on my own. The only issue I have is the follower bots hesitating to attack the tagged mobs & not using their FightClass rotation as a result. What happens is, the followers will sort of wig out and go from attacking to following constantly, in a back & forth kind of way. They target, maybe auto-attack the mobs for a second, then go back to following me, rinse & repeat. I'm currently just using Fight.StartFight(guid), however is it possible to make the followers (or any character in general) ignore the fact that it's attacking a tagged mob and proceed anyways without interruption? The API is very hard to understand as there is no clear explanation on what most methods/functions do, since I am only relying on a decompiler to access them. TL;DR is there a way in C# to force a bot to attack a tagged mob? Thanks, R ---------------------------------------- Matenia Because you must do several states of the bots ( follow state , attack state etc ) when the bot recognize a state it will only do the part which is proper for current moment. Imagine you wanna sit, stand, and run in the same time in real life. The bot is doing exactly that ? ---------------------------------------- Unknown The bot attacks tagged mobs by default unless you have a plugin enabled that stops that (HMP for example) ---------------------------------------- Unknown Hmm, well I haven't had anything but my Plugin enabled and yet they both still do it. When running wrotation, if the follower attacks first, the follower will kill the mob and use its FightClass, but the leader won't. Vice versa, the same happens but this time the follower won't attack. I have to look into this more, I admittedly don't fully understand this system yet but based on Matenia's code it shouldn't be any different than it was, I haven't changed anything about the states yet. ---------------------------------------- Unknown | 2018-11-25T10:10:30Z Wrobot has an option like "can attack units already in combat" that might play into it. There's also a plugin for attacking tabbed targets of a main character. You might be able to look at the source or decompile it. Also, StartFight has a bunch of arguments Edited November 25, 2018 by Matenia ---------------------------------------- @Droidz Yea, I checked the "can attack units in combat" setting and they were turned off on both; I thought I finally figured it out but it's no different. I also decompiled that plugin you were talking about (it's called 'PartyTagger') and attempted to apply what he did to my code, no difference. Finally, I tried just using that plugin on my follower but even still it does not work. It's strange, it may be a bug. I'll keep researching and try to find a way to make this work. @Droidz do you know of a way to do this? ---------------------------------------- Unknown public static ulong StartFight ( ulong guid, bool skipIfPlyerAttackedButNotByTheTarget = true , bool managerMovement = true , bool stopIfPlayerTargetChange = false , bool rotationBot = false ) Maybe some of these parameters are responsible. I also saw that wManagerSetting.CurrentSetting.DetectEvadingMob is considered. ---------------------------------------- Unknown Hello, sometime option "max unit near" can force bot to avoid mobs ---------------------------------------- Unknown | 2018-11-25T21:34:40Z I've been messing around with these but I haven't seen anything work yet, part of what the PartyTagger plugin did was specify all of these to 'true' except 'stopIfPlayerTargetChange' which is left false. DetectEvadingMob is also false (have tested 'true' just for shits and giggles but that doesn't fix it). On a side note, this is what gets logged when the follower tries to attack. Implicit but could be useful. I thought of that too, however the mobs I'm attacking are neutral (not hostile) and this doesn't change anything so I don't think that setting is playing into it ? . EDIT: Aha! I finally figured it out. It was in the FightClass: I had been using the default FightClasses 'Rogue.cs' and 'Warrior.cs' and I can't believe it hadn't crossed my mind to be in there until now. For future reference, if anyone else has this issue and can't figure out wtf it might be, check your FightClass and make sure there isn't any code in there that checks whether it's tapped or not. Search for "Tapped" or "Tagged' (I know for a fact that there's a C# bool in WoWUnit that is able to check if a target is tapped too, so make sure that isn't in there either.) All I did to make it work was comment this portion out: It now works without interruption. Time to remove all of that crap code and condition checking I put all over FightAssist. Thanks for your help everyone, I'm sure this issue is more than well enough documented now ? Edited November 25, 2018 by RADON resolved issue ---------------------------------------- Unknown Since I have this and the NullReferenceException fixed, if anyone cares I will be releasing this w/ source shortly, once I figure out a workaround for SendAddonMessage (WHISPER and CHANNEL types were added after classic so I can't use it). Running it on one of my alts and it's working near perfectly. ---------------------------------------- Unknown Either use SendChatMessage with whisper or make all bots join a new invisible channel then use SendChatMessage for that ---------------------------------------- Unknown Got it, just finished implementing SendChatMessage with whisper for now, everything seems to work. I'll upload when I get home from work tomorrow. (~12hrs) ---------------------------------------- Matenia Done! ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/10511-relogger-start-with-auto-start-checked/ TITLE: Relogger start with auto "Start Checked" ---------------------------------------------------------------------------------------------------- Unknown Hey is there any way to start the Relogger.exe while automatically performing "Start Checked"? I tried it with AutoIt but it doesn't capture the button. Maybe some args by starting it from command prompt? ---------------------------------------- Unknown Hello, yes use shortcut "Relogger Quick Launch" to launch relogger. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/10521-how-do-execute-commands-during-looting/ TITLE: How do execute commands during looting? ---------------------------------------------------------------------------------------------------- Unknown The bot will run through aggressive mobs when it is in the looting phase. Is it possible to have the bot check for targets near your target before running to loot? If ( Looting = true && additional Mob is found within 30 yards of your lootable target && same additional mob is also within 30 yards of ME && same additional mob = aggressive ) { Target additional mob ; begin combat ; } I was also hoping that I could put a 1 second strafe while running toward the mob to loot. If (currently running toward dead target to loot) { Move.StrafeLeft(Move.MoveAction.DownKey); thread.sleep(1000) Move.StrafeLeft(Move.MoveAction.UpKey); do not perform this action more than once per looting; } I am not sure if this is possible as the loot function looks to be built in to wrobot and not in to the fightclass. Are either of these things possible? ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/10727-stop-objectmanager-updates/ TITLE: Stop ObjectManager updates? ---------------------------------------------------------------------------------------------------- Unknown Hey Droidz, I noticed sometimes ObjectManager is updated while I iterate it in my rotation. If I use a lot of checks on units in the ObjectManager, it can slow down my rotations a lot. Sometimes iterations jump from 50ms to 500ms ("randomly") I noticed especially on TBC, this is because the ObjectManager in game gets huuuuge and wRobot takes a "long" time on every update. I noticed (I think) ObjectManager gets locked during these updates and the lock makes my thread wait. Sometimes, this lock can happen two or three times during one iteration, if I get unlucky. One way to prevent this would be to deepcopy the entire ObjectManager (or use my own implementation, reading directly from memory with wRobot API). Both of this would be a loooot of work. Therefore I have a question, something that would be way easier: Can I stop ObjectManager from behind updated manually? Pseudo code here: ObjectManager . DisablesUpdates (); for ( spell in spells ) { if ( spell . AllConditionsTrue ()) { spell . Cast (); break ; } } ObjectManager . EnableUpdates (); ---------------------------------------- Unknown Hello, In next update lock object will be public (wManager.Wow.ObjectManager.ObjectManager.Locker) But it is hard to tell if it is the problem, you lock wow frame when you run this code (wManager.Wow.Memory.WowMemory.LockFrame();)? (500ms seem a lot to refresh objectmanager), you can try to use program like JetBrains dotTrace to check. And I think the best for you is to request object list one time like: ---------------------------------------- Unknown I was locking frames before, that's why it confused me, that sometimes iterations took 400ms+. Currently rewriting my rotation framework for TBC. Will try locking frames again and let you know. I think storing all units by reference is a good idea. I will look into that. If I still have any problems after next update, I will get back to you. Thanks! ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/10730-more-questions-from-a-novice-programmer/ TITLE: More questions from a novice programmer. ---------------------------------------------------------------------------------------------------- Unknown Hello everyone, I'm missing the forum because I'm dedicating myself to Python programming studies and I'm still getting married this year (I'll make a good amount of money to make my fiancée happy ? ). I stopped playing for a while, but I'm going back and now I want to start learning C #. 1 - I did a quick search on goole and saw that C # is in version 7.x, s I want to start developing for wow 3.3.5 that will work? Or will I have to apprehend the C # version of the time that wow 3.3.5 was released? 2 - What topic on the internet do I have to find, about C # to start? (Correct me if I'm wrong.) Example: I believe the first thing I should learn is, how to write and read in memory using C #. (I want to study how a bot works, perhaps by creating my own bot. 3 - In my old Honorbuddy folders I found my old combat routine bot, (the best I've ever used) TuanHAWarriorLegion, I found some files (attached) that I find interesting, I would like an equivalent for version 3.3.5, would anyone? DispellASAPDefault.xml InterruptOnlyDefault.xml ---------------------------------------- Garub It depends, if you compile yourself any framework version should work. If you let for example WRobot compile your C# files(.cs) it will be on C# 4.0 / net framework 4.0. Prefered would be a higher version. https://stackoverflow.com/questions/247621/what-are-the-correct-version-numbers-for-c At first a small project like a plugin for WRobot is good enough to start off, later you may take other sources as reference and improve your code style, structure & performance preferably with C# projects on github or here at the download section. If the goal is to create a bot, you can also just start your own project and take other bot sources as reference. It is also advisable to google as much you can to follow the best practices and apply it to the code. Recommend tools: Visual Studio(IDE) DotPeek(Decompiler) - if you would like to view the API Recommend links: https://github.com/ - Many open source projects to explore http://stackoverflow.com - For me a good a resource on things like how to do X https://www.dotnetperls.com - Good & small code examples for handling different tasks https://docs.microsoft.com/en-us/dotnet/framework/index - C# / Net framework reference https://docs.microsoft.com/en-us/dotnet/framework/wpf/getting-started/walkthrough-my-first-wpf-desktop-application - Create your own app with Wpf Bot sources: https://github.com/miceiken/IceFlake https://github.com/tanis2000/babbot/ https://github.com/Zz9uk3/ZzukBot_V3 ---------------------------------------- Unknown Can someone answer me question 3? Please. ^^ ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/10743-stop-auto-picking-targets/ TITLE: Stop auto picking targets ---------------------------------------------------------------------------------------------------- Unknown I'm trying to get a Priest Fight Class going that can heal party members. I have the bot able to recognize a party member needs to be healed, and it will target the party member and cast Lesser Heal; however, the wRobot product then changes the bot's target to a hostile mob so the Lesser Heal gets cast on itself in the end instead of the party member that needs to be healed. I'm trying to search around the forums, and the unofficial documentation and try some stuff, but I'm not finding the proper way to stop the auto targeting from happening. I think this could be useful in other scenarios too, like getting a Warlock to fear a target when there's multiple enemies, and then ignoring the feared target so it stays away. ---------------------------------------- Unknown Hello, what product du you use? ---------------------------------------- Unknown interesting reads from absolutely ages ago: https://wrobot.eu/forums/topic/7541-switch-target-polymorph-switch-to-original-target/ https://wrobot.eu/forums/topic/7507-solved-move-after-frost-nova-is-it-really-that-hard/ ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/10880-c-code-to-interact-with-npc/ TITLE: C# code to interact with NPC ---------------------------------------------------------------------------------------------------- Serrec Hello, What is the c# code to interact with npc and for example choose train and train herbalism? Regards ---------------------------------------- Unknown ok I figured out how to go to him and pick train, but what is the command to train? wManager . Wow . Bot . Tasks . GoToTask . ToPositionAndIntecractWithNpc ( new Vector3 ( - 8969.99f , 779.636f , 95.89193f ), 5566 , 1 , false ); Now I just need the command "train" what is it? ---------------------------------------- Unknown { wManager.Wow.Helpers.Usefuls.SelectGossipOption(wManager.Wow.Enums.GossipOptionsType.trainer); wManager.Wow.Helpers.Trainer.TrainingSpell(); } ---------------------------------------- Unknown its working thanks ? ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/10887-how-do-i-use-pathfinderfindpath/ TITLE: How do I use Pathfinder.Findpath? ---------------------------------------------------------------------------------------------------- Unknown Hello, So i made a plugin that trains herb and skinning it works, but when my bot is for example in elwyn forest he wants to go to stormwind in straight line through the mountains.. he wants to use this code: wManager.Wow.Bot.Tasks.GoToTask.ToPositionAndIntecractWithNpc(new Vector3(-8969.99f, 779.636f, 95.89193f), 5566, 1, false); So I tried code below, but its not working he keeps trying to go in straight line to sw.. help me out how do I use the pathfinder? var position = new Vector3 (- 8969.99f , 779.636f , 95.89193f ); int npcEntryId = 6929 ; Logging . Write ( "bindloc: " + bindLocation ); //while (bindLocation != "Stormwind") //Logging.Write(ObjectManager.Me.Position.ToString()); var lo = PathFinder . FindPath ( ObjectManager . Me . Position , position ); Logging . Write ( lo . ToString ()); foreach ( Vector3 waypoint in lo ) { Logging . Write ( waypoint . ToString ()); // Move to the given position MovementManager . Go ( PathFinder . FindPath ( waypoint ), false ); // Loop while ( MovementManager . InMovement && Conditions . InGameAndConnectedAndAliveAndProductStartedNotInPause ) { ObjectManager . Me . Position . DistanceTo2D ( waypoint ) > 1.5 // Wait follow path Thread . Sleep ( 10 ); } } ---------------------------------------- Unknown wierd it started working lol, but the movement is very bottish, he moves from 1 waypoint to the next one and stops there for a second ---------------------------------------- Unknown Hello, it is more like that: var position = new Vector3 (- 8969.99f , 779.636f , 95.89193f ); int npcEntryId = 6929 ; Logging . Write ( "bindloc: " + bindLocation ); //while (bindLocation != "Stormwind") //Logging.Write(ObjectManager.Me.Position.ToString()); var lo = PathFinder . FindPath ( ObjectManager . Me . Position , position ); Logging . Write ( lo . ToString ()); MovementManager . Go ( lo ); // Loop while ( MovementManager . InMovement && Conditions . InGameAndConnectedAndAliveAndProductStartedNotInPause ) { Thread . Sleep ( 10 ); } MovementManager . StopMove (); ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/10971-auto-equip-wotlk/ TITLE: Auto-equip WOTLK ---------------------------------------------------------------------------------------------------- Unknown Hi all, tell me how to implement auto-equipment items during leveling? ty ---------------------------------------- Unknown Free Butler plugin in the wotlk plugin section ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/10981-how-to-select-best-quest-reward-option/ TITLE: How To Select Best Quest Reward Option ---------------------------------------------------------------------------------------------------- Unknown Howdy y'all! What I'm Doing Here again because I need help (again)! I'm working on a project to simplify/automate more of the profile creation process. I'm not a baller with C# and LUA like so many of y'all, but I have figured out that, with the exception of actual coordinates (which, for NPCs can be gotten manually with Droidz cool helper tool, but will otherwise have to be done manually until such time we can convert from Zygor --> WRobot). I'll post the final python script once it's functional (can save hours and also lets you have the profile give incredibly useful logging). The Question Anyways, my current issue is that I can't figure out how to have the profile select the best reward option per class. If Zygor and other addons can do it, it seems to me it should be possible to have WRobot make the same calculation to determine which item will be the largest upgrade for the character...no? If not, there should be a way to at least pair classes/specs? with rewards and just use that to make decisions without accounting for equipped items or anything. What do we figure would be the best database to use (or code to cannibalize) to automate this? ---------------------------------------- Unknown Don't bother with that. You need ingame info, tooltip parsing and your own stat weights. HMP can do and so can wTrainer. There are already plugins intercepting wRobot behavior, you don't really need to try and put that into your quester. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/8228-blacklist-events/ TITLE: Blacklist events? ---------------------------------------------------------------------------------------------------- @Droidz Hello @Droidz are there any blacklist events for when the bot does this? My problem: Bot blacklists this NPC (I think because it can't make a path? I don't understand it tbh, it should be able to make a path perfectly, at least within 5 yards, but there is a small counter around the npc). I don't know about this blacklist and select the same NPC over and over => bot never goes to vendor because it always choosest the unreachable vendor. So can I somehow access what vendor the bot blacklists when it happens, so I can add npcEntry to my own blacklist? ---------------------------------------- Unknown Hello, I comeback here when is added ---------------------------------------- Matenia I forgot to say it here, but I added that a while ago. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/9406-wow-vanilla-100-afk-workaround-zeppelin-og-uc-uc-og-and-2x-boat-wetlands-darkshore-darkshore-teldrassil/ TITLE: WOW Vanilla - 100% AFK Workaround Zeppelin OG-UC, UC-OG and 2x Boat - Wetlands-Darkshore - Darkshore-Teldrassil ---------------------------------------------------------------------------------------------------- Nosferatuepic Hi, i play on vanilla right now and had some problems with zeppelin and boats. So I made a few workarounds for that and spent some hours to make it work. Boat travel seems to be buggy on vanilla. Thats why i made these profiles. (I needed an afk solution to go to weapon vendors, for horde sword trainer in uc and for alliance bows weapon trainer in darnassus) Short explanation of the files: zepognachucvanilla.xml - Zeppelin Orgrimmar to Undercity zepucnachogvanilla.xml - Zeppelin Undercity to Orgrimmar testboot.xml - Boat loop - Wetlands to Darkshore testboot2darkshoreteldrassil - Boat loop - Darkshore to Teldrassil For boat travel i made a loop...i dont know when the ship is there, so i wait and go to coord, if ship is not there i fall in the water and repeat it... till the ship is there and my wait delay hits and travel to other continent begins. You can be lucky and you can stay on the boat in a few minutes or it takes 1 hour depending on your luck but at least it is afk able. For the second ship route i had more problems, it is from darkshore to teldrassil. I also have a infinite loop and a distance check to an npc near the boat entry. I also had to deactivate path-finder for a while not to get stucked. Furthermore i enabled spirit healer because in teldrassil, i dont know if my classic server is bugged but when i jump from the boat my char swims into the big ocean. So after dead, you will use spirit healer and you arrived in teldrassil. Now you can path to darnassus without any problems. It is for Wow vanilla only! On other addons, you must change some coords probably. Have fun, inselmann zepognachucvanilla.xml zepucnachogvanilla.xml testboot.xml testboot2darkshoreteldrassil.xml ---------------------------------------- Unknown Wetlands to darkshore broken, he just jump in water and wait again ship, then again jump in water ---------------------------------------- Unknown There is a much smarter way. You can detect the boats as gameobjects. With that you can check if the Boat is in its waiting place, then you fire the code to enter the Boat. If you need example code: Add me on Discord. Bambo#6404 ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/10011-how-to-build-custom-product/ TITLE: How to build custom product ---------------------------------------------------------------------------------------------------- Unknown I used the Party Mode in the 5-person dungeon and found that there were some problems that needed to be modified. Like:I wanted to follow the MT without entering a name. I wanted to stop following the MT in battle for manual movement. I wanted to ride where I could ride and so on. But I didn't want to re-implement all the party functions. I wanted to make changes based on the existing foundation. How to do it? ---------------------------------------- Unknown You can't. The party product code is not public, but Droidz has posted the grinder code so you can write your own products. I've also released a free party plugin you can take a look at. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/10023-clear-combat-log/ TITLE: Clear combat log? ---------------------------------------------------------------------------------------------------- Unknown | 2018-08-30T22:16:38Z Hi, I have a function checking combat log for specific events and i'm using a for loop to itterate the words to check for possible match, returning true if the text contains those words. My problem is, the functions returns true several times instead of just 1, so i guess i should clear the combat log as soon as it finds one of those words so it won't find those words again until the wow event happens again, but i can't find any way to do that.. Does anyone has the anwser please? :) Edited August 30, 2018 by cedced30 clarification ---------------------------------------- Unknown i'm trying to make this work on vanilla by the way. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/10027-get-equipped-bags/ TITLE: Get equipped bags ---------------------------------------------------------------------------------------------------- Unknown Hey, got some issues when trying to get die ID or name of bags that are currently equipped. Does this return the id of the bag in slot 1? When testing with dev tools I only got some large int numbers, seemed like adresses or wow internal ids. uint bag1 = ObjectManager . Me . GetEquipedItemBySlot ( wManager . Wow . Enums . InventorySlot . CONTAINER_BAG_OFFSET_1 ); Any way to get from this adress to the wow id of the bag or at least the name? Or anyone has a better idea how to get ids or currently equipped bags? Thanks in advance! ---------------------------------------- Unknown You might find what you're looking for in this gist: https://gist.github.com/Marsbars/8042d96df022ce4ef019670d130a72ff It's an unfinished & not working bag plugin. ---------------------------------------- Unknown Thanks! Will take a deeper look at this ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/10042-help-with-plugin-working-50-easy/ TITLE: Help with plugin working 50% (easy) ---------------------------------------------------------------------------------------------------- Unknown Hello, I created a plugin that when it's not in battleground it goes to the gem vendor and buy a gem if honor is enough, otherwise it goes into a "wait position". The problem is when he moves, doesnt matter if to go to the vendor or to the wait position, it moves for like 10 yards, then stops, then moves again, then stops and so on.... It's bottish as hell and I don't understand why this behaviour, why doesnt he run all the way to the destination without stopping every 10 steps? I didn't add any sleep in the code. This is the code using System ; using robotManager . Products ; using wManager . Plugin ; using wManager . Wow . Enums ; using robotManager . Helpful ; using System . Threading ; using wManager . Wow ; using wManager . Wow . Helpers ; using wManager . Wow . ObjectManager ; public class Main : wManager . Plugin . IPlugin { const int HONORREQUIRED = 10000 ; bool _running ; public void Initialize () { _running = true ; while ( _running ) { if ( Conditions . InGameAndConnectedAndAliveAndProductStartedNotInPause && ! Conditions . IsAttackedAndCannotIgnore && ! Battleground . IsInBattleground ()) { var zone = Lua . LuaDoString ( "return GetZoneText()" ); var h = Lua . LuaDoString ( "local points = GetHonorCurrency(); return points;" ); if ( h >= HONORREQUIRED && zone == "Stormwind City" ) { wManager . Wow . Bot . Tasks . GoToTask . ToPositionAndIntecractWithNpc ( new Vector3 (- 5768.91 , 419.931 , 103.921 ), 34081 ); Lua . LuaDoString ( "BuyMerchantItem(9,1)" ); } // Wait Position if ( h < HONORREQUIRED && zone == "Stormwind City" ) { wManager . Wow . Bot . Tasks . GoToTask . ToPosition ( new Vector3 (- 5814.899 , 650.6406 , 94.55161 )); } } } } public void Dispose () { _running = false ; } public void Settings () { } } Can anyone help me figuring how to fix this? Thanks ---------------------------------------- Unknown Any help? ---------------------------------------- Unknown This isn't the solution sadly ---------------------------------------- ScripterQQ | 2018-09-05T11:37:11Z wManager . Wow . Bot . Tasks . GoToTask . ToPosition ( new Vector3 (- 5814.899 , 650.6406 , 94.55161 )); This code is blocking - but your loop should have a Thread.Sleep anyway to keep your CPU from exploding. I'm guessing SOMETHING interrupts your code - so add some logging to see if the above quoted code actually returns anything. It probably breaks early, so maybe try an exitCondition for the function call that's basically just if you're getting attacked. Or do MovementManager.Go(PathFinder.FindPath(vector3)), that will never terminate unless your movement is otherwise interruped (say by fightclass, plugin, etc). On the downside, you need to add a sleep until it reaches the final destination, because it's not blocking. Edit: You could also calculate the path ONCE and then just walk it in your loop. Pseudo code below, I don't have a PC right now, just doing this from the top of my head. using System ; using robotManager . Products ; using wManager . Plugin ; using wManager . Wow . Enums ; using robotManager . Helpful ; using System . Threading ; using wManager . Wow ; using wManager . Wow . Helpers ; using wManager . Wow . ObjectManager ; public class Main : wManager . Plugin . IPlugin { const int HONORREQUIRED = 10000 ; bool _running ; List < Vector3 > pathToFollow = new List < Vector3 >(); public void Initialize () { _running = true ; while ( _running ) { if ( Conditions . InGameAndConnectedAndAliveAndProductStartedNotInPause && ! Conditions . IsAttackedAndCannotIgnore && ! Battleground . IsInBattleground ()) { if (! pathToFollow . IsEmpty () && ObjectManager . Me . Position . DistanceTo ( pathToFollow [ pathToFollow . Count - 1 ]) > 5 ) { MovementManager . Go ( pathToFollow ); //wait until we reach last point or enter combat while ( ObjectManager . Me . Position . DistanceTo ( pathToFollow [ pathToFollow . Count - 1 ]) > 5 ) { Thread . Sleep ( 500 ); if ( Conditions . IsAttackedAndCannotIgnore || ! Conditions . InGameAndConnectedAndAliveAndProductStartedNotInPause ) { break ; } } } var zone = Lua . LuaDoString ( "return GetZoneText()" ); var h = Lua . LuaDoString ( "local points = GetHonorCurrency(); return points;" ); if ( h >= HONORREQUIRED && zone == "Stormwind City" ) { pathToFollow = PathFinder . FindPath ( new Vector3 (- 5768.91 , 419.931 , 103.921 )); wManager . Wow . Bot . Tasks . GoToTask . ToPositionAndIntecractWithNpc ( new Vector3 (- 5768.91 , 419.931 , 103.921 ), 34081 ); Lua . LuaDoString ( "BuyMerchantItem(9,1)" ); } // Wait Position if ( h < HONORREQUIRED && zone == "Stormwind City" ) { pathToFollow = PathFinder . FindPath ( new Vector3 (- 5814.899 , 650.6406 , 94.55161 )); wManager . Wow . Bot . Tasks . GoToTask . ToPosition ( new Vector3 (- 5814.899 , 650.6406 , 94.55161 )); } } Thread . Sleep ( 500 ); } } public void Dispose () { _running = false ; } public void Settings () { } } Edited September 5, 2018 by Matenia ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/10051-number-of-mobs-around-my-target-at-a-given-distance/ TITLE: number of mobs around my target at a given distance? ---------------------------------------------------------------------------------------------------- Unknown Hi, i tried to get the distance between my target and the mobs around it to check if any of them is too close to charge in, the problem is, the bool always returns true and if i try to return the distance between my target and the mob close, it returns 0. Can anyone help pls? i got this so far: public int TotalMobsCloseToMyTarget; private bool IsRangedPullBetter() { List mobsAroundMe = ObjectManager.GetWoWUnitHostile(); foreach (WoWUnit unit in mobsAroundMe) { // nombre de mobs proches de ma target if (unit != null && (unit.Position.DistanceTo(ObjectManager.Me.TargetObject.Position) <= 7.0F && !unit.IsDead)) { DistanceEnemisProches = unit.Position.DistanceTo(ObjectManager.Me.TargetObject.Position); TotalMobsCloseToMyTarget++; return true; } } return false; } ---------------------------------------- Unknown I am not sure if this works, as I have not tested it, but try and play around with this: private bool IsRangedPullBetter () { // Create a list var mobsAroundMe = new List < WoWUnit >(); // Check my target's surroundings for mobs that are valid, alive, attackable, and within // 7 yards of target and sort them in the list from closest to furthest from player's position if ( ObjectManager . Me . HasTarget ) { mobsAroundMe . AddRange ( ObjectManager . GetObjectWoWUnit (). Where ( u => u != null && u . IsValid && u . IsAlive && u . IsAttackable && u . Position . DistanceTo ( ObjectManager . Target . Position ) <= 7.0f ). OrderBy ( n => ObjectManager . Me . Position . DistanceTo ( n . Position ))); } // Number of mobs within 7 yards of my target = mobsAroundMe.Count(); // I may want to use a pull spell if there are more than 2 mobs near my target if ( mobsAroundMe . Count () > 2 ) { return true ; } return false ; } ---------------------------------------- Unknown thanks man :) I found my errors and corrected them in the meantime, here's the working version, i'm using it on my warrior class 1 -, it checks if you have a ranged weapon equiped and if the target is at good distance, if not, returns false. 2 -, If there is only 1 hostile (your target) : -if there is a neutral lvl1+ (not a critter) around your target, it checks if the neutral is closest to you or your target, if the neutral is closest to you, it returns false (no need for ranged pull), if the neutral is closest to your target, it returns true (you can ranged pulll your target). - If there are only critters around your target, it returns false, you can charge in, no danger. 3 if there are more than 1 hostile in a 25m radius, it will return true (ranged pull) I wrote this because my character would do stupid shit like spam cooldowns for 1 or 2 critters or even attack an hostile, then aoe and get aggro from nearby neutral mobs and get killed over and over (fellwood south is horrible for that matter).. private static bool IsRangedPullBetter() { if (ObjectManager.Me.GetEquipedItemBySlot(InventorySlot.INVSLOT_RANGED) == 0 && (ObjectManager.Target.GetDistance < 8 || ObjectManager.Target.GetDistance > 25)) return false; var mobsAroundMyTarget = ObjectManager.GetWoWUnitAttackables().Where(u => u.Position.DistanceTo(ObjectManager.Target.Position) <= 25 && u.IsAttackable); var hostilesAroundMyTarget = ObjectManager.GetWoWUnitHostile().Count(u => u.Position.DistanceTo(ObjectManager.Target.Position) <= 25 && u.IsAttackable); var neutralsAroundMyTarget = ObjectManager.GetWoWUnitAttackables().Count(u => u.Position.DistanceTo(ObjectManager.Target.Position) <= 15 && u.IsAttackable && IsNeutral(u) && u.Level >= 10); var crittersAroundMyTarget = ObjectManager.GetWoWUnitAttackables().Count(u => u.Position.DistanceTo(ObjectManager.Target.Position) <= 10 && u.IsAttackable && IsNeutral(u) && u.Level < 2); if (hostilesAroundMyTarget > 1) { return hostilesAroundMyTarget > 1; } if (crittersAroundMyTarget != 0 && neutralsAroundMyTarget == 0) { return false; } return neutralsAroundMyTarget >= 1 && mobsAroundMyTarget.All(unit => !(unit.Position.DistanceTo(ObjectManager.Me.Position) < ObjectManager.Target.Position.DistanceTo(unit.Position))); } ---------------------------------------- @cedced30 Nice job @cedced30 ! I am glad you were able to fix your problem! Glad to help! Great added feature as well. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/10064-wow-vanilla-taxi-database-empty/ TITLE: WoW Vanilla : Taxi database empty ---------------------------------------------------------------------------------------------------- Unknown Hello, My Taxi database is empty. I have to fill it myself? Where can I find the continent ID? Thank you! ? ---------------------------------------- Unknown Hello, start bot near flightmaster ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/10075-try-function-directly/ TITLE: Try function directly ---------------------------------------------------------------------------------------------------- Unknown Hello ? Is it possible to directly try code without launching the quester? Example: I would like to get the number of available quest that a NPC has with wManager.Wow.Helpers.Quest.GetNumGossipAvailableQuests() How can I use the developer tools to get the result? Thank  you! ---------------------------------------- Unknown Hello, In dev tools run code like robotManager . Helpful . Var . SetVar ( "dbgOutput" , wManager . Wow . Helpers . Quest . GetNumGossipAvailableQuests ()); (select language C# and click on Run code button) ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/10084-mists-of-pandaria-memoryreadint32-main-hand-id/ TITLE: Mists of Pandaria (Memory.ReadInt32) Main Hand ID ---------------------------------------------------------------------------------------------------- Unknown Hello, I was wondering if anyone had the offset value for MoP 5.4.8 (18414) Main hand item id for player as well as unit? Thanks in advance! public static int MainHandId ( WoWUnit unit ) { // Using 3.3.5a(12340) offsets. if ( unit . PlayerControlled ) return wManager . Wow . Memory . WowMemory . Memory . ReadInt32 ( unit . GetDescriptorAddress ( 0x4E4 )); return wManager . Wow . Memory . WowMemory . Memory . ReadInt32 ( unit . GetDescriptorAddress ( 0xE0 )); } ---------------------------------------- Unknown I believe I've seen a list of offsets on owned core. I am at work atm. But i will check when i get home. ? ---------------------------------------- @Ordush Thanks @Ordush I wonder if GetInventoryItemID will work the same? return _mainhandid = Lua . LuaDoString < Int32 >( "GetInventoryItemID(\"target\", 16);" ); ---------------------------------------- @Ordush Try. ? ---------------------------------------- Unknown I cannot seem to get it to work. I am attempting to check if my target is humanoid, in combat, range, and has a weapon in hand before using 'Disarm'. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/10103-pause-plugin-while-fight-class-finishes-combat/ TITLE: Pause Plugin While Fight Class Finishes Combat ---------------------------------------------------------------------------------------------------- Unknown Is it possible to pause a plugin while the player is in combat? In my plugin, if I put a Thread.Sleep, it appears that it sleeps the entire bot thread. ---------------------------------------- Unknown Hello, while ( wManager . Wow . Helpers . Fight . InFight ) System . Threading . Thread . Sleep ( 50 ); ---------------------------------------- @Droidz Of course it was that easy. I should have known. Thanks a lot @Droidz ! Much appreciated! ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/10112-issues-with-combat-after-ressing-when-using-c-fight-class/ TITLE: Issues with combat after ressing when using C# fight class ---------------------------------------------------------------------------------------------------- Unknown I have only been using the bot for a few days, I tried making my own fight class in C#. It works fine except when it decides to pull a big pack of mobs and dies. When it ress it stops running my fight class code, it just runs to the mob auto attacking, not using any spell and the log shows nothing at the time of death or ressurection, not even when showing debug. Dying: :54 - [Fight] Player Attacked by ... :55 - [Fight] Fight stopped :56 - [Resurrect] Player dead Ressing: :46 - [Resurrect] Player retrieve corpse : 47 - [Fight] Player Attacked by ... : 55 - [Resurrect] Player dead I tried twice to stop and start the bot while dead and then it works fine, it is then able to ress and use abilities right away. But everytime it dies and try to ress without a restart it won't use any abilities, just auto attack. Could it be that somehow the fight class is "crashing" when it dies? It doesn't say anything about any issues with it and I don't think it really would do that. I haven't had any issues with this with the xml fight classes you make with the GUI. Any idea what is causing the bot to not use any abilities unless it is restarted after dying? ---------------------------------------- Unknown I'm guessing the loop in your fightclass stops when you die. You should just the condition. ---------------------------------------- Matenia It was a different but similar situation. I used some code that someone else made that would pause the bot for a while if it was a pvp death. But it was written wrong so it only paused the fight class not the entire bot and it triggered if the enemy wasn't same faction as the bot (which caused it to trigger on mobs since they are not same faction...). I should have checked their code better, somehow it sounded like it was good in my head when I read it but ofcourse it isn't. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/10144-feral-drinking/ TITLE: Feral drinking ---------------------------------------------------------------------------------------------------- Unknown I noticed that the default drinking behavior doesn't work for feral druids. I looked at one feral druid fight class and it cancelled cat or bear form if mana was low and the bot was out of combat to get the mana bar out so the default drinking behavior works. I was thinking of making my own feral druid fight class and disable the default drinking/eating and instead make it use the items in my code. I could make it drink like this (but a little bit smarter, just some test code). if (ObjectManager.Me.ManaPercentage < 35 && !ObjectManager.Me.HaveBuff("Drink")) { ItemsManager.UseItem(159); } But is there any way I could make it pause its movement and targetting until it has fullfilled some criterias (enter combat or full mana or lost drink buff). ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/10155-trying-to-use-itemsmanagerhasitembyid-but-with-a-stack/ TITLE: trying to use ItemsManager.HasItemById but with a stack ---------------------------------------------------------------------------------------------------- Unknown hello, trying to do  a warlock fightclass,  and one thing i am working on is trying to have it drain soul shards when im getting low... I tried if (! ObjectManager . Me . IsMounted && ItemsManager . HasItemById ( 6265 ) && ObjectManager . Target . HealthPercent <= 10 ) { // drain soul } works but only checks for one shard... so then tried if (! ObjectManager . Me . IsMounted && ItemsManager . HasItemById ( 6265 ) <= 10 && ObjectManager . Target . HealthPercent <= 10 ) { // drain soul } but doesn't seem to like the idea of stacks... also tried ItemsManager.HasItemStacksById but dont think that exists ? any ideas? ---------------------------------------- zze I have not tried this, but I think this would work: ItemsManager.GetItemCountById(6265) <= 10 HasItemById is just a bool (true/false if we have it or not) ---------------------------------------- Unknown ❤️ thank you ? ---------------------------------------- Unknown next silly question is, how do i get the the bot to path back to the body after it dies? currently just stands still after death :< ---------------------------------------- Unknown It should path back by default. Is it your fight class that blocks it? Maybe try to see if it can path back without a fight class or with some xml fight class to see if the issue is your fight class ---------------------------------------- Unknown its something with the fightclass forsure, without it or with normal xml one it works ? think its just my hacked together thing thats breaking it for some reason ---------------------------------------- zze Maybe you use Sleep somewhere that blocks the code from running (not sure if it would block the pathfinding from running its code). Maybe you need to enclose your buff and combat code in a "if (!ObjectManager.Me.IsDeadMe)". That is the only 2 things I can come up with that could possibly affect it. ---------------------------------------- fantasia after messing around with it more found was just the area desolace being werid with pathing after i died :3 now its working ? if (! ObjectManager . Me . IsMounted && ItemsManager . GetItemCountById ( 6265 ) <= 8 && ObjectManager . Target . HealthPercent <= 15 ) { DrainSoul . Launch (); System . Threading . Thread . Sleep ( 700 ); return ; } thank you very much for you help ? ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/9429-dont-drink-till-full/ TITLE: Don't drink till full ---------------------------------------------------------------------------------------------------- Unknown I want that my char regs with water. Yes i know the setting in wrobot but i want that my char only under circumstances that reg mana. Now my little script: internal bool drinkwater () { if (!ObjectManager.Me.InCombatFlagOnly && ObjectManager.Me.ManaPercentage <= drinkwateronManapercent ) { Logging.WriteFight("drink water " + water ); Fight.StopFight(); wManager.Wow.Helpers.ItemsManager.UseItem("Sweet Nectar"); // Nectar while (!ObjectManager.Me.InCombatFlagOnly && ObjectManager.Me.ManaPercentage < 100 && ObjectManager.Me.IsSitting) { Thread.Sleep(pause); } Fight.StartFight(); return true; } return false; } What is my mistake? ---------------------------------------- Unknown Hello, try to add sleep time beetween " UseItem("Sweet Nectar")" and the "while". but why not use default features for that? ---------------------------------------- Unknown My FightClass ist atm not perfect. Often i am in Cat or Bear Form or i have no water in my bag then WRobot will regen. But i want always when my Char is in normal Form and Manapercentage < 40 and Outfight then my char regs water. ---------------------------------------- Unknown I thought: " ObjectManager.Me.IsSitting  " was not an actual function? ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/9729-tell-bot-to-attack-specific-target/ TITLE: Tell bot to attack specific target? ---------------------------------------------------------------------------------------------------- Unknown Using the quester, is there any way i can tell the bot to attack a specific target. Since  ID's are based on any mob of that kind, I'd like to tell it to attack certain mobs instead. Perhaps based on the vector of that mob? ---------------------------------------- Unknown Hello, if target don't move, you can try to put small search distance ---------------------------------------- Unknown The problem is that the search range is circular, and if it gets close enough to the target that it only reaches that, it will body pull a lot of shit. ? ---------------------------------------- Unknown if the mob is agressiv and don't move you can try to use quest type "FollowPath" (and go to mob position). You can also try  to filter mobs to run code like: wManager . Events . FightEvents . OnFightStart += delegate ( WoWUnit unit , CancelEventArgs cancelable ) { if ( unit . Entry != 1234 || ! Quest . HasQuest ( 1234 ) || unit . InCombatWithMe ) return ; if ( unit . Guid != 12345645678 ) { wManager . wManagerSetting . AddBlackList ( unit . Guid , 1000 * 60 , true ); cancelable . Cancel = true ; } }; (complete the questid, entry and mob GUID, GUID is normally the same on all server and unique) ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/9735-modifying-wrobot-config/ TITLE: Modifying WRobot Config ---------------------------------------------------------------------------------------------------- Unknown I am using Entity Framework in my project which requires additions to the app.config:
However, if I modify WRobot.exe.config the application will not start. ---------------------------------------- Unknown I figured it out, I programatically registered the types public class WoWClassDbConfig : DbConfiguration {public WoWClassDbConfig() { // Register Entity Framework provider SetProviderServices("MySql.Data.MySqlClient", new MySqlProviderServices()); SetDefaultConnectionFactory(new MySqlConnectionFactory()); } public void SetupConnection(string username, string password, string server) { var entityConnectionStringBuilder = new EntityConnectionStringBuilder { Provider = "MySql.Data.MySqlClient", ProviderConnectionString = $"server={server};user id={username};password={password};persistsecurityinfo=True;database=wowdb;ConvertZeroDateTime=true;SslMode=none", Metadata = "WoWClassicDb.csdl|WoWClassicDb.ssdl|WoWClassicDb.msl" }; entityConnectionStringBuilder.ProviderConnectionString += ";pooling=false"; ConnectionString = entityConnectionStringBuilder.ToString(); } public string ConnectionString { get; set; } } [DbConfigurationType(typeof(WoWClassDbConfig))] public partial class WoWClassicDb : DbContext { public WoWClassicDb(string connectionString) : base(connectionString) { } ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/9780-help/ TITLE: help ---------------------------------------------------------------------------------------------------- Unknown Did you buy wrobot ---------------------------------------- Unknown Hello, Can you share your log file please ( https://wrobot.eu/forums/topic/1779-how-to-post-your-log-file-with-your-topic/ ). ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/9826-goto-mapclick/ TITLE: GoTo MapClick ---------------------------------------------------------------------------------------------------- Unknown Hi, When running the WRotation product you are able to double click on the map(in the wrobot interface) to send a GoTo task to the bot, is this a state or manually built into WRotation? I wish to allow this to be used in a product I'm working on. Cheers, Mars ---------------------------------------- Marsbar Hello, use event "wManager.Wow.Forms.UserControlMiniMap.OnMouseClickEvent" ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/9834-lua-hearthsthone-code/ TITLE: LUA Hearthsthone Code ---------------------------------------------------------------------------------------------------- Unknown wrong forum, sry ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/9845-tsm/ TITLE: TSM ---------------------------------------------------------------------------------------------------- Unknown Ive Been trying to add Restock Functionality to the TSM Plugin But i am getting alot of errors in VS. Could someone help me out. I have removed Mailbox Functionality Because it looks very bottish. using System; using System.Threading; using robotManager.Helpful; using robotManager.Products; using wManager.Plugin; using wManager.Wow.Bot.Tasks; using wManager.Wow.Helpers; // Token: 0x02000002 RID: 2 public class Main : IPlugin { // Token: 0x06000001 RID: 1 RVA: 0x00002050 File Offset: 0x00000250 public void Initialize() { this._isLaunched = true; TSMAuction.Load(); this.WaitAfter = TSMAuction.CurrentSetting.WaitAfter; this.WaitBefore = TSMAuction.CurrentSetting.WaitBefore; this.AuctionerId = TSMAuction.CurrentSetting.AuctionerId; this.TabNumberAuctioning = TSMAuction.CurrentSetting.TabNumberAuctioning; this.PositionAuctioner = new Vector3(TSMAuction.CurrentSetting.PositionAuctionerX, TSMAuction.CurrentSetting.PositionAuctionerY, TSMAuction.CurrentSetting.PositionAuctionerZ, "None"); this.Loop = TSMAuction.CurrentSetting.Loop; this.DepositGuildBank = TSMAuction.CurrentSetting.DepositGuildBank; this.GuildBankId = TSMAuction.CurrentSetting.GuildBankId; this.GuildBankPosition = new Vector3(TSMAuction.CurrentSetting.GuildBankPositionX, TSMAuction.CurrentSetting.GuildBankPositionY, TSMAuction.CurrentSetting.GuildBankPositionZ, "None"); this.MaxPostCount = TSMAuction.CurrentSetting.MaxPostCount; this.SafeGoldCount = TSMAuction.CurrentSetting.SafeGoldCount; this.RestockItems = TSMAuction.CurrentSetting.TSMRestockItems; while (this._isLaunched) { Thread.Sleep(this.WaitBefore); this.InteractWithNPCAndCancell(); while (!this.CancelButtonVisible() && !this.DoneCanceling()) { Thread.Sleep(3000); } this.CancelAllItems(); this.SellItems(); Thread.Sleep(this.WaitAfter + 150); } } // Token: 0x06000002 RID: 2 RVA: 0x00002204 File Offset: 0x00000404 public void InteractWithNPCAndCancell() { while (!this.AuctionFrameVisible()) { Logging.WriteDebug("Trying to Interact with NPC"); GoToTask.ToPositionAndIntecractWithNpc(this.PositionAuctioner, this.AuctionerId, -1, false, null, false); Thread.Sleep(3000 + Usefuls.Latency); } Logging.WriteDebug("Starting Cancel Scan"); Lua.RunMacroText("/click AuctionFrameTab" + this.TabNumberAuctioning); Thread.Sleep(1000 + Usefuls.Latency); Lua.RunMacroText("/click TSMStartCancelScanButton"); } // Token: 0x06000003 RID: 3 RVA: 0x00002294 File Offset: 0x00000494 private bool CancelButtonVisible() { return Lua.LuaDoString("return TSMAuctioningCancelButton:IsEnabled()", ""); } // Token: 0x06000004 RID: 4 RVA: 0x000022C0 File Offset: 0x000004C0 private bool AuctionFrameVisible() { return Lua.LuaDoString("return AuctionFrame:IsVisible()", ""); } // Token: 0x06000006 RID: 6 RVA: 0x00002318 File Offset: 0x00000518 private bool PostButtonEnabled() { return Lua.LuaDoString("return TSMAuctioningPostButton:IsEnabled()", ""); } private const int V = 24; private const int V1 = 25; private const int V2 = 26; public object RestockItems { get; private set; } // Token: 0x06000007 RID: 7 RVA: 0x00002344 File Offset: 0x00000544 private void CancelAllItems() { for (int i = 0; i < this.MaxPostCount; i++) { bool flag = this.DoneCanceling(); if (flag) { Logging.WriteDebug("Done Canceling"); break; } bool flag2 = this.CancelButtonVisible(); if (flag2) { wManager.Wow.Helpers.Keybindings.PressKeybindings(wManager.Wow.Enums.Keybindings.ACTIONBUTTON1, 1000); } Logging.WriteDebug("Done Canceling" + this.DoneCanceling().ToString()); Thread.Sleep(2000 + Usefuls.Latency); } } // Token: 0x06000009 RID: 9 RVA: 0x00002440 File Offset: 0x00000640 private void SellItems() { Logging.WriteDebug("Let's sell items!"); GoToTask.ToPositionAndIntecractWithNpc(this.PositionAuctioner, this.AuctionerId, -1, false, null, false); Thread.Sleep(1000 + Usefuls.Latency); Lua.RunMacroText("/click AuctionFrameTab" + this.TabNumberAuctioning); Thread.Sleep(1000 + Usefuls.Latency); Lua.RunMacroText("/click TSMStartPostScanButton"); while (!this.PostButtonEnabled() && !this.DonePosting()) { Thread.Sleep(3000); } for (int i = 0; i < 100; i++) { bool flag = this.PostButtonEnabled(); if (flag) { wManager.Wow.Helpers.Keybindings.PressKeybindings(wManager.Wow.Enums.Keybindings.ACTIONBUTTON2, 1000); } else { bool flag2 = this.DonePosting(); if (flag2) { break; } } Thread.Sleep(2000 + Usefuls.Latency); } wManager.Wow.Helpers.Keybindings.PressKeybindings(wManager.Wow.Enums.Keybindings.ACTIONBUTTON3, 1000); bool depositGuildBank = this.DepositGuildBank; if (depositGuildBank) { Logging.WriteDebug("Let's deposit some Gold"); GoToTask.ToPositionAndIntecractWithGameObject(this.GuildBankPosition, this.GuildBankId, -1, false, null); Thread.Sleep(2000 + Usefuls.Latency); Lua.RunMacroText("/run DepositGuildBankMoney(GetMoney() - " + this.SafeGoldCount.ToString() + "0000)"); } bool flag3 = !this.Loop; if (flag3) { Logging.WriteDebug("End of my work"); Products.ProductStop(); } Lua.RunMacroText("/click AuctionFrameTab1"); Thread.Sleep(1000); Lua.RunMacroText("/click BrowseCloseButton"); Thread.Sleep(1000); } } //craft next button enabled private bool TSMCraftNextButtonEnabled() { return Lua.LuaDoString("return TSMCraftNextButton:IsEnabled()", ""); } //craft next button disabled private bool TSMCraftNextButtonDisabled() { return Lua.LuaDoString("return TSMCraftNextButton:IsDisabled()", ""); } //Restock Code Goes Here private void Restocking() { bool resstockItems = this.ResstockItems; if (resstockItems) { Logging.WriteDebug("Restocking Items"); Thread.Sleep(2000); wManager.Wow.Helpers.Keybindings.PressKeybindings(wManager.Wow.Enums.Keybindings.ACTIONBUTTON4, 1000); Lua.RunMacroText("/click TSMGroups"); Thread.Sleep(2000); Lua.RunMacroText("/click TSMRestockGroups"); Thread.Sleep(2000); { { bool flag = this.TSMCraftNextButtonEnabled(); if (flag) } { Lua.RunMacroText("/click TSMCraftNextButton"); } else { bool flag2 = this.TSMCraftNextButtonDisabled(); if (flag2) { break; { } Thread.Sleep(2000); } } } } } //Restock Code Ends Here // Token: 0x0600000A RID: 10 RVA: 0x000025DC File Offset: 0x000007DC private bool DoneCanceling() { bool flag = Lua.LuaDoString("local f=TSMInfo.statusBar:GetText() return f == 'Done Canceling'", ""); bool result; if (flag) { result = true; } else { bool flag2 = Lua.LuaDoString("local f=TSMInfo.statusBar:GetText() return f == 'Abbrechen abgeschlossen'", ""); result = flag2; } return result; } // Token: 0x0600000B RID: 11 RVA: 0x00002620 File Offset: 0x00000820 private bool DonePosting() { bool flag = Lua.LuaDoString("local f=TSMInfo.statusBar:GetText() return f == 'Done Posting'", ""); bool result; if (flag) { result = true; } else { bool flag2 = Lua.LuaDoString("local f=TSMInfo.statusBar:GetText() return f == 'Erstellen abgeschlossen'", ""); result = flag2; } return result; } // Token: 0x0600000C RID: 12 RVA: 0x00002663 File Offset: 0x00000863 public void Dispose() { this._isLaunched = false; } // Token: 0x0600000D RID: 13 RVA: 0x0000266D File Offset: 0x0000086D public void Settings() { TSMAuction.Load(); TSMAuction.CurrentSetting.ToForm(); TSMAuction.CurrentSetting.Save(); } bool CraftNextButtonDisabled() { throw new NotImplementedException(); } bool CraftNextButtonDisabled() { throw new NotImplementedException(); } // Token: 0x04000001 RID: 1 private bool _isLaunched; // Token: 0x04000002 RID: 2 private bool DepositGuildBank; // Token: 0x04000003 RID: 3 private bool Loop; // Token: 0x04000004 RID: 4 private int AuctionerId; // Token: 0x04000006 RID: 6 private int GuildBankId; // Token: 0x04000007 RID: 7 private int WaitAfter; // Token: 0x04000008 RID: 8 private int WaitBefore; // Token: 0x04000009 RID: 9 private int MaxPostCount; //restockone private int MaxRestockCount; // Token: 0x0400000A RID: 10 private int SafeGoldCount; // Token: 0x0400000B RID: 11 private Vector3 PositionAuctioner; // Token: 0x0400000D RID: 13 private Vector3 GuildBankPosition; // Token: 0x0400000E RID: 14 private string TabNumberAuctioning; } private bool ResstockItems; private bool restockItems; ive also tried to make a true and false button to turn it on and off using System; using System.ComponentModel; using System.IO; using robotManager.Helpful; using wManager.Wow.Helpers; using wManager.Wow.ObjectManager; // Token: 0x02000003 RID: 3 public class TSMAuction : Settings { internal int MaxRestockCount; internal object TSMRestockItems; // Token: 0x0600000F RID: 15 RVA: 0x00002698 File Offset: 0x00000898 public TSMAuction() { this.AuctionerId = 17627; this.PositionAuctionerX = 9648.251; this.PositionAuctionerY = -7129.26; this.PositionAuctionerZ = 16.7754; this.Loop = false; this.DepositGuildBank = false; this.GuildBankId = 187390; this.GuildBankPositionX = 9525.154; this.GuildBankPositionY = -7223.089; this.GuildBankPositionZ = 17.4742; this.TabNumberAuctioning = "5"; this.WaitAfter = 5000; this.WaitBefore = 5000; this.MaxPostCount = 100; this.SafeGoldCount = 500; this.RestockItems = false; } // Token: 0x17000001 RID: 1 // (get) Token: 0x06000010 RID: 16 RVA: 0x000027AA File Offset: 0x000009AA // (set) Token: 0x06000011 RID: 17 RVA: 0x000027B1 File Offset: 0x000009B1 public static TSMAuction CurrentSetting { get; set; } // Token: 0x06000012 RID: 18 RVA: 0x000027BC File Offset: 0x000009BC public bool Save() { bool result; try { result = base.Save(Settings.AdviserFilePathAndName("TSMAuction", ObjectManager.Me.Name + "." + Usefuls.RealmName)); } catch (Exception arg) { Logging.WriteDebug("Dungeoner => Save(): " + arg); result = false; } return result; } // Token: 0x06000013 RID: 19 RVA: 0x00002820 File Offset: 0x00000A20 public static bool Load() { try { bool flag = File.Exists(Settings.AdviserFilePathAndName("TSMAuction", ObjectManager.Me.Name + "." + Usefuls.RealmName)); if (flag) { TSMAuction.CurrentSetting = Settings.Load(Settings.AdviserFilePathAndName("TSMAuction", ObjectManager.Me.Name + "." + Usefuls.RealmName)); return true; } TSMAuction.CurrentSetting = new TSMAuction(); } catch (Exception arg) { Logging.WriteDebug("TSMAuction => Load(): " + arg); } return false; } // Token: 0x17000002 RID: 2 // (get) Token: 0x06000014 RID: 20 RVA: 0x000028C8 File Offset: 0x00000AC8 // (set) Token: 0x06000015 RID: 21 RVA: 0x000028D0 File Offset: 0x00000AD0 [Category("General Configuration")] [DisplayName("AuctionerID")] [Description("")] public int AuctionerId { get; set; } // Token: 0x17000003 RID: 3 // (get) Token: 0x06000016 RID: 22 RVA: 0x000028D9 File Offset: 0x00000AD9 // (set) Token: 0x06000017 RID: 23 RVA: 0x000028E1 File Offset: 0x00000AE1 [Category("General Configuration")] [DisplayName("Wait Time After(ms)")] [Description("")] public int WaitAfter { get; set; } // Token: 0x17000004 RID: 4 // (get) Token: 0x06000018 RID: 24 RVA: 0x000028EA File Offset: 0x00000AEA // (set) Token: 0x06000019 RID: 25 RVA: 0x000028F2 File Offset: 0x00000AF2 [Category("General Configuration")] [DisplayName("Wait Time Before(ms)")] [Description("")] public int WaitBefore { get; set; } // Token: 0x17000005 RID: 5 // (get) Token: 0x0600001A RID: 26 RVA: 0x000028FB File Offset: 0x00000AFB // (set) Token: 0x0600001B RID: 27 RVA: 0x00002903 File Offset: 0x00000B03 [Category("General Configuration")] [DisplayName("Auctioning Tab Number")] [Description("")] public string TabNumberAuctioning { get; set; } // Token: 0x17000006 RID: 6 // (get) Token: 0x0600001C RID: 28 RVA: 0x0000290C File Offset: 0x00000B0C // (set) Token: 0x0600001D RID: 29 RVA: 0x00002914 File Offset: 0x00000B14 [Category("General Configuration")] [DisplayName("Position Auctioner X")] [Description("")] public double PositionAuctionerX { get; set; } // Token: 0x17000007 RID: 7 // (get) Token: 0x0600001E RID: 30 RVA: 0x0000291D File Offset: 0x00000B1D // (set) Token: 0x0600001F RID: 31 RVA: 0x00002925 File Offset: 0x00000B25 [Category("General Configuration")] [DisplayName("Position Auctioner Y")] [Description("")] public double PositionAuctionerY { get; set; } // Token: 0x17000008 RID: 8 // (get) Token: 0x06000020 RID: 32 RVA: 0x0000292E File Offset: 0x00000B2E // (set) Token: 0x06000021 RID: 33 RVA: 0x00002936 File Offset: 0x00000B36 [Category("General Configuration")] [DisplayName("Position Auctioner Z")] [Description("")] public double PositionAuctionerZ { get; set; } // Token: 0x1700000D RID: 13 // (get) Token: 0x0600002A RID: 42 RVA: 0x00002983 File Offset: 0x00000B83 // (set) Token: 0x0600002B RID: 43 RVA: 0x0000298B File Offset: 0x00000B8B [Category("General Configuration")] [DisplayName("Loop")] [Description("")] public bool Loop { get; set; } // Token: 0x1700000E RID: 14 // (get) Token: 0x0600002C RID: 44 RVA: 0x00002994 File Offset: 0x00000B94 // (set) Token: 0x0600002D RID: 45 RVA: 0x0000299C File Offset: 0x00000B9C [Category("General Configuration")] [DisplayName("Max Post Count")] [Description("")] public int MaxPostCount { get; set; } // Token: 0x1700000F RID: 15 // (get) Token: 0x0600002E RID: 46 RVA: 0x000029A5 File Offset: 0x00000BA5 // (set) Token: 0x0600002F RID: 47 RVA: 0x000029AD File Offset: 0x00000BAD [Category("Guild Bank")] [DisplayName("Deposit Guild Bank")] [Description("")] public bool DepositGuildBank { get; set; } // Token: 0x17000010 RID: 16 // (get) Token: 0x06000030 RID: 48 RVA: 0x000029B6 File Offset: 0x00000BB6 // (set) Token: 0x06000031 RID: 49 RVA: 0x000029BE File Offset: 0x00000BBE [Category("Guild Bank")] [DisplayName("Quantity Gold after deposit")] [Description("")] public int SafeGoldCount { get; set; } // Token: 0x17000011 RID: 17 // (get) Token: 0x06000032 RID: 50 RVA: 0x000029C7 File Offset: 0x00000BC7 // (set) Token: 0x06000033 RID: 51 RVA: 0x000029CF File Offset: 0x00000BCF [Category("Guild Bank")] [DisplayName("Guild Bank ID")] [Description("")] public int GuildBankId { get; set; } // Token: 0x17000012 RID: 18 // (get) Token: 0x06000034 RID: 52 RVA: 0x000029D8 File Offset: 0x00000BD8 // (set) Token: 0x06000035 RID: 53 RVA: 0x000029E0 File Offset: 0x00000BE0 [Category("Guild Bank")] [DisplayName("Guild Bank Position X")] [Description("")] public double GuildBankPositionX { get; set; } // Token: 0x17000013 RID: 19 // (get) Token: 0x06000036 RID: 54 RVA: 0x000029E9 File Offset: 0x00000BE9 // (set) Token: 0x06000037 RID: 55 RVA: 0x000029F1 File Offset: 0x00000BF1 [Category("Guild Bank")] [DisplayName("Guild Bank Position Y")] [Description("")] public double GuildBankPositionY { get; set; } // Token: 0x17000014 RID: 20 // (get) Token: 0x06000038 RID: 56 RVA: 0x000029FA File Offset: 0x00000BFA // (set) Token: 0x06000039 RID: 57 RVA: 0x00002A02 File Offset: 0x00000C02 [Category("Guild Bank")] [DisplayName("Guild Bank Position Z")] [Description("")] public double GuildBankPositionZ { get; set; } //restock items settings [Category("General Configuration")] [DisplayName("Restock")] [Description("")] public bool RestockItems { get; set; } } ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/9874-breathe-remaining-hook/ TITLE: Breathe remaining hook ---------------------------------------------------------------------------------------------------- Unknown Can't find it anywhere throughout the wManager. Human master plugin has this variable for sure and it's not on a timer, anyone know it? ---------------------------------------- Unknown WRobot doesn't have such a function, but you can create your own using Lua: http://wowwiki.wikia.com/wiki/API_GetMirrorTimerInfo HMP uses Lua events to decide wether you need to swim up again, see "Related events" at the bottom ---------------------------------------- Unknown This is correct. I read Lua events and build my own timer with DateTime instances updated on events ---------------------------------------- Unknown Seriously? It's so accurate on my breath remaining in MS, thanks though guys. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/9886-fastestbest-way-to-regularly-toggle-looting-offon/ TITLE: Fastest/Best Way To Regularly Toggle Looting Off/On ---------------------------------------------------------------------------------------------------- Unknown Hey y'all! So I'm having my bots farm in groups at the moment and need some simple way to get them to spend a couple minutes killing things before doing a mass-loot (both because it's more efficient and because otherwise they end up looking very bot-like. I was hoping I would be able to figure it out using Avvi's sample plugin, but I am still in a little over my head (I am also wondering if his sample plugin might have way more code in there than I need, and I'm not particularly well-equipped to identify). Thanks for any help! ---------------------------------------- Stresse Hello, use this code to disable looting: wManager . wManagerSetting . CurrentSetting . LootMobs = false ; ---------------------------------------- Unknown Thanks! But is there a way to put that on a timer? Or maybe an even smarter idea I haven't had yet? Because when you are farming low-level mobs, you don't just kill and loot them individually (especially if you are in a group). You kill a shit ton of them, then y'all loot. ---------------------------------------- Unknown I think that that WRobot will only try looting after it kills something. So if the line that droidz ( LootMobs = false ; ) sent was used, and you killed 20 mobs, it would only loot things for after when you did LootMobs = true ---------------------------------------- @Avvi @Avvi No, it loots whatever is lootable (currently when I have two grouped up killing low-level mobs, one of them will start just following the other around looting their stuff). ---------------------------------------- @Avvi | 2018-08-04T00:14:10Z Oh, well then that's great news!  In  that case, you can swap out my plugin template's pluginLoop with this: public void pluginLoop () { bool lootStuff = false ; while ( Products . IsStarted && _isLaunched ) { if (! Products . InPause ) { wManager . wManagerSetting . CurrentSetting . LootMobs = lootStuff ; lootStuff = ! lootStuff ; Thread . Sleep ( 300000 ); } } } It will wait 300,000 (5 minutes ) milliseconds and then it will flip the LootMobs value from False to True. After another 300,000 milliseconds  (5 minutes ) it will go from True to False. It will flip it over and over until the WRobot it turned off. Regarding my template, there are a lot of extra things in there. I added them so that there would be examples of many things ? . If you'd like, you can create a Setting that lets you set the milliseconds manually. Or, you can copy what I've done below. (Replace pluginLoop and pluginSettings : Settings public void pluginLoop() { bool lootStuff = false; while (Products.IsStarted && _isLaunched) { if (!Products.InPause) { wManager.wManagerSetting.CurrentSetting.LootMobs = lootStuff; lootStuff= !lootStuff; Thread.Sleep(_settings.timetowait); } } } [Serializable] public class pluginSettings : Settings { public pluginSettings() { timetowait = 300000; } [Setting] [Category("General Settings")] [DisplayName("Time to wait before looting stuff")] [Description("This is a Description.")] public int timetowait { get; set; } public static pluginSettings CurrentSetting { get; set; } public bool Save() { try { return Save(AdviserFilePathAndName("TemplateProjectName", ObjectManager.Me.Name + "." + Usefuls.RealmName)); } catch (Exception e) { Logging.WriteError("TemplateProjectName > Save(): " + e); return false; } } public static bool Load() { try { if (File.Exists(AdviserFilePathAndName("TemplateProjectName", ObjectManager.Me.Name + "." + Usefuls.RealmName))) { CurrentSetting = Load (AdviserFilePathAndName("TemplateProjectName", ObjectManager.Me.Name + "." + Usefuls.RealmName)); return true; } CurrentSetting = new pluginSettings(); } catch (Exception e) { Logging.WriteError("TemplateProjectName > Load(): " + e); } return false; } } Edited August 4, 2018 by Avvi ---------------------------------------- @Avvi @Avvi You are so awesome! I honestly can't thank you enough (I actually need to spend some time going around and "liking" all the posts you have made that have been so so helpful to me while I try to figure all this out)! You are my god! One question: If I wanted different times for killing vs looting (if it splits it 50-50, there is going to be a lot of dead time during the looting phase), would I change it to: public  void pluginLoop ()  { while ( Products . IsStarted && _isLaunched ) { bool lootStuff = false ; if (! Products . InPause ) {  wManager . wManagerSetting . CurrentSetting . LootMobs = lootStuff ; Thread . Sleep ( 300000 ); // spend 5 minutes killing shit lootStuff = ! lootStuff ; Thread . Sleep ( 60000 ); //spend 1 minute looting shit } } } I'm going to try that and see what happens, but I have a sneaky suspicion I am going to have overlooked something. ---------------------------------------- Unknown | 2018-08-04T00:09:51Z unfortunately, that won't work. That will make it do the following: Set looting to the variables value. Wait 5 minutes before doing anything Flip the looting variable to the opposite value Wait for 1 minute Repeat So you'll get something like this: Variable value = false: Set looting to false. Make plugin wait 5 minutes before doing anything Set looting variable to true Make plugin wait 1 minute before doing anything Repeat: Set looting to True. Make plugin wait 5 minutes before doing anything Set looting variable to False Make plugin wait 1 minute before doing anything Repeat Set looting to false. Make plugin wait 5 minutes before doing anything Set looting variable to true Make plugin wait 1 minute before doing anything Repeat I think your desired outcome is something else. I'm guessing you want it to sometimes wait 5 minutes, and sometimes wait 1 minute? I am glad I could help ? !!! Edited August 4, 2018 by Avvi ---------------------------------------- Unknown | 2018-08-04T00:20:26Z If your desire is to wait 5 minutes, and sometimes wait 1 minute, then something like this will work: public void pluginLoop () { bool lootStuff = false ; int longerTimeToWait = 300000 ; int shortTimeToWait = 60000 ; int actualTimeToWait = shortTimeToWait ; while ( Products . IsStarted && _isLaunched ) { if (! Products . InPause ) { wManager . wManagerSetting . CurrentSetting . LootMobs = lootStuff ; lootStuff = ! lootStuff ; if ( actualTimeToWait == longerTimeToWait ){ actualTimeToWait = shortTimeToWait ; } else { actualTimeToWait = longerTimeToWait } Logging . Write ( "Waiting this long until switching looting status: " + actualTimeToWait ); Thread . Sleep ( actualTimeToWait ); } } } Edited August 4, 2018 by Avvi ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/9931-change-wrobot-setting-with-plugin/ TITLE: Change WRobot setting with plugin ---------------------------------------------------------------------------------------------------- @Droidz | 2018-08-12T21:14:47Z Hey guys, anyone know how to make it so if you change i.e. wManagerSetting.CurrentSetting.Selling with your plugin, so that it changes the setting in WRobot too? As soon as wrobot is restarted wManagerSetting.CurrentSetting.Selling is changed back to what you set it to in wrobot. ? wManagerSetting.CurrentSetting.Save(); saves the data, but it dones't change in wrobot until wrobot is restarted. Also completely off-topic: @Droidz how are you getting current mount name in vanilla? Are you checking buffs? Or are you reading from memory? I just realized that button does not work, so i guess you are not ? Edited August 12, 2018 by Ordush ---------------------------------------- Unknown Hello, You cannot do that, and if you use quester product, wrobot reset old settings when stopped. In vanilla I just check if IsMounted (ObjectManager.Me.IsMounted) I don't check if it is good mount name (you can try "Me.MountDisplayId" if you want check a specific mount). To dismount I use CancelPlayerBuff(...) and check texture name (GetPlayerBuffTexture(...)) ---------------------------------------- Unknown Ah alright! Any chance that you will add so that the settings update without restarting wrobot? Not using quester ? ---------------------------------------- Unknown You can try, based on https://stackoverflow.com/a/302588 foreach ( var instancesOfImplementingType in GetInstancesOfImplementingTypes < UserControlTabGeneralSettings >()) { instancesOfImplementingType . LoadGeneralSettings (); } (to refresh UI, but I'm not sure that it solves the problem) ---------------------------------------- Unknown Haven't tried it yet, but seems like it's exactly what I need! Cheers! ---------------------------------------- @Droidz @Droidz What reference do i need for this to work? I guess that i need using wManager.Wow.Forms; for the UserControlTabGeneralSettings However it says GetInstancesOfImplementingTypes doesn't exist in that context. ---------------------------------------- Unknown Add this method https://stackoverflow.com/questions/302542/how-do-i-get-all-instances-of-all-loaded-types-that-implement-a-given-interface/302588#302588 ---------------------------------------- Unknown Ah, not sure how i did not see that. I added the method, and the remaining references (PresentationCore, PresentationFramework and WindowsBase). And it doesn't give any errors, however. When i run foreach ( var instancesOfImplementingType in GetInstancesOfImplementingTypes < UserControlTabGeneralSettings >()) { instancesOfImplementingType . LoadGeneralSettings (); } nothing happens for some reason. ? ---------------------------------------- happiness7 Yes, code is bad. Wait next update and use wManager . Wow . Forms . UserControlTabGeneralSettings . RealoadGeneralSettings () ---------------------------------------- Unknown Cheers mate! ---------------------------------------- @Droidz @Droidz Did you ever get this update out Droidz? (Vanilla) Also btw. ever since I've upgraded to win 10 i get this error: 21 : 04 : 52 - Error during download , please verif link . 21 : 04 : 50 - error : System . Net . WebException : The request was aborted : Could not create SSL / TLS secure channel . at System . Net . WebClient . DownloadFile ( Uri address , String fileName ) at System . Net . WebClient . DownloadFile ( String address , String fileName ) at UpdateManager . UpdateManager .() I've turned off firewall, anit-virus etc. It does however update when there are updates, so not sure why it's even saying it lol ---------------------------------------- @Droidz You have try to restart your computer? ---------------------------------------- Unknown | 2018-08-23T09:23:52Z Many times, I have had this issue for months. It's on ALL my pc's that run windows 10, even my work computer. ? https://stackoverflow.com/questions/2859790/the-request-was-aborted-could-not-create-ssl-tls-secure-channel Apparently it's an issue that's also discussed on stackoverflow Edited August 23, 2018 by Ordush ---------------------------------------- Unknown thank you, can you try with this .exe and tell me if problem is resolved: Updater.zip ---------------------------------------- Unknown Yep! That solved the problem! ? UserControlTabGeneralSettings . RealoadGeneralSettings (); Still does not work though. There is a spelling error: RealoadGeneralSettings(); Is supposed to be ReloadGeneralSettings(); However, that definition does not exists either yet. Is it me being completely retarded? ? ---------------------------------------- Unknown I heven't release update ---------------------------------------- Unknown Now, that explains it. ? ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/9956-c-how-to-flag-a-spell-usable-or-not/ TITLE: c# : how to flag a spell usable or not? ---------------------------------------------------------------------------------------------------- Unknown Hi, Fisrt of all i'm a beginner at c# and i'm having lots of fun tinkering class profiles. I'd like to know how to check if x spell is usable (for example, i'd like to know if charge is usable as one of the conditions to switch to battle stance, i've been searching this for hours). Could anyone post an example of code please? ---------------------------------------- Unknown nevermind, i think i foud the answer :) fisrt make sure the spell is in the list: public Spell Charge = new Spell ( "Charge" ); then use Charge . IsSpellUsable to return true of false. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/9958-how-to-turn-my-c-fight-class-into-a-dll/ TITLE: How to turn my c# fight class into a .dll? ---------------------------------------------------------------------------------------------------- Unknown Hi, i looked at some tutorials on how to build your class into a .dll but for some reason, i can't manage to do it. Whenever i try, it won't compile and displays a ton or errors (800+), but the fight class itself works pretty smooth on wRobot and doesn't display any errors. I think i have some issues with the procedure, from the start. Basically, i created a class library on visual studio, didnt write anything on the text editor, then i created a new class by rightclicking the solution explorer, i copied the dll from wRobot in a subfolder in the project, added the references and filled up the new class. Did i miss something? ---------------------------------------- Unknown Hello, create visual studio library project, add references (wmanager.dll, robotmanager.dll, ...) and compile them to create dll file. ---------------------------------------- Unknown Thank you for your response, it turns out my problem was, i kept different versions of my fight class in the same folder while working on the projet.. bad idea ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/9983-detect-fighting-multiple-mobs/ TITLE: Detect Fighting Multiple Mobs ---------------------------------------------------------------------------------------------------- Unknown Is there a way to detect, if the bit is currently attacked by more than one mob? ---------------------------------------- DrSeltsam Hello, wManager . Wow . ObjectManager . ObjectManager . GetUnitAttackPlayer () wManager . Wow . ObjectManager . ObjectManager . GetNumberAttackPlayer () ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/6890-plugins-3rd-party-libs/ TITLE: Plugins & 3rd Party Libs ---------------------------------------------------------------------------------------------------- Unknown Is it possible to use 3rd party libs in a plugin? So far i did setup the classlibrary project and tried to include Akka.net, but the moment the ActorSystem is created: System.Reflection.TargetInvocationException Error: CS0009: Metadata file 'authManager.dll' could not be opened -- Invalid public key. I'd guess the obfuscated authManager.dll won't play nice in this case. For what i'm trying to accomplish i could use plain async sockets (which works) but they are so...bleh ---------------------------------------- Unknown Hello, sorry I cannot remove this protection (to avoid crack). But you can use Messagebox or log ---------------------------------------- Unknown | 2017-08-29T00:02:00Z You may be able to disable the Error on compilation: follow this: ( https://stackoverflow.com/questions/2943883/c-sharp-pinvokestackimbalance-detected-on-a-well-documented-function ) except disable your error. Edited August 29, 2017 by avvi ---------------------------------------- Unknown Any solutions to this? ---------------------------------------- Unknown Hello, use dnLib ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/8129-extend-combat-timer/ TITLE: Extend combat timer? ---------------------------------------------------------------------------------------------------- @Droidz hey @Droidz when stealthing towards enemies, you are 50% slower and will not reach them sometimes before the bot decides "Mob seem bugged, blacklist" and switches to another target. Can I somehow extend this time before that happens in my fightclass? ---------------------------------------- capint Have the same problem for casters. When bot selects target and runs to it. He need time to Cast. so pretty often during cast bot says : target seems bugged. blacklisting. But it's NOT. he's blacklisting enemies too fast ---------------------------------------- Unknown Hello, you get this problem with what WRobot version? Only with casters? You have try with several fightclass? ---------------------------------------- Unknown I get it with every class that takes "long" to pull. For example, wRobot runs in range (and I use my own combat system, not FiniteStateMachine - I execute my rotation based on Fight.InFight property). On Rogue/Druid it takes long to run into range because Stealth/Prowl is slow, on Mage because Frostbolt takes 2.5 seconds to cast (+ time to run to target after selecting it). I get that problem in vanilla/tbc, haven't tried Wrath of the Lich King. ---------------------------------------- Unknown Ok, how many time he miss for you before blacklist? ---------------------------------------- @maukor hey, bot doesn't miss the enemy. It goes towards it, keeps walking, walking, walking. Sometimes, just before you reach the enemy, the log says: "Mob seem bugged, blacklist" and stops. I tried to record a video of it but couldn't really get a good example. Maybe @maukor can record a better video. ---------------------------------------- @Matenia @Matenia @Droidz yeah. i will try. but not today. will do it tomorrow. And dont forget to fix inkeepers selling pls. got few bans cause of reports running in loops near inkeeper ---------------------------------------- Unknown Just happened, but I didn't record it. As the bot got into melee range, this is what the log said: 16:33:49 - [Fight] Can't reach Mottled Raptor, blacklisting it. ---------------------------------------- @Droidz @Droidz + log snippet: [F] 20:37:36.526 - Iteration took 267ms [F] 20:37:36.910 - Iteration took 232ms [D] 20:37:39.291 - [Fight] Mob seem bugged [F] 20:37:39.411 - Fightclass successfully casted: Cheap Shot() [F] 20:37:39.411 - Iteration took 466ms 20:37:39.492 - [Fight] Can't reach Skeletal Flayer, blacklisting it. 20:37:39.711 - [Fight] Player Attack Skeletal Sorcerer (lvl 52) [F] 20:37:41.079 - Iteration took 533ms [D] 20:37:43.662 - [Fight] Player attacked by other unit, skip this fight. 20:37:44.065 - [Fight] Player Attacked by Skeletal Flayer (lvl 51) [F] 20:37:45.468 - Fightclass successfully casted: Sinister Strike() [F] 20:37:45.468 - Iteration took 350ms [F] 20:37:45.633 - Staying in fight with target [F] 20:37:46.053 - Iteration took 419ms [F] 20:37:46.535 - Fightclass successfully casted: Sinister Strike() [F] 20:37:46.535 - Iteration took 329ms [F] 20:37:47.055 - Iteration took 369ms [F] 20:37:47.652 - Fightclass successfully casted: Slice and Dice() Rogue.mp4 ---------------------------------------- Unknown I incremented timer, if problem is not resolved in next update up again this post ---------------------------------------- Unknown This is still a problem. Could you make the time out variable accessible so we could at least program it ourselves? ---------------------------------------- Unknown Update today Vanilla Wow I get this error [F] 19:05:01 - Fightclass successfully casted: Holy Fire [F] 19:05:01 - Iteration took 262ms [F] 19:05:01 - Fightclass successfully casted: Holy Fire [F] 19:05:01 - Iteration took 140ms [F] 19:05:03 - Fightclass successfully casted: Shoot [F] 19:05:03 - Iteration took 1034ms [F] 19:05:03 - Iteration took 415ms [F] 19:05:04 - Fightclass successfully casted: Vampiric Embrace [F] 19:05:04 - Iteration took 403ms [F] 19:05:04 - Fightclass successfully casted: Holy Fire [F] 19:05:04 - Iteration took 108ms [F] 19:05:04 - Fightclass successfully casted: Power Word: Shield [F] 19:05:04 - Iteration took 169ms [F] 19:05:05 - Fightclass successfully casted: Power Word: Shield [F] 19:05:05 - Iteration took 122ms [F] 19:05:05 - Fightclass successfully casted: Power Word: Shield [F] 19:05:05 - Iteration took 136ms [F] 19:05:06 - Fightclass successfully casted: Shoot [F] 19:05:06 - Iteration took 604ms [F] 19:05:06 - Fightclass successfully casted: Power Word: Shield [F] 19:05:06 - Iteration took 323ms [F] 19:05:07 - Fightclass successfully casted: Shoot [F] 19:05:07 - Iteration took 884ms [F] 19:05:08 - Fightclass successfully casted: Mind Flay [F] 19:05:08 - Iteration took 588ms [F] 19:05:09 - Iteration took 665ms Now game lags and lags and lags, response time to server is 15ms But worked like a charm last night so really not sure why it lags so now ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/8974-wrobot-public-api-doc/ TITLE: WRobot Public API Doc ---------------------------------------------------------------------------------------------------- Unknown Primarily question to the bot developers, are you going to share public API documentation to end-users? I think it would be great to share it on Github and share product sources like Battlegrounder, Party etc. to improve their quality and flexibility. Don't get me wrong but I'm tired fighting with your obfuscator every time once WRobot updated to fix some issues with this modules... ---------------------------------------- Unknown You can find old, unobfuscated binaries somewhere on the internet, I believe. Either way, we've all been asking and he won't do it (you can PM for particular sources and ask nicely). Essentially, the obfuscation got really bad when the bot got cracked over and over. Now it's been fairly safe for him. ---------------------------------------- @Droidz I'm not against obfuscation, to be honest, it doesn't stop me. Main modules like authManager, robotManager, wManager can be obfuscated but products like battlegrounder and documentation can be open, but still compiled and delivered from WRobot team. @Droidz what do you think about that? ---------------------------------------- Unknown | 2018-03-27T13:04:59Z This isn't what I'd consider an 'api' doc, but if you need somewhere to get started, you can take a look at this: Edited March 27, 2018 by Avvi ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/8980-walkingrunning-detection/ TITLE: Walking/Running detection ---------------------------------------------------------------------------------------------------- Unknown How to detect is player running or walking switched by ToggleRun (); ---------------------------------------- Unknown Hello, wManager . Wow . ObjectManager . ObjectManager . Me . IsMovingForward But this detect if player move forward (not only if togglerun is active) ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/8990-new-features-and-botstates-assist/ TITLE: New features and Bot.States assist ---------------------------------------------------------------------------------------------------- Unknown Hello, сan you show a working example of adding a new  wManager.Wow.Bot.States? Quester bot via .cs file Can you also add functions to the bot? Me.SubZoneId == 111 ItemsManager.UseItem() - by WoWItem, not entry Item.UseContainerItem() WoWGameObject.InteractDistance WoWGameObject.IsGoodInteractDistance Me.GetAllAuras().Any(a => (a.Spell.Mechanic == WoWSpellMechanic.Stunned || a.Spell.Mechanic == WoWSpellMechanic.Fleeing || a.Spell.Mechanic == WoWSpellMechanic.Asleep || a.Spell.Mechanic == WoWSpellMechanic.Charmed) && a.TimeLeft.TotalSeconds >= 2)) and fix this wManager.Wow.Helpers.Bag.PickupContainerItem - just does not work. wManager.Wow.Bot.Tasks.GoToTask.ToPositionAndIntecractWith(WoWGameObject) - goes to the object and does not interact, with npc works fine. ---------------------------------------- Unknown I talk about States on my Tips & Tricks Thread. Does that provide enough information, or do you think additional information/tips should be added for that section? ---------------------------------------- Unknown there is no information how to add a custom State. ---------------------------------------- Unknown https://wrobot.eu/forums/topic/8959-botstates/ ---------------------------------------- Unknown Ah ok. Sorry I misread your initial post. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/9019-load-plugins-dispose-plugins/ TITLE: Load plugins / Dispose Plugins ---------------------------------------------------------------------------------------------------- Unknown | 2018-03-31T06:41:14Z Cheers, Can anyone tell me if they know of a way to get the following methods to work? wManager . Plugin . PluginsManager . LoadAllPlugins (); wManager . Plugin . PluginsManager . DisposeAllPlugins (); Or of a way to individually activate plugins? I suppose create a iPlugin/iProduct? Thanks, Enraged Edited March 31, 2018 by Enraged ---------------------------------------- Unknown Hello https://wrobot.eu/forums/topic/5417-change-fight-classload-pluginchanging-the-type-of-the-bot-in-questing-profile-using-code/?do=findComment&comment=25072 ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/9040-runcode-and-botstates/ TITLE: RunCode and Bot.States ---------------------------------------------------------------------------------------------------- Unknown During the execution ,  all states dont work(like loot or death). How can I fix this? ---------------------------------------- Unknown you didnt understand <- during the execution of this line, dont work any Bot.States. I need them to work. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/9052-remove-wmanagerwowbotstates/ TITLE: Remove wManager.Wow.Bot.States ---------------------------------------------------------------------------------------------------- Unknown Hello, is it possible to remove wManager.Wow.Bot.States? like wManager.Wow.Bot.States.Resurrect wManager.Wow.Bot.States.Looting ---------------------------------------- Unknown | 2018-04-04T23:37:22Z If you would like to ignore states, you can do so. Below is an example of ignoring/cancelling the To Town State. robotManager.Events.FiniteStateMachineEvents.OnBeforeCheckIfNeedToRunState += (engine, state, cancelable) => { if (state != null && state.DisplayName == "To Town") { Logging.Write("We have cancelled the To Town State"); cancelable.Cancel = true; } }; Edited April 4, 2018 by Avvi ---------------------------------------- Unknown just turn it off, its possible? without unnecessary code. ---------------------------------------- Unknown No you need to use code for that ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/9123-c-combat-range-change-through-settings/ TITLE: C# Combat Range - Change through settings? ---------------------------------------------------------------------------------------------------- @Droidz Hey all I set the combat range in the top of my C# With the code @Droidz has provided. public float Range { get { return CombatRange ; } } It seems that, it doesn't work if i don't set it as read-only (get). I want to be able to change the range from fightclass settings, does anyone know how to get this to work? :) Added this here, since it's more a all around thing, than vanilla only. :) ---------------------------------------- Unknown This doesn't work? public float Range { get { return FightClassSettingsHere ; } } ---------------------------------------- Unknown | 2018-04-13T00:01:09Z Well, yes it does. But since it's read-only i can only set it once. I wanted to change Range based on conditions. :) Edit: LoL.Brainfart.. nevermind.. how did i not see the "return" rofl.. Works fine. :) Edited April 13, 2018 by Ordush ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/9172-how-to-create-a-plugin/ TITLE: How to create a plugin? ---------------------------------------------------------------------------------------------------- Unknown Sorry I'm actually looking to create a new plugin about mass disenchanting stuff in my bags, I looked for all tutorial topics and nothing shows me how to create a simple plugin, I need to mention I'm not advanced in this so I few tips for start would be appreciated. Thank you ---------------------------------------- Unknown I threw this together real quick, disenchants everything in bags. Use wRotation or Tracker. MassDisenchant.dll ---------------------------------------- Unknown that's exactly what I was looking for , Thank you real much appreciated mate ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/9185-use-outer-hitbox-for-vector3/ TITLE: Use outer hitbox for Vector3? ---------------------------------------------------------------------------------------------------- Unknown | 2018-04-23T17:39:39Z Hey all Does anyone know if it's possible to use the hitbox when using Vector3? I use this to backtrack from mobs, but if the mob has a big hitbox, it'll cause problems. Because Target Position does not include the mobs hitbox? var tar = ObjectManager . Target ; Vector3 newPos = new Vector3 ( tar . Position . X + posX , tar . Position . Y + posY , tar . Position . Z ); The code below gives the distance between me and target hitbox. ObjectManager . Target . GetDistance - ObjectManager . Target . CombatReach - ObjectManager . Me . CombatReach I also use the Vector3 to check TraceLine, but this also doesn't check far enough on mobs with big hitboxes. (! TraceLine . TraceLineGo ( ObjectManager . Target . Position , newPos )) Hope any of this made any sense, otherwise please ask. :) I'd love to get help on this! public static double PosX ( int angle ) { return 0 + 18 * System . Math . Cos ( angle * System . Math . PI / 180 ); } public static double PosY ( int angle ) { return 0 + 18 * System . Math . Sin ( angle * System . Math . PI / 180 ); } The number "18" is the range between the vector and the mob. it has to be 18 in order to be 8 yards from a mob with a big hitbox (Raptors in Un'Guru, is an example). I could make a variable that changed number based on target hitbox size, but i don't know how to get that either. :P Edited April 23, 2018 by Ordush ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/9256-plugin-auto-buff-blood-fury-rogue/ TITLE: plugin auto buff Blood Fury Rogue ---------------------------------------------------------------------------------------------------- Unknown Hi there, i want to run Blood Fury on my classic wow rogue every 2minutes. I tried already: But it does not work. I would appreciate it if somebody can take a look, thank you if (SpellManager.KnowSpell(20572) && !ObjectManager.Me.IsDeadMe) { wManager.Wow.Helpers.Lua.RunMacroText("/cast Blood Fury"); Logging.WriteDebug("Use Blood Fury"); I also tried SpellManager.CastSpellByName("Blood Fury"); RunMacroText("/cast Blood Fury"); using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.ComponentModel; using System.Diagnostics; using System.Threading; using robotManager.Helpful; using robotManager.Products; using wManager.Wow.Helpers; using wManager.Wow.ObjectManager; public class Main : wManager.Plugin.IPlugin { private bool isRunning; private BackgroundWorker pulseThread; private static WoWLocalPlayer Me = ObjectManager.Me; public void Start() { pulseThread = new BackgroundWorker(); pulseThread.DoWork += Pulse; pulseThread.RunWorkerAsync(); } public void Pulse(object sender, DoWorkEventArgs args) { try { while (isRunning) { if (!Products.InPause && Products.IsStarted) { if (SpellManager.KnowSpell(20572) && !ObjectManager.Me.IsDeadMe) { wManager.Wow.Helpers.Lua.RunMacroText("/cast Blood Fury"); Logging.WriteDebug("Use Blood Fury"); Thread.Sleep(Usefuls.Latency + 100); } } Thread.Sleep(10000); } } catch (Exception ex) { } } public void Dispose() { try { isRunning = false; } catch (Exception e) { } } public void Initialize() { isRunning = true; Start(); } public void Settings() { } } ---------------------------------------- Unknown Ah i got it working...if somebody come across the same problems, in vanilla: SpellManager.CastSpellByIdLUA(20572); ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/9346-fightclass-ingame-settings-ui/ TITLE: Fightclass Ingame Settings UI ---------------------------------------------------------------------------------------------------- Unknown Hello, I was wondering if anyone had any suggestions on how to go about creating a settings UI in-game for a C# fightclass? I've previously used Ordush's profiles and I really like how he handled this rather than changing settings outside of the game which is not very user-friendly during PVE. I'm linking an example from Ordush's profiles below. ---------------------------------------- Unknown As in how to make the menu ingame or how to link it with the profile? ---------------------------------------- Unknown He wants to do what i did lol ---------------------------------------- Unknown Obviously, considering I asked for a starting point on how it would be done, and referenced your fight class. ---------------------------------------- Unknown Use this plugin as an example of creating lua ingame; (download the Main.cs) ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/9352-what-loads-first-plugins-or-fightclasses/ TITLE: What loads first? Plugins or Fightclasses ---------------------------------------------------------------------------------------------------- Unknown Hey all I have only made fightclasses and a few profiles. What loads first? Plugins or fightclasses? Is there any way to change this? ---------------------------------------- Unknown Hello, fightclasses are loaded before (but on different threads, this can change order?) ---------------------------------------- Unknown Awesome, it's because i want to make a plugin that loads into my fightclass, but also works without my fightclass. ? ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/9369-dont-move-after-pull/ TITLE: Don't move after pull ---------------------------------------------------------------------------------------------------- Unknown Hello, i want to write my own C# class. Now i want to pull Moofire and after pull that my char don't move till target is in melee range. Is this possible? Ragards ---------------------------------------- Unknown Set range to 30 yards. Then set some condition for your range to be at 5 yards if you need to melee later. If you never need to melee, just keep the range at 30 or 35. ---------------------------------------- Unknown Hey Matenia, thanks for your answer. I have no idea how i can set range to 30 yards. I try a loop when target.disctance >= 5 then Thread.Sleep(20) but also my char move. Regards ---------------------------------------- Unknown maybe something like this? private bool rangedPull ; public float Range { get { if (! Fight . InFight && ObjectManager . GetWoWUnitHostile (). Count ( u => u . Position . DistanceTo ( ObjectManager . Target . Position ) <= 30 && u . IsAttackable ) > 1 ) // if there is more than one mob within 30 yards of the your target's position { rangedPull = true ; return 29f ; } else { rangedPull = false ; return 5f ; } } } To note, that will only stay at range while out of fight because if the mob you're attacking is a caster, you'll want to run to it. You can of course edit that and add more logic ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/9377-plugin-only-create-instance-of-class-if-it-doesnt-already-exist/ TITLE: Plugin - Only create instance of class if it doesn't already exist ---------------------------------------------------------------------------------------------------- Unknown In a plugin I'm writing I create an instance of a class. I do not want to dispose it when the bot is stopped (which is fine and working) however I don't want to create another instance of it if it already exists as there would then be 2 of them (as I'm not disposing the original). I can't track it in a variable within my plugin because once the bot is restarted a new instance of the plugin is spawned and would not have those variables. Is there something I can set in a wrobot variable to track whether my plugin has launched and thus I don't need to track it in my plugin? ---------------------------------------- @Enraged I may use the plugin settings and pulse them to let them know the instance is still alive - I'll update if that worked for me. Thanks @Enraged ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/9385-can-2-wrobot-speak-together/ TITLE: Can 2 wrobot speak together? ---------------------------------------------------------------------------------------------------- Unknown Is there any way that 2 different wrobot programs can speak together? Like if i set a variable in one wrobot profile or fightclass or whatever, can i then read it from another profile/plugin/fightclass ? Or do i have to use the chat? ---------------------------------------- Unknown only programmer is the limit ? ---------------------------------------- Unknown Whale. ? ---------------------------------------- Unknown I was thinking about this the other day. Something similar to what Jamba does in WoW but for leveling with wrobot. ---------------------------------------- Unknown Jamba uses the chat, that is easy. I was thinking of going outside of wow. ? ---------------------------------------- Unknown Hello, you may take a look into memory mapped objects / remote procedure call(RPC). For example: https://github.com/spazzarama/SharedMemory http://csharptest.net/projects/rpclibrary/index.html These can be also installed via nuget packet manager on Visual Studio and can be binded with fody with your distributed library(fightclass / plugin). Note: RPC is rather for client / server communication but you may also exchange data via calls. If this may take abit too much effort, you can also save a file to disk(like fightclass settings) and read from another wrobot instance. ---------------------------------------- Unknown Easiest way right there. ---------------------------------------- Unknown Ah yes, cheers! ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/9393-target-not-in-line-of-sight/ TITLE: target not in line of sight ---------------------------------------------------------------------------------------------------- Unknown HI,everyone.sometimes target not in line of sight,and player can't cast spell,but bot won't move,so I want to write a function with C# in FC to handle this use  events. Which events is about  target not in line of sight? tks! ---------------------------------------- 79135 Donno if that helps and its right out of the mind and just an idea... wManager . Events . FightEvents . OnFightStart += ( WoWUnit unit , System . ComponentModel . CancelEventArgs e ) => { // Not in LoS if ( TraceLine . TraceLineGo ( unit . Position )) { // Get waypoints to the target IEnumerable < robotManager . Helpful . Vector3 > waypoints = PathFinder . Pather . FindPath ( ObjectManager . Me . Position , unit . Position , out bool result , out bool resultPartial ); foreach ( robotManager . Helpful . Vector3 waypoint in waypoints ) { if (! TraceLine . TraceLineGo ( waypoint )) { // In LoS MovementManager . MoveTo ( waypoint ); // While moving.... } } } }; You also need to cancel that event and i'm not sure if its the right one. There is no "not in LoS" event as far i know. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/9394-very-simple-question-for-c-users/ TITLE: Very simple question for C# users ---------------------------------------------------------------------------------------------------- Unknown I'm learning C#, small steps but It's okay. I just noticed some profile when there are codes like "GoToPositionAndTalkWithNpc" or similar, there are the XYZ coordinates, but in some profile they are in format X, X, X, in other profiles they are written like Xf, Xf, Xf,. What the f stands for? I tried both version and apparently didn't notice any difference for my purpose to move the character in a certain position. Thanks for any clarification! ---------------------------------------- ScripterQQ Hello, in C# when you use float type you need to end by "f" (when use have decimal number), but not when you use double type (but result is the same) ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/9395-range-between-two-players/ TITLE: Range between two players ---------------------------------------------------------------------------------------------------- @Droidz | 2018-05-14T17:31:17Z Hey all I have been looking through the ObjectManager, i can't seem to find anything. Is there a way to check range between two units? i.e. Party1 and Party2? I know that a player has to be near them to check their range, but i just want it to do this: if range between Party1 and Party2 < 5 return true else return false. Obviously it will return false if the player can't see party1 and party2. ? Perhaps @Droidz knows if the units party1-4 is implemented in the ObjectManager? I know that his fightclass editor, can heal party. ? Edited May 14, 2018 by Ordush ---------------------------------------- Unknown | 2018-05-14T18:01:24Z WoWPlayer one = new WoWPlayer (); WoWPlayer two = new WoWPlayer (); // Get distance between 2 objects float distance = one . Position . DistanceTo ( two . Position ); If you are looking for party stuff take a look at "wManager.Wow.Helpers.Party" Hope i understood the question right ? Do you want to be able to check if the whole group is near or just one of them? Edited May 14, 2018 by iMod ---------------------------------------- Unknown cool so use GUID which i get with Party and then check position between the two GUIDs? ---------------------------------------- Unknown | 2018-05-14T18:09:23Z The Party namespace offers you a whole object list of the player so you just need to select 2 player and use the DistanceTo property of the position property.of the WoWPlayer object you selected. But yeah you also can use the guid. Edited May 14, 2018 by iMod ---------------------------------------- Unknown I can't seem to be able to get the units from the Party namespace ? I am on Vanilla, not sure if it makes a difference. ? ---------------------------------------- @iMod @iMod are you getting errors in VS using DistanceTo? My projects are all red when I use it. Even using it inside .Order it gives an error. ---------------------------------------- Unknown | 2018-05-14T18:37:42Z Nah i'm lucky i don't had to update any of my projects after updates since yet and DistanceTo is working for me (WOTLK) What kind of error do you get? Edited May 14, 2018 by iMod ---------------------------------------- Unknown It just shows up in Red. I do use resharper but I thought I put ignore error for it. I'll screen shot it after I get home from work. I use it on 7.1.5 private server btw. ---------------------------------------- Unknown Just hover with your mouse over the red text and tell me the error message wich should pop up ? ---------------------------------------- Unknown I had the same issue until i used WoWPlayer. ? ---------------------------------------- Unknown | 2018-05-15T14:38:50Z I went through and referenced other versions of WRobot' s wManager and found Wrath was good, Cata, MoP, WoD, and Legion were all red. The error I'm getting is "cannot resolve symbol". I changed .net versions but that didn't help either. I even tried every suggestion online to possibly correct it. But it does compile for me. It's odd. I get the error using DistanceTo with WowPlayer and WowUnit. Basically anytime DistanceTo is used. Edited May 15, 2018 by Zan ---------------------------------------- Unknown Weird. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/9416-wow-vanilla-taxi-nodes-enableall-plugin/ TITLE: WOW Vanilla - Taxi Nodes EnableAll Plugin ---------------------------------------------------------------------------------------------------- Pudge Hi there, i noticed on vanilla wow that my taxi nodes are disabled from time to time. I checked the flightmaster coords and they were okay, i deleted the TaxiNodes.xml so wrobot can make the file again from games data. But at the end i still saw some taxi nodes deactivated which were used before without any problems. I am not sure what causes these problems on vanilla. So i wrote a small plugin to activate all taxinodes every 5 minutes. I added my file. Maybe it helps somebody. Best regards [Vanilla]TaxiNodes-EnableAll.cs ---------------------------------------- Unknown Lifesaver!  This solves my issue :) ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/9433-pickup-all-monster-corpses/ TITLE: pickup all monster corpses ---------------------------------------------------------------------------------------------------- Unknown A lot of monster corpses can't be once pickup . How can I pick them up all the time until nothing can be picked up. ---------------------------------------- Unknown i get it ---------------------------------------- Unknown Hello, try to increment "Max units near target:" in general settings tab ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/9486-is-it-possible-to-get-stats/ TITLE: Is it possible to get stats? ---------------------------------------------------------------------------------------------------- Unknown In Vanilla, functions like GetSpellBonusHealing(); and GetSpellBonusDamage(spellTreeID); does not exist. Is there a way to get these stats with WRobot? ---------------------------------------- Unknown Only in theorie, you can calculate and make a guess, otherwise no. If i'm not wrong there was a lua library that does it for a healing addon but sadly i don't remember the name y.y ---------------------------------------- iMod | 2018-05-31T13:27:22Z Bonusscanner. ? Already knew how to do it with lua, it's just tedius in Vanilla, because you have to check tooltips. So i hoped there was an easier way with WRobot. Cheers for the heads up ? Edited May 31, 2018 by Ordush ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/9626-objectmanagergetobjectwowplayer/ TITLE: ObjectManager.GetObjectWoWPlayer() ---------------------------------------------------------------------------------------------------- Unknown I'm having a problem where if I have 2 players and use foreach (WoWPlayer _unit in ObjectManager.GetObjectWoWPlayer() ) { Logging.WriteDebug("Unit: " + _unit.Name + " Requires : " + (_unit.MaxHealth- _unit.Health).ToString() + " Heal " + (_unit.HealthPercent).ToString() + " % "); } It returns completely different health values depending on if they are in a party or not on vanilla ---------------------------------------- Unknown Hello, _unit.HealthPercent = 100*_unit.Health/_unit.MaxHealth ---------------------------------------- Unknown WoWPlayer.MaxHealth is the MaxPercentage  and WowPlayer.Health == WowPlayerHealthPercent  when not in a party on Vanilla And if they are in group or party then the values are what you would expect them to be ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/9639-adding-my-own-states/ TITLE: Adding my own states ---------------------------------------------------------------------------------------------------- @Droidz Hey @Droidz through my plugin, I want to add some states of my own (mostly for custom training etc). Unfortunately, when doing this OnEngineStart event, I always get: [ E ] 13 : 50 : 08 - Engine > Pulse (): System . InvalidOperationException : Collection was modified ; enumeration operation may not execute . at System . ThrowHelper . ThrowInvalidOperationException ( ExceptionResource resource ) at System . Collections . Generic . List ` 1.Enumerator . MoveNextRare () at System . Collections . Generic . List ` 1.Enumerator . MoveNext () at robotManager . FiniteStateMachine . Engine . Pulse () which makes sense. Is there any way to add my own states, currently? I couldn't find any event that fires before EngineStart and I am sure I'm not modifying the collection DURING Pulse on another thread . ---------------------------------------- Unknown Hello, you use AddState ? robotManager . Events . FiniteStateMachineEvents . OnStartEngine += engine => { engine . AddState ( MyState ); }; ---------------------------------------- Unknown Yeah, I only get the exception once and then it works. All good. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/7831-use-item-at-hotspot-and-wait/ TITLE: Use item at hotspot and wait? ---------------------------------------------------------------------------------------------------- Unknown Is there any way to use an item at a hotspot or on a target and then wait for a set amount of time before casting use item again? I need to use item and wait and everything I try just has the bot using the item over and over in a loop. Thanks ---------------------------------------- Unknown Hello, use quest type UseScriptOn and use c# code like ItemsManager . UseItem ( 1234 ); Usefuls . WaitIsCasting (); Thread . Sleep ( 1000 * 10 ); (replace 1234 by your item id and replace 10 by number of secondes to wait) ---------------------------------------- Unknown Tried using this and all I get is tons of errors in wow? ItemsManager.UseItem(58165); Usefuls.WaitIsCasting(); Thread.Sleep(1000 * 10); 1005x [string "aiHwKuiCDT.lua"]:1: attempt to index global 'ItemsManager' (a nil value) [string "aiHwKuiCDT.lua"]:1: in main chunk I did usescripton and added hotspots did I miss something? ---------------------------------------- Unknown Check "Is c#..." option ---------------------------------------- Unknown This worked well but I need it to attack  id 3475. How can i incorporate this id in the script you posted? Thanks ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/8168-disable-fightclass-at-all/ TITLE: Disable Fightclass at all ---------------------------------------------------------------------------------------------------- @Droidz @Droidz i know i can disable fight by code Conditions.ForceIgnoreIsAttacked = true; but, this will ignore fighting with mobs. fightclass still running and sometimes contains spells/casts that can break questing behaviour, especialy "out of combat" spells. example this quest http://www.wowhead.com/quest=42834/intense-concentration any mount or stealth or form will remove quest item and you need to gather it again. is there any possibility to disable fighclass and/or fightclass state from running ? and enable it again ---------------------------------------- Unknown Hello, in fightclass if you use option "in combat only" wrobot will not casts spells. You can try to dispose figthclass wManager . Wow . Helpers . CustomClass . DisposeCustomClass (); wManager.Wow.Helpers.CustomClass.LoadCustomClass(); ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/8199-check-for-spell-rank-in-112/ TITLE: Check for spell rank in 1.12 ---------------------------------------------------------------------------------------------------- Unknown Hello I have been searching the forums but not been able to find a solution that works I am trying to have a fight class select the appropriate spell based on the ranks that are known, a dream scenario would be: public Spell Frostbolt = new Spell("Frostbolt"); public Spell Firebolt = new Spell("Firebolt"); if(Frostbolt.KnownRank > 4){ Frostbolt.Launch(); } else { Firebolt.Launch(); } Does any one know how this would be possible to do given the functionality that is available? Thanks in advance! ---------------------------------------- Unknown | 2018-01-06T20:05:54Z would you not be best in just putting a level on it, assuming you train frostbolt rank 4 at lvl 20?  22?.. why not just: if (ObjectMager.Me.level > 20 && Frostbolt.Knownspell) Frostbolt.launch; ... not exactly what your asking, but would work for the scenario you gave above. Edited January 6, 2018 by eeny ---------------------------------------- Unknown Hi Eeny! Thanks for replying Great suggestion, and actaully what I am doing atm. I was hoping there was a better solution though :) Best regards ---------------------------------------- Unknown You can find some inspiration here: https://github.com/Schaka/VanillaFightclassFramework/commit/11db781db73cfa1cda5b43ea6ac034f616d8eab0 ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/8200-check-party-class-composition/ TITLE: Check party class composition ---------------------------------------------------------------------------------------------------- Unknown Hello robot wizards! I am trying to improve my healer fightclass by understanding which classes are in the party The below should work in theory, but I cannot get it to work. Anyone have done a similar function before? Thanks in advance! private bool _Partyclass_Druid; public void UpdatePartyComposition() { _Partyclass_Druid = false; var partyMembers = Party.GetPartyGUIDHomeAndInstance(); if (partyMembers.Any()) { foreach (Int128 u in partyMembers) { if (u.WowClass = "Druid") { _Partyclass_Druid = true; } // Repeat for other clases } } } ---------------------------------------- Unknown Hello, you code is bad, it is more like: private bool _Partyclass_Druid ; public void UpdatePartyComposition () { _Partyclass_Druid = false ; var partyMembers = Party . GetPartyHomeAndInstance (); if ( partyMembers . Any ()) { foreach ( var u in partyMembers ) { if ( u . WowClass == WoWClass . Druid ) { _Partyclass_Druid = true ; } // Repeat for other clases } } } ---------------------------------------- Unknown bool partyHasDruid = Party . GetPartyHomeAndInstance (). Any ( u => u . WowClass == WowClass . Druid ); ---------------------------------------- Unknown Thank you both! ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/8234-bot-on-the-way-to-flightmaster/ TITLE: Bot on the way to flightmaster? ---------------------------------------------------------------------------------------------------- Matenia Hello, I'm having problems with my script that it should stop executing when the bot is on it's way to a flight mater (preferably when it is close to it) I've noticed that the log produces a "11:35:55.664 - [FlightMaster] Try to take taxi at " but I am unsure if i can use something like the below to see if the bot is in a "seek out flightmaster"-state robotManager.Helpful.Logging.Status == "Regeneration" Does anyone know, or is there some documentation regarding the functions that I can call to understand where the bot is going and the purpose? Thanks! ---------------------------------------- Matenia Hello, you can try to read log: robotManager . Events . LoggingEvents . OnAddLog += delegate ( Logging . Log log ) { if (! string . IsNullOrWhiteSpace ( log . Text ) && log . Text . StartsWith ( "[FlightMaster] Try to take taxi at " )) { // ... } }; ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/8242-pathfinder-reportarea-explanation/ TITLE: PathFinder ReportArea explanation ---------------------------------------------------------------------------------------------------- @Droidz | 2018-01-11T09:55:45Z Hi @Droidz can you explain how PathFinder.ReportDangerArea and PathFinder.ReportBigDangerArea are different? From what I understand, ReportNormalArea reports it as safe again, so the pathfinder can once again use the path safely. But how are DangerArea and BigDangerArea different? You always enter a radius anyway. Both DangerAreas are considered when doing corpse runs (maybe unnecessary?). Edited January 11, 2018 by Matenia ---------------------------------------- Unknown Hello, The cost change ( http://masagroup.github.io/recastdetour/classdtQueryFilter.html#details ) m_filter -> setAreaCost (( int ) PolyArea :: POLYAREA_GROUND , 1.0f ); m_filter -> setAreaCost (( int ) PolyArea :: POLYAREA_DANGER , 2.0f ); m_filter -> setAreaCost (( int ) PolyArea :: POLYAREA_BIGDANGER , 15.0f ); ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/8274-party-leader-channel-id/ TITLE: Party leader channel id? ---------------------------------------------------------------------------------------------------- Unknown Hi I'm using Party Chat commands which reads party chat and does lua/c++ commands accordingly, this is very usefull for when im running my 5 man bot group but I've got a problem where it can only read chat from party members and not the party leader. This is the code where it reads the chat while ( chat . ActuelRead != Channel . GetMsgActuelInWow && Products . IsStarted ) { var msg = chat . ReadMsg (); if (! string . IsNullOrWhiteSpace ( msg . Msg ) && (( int ) msg . Channel == 49 || msg . Channel == ChatTypeId . PARTY )) { foreach ( var c in PartyChatCommandSettings . CurrentSetting . Commands ) { if ( c . IsValid () && string . Equals ( c . CommandChat . Trim (), msg . Msg . Trim (), StringComparison . CurrentCultureIgnoreCase )) { c . Run (); break ; } } } } If i change leader then the leader won't be able to litsen to the commands anymore. I need my bots being able to litsen to the leader because that's where I have all the logic for queuing and joining dungeons. Thanks in advance! ---------------------------------------- Unknown I fixed this problem by adding Logging . Write ( "Channel = " + (( int ) msg . Channel ) + " (message: " + msg . Msg + ")" ); just above       var msg = chat.ReadMsg(); in the party chat .cs script and I read in the log what ID the channel had. I found that the party leader had channel 51 insted of normal party which was 2. This could be different in any privaate server so do this check if party leader does not work ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/8449-intercepting-gathering-movement-with-plugin/ TITLE: Intercepting gathering movement with plugin? ---------------------------------------------------------------------------------------------------- Unknown Hi, is it possible to "intercept/override" the "move-to-gather node" state of gatherer? I want to add some basic anti-stuck when flying to a node via a plugin. Like ascending / strafing some yards when distance to the gathe rnode does not change for like 5 seconds. Thanks  for any help ---------------------------------------- Avvi Hello, do you have try with this events wManager . Events . MovementEvents . OnPulseStuckResolver += delegate ( CancelEventArgs cancelable ) { }; wManager . Events . MovementEvents . OnSeemStuck += delegate { }; You can try to check status if you want run this code only when you farming if ( robotManager . Helpful . Logging . Status == "Farming" ) (you can also read last log) ---------------------------------------- Unknown Hi, thank you, Droidz! the robotManager . Helpful . Logging . Status == "Farming" trick is working quite well ;) I also want to add some JumpOrAscend when gatherer detects the "next/new" gatherig node that is "above" the char. Because currently the movement looks very stuttering when gatherer flies to a node with node.z >  me.z   (looks like it runs up stairs). How to readout the position of the current  node/POI gatherer is focused on ? Thank you in advanced. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/8588-declaration-code/ TITLE: Declaration Code ---------------------------------------------------------------------------------------------------- Unknown Hi, how can I make a declaration code in the quest profile? Like in hb. ---------------------------------------- Unknown Hello, you have serveral possibilities but the more easy is: robotManager . Helpful . Var . SetVar ( "Zone" , 123 ); robotManager . Helpful . Var . GetVar ( "Zone" ) ---------------------------------------- Unknown thanks, but this is a very uncomfortable way. better to use Is it possible to implement custom "wManager.Wow.Class.QuestAction" in a bot? like ---------------------------------------- Unknown Use step RunCode with code like: To interact: GoToTask . ToPositionAndIntecractWithNpc ( new Vector3 (- 8835.76 , 490.084 , 109.6157 ), 123 ); // OR GoToTask . ToPositionAndIntecractWithGameObject ( new Vector3 (- 8835.76 , 490.084 , 109.6157 ), 123 ); //if you want interact with NPC/GameObject near of your character: GoToTask . ToPositionAndIntecractWithNpc ( ObjectManager . Me . Position , 123 ); GoToTask . ToPositionAndIntecractWithGameObject ( ObjectManager . Me . Position , 123 ); To go to position: GoToTask . ToPosition ( new Vector3 (- 8835.76 , 490.084 , 109.6157 )); If you want to be sure that step are completed (this work on interact and goto): Use step type While with the code: ! GoToTask . ToPosition ( new Vector3 (- 8835.76 , 490.084 , 109.6157 )) Add after step type EndWhile ---------------------------------------- Unknown I know, I just gave an example. I wanted to add pieces of code to separate files and use them in profiles, whats the easiest way to create a profile ? can you help me with that please ? ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/2170-import-converse-profil-of-honorbuddytuanha/ TITLE: import / converse Profil of Honorbuddy/tuanha ---------------------------------------------------------------------------------------------------- Unknown Hi all I want know if we can converse profil of TuanHa, Honorbuddy (<< all user ban) i have 2 account 1 for player raid with HB before the ban ;) 1 for Farm mmorobot i used HB for raid beacause i have buy very best profils and i want used in mmorobot because our are not detected by Bli² it is possible ? i can pay for converse profil at the 6.2 Thx ---------------------------------------- Unknown Hello, Can you share profiles please (you can try to use "Profiles Converters" product, if this don't works, in "Quester" product, go to "easy quest editor", in the tools you can found hb quest profiles converters) ---------------------------------------- Unknown it is the files who i have buy i have too for dk and paladin https://mega.co.nz/#F!jZ0mHABK!W_nC_g6fjQPFc44vIXpmjQ it is combat routine if you find how use with mmorobot i m very very happy ;) but i dont know if it the same in HB i think it autoplay cooldown i you let check and thx for you help PS : Droidz you speack French ? ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/2194-droidz-question-about-something-like-a-route-addon-in-profile-creator/ TITLE: Droidz, Question about something like a Route Addon in Profile Creator. ---------------------------------------------------------------------------------------------------- zembiosguy Droidz, Would there be a Possibility of adding in a Route Creator or something. I find in alot of areas when making questing profiles in the new zones there are alot of reacurring Stucks in very awkward places.. What i mean by this addons is Creates more Complex Route based profile to Call upon when going  To and From a Spot to turn in quests or Run to Another zone etc.. I would find this very useful in the work that i am doing. So this addon in my mind. Would. Create a set of Exact waypoints to follow with click to move or Set hotpot every X amount of Steps. Then When writing a New Profile you can call on to a profile like (if=quest(123455)) =isCompleted; call(profile(123455)) returnPath; execute= returnPath; I cant code worth a piss so im not sure if im on crack or what lol. Or if you can Implement something like this at all. if you can read my mind Awesome, If not I tried xD ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/2268-face-target-in-healer-mode-plugin/ TITLE: Face target in healer mode plugin ---------------------------------------------------------------------------------------------------- Unknown Hi, i wait to create a plugin so my character will allways face the target in healer mode, is this possible? Thanks ---------------------------------------- Unknown Hello, Yes, it is base code (not tested): FaceTarget.cs ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/1121-advanced-settings-window/ TITLE: Advanced settings window ---------------------------------------------------------------------------------------------------- Unknown Hello, I just got this bot recently and my advanced settings window has everything overlapping and its not adjustable. I found other threats about this saying its my screen resolution but i can't lower my resolution without running into other technical issues. I run 3200x1800. ---------------------------------------- Unknown im Running Double Monitor as well, And my bot is seems to be running fine, Make try going to properties and setting program conditions to windows service pack 2, Helps with some things, If it doesnt Change it back, Run as admin, And if nothing Hopefully there is a fix for you soon = ), Droidz usually replies every morning. ---------------------------------------- Unknown Hello, Can you send me screenshot please. ---------------------------------------- Unknown Hopefully that helps, thank you! ---------------------------------------- Unknown What's your window aspect ratio.. not sure if it makes a huge difference tho. Right click, personalization, screen resolution, make it as high as you can if you havent. Might work. Sent from my HTC One X using Tapatalk ---------------------------------------- Unknown Change your icon size in personalization to small as well. Another try ? Sent from my HTC One X using Tapatalk ---------------------------------------- Unknown While that screen is selected try using shift+ mousewheel up / down. It's used to change text sizes and page sizes on browsers. I'm using s phone to reply so anything I'm coming up with I can test to see if it works atm for you. Sent from my HTC One X using Tapatalk ---------------------------------------- Unknown Can you try it please: http://www.microsoft.com/surface/en-us/support/apps-and-windows-store/app-display-issues#Solution2 And what is your Windows settings (to view if I can fix this in program directly). ---------------------------------------- Unknown Try all that didn't work sadly, thanks for the effort though. What do you mean by what are my windows settings? ---------------------------------------- Unknown In Windows Settings you can change text size and interface size. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/38-list-of-functions-and-how-they-work/ TITLE: List of functions and how they work. ---------------------------------------------------------------------------------------------------- Droidz I will be posting a list of funcs that i understand and do not understand completely and we can all fill them in together  :) this will make profile and character settings a lot more easy for all to build. ------------------------------------------------------------------------------------------------ These are the conditions functions for making a fight class - it is not complete, please update by posting what you know about them so we can get full explanations of these. Pet Health Percent Target Health Percent Health Percent Mana Rage Focus Energy Chi Runes Runic Power Soul Shards Eclipse Holy Power Alternate Dark Force Light Force Shadow Orbs Burning Embers Demonic Fury Arcane Chargers Target Distance Hostile Unit Near Unit Attack Player Near Hostile Unit Near Target Unit Attack Player Near Target Buff Target Buff In Battle Ground Known Spell C Sharp Code Distance Pet To Target Distance Me To Pet Me Level Target Level Have Target Have Pet Me in Combat Me in Move Target in Move Pet in Move Target in Cast Pet in Cast Me in Cast Target is Player Target is Summoned Is Spell Usable Item Count LUA Script Target Pet is my Target Target Targeting Me Target Me or My Pet Target Targeting My Pet ---------------------------------------- Unknown That's a very good idea :) ---------------------------------------- Unknown added a few, will add descriptions soon ---------------------------------------- Droidz Anyone else notice combo points is missing?  when working with a rogue or feral druid, some abilities require combo points, works just like runes or soul shards. ---------------------------------------- Unknown hem it is, report to droidz ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/452-product-construction/ TITLE: Product Construction ---------------------------------------------------------------------------------------------------- Unknown Interested in building my own Bot (Product).  First, is this currently possible?  I haven't looked at your API structure much, but I played with the Quester a little bit and was overall pleased with the responsiveness of the bot and the based Navigation.  In addition, the necessary Battleground helper methods seem to be present.  Looks like the currently provided products implement an interface (IProduct), but there seem to be a few protected methods I don't see exposed via the API, in addition to some internal classes. If this isn't currently possible, do you have plans to open this up?  If this is possible, and I'm missing something, please let me know. Thanks! Pookie ---------------------------------------- Unknown Disregard.  I took a deeper look, and I see the structure now.  Got a basic product working, so I'm on my way. Thanks! Pookie ---------------------------------------- Pookie Hi, I attach grinder product project in this message (sample source code). You can create products, if you need help for understand api classes/functions tell me. Grinder.zip ---------------------------------------- Unknown Excellent.  Thank you sir. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/501-interrupts/ TITLE: Interrupts ---------------------------------------------------------------------------------------------------- Unknown Any way to interrupt spells ? something like : if (SpellManager.KnownSpell(MightyBash) && (Me.CurrentTarget.IsCasting && Me.CanInterruptCurrentSpellCast)) { do something; } ---------------------------------------- Unknown Hello, sample code (fightclass in c#, save this file in *.cs): using System; using System.Threading; using System.Windows.Forms; using robotManager.Helpful; using wManager.Wow.Class; using wManager.Wow.Helpers; using wManager.Wow.ObjectManager; public class Main : ICustomClass { public float Range { get { return 4.5f; } } // Fight Range private bool _isLaunched; private const string FightClassName = "Interrupts"; #region ListSpells private Spell _mightyBash; #endregion ListSpells public void Initialize() { Logging.Write("Loading FightClass: " + FightClassName); // Init spells: _mightyBash = new Spell("Mighty Bash"); Logging.Write("FightClass Loaded: " + FightClassName); // Launch loop in new thread: _isLaunched = true; var threadLoop = new Thread(Loop); threadLoop.Start(); Logging.Write("FightClass Launched: " + FightClassName); } private void Loop() { while (_isLaunched) { try { if (Fight.InFight && ObjectManager.Target.IsValid) { // Spell Mighty Bash: if (ObjectManager.Target.IsCast && _mightyBash.IsSpellUsable && _mightyBash.IsDistanceGood) { var resultLua = Lua.LuaDoString( "ret = \"false\"; spell, rank, displayName, icon, startTime, endTime, isTradeSkill, castID, interrupt = UnitCastingInfo(\"target\"); if interrupt then ret = \"true\" end", "ret"); if (resultLua == "true") { _mightyBash.Launch(); } } } } catch (Exception e) { Logging.Write("Error in FightClass " + FightClassName + ": " + e); } Thread.Sleep(35); // Wait for UC usage } } public void Dispose() { _isLaunched = false; Logging.Write("FightClass Disposed: " + FightClassName); } public void ShowConfiguration() { MessageBox.Show("No setting for this Fight Class: " + FightClassName); } } ---------------------------------------- Unknown Thx alot :) ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/572-new-thing-stopping-the-bot/ TITLE: New thing stopping the bot... ---------------------------------------------------------------------------------------------------- Unknown [Normal] 17:57 - Player attack before being attacked by World Trigger (lvl 85) Is there a way to code in that the bot avoids this combat? Apperently Blizzard is getting smart about how to stop bots. ---------------------------------------- Unknown Hello, You can disable this option in "General Settings" > "Attack before being attacked". ---------------------------------------- Unknown Its not a real mob. Its a code placed in the game against bots. Attacking it is the problem. The bot literally will stand there doing nothing until you are eaither teleported and logged off, idle offline, or worse. ---------------------------------------- Unknown I never had this. Only thing i see sometimes bot trying to attack Mobs that are not attackable (NPCs in battlegrounds or something). And i am quite active lately :D ---------------------------------------- Unknown The only way to stop the bot attacking these mobs is to black list the that area these mobs have been added into the game since lichking days like herbs that can be looted or beasts that can't be skinned! dear Shai just because you don't know about it does not mean it does not exist google something first before giving people here the wrong information please! ---------------------------------------- Unknown In last update I have added possibility to blacklist mobs by guid: ---------------------------------------- Unknown Awesome - didnt realise that - thanks Droidz ---------------------------------------- Unknown Apperently Blizzard is getting smart about how to stop bots. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/603-how-do-i-make-plugins-work/ TITLE: How do i make plugins work? ---------------------------------------------------------------------------------------------------- Unknown Hi im trying to add plugin to wrobot for wow can anyone tell me how to do it? ---------------------------------------- loves2spooge Hello, Extract and copy downloaded plugin in "Plugins" folder. Launch WRobot, in "General settings", tab "Plugins" select your plugin and click on button "Activate/Desactivate selected Plugin" (Plugin activated if green, red if desactivated). ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/721-use-of-talents-failed/ TITLE: Use of talents failed ---------------------------------------------------------------------------------------------------- Unknown If you have spells added to your spellbook via talents, the bot don't use it and if you debug he says spellname = failed. For mages : don't recognize Nether Tempest For Druids : don't recognize Faerie Swarm. ---------------------------------------- Unknown Hello, You need to use base spell name ( ) ---------------------------------------- Droidz There's is no base spellname for Nether Tempest. You only get that skill if you choose that specific talent. If you have Faerie Swarm and you cast Faerie Fire, then he casts Faerie Swarm. The only thing then, when he look for the debuff, it's Faerie Swarm and not Faerie Fire. I made a solution for that one ; new SpellState("Faerie Fire", 23, context => !MeFeralSettings.CurrentSetting.HaveFaerieSwarm && !(ObjectManager.Me.Guid == ObjectManager.Target.BuffCastedBy("Faerie Fire")), false, true, false, false, true, true, 0, false, false, false, false), new SpellState("Faerie Fire", 22, context => MeFeralSettings.CurrentSetting.HaveFaerieSwarm && !(ObjectManager.Me.Guid == ObjectManager.Target.BuffCastedBy("Faerie Swarm")), false, true, false, false, true, true, 0, false, false, false, false), [Setting] [DefaultValue(false)] [Category("Druid Feral")] [DisplayName("Faerie Swarm Talent")] [Description("Put on true if you have that Talent")] public bool HaveFaerieSwarm { get; set; } ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/730-failing-casting-some-spells-for-hunter-class/ TITLE: Failing casting some spells for Hunter class ---------------------------------------------------------------------------------------------------- Unknown He don't cast Rapid Fire and Focus Fire. ---------------------------------------- Unknown Hello, Can you share your fightclass please? What spell conditions do you use? ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/797-advice/ TITLE: Advice. ---------------------------------------------------------------------------------------------------- Unknown So browsing around and i seen this.. http://www.thebuddyforum.com/honorbuddy-forum/plugins/featured-botbases/124708-bot-fpswares-lazyboxer-raf-way-meant.html It is awesome for RaF leveling and what not. Any tips? on how i can transfer all the data from that addon to a WR plugin??? ---------------------------------------- Unknown This is sorta like the Party option on WRobot, minus the questing part (which would be a great addition for us) ---------------------------------------- da8ball Hello, I'll add on the party bot, pickup/turnin quests, repair and sell (if the group leader interact with an of this npc). ---------------------------------------- Unknown awesome!! is it updated yet I tried however its not doing it. ---------------------------------------- Unknown it isn't incorporated yet (  i do not think ) But it will be an awesome addition :) ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/835-timeless-isle/ TITLE: timeless isle ---------------------------------------------------------------------------------------------------- Unknown using the timeless isle grind.xml which  i downloaded frm the website, was happily grinding on mobs (as u do)........until a alli hunter on a tundra mount went past he wasn't flagged for PVP but for some strange reason it targeted the npc on its back....here is some of the log...any suggestions ? 14:35:06 - Player Attack Spectral Mistweaver (lvl 90) [F] 14:35:06 - Cast Curse of the Elements (Curse of the Elements) [F] 14:35:07 - Cast Curse of the Elements (Curse of the Elements) [F] 14:35:09 - Cast Corruption (Corruption) [F] 14:35:10 - Cast Shadow Bolt (Shadow Bolt) [F] 14:35:12 - Cast Shadow Bolt (Shadow Bolt) [F] 14:35:14 - Cast Chaos Bolt (Chaos Bolt) 14:35:16 - Loot Spectral Mistweaver [N] 14:35:16 - Path Count: 3 14:35:17 - Player attack before being attacked by Gnimo (lvl 80)<----------------------| [F] 14:35:17 - Cast Curse of the Elements (Curse of the Elements) ---------------------------------------- Unknown There is an item that drops on the isle that can summon the Npc http://www.wowhead.com/item=104334 Since he is non friendly, he will be attacked. You can blacklist the Spectral Mistweaver, ID 73025 EDIT: My bad, I just realized you meant Gnimo and not the Mistweaver, lol. Anyways, you can blacklist Gnimo, his ID is 32639. ---------------------------------------- Unknown thank you so much for the help.... ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/858-need-help-bot-stopping-and-other-things/ TITLE: [Need Help] Bot stopping and other things ---------------------------------------------------------------------------------------------------- Unknown Hey all, I bought a bot couple of days ago and I am having some problems, hope you can fix it. First thing: My char sometimes stucks on a flat surface. There is no obstacles or anything like that on the ground. He just starts running in circle or something similar and bot log says he stucked and after some time char logs out. (and does not log back in.) I attached my bot log for you to see. Second: More often than not, my char keeps running couple of yards (10-15y) away from mob after killing him and then comes back to loot and skin. It's not a major problem but its time consuming over time and looks un-natural to someone who looks at him (lets say if there is another player near.) Third: I created macro in game to open ' Plump Intestines ' and placed it in action bar position 1. In general settings under 'my macros' I activated macro 1 and changed 'x time' to 10, told him to use it out of combat and when not on the mount but bot doesn't use it. I tested the macro myself by clicking on it ingame and it works, but bot doesn't  use it on his own. I would appreciate any help you can give me. Thanks, Xsonz UPDATE: I noticed,according to bot that macro is ran after every kill (Bot state > Bot: My Macro) , however, plump is not used/opened. I know there is way to change this, but I don't know how. Any ideas? 4 Nov 2013 11H20.log.html ---------------------------------------- Unknown For your macro after looting you can also use option "Auto Make Elemental" (in "General settings" > "Advanced settings" > Tab "Looting and Farming...") and open with notepad "WRobot\Data\autoMakeElementalMacro.txt" and add this line: itemName = GetItemInfo(72201) if GetItemCount(itemName) > 0 then RunMacroText("/use " .. itemName) end (don't forget to save file). Can you give me position where your character sometimes stucks? Thanks ---------------------------------------- Unknown Hey Druidz, thx for the macro alternative but I did what you said but he still doesn't use Plumps. I added that line to "WRobot\Data\autoMakeElementalMacro.txt" and checked the box on Auto Make Elemental. Am I missing something? P.S. The bot kept stucking on that spot where I was farming so I changed the spot, created new profile and it seems fine for now. So that problem is gone for godo. (I hope) ---------------------------------------- Unknown If problem is not solved send me your fightclass (I'll add macro in it). ---------------------------------------- Unknown Hey Droidz, I couldn't make it work so I attached the fightclass in this post. Hope you will have more luck. Thanks OhrenWindwalker Monk.xml ---------------------------------------- Unknown Btw, not casting buffs on himself and not opening Plumps is irritated but I can live without it. It's not a big deal. What bugs me the most is the fact that in 3 days I have this bot, I didn't run it longer than one hour straight, it always stucks somewhere and logs out. To clarify that last part: I am not running my third or fourth profile and the problem is always the same. He makes couple of rounds (grinding between given spots) with no problem what so ever, and then at one point he somehow stucks on the spot he passed already couple of times with no problem,and logs out and doesn't come back in game. When I manually start him again (without even stopping the bot), he just continues from that "stuck" spot like nothing happened. Which means, he wasn't stuck in a first place. (but of course, logs says he did.) . I don't get it and it drives me crazy. I changed couple of grinding locations I made couple of profiles for each (ground, fly paths)...I did everything I could think of..but it continues to happen. And this is always around 60min of grinding. (sometimes is after 15min, sometimes 35,somtimes 1hour and 2min)... If you have any idea why is this happening, please tell me because I can't take it any longer. I bought the bot so I don't have to play, but it turns out I am playing it more now than I played before xD UPDATE: I found a profile of someone else here on forum for the same spot I was farming, so I decided to try it out. I can't say I am surprised, but here is the result. In short: [D] 16:30:13 - Profile used: Krasarang Wilds- Kea Krak.xml 17:27:15 - Relog Player He farmed for 57min and somehow stuck. Note that,the creator of profile did something wrong with hotspots so I found my char on a close by island when I logged back in, but non the less... look at the picture below to see where it "stucked". There is nothing close by to stuck..and he did it.. I also uploaded the log for you to see. 6 Nov 2013 16H24.log.html ---------------------------------------- Unknown I'll test I come back after ---------------------------------------- Unknown Try with this fightclass for plump intestines: OhrenWindwalker Monk EDITED.xml ---------------------------------------- Unknown For stuck problem try to remove folder "WRobot\Meshes\HawaiiMainLand" (and all files of this folder). Don't forget to restart WRobot after. Tell me if problem is solved. Thanks. ---------------------------------------- ==================================================================================================== TOPIC: https://wrobot.eu/forums/topic/991-converter-tool/ TITLE: converter tool ---------------------------------------------------------------------------------------------------- Unknown hello guys I just wonder what can you convert from what to what greet ---------------------------------------- Unknown Sorry elaborate more please? ---------------------------------------- Unknown Hello, It is written in the product window : ---------------------------------------- ####################################################################################################