1package com.osroyale.game.world.entity.mob.movement;
3import com.osroyale.game.world.Interactable;
4import com.osroyale.game.world.entity.mob.Direction;
5import com.osroyale.game.world.entity.mob.Mob;
6import com.osroyale.game.world.entity.mob.data.PacketType;
7import com.osroyale.game.world.pathfinding.distance.Manhattan;
8import com.osroyale.game.world.pathfinding.path.Path;
9import com.osroyale.game.world.pathfinding.path.impl.AStarPathFinder;
10import com.osroyale.game.world.pathfinding.path.impl.DijkstraPathFinder;
11import com.osroyale.game.world.pathfinding.path.impl.SimplePathFinder;
12import com.osroyale.game.world.position.Position;
13import com.osroyale.net.packet.out.SendConfig;
15import java.util.ArrayDeque;
16import java.util.Deque;
62 private static final int MAXIMUM_SIZE = 50;
77 private Deque<Point> waypoints =
new ArrayDeque<>();
83 private boolean isMoving;
86 private boolean runToggled =
false;
89 private boolean runQueue =
false;
91 private int walkingDirection = -1;
92 private int runningDirection = -1;
103 addStep(position.getX(), position.getY());
109 final int newX = mob.getX() + x;
110 final int newY = mob.getY() + y;
112 addStepInternal(newX, newY);
119 addStepInternal(position.getX(), position.getY());
125 this.runToggled = runToggled;
126 if (mob.isPlayer()) {
127 mob.getPlayer().send(
new SendConfig(152, runToggled ? 1 : 0));
135 waypoints.add(
new Point(mob.getX(), mob.getY(), -1));
140 waypoints.removeFirst();
146 if (waypoints.size() == 0)
148 Point last = waypoints.peekLast();
149 int diffX = x - last.
x;
150 int diffY = y - last.
y;
151 int max = Math.max(Math.abs(diffX), Math.abs(diffY));
152 for (
int i = 0; i < max; i++) {
155 }
else if (diffX > 0) {
160 }
else if (diffY > 0) {
163 addStepInternal(x - diffX, y - diffY);
172 private void addStepInternal(
int x,
int y) {
173 if (waypoints.size() >= MAXIMUM_SIZE)
175 Point last = waypoints.peekLast();
176 int diffX = x - last.
x;
177 int diffY = y - last.
y;
178 int dir =
Direction.direction(diffX, diffY);
180 waypoints.add(
new Point(x, y, dir));
185 boolean teleporting = mob.teleportTarget !=
null;
188 mob.positionChange =
true;
189 mob.setPosition(mob.teleportTarget);
190 mob.clearTeleportTarget();
192 Point walkPoint, runPoint =
null;
193 walkPoint = getNextPoint();
195 if (runToggled || runQueue) {
196 runPoint = getNextPoint();
199 int walkDir = walkPoint ==
null ? -1 : walkPoint.
dir;
200 int runDir = runPoint ==
null ? -1 : runPoint.
dir;
203 this.walkingDirection = walkDir;
204 this.runningDirection = runDir;
206 int diffX = mob.getPosition().getLocalX(mob.lastPosition);
207 int diffY = mob.getPosition().getLocalY(mob.lastPosition);
208 boolean changed =
false;
211 }
else if (diffX >= 88) {
216 }
else if (diffY >= 88) {
220 mob.regionChange =
true;
229 private Point getNextPoint() {
230 Point p = waypoints.poll();
231 if (p ==
null || p.
dir == -1) {
238 mob.setPosition(mob.getPosition().transform(diffX, diffY));
248 return !mob.locking.locked(
PacketType.MOVEMENT) &&
addPath(SIMPLE_PATH_FINDER.find(mob, destination));
253 return !mob.locking.locked(
PacketType.MOVEMENT) &&
addPath(DIJKSTRA_PATH_FINDER.find(mob, destination));
258 return !mob.locking.locked(
PacketType.MOVEMENT) &&
addPath(smartPathFinder.find(mob, destination));
263 return !mob.locking.locked(
PacketType.MOVEMENT) &&
addPath(SIMPLE_PATH_FINDER.find(mob, interactable));
268 return !mob.locking.locked(
PacketType.MOVEMENT) &&
addPath(DIJKSTRA_PATH_FINDER.find(mob, interactable));
273 return !mob.locking.locked(
PacketType.MOVEMENT) &&
addPath(smartPathFinder.find(mob, interactable));
286 this.runQueue = runQueue;
301 return runToggled || runQueue;
304 public boolean isMoving() {
308 public boolean isMovementDone() {
309 return waypoints.size() == 0;
312 public boolean hasSteps() {
313 return !waypoints.isEmpty();
316 public boolean needsPlacement() {
317 return isMoving || hasSteps();
320 public AStarPathFinder getSmartPathFinder() {
321 return smartPathFinder;
324 public int getWalkingDirection() {
325 return walkingDirection;
328 public int getRunningDirection() {
329 return runningDirection;
boolean aStarPath(Position destination)
boolean isRunningToggled()
boolean simplePath(Interactable interactable)
void setRunningToggled(boolean runToggled)
void walk(Position position)
void walkTo(int x, int y)
boolean addPath(Path path)
void walkTo(Position position)
void setRunningQueue(boolean runQueue)
boolean simplePath(Position destination)
void processNextMovement()
void addStep(int x, int y)
boolean aStarPath(Interactable interactable)
boolean dijkstraPath(Interactable interactable)
boolean dijkstraPath(Position destination)
static final byte[] DELTA_X
static final byte[] DELTA_Y