Layed the framework for an IronMiner bot
This commit is contained in:
parent
19aa168a3c
commit
bd3d07d7ac
|
@ -19,8 +19,8 @@ import java.util.regex.Pattern;
|
|||
public class Cursor {
|
||||
|
||||
public static final int NUMBER_OF_DISTANCES = 2203; // For 1080p screen
|
||||
public static final int MINIMUM_CLICK_LENGTH = 120;
|
||||
public static final int MAXIMUM_CLICK_LENGTH = 240;
|
||||
public static final int MINIMUM_CLICK_LENGTH = 100;
|
||||
public static final int MAXIMUM_CLICK_LENGTH = 230;
|
||||
|
||||
private Robot robot;
|
||||
private Randomizer randomizer;
|
||||
|
@ -136,7 +136,8 @@ public class Cursor {
|
|||
|
||||
CursorPath cursorPathWithDistanceSet = chooseCursorPathToFollowBasedOnDistance(distanceToMoveCursor);
|
||||
CursorPath cursorPathWithDistanceAndAngleSet = cursorPathWithDistanceSet.getRotatedCopyOfCursorPath(angleToRotateCursorPathTo);
|
||||
|
||||
// TODO: Add randomization by parabola or similar
|
||||
// CursorPath randomizedCursorPath = cursorPathWithDistanceAndAngleSet.getCopyOfCursorPathTransformedByParabola();
|
||||
followCursorPath(cursorPathWithDistanceAndAngleSet, startingPoint);
|
||||
}
|
||||
|
||||
|
@ -207,7 +208,6 @@ public class Cursor {
|
|||
return (1.0 * distanceToMoveCursor / newDistanceToMoveCursor);
|
||||
}
|
||||
|
||||
|
||||
public Point getCurrentCursorPoint() {
|
||||
return MouseInfo.getPointerInfo().getLocation();
|
||||
}
|
||||
|
|
|
@ -34,7 +34,7 @@ public class CursorDataFileParser {
|
|||
CursorPoint newCursorPoint = getCursorPointFromLine(line);
|
||||
if (cursorPointsHaveEqualCoordinates(newCursorPoint, lastCursorPoint)) {
|
||||
numberOfRepeats++;
|
||||
if (numberOfRepeats == 20) {
|
||||
if (numberOfRepeats == 50) {
|
||||
CursorPath newCursorPath = new CursorPath(currentCursorPoints);
|
||||
cursorPaths.add(newCursorPath);
|
||||
currentCursorPoints.clear();
|
||||
|
|
|
@ -74,15 +74,15 @@ public class CursorPath {
|
|||
return new CursorPath(rotatedCursorPoints, true);
|
||||
}
|
||||
|
||||
public CursorPath getCopyOfCursorPathTransformedByParabola() {
|
||||
/*public CursorPath getCopyOfCursorPathTransformedByParabola() {
|
||||
double[] parabolaEquation = randomizer.generateParabolaEquation(this.getCursorPathDistance());
|
||||
ArrayList<CursorPoint> transformedCursorPoints = new ArrayList<CursorPoint>();
|
||||
for (CursorPoint cursorPoint : this.cursorPoints) {
|
||||
transformedCursorPoints.add(cursorPoint.getCursorPointTransformedBy(parabolaEquation);)
|
||||
transformedCursorPoints.add(cursorPoint.getCursorPointTransformedBy(parabolaEquation));
|
||||
}
|
||||
return new CursorPath(transformedCursorPoints, true);
|
||||
|
||||
}
|
||||
}*/
|
||||
|
||||
private int calculateCursorPathTimespan() {
|
||||
int sumPathTimespanMilliseconds = 0;
|
||||
|
|
|
@ -12,10 +12,10 @@ class CursorPointTest {
|
|||
CursorPoint d = new CursorPoint(284, 848, 0);
|
||||
|
||||
assertEquals(0, a.getDistanceFromOrigin());
|
||||
assertTrue(withinRangeByRatio(a.getDistanceFromOrigin(), 901.387818866, 0.0001));
|
||||
assertTrue(withinRangeByRatio(a.getDistanceFromOrigin(), 894.293016857, 0.0001));
|
||||
assertTrue(withinRangeByRatio(b.getDistanceFromOrigin(), 896.395560007, 0.0001));
|
||||
assertTrue(withinRangeByRatio(c.getDistanceFromOrigin(), 237.191905427, 0.0001));
|
||||
//assertEquals(901.387818866, d.getDistanceFromOrigin(), 0.0001);
|
||||
assertEquals(894.293016857, d.getDistanceFromOrigin(), 0.0001);
|
||||
//assertEquals(896.395560007, c.getDistanceFromOrigin(), 0.0001);
|
||||
assertEquals(5, b.getDistanceFromOrigin(), 0.0001);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -67,11 +67,4 @@ class CursorPointTest {
|
|||
assertTrue(g.x == 123 && g.y == 246);
|
||||
assertTrue(h.x == -428 && h.y == -321);
|
||||
}
|
||||
|
||||
|
||||
|
||||
boolean withinRangeByRatio(double actual, double expectation, double toleranceRatio) {
|
||||
return ((actual <= (expectation * (1 + toleranceRatio))) && (actual >= (expectation * (1 - toleranceRatio))));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -0,0 +1,75 @@
|
|||
import java.awt.AWTException;
|
||||
import java.awt.Point;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class IronMiner {
|
||||
|
||||
public static final int IRON_ORE_MINING_TIME_MILLISECONDS = 650;
|
||||
public static final int MAXIMUM_DISTANCE_TO_WALK_TO_IRON_ORE = 650;
|
||||
public static final Point GAME_WINDOW_CENTER = new Point(200, 300);
|
||||
|
||||
Cursor cursor;
|
||||
CursorTask cursorTask;
|
||||
Inventory inventory;
|
||||
|
||||
public IronMiner() throws AWTException, IOException
|
||||
{
|
||||
cursor = new Cursor();
|
||||
cursorTask = new CursorTask();
|
||||
inventory = new Inventory();
|
||||
}
|
||||
|
||||
public void run() throws Exception {
|
||||
|
||||
while (true) {
|
||||
Thread.sleep(250);
|
||||
|
||||
mineClosestIronOre();
|
||||
|
||||
inventory.update(); // TODO: add iron ore to inventory items
|
||||
if (inventory.isInventoryFull()) {
|
||||
System.out.println("Inventory is full! Dropping...");
|
||||
cursorTask.optimizedDropAllItemsInInventory(cursor, inventory);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void mineClosestIronOre() throws Exception {
|
||||
Point ironOreLocation = getClosestIronOre();
|
||||
if (ironOreLocation == null) {
|
||||
Thread.sleep(1000);
|
||||
}
|
||||
cursor.moveAndLeftClickAtCoordinatesWithRandomness(ironOreLocation, 20, 20);
|
||||
Thread.sleep(IRON_ORE_MINING_TIME_MILLISECONDS);
|
||||
}
|
||||
|
||||
private Point getClosestIronOre() {
|
||||
ArrayList<Point> ironOreLocations = getIronOreLocations();
|
||||
int closestDistanceToIronOreFromCharacter = Integer.MAX_VALUE;
|
||||
Point closestIronOreToCharacter = null;
|
||||
for (Point ironOreLocation : ironOreLocations) {
|
||||
int distanceToIronOreFromCharacter = getDistanceBetweenPoints(GAME_WINDOW_CENTER, ironOreLocation);
|
||||
if (distanceToIronOreFromCharacter < closestDistanceToIronOreFromCharacter) {
|
||||
closestDistanceToIronOreFromCharacter = distanceToIronOreFromCharacter;
|
||||
closestIronOreToCharacter = ironOreLocation;
|
||||
}
|
||||
}
|
||||
|
||||
if (closestDistanceToIronOreFromCharacter < MAXIMUM_DISTANCE_TO_WALK_TO_IRON_ORE) {
|
||||
return closestIronOreToCharacter;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private ArrayList<Point> getIronOreLocations() {
|
||||
// TODO: Use trained DNN here
|
||||
return new ArrayList<Point>();
|
||||
}
|
||||
|
||||
public int getDistanceBetweenPoints(Point startingPoint, Point goalPoint) {
|
||||
return (int) (Math.hypot(goalPoint.x - startingPoint.x, goalPoint.y - startingPoint.y));
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -1,6 +1,6 @@
|
|||
import java.awt.Point;
|
||||
import java.util.Random;
|
||||
import Jama.Matrix;
|
||||
//import Jama.Matrix;
|
||||
|
||||
public class Randomizer {
|
||||
|
||||
|
@ -28,7 +28,7 @@ public class Randomizer {
|
|||
return new Point(peakX, peakY);
|
||||
}
|
||||
|
||||
public double[] generateParabolaEquation(int pathDistance) {
|
||||
/*public double[] generateParabolaEquation(int pathDistance) {
|
||||
Point peakPoint = generatePeakForTransformationParabola(pathDistance);
|
||||
double[][] lhsMatrix = {{0, 0, 1}, {peakPoint.x * peakPoint.x, peakPoint.x, 1}, {pathDistance * pathDistance, pathDistance, 1}};
|
||||
double[][] rhsMatrix = {{0, peakPoint.y, 0}};
|
||||
|
@ -39,7 +39,7 @@ public class Randomizer {
|
|||
|
||||
double[] result = {ans.get(0, 0), ans.get(1, 0), ans.get(2, 0)};
|
||||
return result;
|
||||
}
|
||||
}*/
|
||||
|
||||
//public Point transformPoint
|
||||
}
|
||||
|
|
|
@ -11,15 +11,15 @@ class RandomizerTest {
|
|||
Randomizer randomizer = new Randomizer();
|
||||
|
||||
|
||||
double[] parabolaEquation1 = randomizer.generateParabolaEquation(100, new Point(50, 0));
|
||||
//double[] parabolaEquation1 = randomizer.generateParabolaEquation(100, new Point(50, 0));
|
||||
double[] expectedResult1 = {0, 0, 0};
|
||||
double[] parabolaEquation2 = randomizer.generateParabolaEquation(100, new Point(50, 20));
|
||||
//double[] parabolaEquation2 = randomizer.generateParabolaEquation(100, new Point(50, 20));
|
||||
double[] expectedResult2 = {-0.008, 0.008, 0};
|
||||
double[] parabolaEquation3 = randomizer.generateParabolaEquation(250, new Point(90, 30));
|
||||
//double[] parabolaEquation3 = randomizer.generateParabolaEquation(250, new Point(90, 30));
|
||||
double[] expectedResult3 = {-0.002083, 0.52083, 0.0};
|
||||
checkVariables(expectedResult1, parabolaEquation1);
|
||||
checkVariables(expectedResult2, parabolaEquation2);
|
||||
checkVariables(expectedResult3, parabolaEquation3);
|
||||
//checkVariables(expectedResult1, parabolaEquation1);
|
||||
//checkVariables(expectedResult2, parabolaEquation2);
|
||||
//checkVariables(expectedResult3, parabolaEquation3);
|
||||
}
|
||||
|
||||
void checkVariables(double[] expected, double[] actual) {
|
||||
|
|
|
@ -30,8 +30,10 @@ public class WillowChopper {
|
|||
*/
|
||||
inventory.update();
|
||||
if (inventory.isInventoryFull()) {
|
||||
long startTime = System.currentTimeMillis();
|
||||
System.out.println("Inventory is full! Dropping...");
|
||||
cursorTask.optimizedDropAllItemsInInventory(cursor, inventory);
|
||||
System.out.println("Dropping took " + (System.currentTimeMillis() - startTime) / 1000.0 + " seconds.");
|
||||
//cursorTask.dropAllItemsInInventory(cursor, inventory);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,6 +7,7 @@ import java.net.URL;
|
|||
public class main {
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
System.out.println("Starting Willow Chopper.");
|
||||
WillowChopper willowChopper = new WillowChopper();
|
||||
willowChopper.run();
|
||||
/*Cursor cursor = new Cursor();
|
||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue