Jump to content

Avvi

Members
  • Posts

    397
  • Joined

  • Last visited

Reputation Activity

  1. Like
    Avvi got a reaction from shoro2 in Avvi's C# Tips & Tricks with Helpful Code Snippets   
    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 <variable type>  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<int>>("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<int>("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<string>("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<string> 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 
     
  2. Like
    Avvi got a reaction from S13 in Avvi's C# Tips & Tricks with Helpful Code Snippets   
    Added information about WRobot States.
  3. Like
    Avvi got a reaction from Matenia in Avvi's C# Tips & Tricks with Helpful Code Snippets   
    Added information about WRobot States.
  4. Like
    Avvi got a reaction from Matenia in Totown state?   
    bool goToTown = false; public void Initialize(){ initializeToTownWatcher(); } 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."); } }; } I recommend doing it by watching for state change. I've not used Matenia's version, but if that doesn't work you can use my code and use the goToTown boolean. 
     
     
  5. Like
    Avvi got a reaction from conne2 in How to bot safe!   
    I'm going to self promote my plugin, because I feel that it is what gives me the confidence to bot safely on my accounts.  I'm rather self-conscious regarding getting banned / looking too botty, so I created a plugin that can send phone notifications, send emails, and play sound files, pause bot when an event occurs.
    The plugin can watch for:
    Whisper Received Say message Received Character Died Character Logged Out Players nearby Enemy Nearby Character Teleported Continent Changed (or) Character moved very big distance
    This plugin works on all versions of WoW. Including Vanilla :D 
     
     
     
    Great post, and good points @conne2 . Thanks for sharing!
  6. Like
    Avvi reacted to conne2 in How to bot safe!   
    How to bot safe on privet servers
    Guide by Conne2
     
    ? So to start things of with, botting is always a risk, and this guide will definitely not keep you from getting banned for 100%..  but it will for sure increase your already existing chanses by 40-70% depending on how much of the advice you are taking.?

    ? So i've have been using Different bots on World of warcraft for over past 5 years starting with HB and now Wrobot. I've made a lot of profiles on HB and some here on Wrobot. and i've been banned atleast 5-7 times on Retail WOW 
    And i've been learning from every time i got banned what i did wrong and i've been improving a lot. I would not consider myself as a "Proffesional botter" but i know my ways around stuffs... And im only doing this guide to help ppl using Wrobot.  

    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
    ⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄⎔⋄
    ϟ So Here is some quick advice that almost 90% of all bot users know. but im putting it out here just in case. ϟ

    ①  Never ever run the bot 24/7  keep it running for max 7-8h a day.
    ②  Look over your bot as much as you can, there is always things that can go wrong. 
    ③ "You dont want attention from nobody"  meaning don't bot on for exampel friday evening when there is a lot of players online, don't keep botting if you see a lot of players in the area, don't report players and making GM's know you even exist. 
    ④ If you get a warning or if ppl have been /W you saying that they have been reporting you, do not keep botting, take a break for atleast a week, all reports will always be looked in to, and the chanses of getting banned are almost surtent if you ignore reports. 
    ⑤ And the Golden rule is to be patient, you dont have to ruch all they way to 60 (if you are playing Vanilla) in just 1 week of botting, take time, take breaks from botting don't take the rist of botting on a saturday evening when a lot of players is online. and keep calm. mistakes will be made all the time in life. and if you ever get banned, learn from it. And make it right the next time (Tho im making this toturial to make sure you wont get banned :D)

    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
    ?  And now to some better tips that all ppl may not know.  ?

    * Try to use known and tested profiles proven to be working and good. 

    * Never keep to much gold on the account you are botting on, try to mail it over to a different account. 

    * Use a good fighting class and make sure to go throug all the setting on the Wrobot client before starting the bot (for the first time) make sure you know whats up.

    *Use the the Wrobot forum, there is a lot of good content if you are looking for advice in the botting experience. 

    * If you see that some one is following you and you are beeing watched. stop the bot and move around like a normal player, mby even type in the chat " Waddup something you want, i've seen that you have been following me for a while" or something like that, if the GM is taking a look in to the report and see that you have been active in that chat, they may just close the report and you are good to go.

    *Don't make your own profile, only do it if you rly know what you are doing, and if so dont use it on your Main account, or not even your "main bot account" better to be safe then banned  if your profile is bugged in some way. 

    * Never leave the bot running for itself more then 2 hours without watching it, and make sure to have the settings if some one do /W you more then 10 times the bot will close .

    The last golden tips i have for you botters who wanna bot on your main account if you are over lvl 40-50 is to use this addon   --> https://wrobot.eu/files/file/1045-stop-bot-private-servers/
    That addon will make you stand still if a player is rly near you, and that way he will not suspect you for botting, he will just think that you are afk. (i only recomend using this if you wanna be rly rly safe) 

    <   HERE YOU CAN FINDE YOUR WAY AROUND WITH ADDONS AND PROFILES ON VANILLA WOW  -- https://wrobot.eu/files/category/161-wrobot-for-wow-vanilla/  >


    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
     And this is some advice from FNV316 
    -You can start Tracker before any other modul and select humanoids, so it's much easier to keep track of nearby players on the mini map, even if they are out of sight ( humanoid NPCs will be displayed as well tho). Tracker should stay active until WoW has to reload.
    -Especially for grinding, going back to town on a regular base can help to reduce the risk of other players monitoring you for a longer time or running into the bot over and over again. The chance getting caught while doing non bot related stuff is pretty low in my experience.
    -Don't bot seven days a week, let it sleep a couple of days every other day.
    -If someone invites you into a group to do a quest with them, don't just log out (-> bottish behavior). Move to a safe spot and let the bot paused (-> /AFK) for long enough to be sure the player has moved on.
    -Addons like TinyTip allow you to see other players target by just hovering over them. If you see someone targeting you, target them back.
    -Wrobots remote function allows you to monitor your bots without staying at your computer all the time (f.e. via smartphone).
    -Avoid areas with a high density of quests if possible. Don't grind on mobs related to quests.
    -Use tools to increase your latency to ~300-500 ms (personal preference). This helps to hide bottish movement / behavior.
    -Never use more than one IP for each bot instance or even your main account. Set up a proxy or get yourself a fresh IP.


    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔

    Thats all from me, There might be some more good advice that could be implemented in this toturial. but thats all from me.. 
    <Ther might be some wrong spelling tho i am from Sweden>


    I wish you all a safe botting experience on World of Warcraft! 
    // Conne2  
     
     

  7. Like
    Avvi got a reaction from Razzue in Avvi's C# Tips & Tricks with Helpful Code Snippets   
    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 <variable type>  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<int>>("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<int>("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<string>("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<string> 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 
     
  8. Thanks
    Avvi got a reaction from vanbotter in Avvi's C# Tips & Tricks with Helpful Code Snippets   
    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 <variable type>  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<int>>("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<int>("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<string>("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<string> 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 
     
  9. Like
    Avvi reacted to KingFarm in How to make it AFK   
    Hi Guys,
    I was just wondering what plugins / addons you use to make WRobot fully afk or make it just a better bot.
    At this point I use:
    [Paid] Fightclass [Paid] Quester profiles [iEquipe plugin] to add better items [AutoScroll] use the scrolls you find Looking at:[PAID][1.12.1/2.4.3/3.3.5a] AFKing and Humanizing plugin 1.1  Link hereGuess I will buy that later this week.
    Would like to hear from you guys what you use, and what tips you have for me.
    Thanks in advance.
    KingFarm
  10. Like
    Avvi got a reaction from Matenia in Close game when Teleported --> Stop bot when Teleported   
    My recommendation is to take a look / decompile the WRobot code using dotPeek to figure out how Droidz does it. In his above snippet, he is omitting a lot - such as checking for when character is dead / character moved to different continent, etc.
     
  11. Thanks
    Avvi got a reaction from ScripterQQ in Avvi's C# Tips & Tricks with Helpful Code Snippets   
    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 <variable type>  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<int>>("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<int>("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<string>("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<string> 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 
     
  12. Like
    Avvi got a reaction from Stresse in Avvi's C# Tips & Tricks with Helpful Code Snippets   
    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 <variable type>  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<int>>("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<int>("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<string>("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<string> 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 
     
  13. Like
    Avvi reacted to reapler in Plugins and Accept User Keyboard Input   
    I've looked into it, you need to run the hook on its own context via "Application.Run();" to get it working:
    using System; using System.Diagnostics; using System.Runtime.InteropServices; using System.Threading.Tasks; using System.Windows.Forms; using robotManager.Helpful; using wManager.Plugin; public class Main : IPlugin { public void Initialize() { KeyBoardHook.Initialize(); KeyBoardHook.OnKeyDown += KeyDown; } public void Dispose() { KeyBoardHook.OnKeyDown -= KeyDown; KeyBoardHook.Dispose(); } public void Settings() { } private static void KeyDown(object sender, KeyBoardHook.KeyArgs keyArgs) { Logging.Write(keyArgs.Key.ToString()); } public class KeyBoardHook { private const int WH_KEYBOARD_LL = 13; private const int WM_KEYDOWN = 0x0100; private const int WM_KEYUP = 0x101; private static readonly LowLevelKeyboardProc Proc = HookCallback; private static IntPtr _hookId = IntPtr.Zero; private static Keys _lastKeyDown = Keys.None; public delegate void KeyBoardHookEventHandler(object sender, KeyArgs e); public static event KeyBoardHookEventHandler OnKeyDown = delegate{}; public static event KeyBoardHookEventHandler OnKeyUp = delegate{}; internal static void Initialize() { Task.Factory.StartNew(() =>//avoid thread blocking from Application.Run(); { _hookId = SetHook(Proc); Application.Run(); //important! need to run in its own "context" }); } internal static void Dispose() { UnhookWindowsHookEx(_hookId); Application.Exit(); } private static IntPtr SetHook(LowLevelKeyboardProc proc) { using (var curProcess = Process.GetCurrentProcess()) using (var curModule = curProcess.MainModule) { return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(curModule.ModuleName), 0); } } private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam); private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) { if (nCode < 0) return CallNextHookEx(_hookId, nCode, wParam, lParam); if (wParam == (IntPtr) WM_KEYDOWN) { var vkCode = (Keys) Marshal.ReadInt32(lParam); if (_lastKeyDown == vkCode) return CallNextHookEx(_hookId, nCode, wParam, lParam); OnKeyDown(null, new KeyArgs(vkCode)); _lastKeyDown = vkCode; } else if (wParam == (IntPtr) WM_KEYUP) { var vkCode = (Keys) Marshal.ReadInt32(lParam); OnKeyUp(null, new KeyArgs(vkCode)); if (_lastKeyDown == vkCode) _lastKeyDown = Keys.None; } return CallNextHookEx(_hookId, nCode, wParam, lParam); } [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool UnhookWindowsHookEx(IntPtr hhk); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam); [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr GetModuleHandle(string lpModuleName); public class KeyArgs : EventArgs { public Keys Key { get; private set; } public KeyArgs(Keys key) { this.Key = key; } } } } So far it worked well.
  14. Like
    Avvi got a reaction from sowelu in Add custom dll   
    Not stupid questions! Thanks for updating us with how you resolved the issue :D
  15. Like
    Avvi reacted to sowelu in Add custom dll   
    Yes, I have put to /wrobot /bin and /plugins, nothing, but also, all my plugins have .cs extension, not .dll
     
    UPD I have put Xtest.dll, (not .cs) to /plugins and it seems fine! And sorry for my stupid questions.
     
  16. Thanks
    Avvi got a reaction from Arcangelo in Avvi's C# Tips & Tricks with Helpful Code Snippets   
    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 <variable type>  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<int>>("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<int>("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<string>("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<string> 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 
     
  17. Like
    Avvi got a reaction from Enraged in Avvi's C# Tips & Tricks with Helpful Code Snippets   
    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 <variable type>  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<int>>("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<int>("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<string>("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<string> 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 
     
  18. Thanks
    Avvi got a reaction from n8bit in Avvi's C# Tips & Tricks with Helpful Code Snippets   
    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 <variable type>  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<int>>("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<int>("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<string>("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<string> 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 
     
  19. Like
    Avvi reacted to reapler in Plugins and Accept User Keyboard Input   
    Hello, you may decompile my plugin which uses keyboardhook & gui: https://wrobot.eu/files/file/1213-aoebutton/
    I hope it's self-explaining, since it's quite old and can't remember anything ;)
     
  20. Like
    Avvi got a reaction from FNV316 in Avvi's C# Tips & Tricks with Helpful Code Snippets   
    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 <variable type>  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<int>>("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<int>("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<string>("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<string> 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 
     
  21. Like
    Avvi got a reaction from Blobby in Avvi's C# Tips & Tricks with Helpful Code Snippets   
    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 <variable type>  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<int>>("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<int>("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<string>("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<string> 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 
     
  22. Like
    Avvi got a reaction from createdby in "Downloads" moderation and rules   
    If you had noticed, @createdby actually removed ALL submissions previously and submitted everything under one large "Profile Package". You did not tell the FULL truth, @camelot10 initially.
    Timeline of how things occured:
    Each Profile had its own Page. Createdby Removed Listings Reposted All Profiles under one Page. Createdby Removed  Listing Createdby Re-Listed all profiles under separate Pages. You have only reported what has occured in Steps 3 - 5. I personally see nothing wrong with this activity, as it appears that @createdby decided that having everything listed under one page may have lead to less purchases. Also, I see nothing wrong with adding in the previous reviews... I haven't seen any negatives on his profiles anyway, so your point is invalid there anyway. As long as he doesn't repeat this cycle, I don't see a problem.
     
    To be quite honest, I'm tired of these flameposts by you @camelot10. Perhaps you should speak with Droidz individually before embarrassing yourself and , quite honestly, the community with these ridiculous posts. I appreciate your contributions to this forum and bot, but things like this should stay private and mentioned only when reports are CONFIRMED.
  23. Like
    Avvi got a reaction from S13 in Avvi's C# Tips & Tricks with Helpful Code Snippets   
    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 <variable type>  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<int>>("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<int>("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<string>("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<string> 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 
     
  24. Thanks
    Avvi got a reaction from dbennett33 in Avvi's C# Tips & Tricks with Helpful Code Snippets   
    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 <variable type>  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<int>>("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<int>("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<string>("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<string> 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 
     
  25. Like
    Avvi got a reaction from ScripterQQ in The WRobot rant (long)   
    You have valid complaints, and criticisms, but let's keep this civil. There is no reason to start name calling and using curse words.
×
×
  • Create New...