1package com.osroyale.game.action;
3import com.osroyale.game.action.policy.WalkablePolicy;
4import com.osroyale.game.world.World;
5import com.osroyale.game.world.entity.mob.Mob;
7import java.util.ArrayDeque;
8import java.util.Objects;
49* The
class which manages {@link Action}s executed by mobs.
51 * @author <a href=
"http://www.rune-server.org/members/stand+up/">Stand Up</a>
53public final class ActionManager {
56 private final Queue<Action<?>> queuedActions =
new ArrayDeque<>();
59 private Action<?> currentAction =
null;
62 public void sequence() {
63 if (queuedActions.isEmpty() || (currentAction !=
null && currentAction.isRunning())) {
67 execute(this.currentAction = queuedActions.poll(),
true);
71 public <A extends Action<?>>
void queue(A action) {
72 queuedActions.add(action);
75 public <A extends Action<?>>
void execute(A action) {
76 execute(action,
true);
80 public <A extends Action<?>>
void execute(A action,
boolean override) {
82 if (currentAction !=
null && currentAction.isRunning() && currentAction.prioritized()) {
90 if (currentAction !=
null && currentAction.isRunning() && !override) {
96 if (currentAction !=
null && currentAction.isRunning()) {
97 currentAction.cancel();
101 World.schedule(currentAction = action);
105 private void cancelQueuedActions() {
106 queuedActions.forEach(Action::cancel);
107 queuedActions.clear();
111 public void cancel() {
112 if (currentAction !=
null && currentAction.isRunning() && currentAction.prioritized()) {
113 currentAction.cancel();
114 currentAction =
null;
119 public void reset() {
121 cancelQueuedActions();
125 public void clearNonWalkableActions() {
126 final Action<?> currentAction = this.currentAction;
127 if (currentAction !=
null) {
128 if (!currentAction.cancellableInProgress()) {
131 if (currentAction.getWalkablePolicy() == WalkablePolicy.NON_WALKABLE) {
132 currentAction.cancel();
133 this.currentAction =
null;
137 for (Action<?> actionEvent : queuedActions) {
138 if (actionEvent.getWalkablePolicy() != WalkablePolicy.WALKABLE) {
139 actionEvent.cancel();
140 queuedActions.remove(actionEvent);
146 public void cancel(String name) {
147 if (currentAction !=
null && Objects.equals(currentAction.getName(), name)) {
148 currentAction.cancel();
149 currentAction =
null;
152 for (Action<?> actionEvent : queuedActions) {
153 if (Objects.equals(actionEvent.getName(), name)) {
154 actionEvent.cancel();
155 queuedActions.remove(actionEvent);
161 public Action<?> getCurrentAction() {
162 return currentAction;
166 public String toString() {
167 return String.format(
"ActionManager[size=%s, action=%s]", queuedActions.size(), currentAction);