package net.scapeemulator.game.model.npc.stateful.impl; import static net.scapeemulator.game.model.npc.stateful.impl.NormalNPC.State.*; import java.util.Random; import net.scapeemulator.game.model.npc.stateful.StatefulNPC; import net.scapeemulator.game.model.npc.stateful.handler.RandomWalkStateHandler; import net.scapeemulator.game.model.npc.stateful.handler.WalkToSpawnStateHandler; import net.scapeemulator.game.model.npc.stateful.impl.NormalNPC.State; /** * @author Hadyn Richard */ public final class NormalNPC extends StatefulNPC<State> { /** * The random used to calculate if the NPC should randomly walk. */ private static final Random random = new Random(); /** * Each of the enumerable states. */ public enum State { NONE, WALK_RANDOMLY, WALK_TO_SPAWN } /** * Constructs a new {@link NormalNPC}; * * @param type The type id. */ public NormalNPC(int type) { super(type); initialize(); } /** * Initializes the NPC by binding the appropriate state handlers. */ private void initialize() { bindHandler(WALK_RANDOMLY, new RandomWalkStateHandler()); bindHandler(WALK_TO_SPAWN, new WalkToSpawnStateHandler()); } @Override public State determineState() { if (definition.isAttackable()) { if (getCombatHandler().getNoRetaliate() > 0 || frozen() || !alive()) { return NONE; } } if (getWalkingBounds() != null) { if (!getWalkingBounds().withinArea(position.getX(), position.getY(), getDefinition().getLeashRange(), true)) { return WALK_TO_SPAWN; } /* 10% chance to randomly walk around, ~every 3 seconds */ if (random.nextInt(15) == 0 && getWalkingQueue().isEmpty() && !isTurnToTargetSet()) { return WALK_RANDOMLY; } } else { if (getSpawnPosition().getDistance(position) > getDefinition().getLeashRange()) { return WALK_TO_SPAWN; } } return NONE; } }