forked from RLBot/RLBotJavaExample
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathBot.java
More file actions
81 lines (66 loc) · 2.33 KB
/
Bot.java
File metadata and controls
81 lines (66 loc) · 2.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package rlbot;
import rlbot.api.GameData;
import rlbot.input.CarData;
import rlbot.input.DataPacket;
import rlbot.interop.RLBotDll;
import rlbot.vector.Vector2;
import java.time.Duration;
import java.time.LocalDateTime;
public class Bot {
private final int playerIndex;
private boolean keepRunning;
private Thread looper;
public Bot(int playerIndex) {
this.playerIndex = playerIndex;
}
private ControlsOutput processInput(DataPacket input) {
Vector2 ballPosition = input.ball.position.flatten();
CarData myCar = input.car;
Vector2 carPosition = myCar.position.flatten();
Vector2 carDirection = myCar.orientation.noseVector.flatten();
Vector2 carToBall = ballPosition.minus(carPosition);
double steerCorrectionRadians = carDirection.correctionAngle(carToBall);
float steer;
if (steerCorrectionRadians > 0) {
steer = -1;
} else {
steer = 1;
}
return new ControlsOutput()
.withSteer(steer)
.withThrottle(1);
}
private GameData.ControllerState reactToFrame(GameData.GameTickPacket request) {
DataPacket dataPacket = new DataPacket(request, playerIndex);
return processInput(dataPacket).toControllerState();
}
public void start() {
keepRunning = true;
looper = new Thread(this::doLoop);
looper.start();
}
private void doLoop() {
while (keepRunning) {
LocalDateTime before = LocalDateTime.now();
try {
GameData.GameTickPacket packet = BotManager.latestPacket;
if (packet != null) {
GameData.ControllerState controllerState = reactToFrame(packet);
RLBotDll.setControllerState(controllerState, playerIndex);
}
} catch (final Throwable e) {
e.printStackTrace();
}
try {
long executionMillis = Duration.between(before, LocalDateTime.now()).toMillis();
long sleepTime = Math.max(0, (1000 / 60) - executionMillis);
Thread.sleep(sleepTime);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
public void retire() {
keepRunning = false;
}
}