1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

Tutorial Making a bot that does something :D

Discussion in 'Tutorials & Resources' started by awesome123man, Sep 9, 2016.

?

Was this helpful to users trying to become bot authors?

  1. Yes, please add more!

    28 vote(s)
    75.7%
  2. Yes, I am well off now.

    3 vote(s)
    8.1%
  3. No, please add more!

    0 vote(s)
    0.0%
  4. No, it wasn't useful.

    3 vote(s)
    8.1%
  5. No, it is too confusing.

    4 vote(s)
    10.8%
Multiple votes are allowed.
  1. awesome123man

    awesome123man Go check out new bots and give helpful feedback.

    Joined:
    Jan 31, 2016
    Messages:
    5,413
    Likes Received:
    1,662
    Hello aspiring botters!
    I am a pretty new bot author know on Runemate as @awesome123man
    In real life I am just starting my first year of college, and have taken one java class in High School.

    This tutorial is for those who have not taken any Java classes or who don't understand how to use the Runemate API.

    Here is how i will teach you guys, i will show a piece of code, and translate it to english to the best that i can.

    Code (Text):
    1. public class ExampleBot extends LoopingBot {
    2.  
    3. @Override
    4. public void onStart(String... args) {//Begins onStart method
    5.  
    6. }//Ends onStart Method
    7.  
    8. @Override
    9. public void onLoop() {//Begins onLoop method
    10.  
    11. }//Ends onLoop method
    12.  
    13. }//Ends class ExampleBot
    Translation:
    create a class named "ExampleBot" that uses LoopingBot(onLoop()).

    Create an onStart method with no return value, meaning the method is for completing actions, not getting a value, that will execute when the bot is started.

    Create an onLoop method with no return value to loop while bot is running.

    Code (Text):
    1. public GameObject obj;
    2. //Put this inside the class, but outside(before) the onStart and onLoop methods.
    Translation:
    create a variable of GameObject type called "obj".

    Code (Text):
    1. obj = GameObjects.newQuery().names("Insert name here in these quotes").results().nearest();
    2. //Put this inside the onLoop method.
    Translation:
    set the value of the varible "obj" to the GameObject returned from the statement to the right of the equals sign.

    Code (Text):
    1. if(obj != null){
    2.  
    3. }
    4. //Also in onLoop method.
    Translation:
    if the statement inside the parenthesis is true, execute what is inside the the brackets of the if statement. This particular statement checks if obj has a value or is null(does not). Do this whenever there is a possibilty that a variable could not have a value assigned to it.

    Code (Text):
    1. if(obj.interact("Action here", "name here(optional)"){
    2.  
    3. }
    4. //Inside of the if statement's braces above.
    Translation:
    tries to interact with the GameObject "obj" using the action and name, if the mouse successfully clicks it, the statement is true, otherwise, it's false.

    Code (Text):
    1. Execution.delayUntil(() -> Players.getLocal().getAnimationId() != -1, 5000);
    2. //Put this inside the if statement above that has the interaction
    Translation:
    Stop the bot from doing anything else until the players animation Id is not -1, which happens to mean that the player is not static and is animating. (Very useful). Also notice the 5000, which is the max delay, so if the player's animation Id is always == -1, then after 5000 ms, or 5 seconds, the delay will stop. (aka. Max delay time)

    Now for an actual bot Example. Make sure you create all the classes and methods, but leave out the stuff inside the onLoop, for i am going to create a few unsophisticated sample bots.
    Code (Text):
    1. //Put this inside onLoop method
    2. //This is a sample bot that cuts Trees only
    3. obj = GameObjects.newQuery().names("Tree").results.nearest();
    4. if(obj != null){
    5. if(obj.interact("Chop down", obj.getDefinition().getName())){
    6. Execution.delayUntil(() -> !obj.isValid(), 10000);
    7. }
    8. }
    Translation:
    sets obj to the nearest Tree, or null if no trees are nearby
    if the tree was found, execute the inside of the if
    if the tree was successfully clicked to chop down, execute the inside of the if
    Delay the bot until the tree is no longer there or has changed somehow.

    And that's about it! You will need a manifest to go along with this, but there are good tutorials out there like This one :D

    To make things a bit more organized with larger bots/more sophistication, you use things called helper methods.

    To call a helper method, simply use its name and any local variables it has inside of parenthesis.
    For example, findPlace(obj.getPosition()).
    This set's the local variable known as place in the method below called findPlace to the obj position.

    Here is how you create them and what they do
    This is a helper method to check if the player is animating
    Code (Text):
    1. public boolean isAnimating() {
    2.     Player me = Players.getLocal();
    3.     if (me != null) {
    4.         return me.getAnimationId() != -1;
    5.     }
    6.     return true;
    7. }
    Translation:
    Creates a public helper method called isAnimating that returns a boolean(True or false)
    Get's the current player and set's it to the local variable, "me"
    Checks to see if me is not null(null means that no player was found)
    If the player was found return if the animationId is not equal to -1,
    If the player was not found(null), return true because (A convention for me).

    Here is another helper method that does walking for your player.
    Code (Text):
    1. public void findPlace(Coordinate place){
    2.     path = RegionPath.buildTo(place);
    3.     if(path != null) {
    4.         path.step();
    5.     }
    6. }
    Translation:
    Creates the helper method findPlace, that returns a void(nothing) meaning it does an action
    Notice that inside the parenthesis of the method declaration there is "Coordinate place"
    That is a local variable only accessible inside that method, and that value is set when you call the method in your bot.
    path is a variable declared in the Class that is of type Path, and set to the RegionPath created.
    if the path was created, take a step. Inside the parenthesis you can put true to run and false to walk.

    This style of scripting is the least organized. Consider looking into TaskScript and TreeScript soon to be TaskBot and TreeBot as they are much more organized. The syntax of the actions and variable declarations/setters is still the same, just more organized.
     
    #1 awesome123man, Sep 9, 2016
    Last edited: Oct 26, 2016
    dtky, taushadow, DjZep and 6 others like this.
  2. Geashaw

    Joined:
    Jan 8, 2015
    Messages:
    1,429
    Likes Received:
    252
    Lovely
     
    awesome123man likes this.
  3. machiavelli

    Joined:
    Sep 2, 2016
    Messages:
    28
    Likes Received:
    4
    Perfect brother, excellent work and nice tut!
     
    awesome123man likes this.
  4. qverkk

    Joined:
    Sep 22, 2015
    Messages:
    1,603
    Likes Received:
    381
    Code (Text):
    1. public boolean isAnimating() {
    2.     Player me = Players.getLocal();
    3.     if (me != null) {
    4.         return me.getAnimationId() != -1;
    5.     }
    6.     return false; // false m8, otherwise this boolean will always return true
    7. }
     
  5. awesome123man

    awesome123man Go check out new bots and give helpful feedback.

    Joined:
    Jan 31, 2016
    Messages:
    5,413
    Likes Received:
    1,662
    I want it to be true. So if got some reason the player is null then isAnimating is true and it wont do anything. I usually do if (!isAnimating) outside my main part of code.
     
  6. qverkk

    Joined:
    Sep 22, 2015
    Messages:
    1,603
    Likes Received:
    381
    Ah alright then ;) good job
     
  7. Derk

    Derk 12 year old normie

    Joined:
    Jan 8, 2015
    Messages:
    2,766
    Likes Received:
    1,339
    #getDefintion() might return null, nullchecking is required.
     
    qverkk likes this.
  8. awesome123man

    awesome123man Go check out new bots and give helpful feedback.

    Joined:
    Jan 31, 2016
    Messages:
    5,413
    Likes Received:
    1,662
    Damnit, saving that for later... thanks!
     
    Derk likes this.
  9. Jhinn

    Joined:
    Jun 9, 2015
    Messages:
    3,643
    Likes Received:
    1,337
    Thank you for putting effort into teaching some basic stuff!

    Very usefull :)
     
  10. Dylan Turner

    Joined:
    Oct 19, 2015
    Messages:
    219
    Likes Received:
    52
    might have to have a go at writing an awful bot for a bit of fun ;) ! thanks @awesome123man
     
  11. awesome123man

    awesome123man Go check out new bots and give helpful feedback.

    Joined:
    Jan 31, 2016
    Messages:
    5,413
    Likes Received:
    1,662
    Anytime. You can request code also! Or bots... :p
     
  12. SuperBotter

    SuperBotter Super Bot Author

    Joined:
    Jun 24, 2016
    Messages:
    151
    Likes Received:
    52
    This is good for new bot developers, thank you for making this. However, I have a few notes that may help (help you or anyone else reading this). First I would recommend using TaskScript, as it is much easier to make more modular, OOP bots while using it.

    I've seen you post this method in a few places before, and every time I see it I ask myself, "Wouldn't it be easier to just call #getAnimationId() directly?". In all of the places where "isAnimating()" is used, it can be replaced with "player.getAnimationId() != -1" (assuming the nullcheck on "player" have been done). What are the advantages to this over calling #getAnimationId() directly?

    This is a good method, its very similar to the method that I use to travel in my bots. The only thing that I would change is the naming. "findPlace" sounds like it would return an Area, instead it goes to the given coordinate. In my code, my equivalent method is "goToCoordinate(Coordinate coordinate)". This is just a minor nitpick that I believe would make code that uses this method more understandable.

    Please don't take this negatively, I like the guide, I hope that it encourages more people to make bots for RuneMate and make the client even better.
     
  13. awesome123man

    awesome123man Go check out new bots and give helpful feedback.

    Joined:
    Jan 31, 2016
    Messages:
    5,413
    Likes Received:
    1,662
    Great advice! Would you mine giving a quick task script bot tutorial?
     
  14. Yuuki Asuna

    Joined:
    Aug 11, 2016
    Messages:
    778
    Likes Received:
    110
    Keep getting this :| http://i.imgur.com/o5N9xuM.png

    How can I test out my script bot via clicking the Play/Run button?

    Here's my configuration right now--> -login=PuppyLover101:hunter123-sdk -Xmx1024m
     
  15. Wet Rag

    Wet Rag easily triggered ✌

    Joined:
    Dec 31, 2015
    Messages:
    4,449
    Likes Received:
    1,692
    you just gave out your login to the site...
     
  16. awesome123man

    awesome123man Go check out new bots and give helpful feedback.

    Joined:
    Jan 31, 2016
    Messages:
    5,413
    Likes Received:
    1,662
    Hoping that's a fake password...
    --- Double Post Merged, Sep 30, 2016, Original Post Date: Sep 30, 2016 ---
    should be com.runemate.boot.Boot i believe
     
  17. Yuuki Asuna

    Joined:
    Aug 11, 2016
    Messages:
    778
    Likes Received:
    110
    https://i.imgur.com/K7IPz7Y.jpg

    Getting this error now :| thanks btw :)
     
  18. SuperBotter

    SuperBotter Super Bot Author

    Joined:
    Jun 24, 2016
    Messages:
    151
    Likes Received:
    52
    Check your cases. Use IntelliJ's autocompletion next time to prevent that :)
     
  19. awesome123man

    awesome123man Go check out new bots and give helpful feedback.

    Joined:
    Jan 31, 2016
    Messages:
    5,413
    Likes Received:
    1,662
  20. muhammadfahadqureshi

    Joined:
    Oct 6, 2016
    Messages:
    1
    Likes Received:
    0
    How do i add these .idea,out into my eclipse and what are they?
     

Share This Page

Loading...