PshYouLost Posted July 27, 2017 Share Posted July 27, 2017 This is the script import org.osbot.rs07.api.model.RS2Object; import org.osbot.rs07.api.util.Utilities; import org.osbot.rs07.script.Script; import org.osbot.rs07.script.ScriptManifest; import org.osbot.rs07.utility.ConditionalSleep; import java.awt.*; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; import java.util.Date; @ScriptManifest(author = "PshYouLost", name = "labelCollector", info = "Get Runescape Info", version = 0.1, logo = "") public final class dataCollector extends Script { private Path screenshotFile = Paths.get("C:\\Users\\PshYouLost\\OSBot\\Data\\screenshots\\screenshot_1.png"); private void labelImages(String folderName) { Utilities.takeScreenshot(); java.util.Date date = new Date(); Path destinationFile = Paths.get("C:\\Users\\PshYouLost\\OSBot\\Data\\screenshots\\varrockEastIronPowerMiner\\" + folderName + "\\" + date.getTime() + ".png"); try { Files.move(screenshotFile, destinationFile, StandardCopyOption.REPLACE_EXISTING); } catch (IOException e) { e.printStackTrace(); log(e); } } private RS2Object ironRocks = null; @Override public final int onLoop() throws InterruptedException { switch (getState()) { case MINE: labelImages("mineIronOre"); ironRocks.interact("Mine"); new ConditionalSleep(5000) { @Override public boolean condition() throws InterruptedException { return myPlayer().isAnimating(); } }.sleep(); break; case DROP: labelImages("dropIronOre"); inventory.dropAll("Iron ore"); break; case WAIT: labelImages("doNothing"); break; } return 100; } private enum State { MINE, DROP, WAIT; } private State getState() { if (inventory.isFull()) { return State.DROP; } else if (!myPlayer().isAnimating() && !myPlayer().isMoving() && ironRocks.hasAction("Mine")) { return State.MINE; } else { return State.WAIT; } } @Override public final void onStart() throws InterruptedException { log("Script Started"); if (getObjects().closest(7488) != null) { ironRocks = getObjects().closest(7488); } else if (ironRocks == null) { log("There are no iron rocks in this area!"); stop(); } camera.toTop(); } @Override public void onPaint(Graphics2D g) { } } The goal is to only power mine iron from these two specific rocks I don't want it to look for any other rocks at the moment. The ID for those 2 specific iron rocks is `7488` There are two issues. At the moment, the issue is that when I click run, the bot clicks an iron ore, and then stops and doesnt do anything else. Any ideas? 1 Quote Link to comment Share on other sites More sharing options...
bugsinmycode Posted July 27, 2017 Share Posted July 27, 2017 (edited) I'm not 100% sure, but it looks like the problem may be that you need to re-cache the iron rocks each time after you mine it. Try printing something like `ironRocks == null` or maybe `ironRocks.hasAction("Mine")` in your getstate function. Edited July 27, 2017 by bugsinmycode Quote Link to comment Share on other sites More sharing options...
Charlotte Posted July 27, 2017 Share Posted July 27, 2017 @Override public final void onStart() throws InterruptedException { log("Script Started"); if (getObjects().closest(7488) != null) { ironRocks = getObjects().closest(7488); } else if (ironRocks == null) { log("There are no iron rocks in this area!"); stop(); } camera.toTop(); } Why is this even in your onStart() ? 1 Quote Link to comment Share on other sites More sharing options...
PshYouLost Posted July 27, 2017 Author Share Posted July 27, 2017 1 minute ago, Charlotte said: @Override public final void onStart() throws InterruptedException { log("Script Started"); if (getObjects().closest(7488) != null) { ironRocks = getObjects().closest(7488); } else if (ironRocks == null) { log("There are no iron rocks in this area!"); stop(); } camera.toTop(); } Why is this even in your onStart() ? Because if I set the ironRocks = getObjects().closest(7488); in the onLoop area, then the bot will run around to other rocks and I don't want that. I only want it to wait for the rock north and west of me Quote Link to comment Share on other sites More sharing options...
bugsinmycode Posted July 27, 2017 Share Posted July 27, 2017 Just now, PshYouLost said: Because if I set the ironRocks = getObjects().closest(7488); in the onLoop area, then the bot will run around to other rocks and I don't want that. I only want it to wait for the rock north and west of me You could store the position/tile of that rock and use that with a filter to find only that rock. Quote Link to comment Share on other sites More sharing options...
PshYouLost Posted July 27, 2017 Author Share Posted July 27, 2017 4 minutes ago, bugsinmycode said: You could store the position/tile of that rock and use that with a filter to find only that rock. Uhh. I'll look into it! 10 minutes ago, bugsinmycode said: I'm not 100% sure, but it looks like the problem may be that you need to re-cache the iron rocks each time after you mine it. Try printing something like `ironRocks == null` or maybe `ironRocks.hasAction("Mine")` in your getstate function. private State getState() { log(ironRocks.hasAction("Mine")); log(!myPlayer().isAnimating()); log(!myPlayer().isMoving()); if (inventory.isFull()) { return State.DROP; } else if (!myPlayer().isAnimating() && !myPlayer().isMoving()) { return State.MINE; } else { return State.WAIT; } } After my bot mines the initial rock, it just keeps printing Quote [INFO][Bot #1][07/27 02:56:33 AM]: true [INFO][Bot #1][07/27 02:56:33 AM]: true [INFO][Bot #1][07/27 02:56:33 AM]: true Every 5 seconds. Which I think means it's stuck at case MINE: labelImages("mineIronOre"); ironRocks.interact("Mine"); new ConditionalSleep(5000) { @Override public boolean condition() throws InterruptedException { return myPlayer().isAnimating(); } }.sleep(); break; Quote Link to comment Share on other sites More sharing options...
bugsinmycode Posted July 27, 2017 Share Posted July 27, 2017 3 minutes ago, PshYouLost said: Uhh. I'll look into it! private State getState() { log(ironRocks.hasAction("Mine")); log(!myPlayer().isAnimating()); log(!myPlayer().isMoving()); if (inventory.isFull()) { return State.DROP; } else if (!myPlayer().isAnimating() && !myPlayer().isMoving()) { return State.MINE; } else { return State.WAIT; } } After my bot mines the initial rock, it just keeps printing Every 5 seconds. Which I think means it's stuck at case MINE: labelImages("mineIronOre"); ironRocks.interact("Mine"); new ConditionalSleep(5000) { @Override public boolean condition() throws InterruptedException { return myPlayer().isAnimating(); } }.sleep(); break; I think you need to put `ironRocks = getObjects().closest(7488); ` in your `onLoop` above your switch. You mentioned that doing that causes it to look for other rocks, but if you use the filter like I mentioned you can fix that. The way you are currently trying to do it is almost surely failing because you aren't recaching the ironRocks variable after mining it. You could test this easily enough by just moving what you currently have in the onstart (where you set iron rocks) to your on loop above the switch. If the script continues mining past 1 ore, then you know thats the issue. At that point you should attempt to implement the filter using the tile/position of the rocks you want to get. It will do you a lot of good in the future to understand how to use filters anyway, so it will be time well spent if you have to spend some time figuring them out. Quote Link to comment Share on other sites More sharing options...
PshYouLost Posted July 27, 2017 Author Share Posted July 27, 2017 7 minutes ago, bugsinmycode said: I think you need to put `ironRocks = getObjects().closest(7488); ` in your `onLoop` above your switch. You mentioned that doing that causes it to look for other rocks, but if you use the filter like I mentioned you can fix that. The way you are currently trying to do it is almost surely failing because you aren't recaching the ironRocks variable after mining it. You could test this easily enough by just moving what you currently have in the onstart (where you set iron rocks) to your on loop above the switch. If the script continues mining past 1 ore, then you know thats the issue. At that point you should attempt to implement the filter using the tile/position of the rocks you want to get. It will do you a lot of good in the future to understand how to use filters anyway, so it will be time well spent if you have to spend some time figuring them out. I'm almost certain I'm doing this wrong.. =/ But this is what I attempted to do List<RS2Object> availableIronRock = getObjects().filter(t -> t.getPosition() == ironRocks.getPosition() && t.getId() == 7488); availableIronRock.get(0).interact("Mine"); But that obviously doesn't work lol. And I couldn't figure out how to use a filter after the `.closest` part Quote Link to comment Share on other sites More sharing options...
PshYouLost Posted July 27, 2017 Author Share Posted July 27, 2017 Holy shit. Okay, I'm definitely getting closer public final int onLoop() throws InterruptedException { ironRocks = getObjects().closest(n -> n.getId() == 7488 && ((n.getX() == 1234 && n.getY() == 1234) || (n.getX() == 1234 && n.getY() == 1234))); switch (getState()) { case MINE: labelImages("mineIronOre"); ironRocks.interact("Mine"); new ConditionalSleep(5000) { @Override public boolean condition() throws InterruptedException { return myPlayer().isAnimating(); } }.sleep(); break; case DROP: labelImages("dropIronOre"); inventory.dropAll("Iron ore"); break; case WAIT: labelImages("doNothing"); break; } return 100; } Quote Link to comment Share on other sites More sharing options...
PshYouLost Posted July 27, 2017 Author Share Posted July 27, 2017 Okay I officially did it! Thanks everyone for all your help! ironRocks = getObjects().closest(n -> n.getId() == 7488 && ((n.getX() == 3286 && n.getY() == 3369) || (n.getX() == 3285 && n.getY() == 3368))); 1 Quote Link to comment Share on other sites More sharing options...
Eagle Scripts Posted July 27, 2017 Share Posted July 27, 2017 (edited) Only do ironRocks = getObjects().closest(n -> n.getId() == 7488 && ((n.getX() == 1234 && n.getY() == 1234) || (n.getX() == 1234 && n.getY() == 1234))); In the actual mining state, no need to do that in a state where you won't need to know any information about that object. Please do null-checking aswell :) Edited July 27, 2017 by Eagle Scripts 1 Quote Link to comment Share on other sites More sharing options...
PshYouLost Posted July 27, 2017 Author Share Posted July 27, 2017 Good idea @Eagle Scripts! Quote Link to comment Share on other sites More sharing options...