liondedan 1 Share Posted December 10, 2018 Hello, I'm a web developer, played RuneScape for years, and fancy having a go at making some dreambot scripts. The community here seems great and there are some very cool projects ongoing. I'm running into what is probably a very beginner Java problem, as I haven't actually read any Java docs to get here (reply replying on the small amoutn of similarities between Java and other web languages) - so feel free to shout at me. However, if I'm creating a new class, is it possibly to use dreambot methods from within the new class. Example: // Main.java public class Main extends AbstractScript { @Override public int onLoop() { Area varrockArea = new Area (3187, 3235,3196, 3228); TreeLocation varrock = new TreeLocation(varrockArea); varrock.getToLocation(); } } // TreeLocation.java public class TreeLocation { Object location; // This is the constructor of the class Employee public TreeLocation(Object location) { this.location = location; } public void getToLocation() { getWalking().walk(location.getRandomTile()); } } Thanks and Hello Dan Link to comment Share on other sites More sharing options...
Xephy 237 Share Posted December 10, 2018 You'll notice that you can only execute methods like that via the MethodContext class, which is a parent of AbstractScript. If you want to do something like this, you'll need to pass the method context around that is instantiated internally when the AbstractScript class is loaded by the class loader. Your constructor would need to look something like public TreeLocation(Area loc, MethodContext mc) { this.loc = loc; this.mc = mc; } public void walk(Area loc) { if (mc.getWalking().walk(/* a location that should be an Area#getRandomTile() or Tile */)) { // Sleep and stuff } } Link to comment Share on other sites More sharing options...
liondedan 1 Author Share Posted December 10, 2018 Ah brilliant - thank you Xephy will have a play when I get home later. Link to comment Share on other sites More sharing options...
liondedan 1 Author Share Posted December 10, 2018 Hey sorry - next question @Xephy . If I'm instantiating the TreeLocation class from the main class - how do I go about passing the MethodContext through? import org.dreambot.api.methods.MethodContext; TreeLocation varrock = new TreeLocation(MethodContext.this); Link to comment Share on other sites More sharing options...
Xephy 237 Share Posted December 10, 2018 15 minutes ago, liondedan said: Hey sorry - next question. If I'm instantiating the TreeLocation class from the main class - how do I go about passing the MethodContext through? import org.dreambot.api.methods.MethodContext; TreeLocation varrock = new TreeLocation(MethodContext.this); getClient().getMethodContext(); Link to comment Share on other sites More sharing options...
Nuclear Nezz 2055 Share Posted December 10, 2018 AbstractScript is also a method context in itself. So you could just do new TreeLocation(this); from the main script class. Link to comment Share on other sites More sharing options...
Im A Baller 348 Share Posted December 10, 2018 23 minutes ago, Nuclear Nezz said: AbstractScript is also a method context in itself. So you could just do new TreeLocation(this); from the main script class. ^ this Remember that MethodContext is the parent class of AbstractScript, so you get access to those methods by passing in the AbstractScript. I would recommend not storing your location as an Object as well. I would recommend storing it as an Area; this is good design and practice both for clarity and because you won't have to cast it later. It's also good practice to store your variables explicitly as either 'private' or 'public'. Private variables can't be viewed or accessed from outside of the file, and public variables are viewable, accessible, and changeable from outside of the file. Lastly, if a variable should not (or will not) change value in the future, another useful marker is 'final', which means the value will never be changed after when it's first assigned (which you're doing during instantiation of the object). It should look something like this: // TreeLocation.java public class TreeLocation { private Area location; private final MethodContext m; // This is the constructor of the class Employee public TreeLocation(MethodContext m, Area location) { this.m = m; this.location = location; } public void getToLocation() { m.getWalking().walk(location.getRandomTile()); } } // Main.java public class Main extends AbstractScript { @Override public int onLoop() { Area varrockArea = new Area (3187, 3235,3196, 3228); TreeLocation varrock = new TreeLocation(this, varrockArea); varrock.getToLocation(); } } Happy scripting Link to comment Share on other sites More sharing options...
liondedan 1 Author Share Posted December 12, 2018 On 12/10/2018 at 10:05 PM, Im A Baller said: ^ this Remember that MethodContext is the parent class of AbstractScript, so you get access to those methods by passing in the AbstractScript. I would recommend not storing your location as an Object as well. I would recommend storing it as an Area; this is good design and practice both for clarity and because you won't have to cast it later. It's also good practice to store your variables explicitly as either 'private' or 'public'. Private variables can't be viewed or accessed from outside of the file, and public variables are viewable, accessible, and changeable from outside of the file. Lastly, if a variable should not (or will not) change value in the future, another useful marker is 'final', which means the value will never be changed after when it's first assigned (which you're doing during instantiation of the object). It should look something like this: // TreeLocation.java public class TreeLocation { private Area location; private final MethodContext m; // This is the constructor of the class Employee public TreeLocation(MethodContext m, Area location) { this.m = m; this.location = location; } public void getToLocation() { m.getWalking().walk(location.getRandomTile()); } } // Main.java public class Main extends AbstractScript { @Override public int onLoop() { Area varrockArea = new Area (3187, 3235,3196, 3228); TreeLocation varrock = new TreeLocation(this, varrockArea); varrock.getToLocation(); } } Happy scripting Thank you for this ^^ Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.