RuneHive-Tarnish
Neural OSRS Enhancement Framework
Loading...
Searching...
No Matches
Movement.java
1package com.osroyale.game.world.entity.mob.movement;
2
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;
14
15import java.util.ArrayDeque;
16import java.util.Deque;
17
59
60public class Movement {
62 private static final int MAXIMUM_SIZE = 50;
63
65 private final AStarPathFinder smartPathFinder;
66
68 private static final SimplePathFinder SIMPLE_PATH_FINDER = new SimplePathFinder();
69
71 private static final DijkstraPathFinder DIJKSTRA_PATH_FINDER = new DijkstraPathFinder();
72
74 private Mob mob;
75
77 private Deque<Point> waypoints = new ArrayDeque<>();
78
81
83 private boolean isMoving;
84
86 private boolean runToggled = false;
87
89 private boolean runQueue = false;
90
91 private int walkingDirection = -1;
92 private int runningDirection = -1;
93
95 public Movement(Mob mob) {
96 this.mob = mob;
97 this.smartPathFinder = new AStarPathFinder(mob, new Manhattan());
98 }
99
101 public void walk(Position position) {
102 reset();
103 addStep(position.getX(), position.getY());
104 finish();
105 }
106
108 public void walkTo(int x, int y) {
109 final int newX = mob.getX() + x;
110 final int newY = mob.getY() + y;
111 reset();
112 addStepInternal(newX, newY);
113 finish();
114 }
115
117 public void walkTo(Position position) {
118 reset();
119 addStepInternal(position.getX(), position.getY());
120 finish();
121 }
122
124 public void setRunningToggled(boolean runToggled) {
125 this.runToggled = runToggled;
126 if (mob.isPlayer()) {
127 mob.getPlayer().send(new SendConfig(152, runToggled ? 1 : 0));
128 }
129 }
130
132 public void reset() {
133 runQueue = false;
134 waypoints.clear();
135 waypoints.add(new Point(mob.getX(), mob.getY(), -1));
136 }
137
139 public void finish() {
140 waypoints.removeFirst();
141 }
142
144 public void addStep(int x, int y) {
145// if (mob.locked()) return;
146 if (waypoints.size() == 0)
147 reset();
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++) {
153 if (diffX < 0) {
154 diffX++;
155 } else if (diffX > 0) {
156 diffX--;
157 }
158 if (diffY < 0) {
159 diffY++;
160 } else if (diffY > 0) {
161 diffY--;
162 }
163 addStepInternal(x - diffX, y - diffY);
164 }
165 }
166
172 private void addStepInternal(int x, int y) {
173 if (waypoints.size() >= MAXIMUM_SIZE)
174 return;
175 Point last = waypoints.peekLast();
176 int diffX = x - last.x;
177 int diffY = y - last.y;
178 int dir = Direction.direction(diffX, diffY);
179 if (dir > -1)
180 waypoints.add(new Point(x, y, dir));
181 }
182
184 public void processNextMovement() {
185 boolean teleporting = mob.teleportTarget != null;
186 if (teleporting) {
187 reset();
188 mob.positionChange = true;
189 mob.setPosition(mob.teleportTarget);
190 mob.clearTeleportTarget();
191 } else {
192 Point walkPoint, runPoint = null;
193 walkPoint = getNextPoint();
194
195 if (runToggled || runQueue) {
196 runPoint = getNextPoint();
197 }
198
199 int walkDir = walkPoint == null ? -1 : walkPoint.dir;
200 int runDir = runPoint == null ? -1 : runPoint.dir;
201 if (runDir != -1) lastDirection = Direction.DIRECTIONS.get(runDir);
202 else if (walkDir != -1) lastDirection = Direction.DIRECTIONS.get(walkDir);
203 this.walkingDirection = walkDir;
204 this.runningDirection = runDir;
205 }
206 int diffX = mob.getPosition().getLocalX(mob.lastPosition);
207 int diffY = mob.getPosition().getLocalY(mob.lastPosition);
208 boolean changed = false;
209 if (diffX < 16) {
210 changed = true;
211 } else if (diffX >= 88) {
212 changed = true;
213 }
214 if (diffY < 16) {
215 changed = true;
216 } else if (diffY >= 88) {
217 changed = true;
218 }
219 if (changed)
220 mob.regionChange = true;
221
222// if (mob.attributes.has("mob-following")) {
223// Waypoint waypoint = mob.attributes.get("mob-following");
224// waypoint.onChange();
225// }
226 }
227
229 private Point getNextPoint() {
230 Point p = waypoints.poll();
231 if (p == null || p.dir == -1) {
232 if (isMoving)
233 isMoving = false;
234 return null;
235 } else {
236 int diffX = Direction.DELTA_X[p.dir];
237 int diffY = Direction.DELTA_Y[p.dir];
238 mob.setPosition(mob.getPosition().transform(diffX, diffY));
239 if (!isMoving)
240 isMoving = true;
241 mob.onStep();
242 return p;
243 }
244 }
245
247 public boolean simplePath(Position destination) {
248 return !mob.locking.locked(PacketType.MOVEMENT) && addPath(SIMPLE_PATH_FINDER.find(mob, destination));
249 }
250
252 public boolean dijkstraPath(Position destination) {
253 return !mob.locking.locked(PacketType.MOVEMENT) && addPath(DIJKSTRA_PATH_FINDER.find(mob, destination));
254 }
255
257 public boolean aStarPath(Position destination) {
258 return !mob.locking.locked(PacketType.MOVEMENT) && addPath(smartPathFinder.find(mob, destination));
259 }
260
262 public boolean simplePath(Interactable interactable) {
263 return !mob.locking.locked(PacketType.MOVEMENT) && addPath(SIMPLE_PATH_FINDER.find(mob, interactable));
264 }
265
267 public boolean dijkstraPath(Interactable interactable) {
268 return !mob.locking.locked(PacketType.MOVEMENT) && addPath(DIJKSTRA_PATH_FINDER.find(mob, interactable));
269 }
270
272 public boolean aStarPath(Interactable interactable) {
273 return !mob.locking.locked(PacketType.MOVEMENT) && addPath(smartPathFinder.find(mob, interactable));
274 }
275
277 public boolean addPath(Path path) {
278 if (!path.isPossible() || mob.locking.locked(PacketType.MOVEMENT))
279 return false;
280 path.addSteps(this);
281 return true;
282 }
283
285 public void setRunningQueue(boolean runQueue) {
286 this.runQueue = runQueue;
287 }
288
290 public boolean isRunningToggled() {
291 return runToggled;
292 }
293
295 public boolean isRunningQueue() {
296 return runQueue;
297 }
298
300 public boolean isRunning() {
301 return runToggled || runQueue;
302 }
303
304 public boolean isMoving() {
305 return isMoving;
306 }
307
308 public boolean isMovementDone() {
309 return waypoints.size() == 0;
310 }
311
312 public boolean hasSteps() {
313 return !waypoints.isEmpty();
314 }
315
316 public boolean needsPlacement() {
317 return isMoving || hasSteps();
318 }
319
320 public AStarPathFinder getSmartPathFinder() {
321 return smartPathFinder;
322 }
323
324 public int getWalkingDirection() {
325 return walkingDirection;
326 }
327
328 public int getRunningDirection() {
329 return runningDirection;
330 }
331
332}
boolean simplePath(Interactable interactable)
boolean aStarPath(Interactable interactable)
boolean dijkstraPath(Interactable interactable)