diff --git a/src/DropperThread.java b/src/DropperThread.java new file mode 100644 index 0000000..51ea051 --- /dev/null +++ b/src/DropperThread.java @@ -0,0 +1,40 @@ +import java.io.IOException; + +public class DropperThread implements Runnable { + Thread dropperThread; + Inventory inventory; + Cursor cursor; + + public DropperThread(Inventory inventory, Cursor cursor) { + this.inventory = inventory; + this.cursor = cursor; + } + + @Override + public void run() { + try { + inventory.update(); + cursor.moveAndRightlickAtCoordinatesWithRandomness(inventory.getClickCoordinatesForInventorySlot(0, 0), 15, 15); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + System.out.println("~~~~~~~~~~~~~ dropperThread finished!"); + } + + public void start() { + System.out.println("dropperThread started"); + if (dropperThread == null) { + dropperThread = new Thread(this, "dropperThread"); + dropperThread.start(); + } + } + + public void waitTillDone() throws InterruptedException { + dropperThread.join(); + } + +} diff --git a/src/IronMiner.java b/src/IronMiner.java index dbff826..bd9640c 100644 --- a/src/IronMiner.java +++ b/src/IronMiner.java @@ -46,7 +46,6 @@ public class IronMiner { humanBehavior = new HumanBehavior(); cameraCalibrator = new CameraCalibrator(); randomDetector = new RandomDetector(); - worldHopper = new WorldHopper(); } public void run() throws Exception { @@ -73,37 +72,18 @@ public class IronMiner { DetectedObject closestIronOre = getClosestObjectToCharacter(ironOres); if (closestIronOre != null) { - Rect2d boundingBox = closestIronOre.getBoundingRect2d(); - ObjectTracker ironOreTracker = new ObjectTracker(screenCapture, boundingBox); - cursor.moveAndLeftClickAtCoordinatesWithRandomness(closestIronOre.getCenterForClicking(), 10, 10); - long miningStartTime = System.currentTimeMillis(); - int maxTimeToMine = Randomizer.nextGaussianWithinRange(3400, 4519); + System.out.println("Starting threads!"); + TrackerThread trackerThread = new TrackerThread(screenCapture, closestIronOre, objectDetector); + trackerThread.start(); + DropperThread dropperThread = new DropperThread(inventory, cursor); + dropperThread.start(); - boolean objectTrackingFailure = false; - boolean oreAvailable = true; - int oreLostCount = 0; - while (!objectTrackingFailure && oreLostCount < 3 && !isTimeElapsedOverLimit(miningStartTime, maxTimeToMine)) { - long trackingFrameStartTime = System.currentTimeMillis(); - - screenCapture = objectDetector.captureScreenshotGameWindow(); - detectedObjects = objectDetector.getObjectsInImage(screenCapture, 0.15); - ironOres = objectDetector.getObjectsOfClassInList(detectedObjects, "ironOre"); - objectTrackingFailure = ironOreTracker.update(screenCapture, boundingBox); - oreAvailable = objectDetector.isObjectPresentInBoundingBoxInImage(ironOres, boundingBox, "ironOre"); - if (!oreAvailable) { - oreLostCount++; - } - else { - oreLostCount = 0; - } - } - - inventory.update(); - if (!inventory.inventorySlotIsEmpty(0, 0)) { - cursorTask.dropOre(cursor, inventory); - } + trackerThread.waitTillDone(); + dropperThread.waitTillDone(); + + System.out.println("Both threads finished?"); } humanBehavior.randomlyCheckMiningXP(cursor); @@ -116,6 +96,46 @@ public class IronMiner { System.out.println("Completed full mining session."); } + /*private void dropOre() throws Exception { + inventory.update(); + System.out.println("Thread 1 [mouse hover] finished!"); + //cursorTask.dropOre(cursor, inventory); + }*/ + + /*private void trackOre(DetectedObject closestIronOre, BufferedImage screenCapture) throws Exception { + Rect2d boundingBox = closestIronOre.getBoundingRect2d(); + ObjectTracker ironOreTracker = new ObjectTracker(screenCapture, boundingBox); + + long miningStartTime = System.currentTimeMillis(); + int maxTimeToMine = Randomizer.nextGaussianWithinRange(3400, 4519); + + boolean objectTrackingFailure = false; + boolean oreAvailable = true; + int oreLostCount = 0; + while (!objectTrackingFailure && oreLostCount < 3 && !isTimeElapsedOverLimit(miningStartTime, maxTimeToMine)) { + BufferedImage screenCapture2 = objectDetector.captureScreenshotGameWindow(); + ArrayList detectedObjects = objectDetector.getObjectsInImage(screenCapture2, 0.15); + ArrayList ironOres = objectDetector.getObjectsOfClassInList(detectedObjects, "ironOre"); + objectTrackingFailure = ironOreTracker.update(screenCapture, boundingBox); + oreAvailable = objectDetector.isObjectPresentInBoundingBoxInImage(ironOres, boundingBox, "ironOre"); + if (!oreAvailable) { + oreLostCount++; + } + else { + oreLostCount = 0; + } + } + System.out.println("Thread 2 [track ore] finished!"); + }*/ + + /*private void dropOre() throws IOException { + inventory.update(); + if (inventory.containsItem("ironOre")) { + cursor.moveAndRightlickAtCoordinatesWithRandomness(inventory.getClickCoordinatesForInventorySlot(0, 0), 15, 15); + // move cursor down 40 pixels + cursor.moveAndLeftClickAtCoordinatesWithRandomness(goalPoint, 20, 5); + } + }*/ private void dropInventoryIfFull() throws Exception { inventory.updateLastSlot(); diff --git a/src/MultiThreadingExample.java b/src/MultiThreadingExample.java new file mode 100644 index 0000000..af7dcb9 --- /dev/null +++ b/src/MultiThreadingExample.java @@ -0,0 +1,13 @@ + +public class MultiThreadingExample { + + public static void main(String[] args) { + // TODO Auto-generated method stub + System.out.println("Starting multithreading..."); + TrackerThread trackerThread = new TrackerThread(); + trackerThread.start(); + DropperThread dropperThread = new DropperThread(); + dropperThread.start(); + } + +} diff --git a/src/TrackerThread.java b/src/TrackerThread.java new file mode 100644 index 0000000..ab26728 --- /dev/null +++ b/src/TrackerThread.java @@ -0,0 +1,77 @@ +import java.awt.AWTException; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.util.ArrayList; + +import org.opencv.core.Rect2d; + +public class TrackerThread implements Runnable { + Thread trackerThread; + BufferedImage screenCapture; + DetectedObject closestIronOre; + ObjectDetector objectDetector; + + public TrackerThread(BufferedImage screenCapture, DetectedObject closestIronOre, ObjectDetector objectDetector) { + this.screenCapture = screenCapture; + this.closestIronOre = closestIronOre; + this.objectDetector = objectDetector; + } + + @Override + public void run() { + Rect2d boundingBox = closestIronOre.getBoundingRect2d(); + ObjectTracker ironOreTracker; + try { + ironOreTracker = new ObjectTracker(screenCapture, boundingBox); + + long miningStartTime = System.currentTimeMillis(); + int maxTimeToMine = Randomizer.nextGaussianWithinRange(3400, 4519); + + boolean objectTrackingFailure = false; + boolean oreAvailable = true; + int oreLostCount = 0; + while (!objectTrackingFailure && oreLostCount < 3 && !isTimeElapsedOverLimit(miningStartTime, maxTimeToMine)) { + BufferedImage screenCapture2 = objectDetector.captureScreenshotGameWindow(); + ArrayList detectedObjects = objectDetector.getObjectsInImage(screenCapture2, 0.15); + ArrayList ironOres = objectDetector.getObjectsOfClassInList(detectedObjects, "ironOre"); + objectTrackingFailure = ironOreTracker.update(screenCapture, boundingBox); + oreAvailable = objectDetector.isObjectPresentInBoundingBoxInImage(ironOres, boundingBox, "ironOre"); + if (!oreAvailable) { + oreLostCount++; + } + else { + oreLostCount = 0; + } + System.out.println("trackerThread working..."); + } + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (AWTException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + System.out.println("~~~~~~~~~~~~~ trackerThread finished!"); + } + + private boolean isTimeElapsedOverLimit(long startTime, int timeLimit) { + return (System.currentTimeMillis() - startTime) > timeLimit; + } + + public void start() { + System.out.println("TrackerThread started"); + if (trackerThread == null) { + trackerThread = new Thread(this, "trackerThread"); + trackerThread.start(); + } + } + + public void waitTillDone() throws InterruptedException { + trackerThread.join(); + } + +} diff --git a/src/main.java b/src/main.java index 46aaf8f..9f2e9e2 100644 --- a/src/main.java +++ b/src/main.java @@ -10,7 +10,7 @@ public class main { public static void main(String[] args) throws Exception { System.out.println("Starting Iron Miner."); - System.load("/usr/local/cuda/lib64/libcublas.so.9.0"); + System.load("/usr/local/cuda/lib64/libcublas.so.9.0"); System.load("/usr/local/cuda/lib64/libcusolver.so.9.0"); System.load("/usr/local/cuda/lib64/libcudart.so.9.0"); System.load("/usr/local/cuda/lib64/libcufft.so.9.0"); @@ -20,19 +20,7 @@ public class main { IronMiner ironMiner = new IronMiner(); ironMiner.run(); - /*Cursor cursor = new Cursor(); - CursorTask cursorTask = new CursorTask(); - Inventory inventory = new Inventory(); - - while (true) { - inventory.update(); - if (inventory.isInventoryFull()) { - System.out.println("Inventory full. Emptying..."); - cursorTask.optimizedDropAllItemsInInventory(cursor, inventory); - } - Thread.sleep(100); - } */ - //cursor.moveCursorToCoordinates(new Point(620, 420)); + System.out.println("Finished everything!"); } } diff --git a/target/classes/DropperThread.class b/target/classes/DropperThread.class new file mode 100644 index 0000000..00e7137 Binary files /dev/null and b/target/classes/DropperThread.class differ diff --git a/target/classes/IronMiner.class b/target/classes/IronMiner.class index f86848d..9625d95 100644 Binary files a/target/classes/IronMiner.class and b/target/classes/IronMiner.class differ diff --git a/target/classes/MultiThreadingExample.class b/target/classes/MultiThreadingExample.class new file mode 100644 index 0000000..10024f5 Binary files /dev/null and b/target/classes/MultiThreadingExample.class differ diff --git a/target/classes/TrackerThread.class b/target/classes/TrackerThread.class new file mode 100644 index 0000000..8f72f12 Binary files /dev/null and b/target/classes/TrackerThread.class differ diff --git a/target/classes/main.class b/target/classes/main.class index 10882b7..1ffd688 100644 Binary files a/target/classes/main.class and b/target/classes/main.class differ