package net.scapeemulator.game.model.npc.stateful.handler; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Random; import java.util.Set; import net.scapeemulator.game.model.Position; import net.scapeemulator.game.model.area.Area; import net.scapeemulator.game.model.mob.Direction; import net.scapeemulator.game.model.npc.stateful.StateHandler; import net.scapeemulator.game.model.npc.stateful.impl.NormalNPC; /** * @author Hadyn Richard */ public final class RandomWalkStateHandler extends StateHandler<NormalNPC> { private final static Random random = new Random(); @Override public void handle(NormalNPC npc) { /* Get the amount of steps that the NPC will walk if possible */ int iterations = random.nextInt(2) + 1; Position currentPosition = npc.getPosition(); Set<Position> oldPositions = new HashSet<>(); oldPositions.add(currentPosition); Area bounds = npc.getWalkingBounds(); for (int i = 0; i < iterations; i++) { List<Position> positions = Direction.getNearbyTraversableTiles(currentPosition, npc.getSize()); // Remove all the positions that are not within bounds or previously used Iterator<Position> iterator = positions.iterator(); while (iterator.hasNext()) { Position position = iterator.next(); if (!bounds.allWithinArea(position, npc.getSize(), 0, true) || oldPositions.contains(position)) { iterator.remove(); } } Position[] array = positions.toArray(new Position[0]); if (array.length > 0) { Position position = array[random.nextInt(array.length)]; npc.getWalkingQueue().addPoint(position); oldPositions.add(position); currentPosition = position; } } } }