2018-03-13 10:33:32 -04:00
|
|
|
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)) {
|
2018-03-13 11:15:08 -04:00
|
|
|
long frameStartTime = System.currentTimeMillis();
|
|
|
|
screenCapture = objectDetector.captureScreenshotGameWindow();
|
|
|
|
ArrayList<DetectedObject> detectedObjects = objectDetector.getObjectsInImage(screenCapture, 0.15);
|
2018-03-13 10:33:32 -04:00
|
|
|
ArrayList<DetectedObject> ironOres = objectDetector.getObjectsOfClassInList(detectedObjects, "ironOre");
|
|
|
|
objectTrackingFailure = ironOreTracker.update(screenCapture, boundingBox);
|
|
|
|
oreAvailable = objectDetector.isObjectPresentInBoundingBoxInImage(ironOres, boundingBox, "ironOre");
|
|
|
|
if (!oreAvailable) {
|
|
|
|
oreLostCount++;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
oreLostCount = 0;
|
|
|
|
}
|
2018-03-14 03:17:51 -04:00
|
|
|
//System.out.println("Threaded tracker took " + (System.currentTimeMillis() - frameStartTime) + " milliseconds.");
|
2018-03-13 11:15:08 -04:00
|
|
|
//System.out.println("trackerThread working...");
|
2018-03-13 10:33:32 -04:00
|
|
|
}
|
|
|
|
} 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();
|
|
|
|
}
|
|
|
|
|
2018-03-14 03:17:51 -04:00
|
|
|
//System.out.println("~~~~~~~~~~~~~ trackerThread finished!");
|
2018-03-13 10:33:32 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
private boolean isTimeElapsedOverLimit(long startTime, int timeLimit) {
|
|
|
|
return (System.currentTimeMillis() - startTime) > timeLimit;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void start() {
|
2018-03-14 04:18:07 -04:00
|
|
|
//System.out.println("TrackerThread started");
|
2018-03-13 10:33:32 -04:00
|
|
|
if (trackerThread == null) {
|
|
|
|
trackerThread = new Thread(this, "trackerThread");
|
|
|
|
trackerThread.start();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public void waitTillDone() throws InterruptedException {
|
|
|
|
trackerThread.join();
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|