2025-04-28 03:25:01 -04:00
|
|
|
package noppes.npcs.controllers.data.action;
|
|
|
|
|
|
|
|
|
|
import noppes.npcs.api.handler.data.IAction;
|
2025-06-28 19:07:19 +03:00
|
|
|
import noppes.npcs.scripted.CustomNPCsException;
|
2025-04-28 03:25:01 -04:00
|
|
|
import noppes.npcs.scripted.ScriptedActionManager;
|
|
|
|
|
|
|
|
|
|
import java.util.HashMap;
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
import java.util.function.Consumer;
|
2025-06-28 19:07:19 +03:00
|
|
|
import java.util.function.Supplier;
|
2025-04-28 03:25:01 -04:00
|
|
|
|
|
|
|
|
public class Action implements IAction {
|
|
|
|
|
protected final ScriptedActionManager manager;
|
|
|
|
|
protected final String name;
|
|
|
|
|
protected int startAfterTicks;
|
|
|
|
|
protected int count;
|
|
|
|
|
protected int duration;
|
|
|
|
|
protected int maxDuration = -1;
|
|
|
|
|
protected int updateEveryXTick = 5;
|
|
|
|
|
protected Consumer<IAction> task;
|
2025-06-28 09:30:21 +03:00
|
|
|
protected boolean done;
|
|
|
|
|
protected final Map<String, Object> dataStore = new HashMap<>();
|
|
|
|
|
protected boolean isThreaded;
|
2025-06-29 20:59:43 +03:00
|
|
|
protected ActionThread actionThread;
|
2025-04-28 03:25:01 -04:00
|
|
|
|
|
|
|
|
public Action(ScriptedActionManager manager, String name) {
|
|
|
|
|
this.manager = manager;
|
|
|
|
|
this.name = name;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public Action(ScriptedActionManager manager, Consumer<IAction> task) {
|
|
|
|
|
this(manager, task.toString(), task);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public Action(ScriptedActionManager manager, String name, int maxDuration, int startAfterTicks, Consumer<IAction> task) {
|
|
|
|
|
this.manager = manager;
|
|
|
|
|
this.name = name;
|
|
|
|
|
this.maxDuration = maxDuration;
|
|
|
|
|
this.startAfterTicks = startAfterTicks;
|
|
|
|
|
this.task = task;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public Action(ScriptedActionManager manager, String name, int startAfterTicks, Consumer<IAction> task) {
|
2025-04-28 10:41:36 +03:00
|
|
|
this(manager, name, task);
|
|
|
|
|
this.startAfterTicks = startAfterTicks;
|
2025-04-28 03:25:01 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public Action(ScriptedActionManager manager, String name, Consumer<IAction> task) {
|
2025-04-28 10:41:36 +03:00
|
|
|
this(manager, name);
|
|
|
|
|
this.task = task;
|
2025-04-28 03:25:01 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public Action(ScriptedActionManager manager, int startAfterTicks, Consumer<IAction> task) {
|
|
|
|
|
this(manager, task);
|
|
|
|
|
this.startAfterTicks = startAfterTicks;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public IAction setTask(Consumer<IAction> task) {
|
|
|
|
|
this.task = task;
|
|
|
|
|
return this;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void tick(int ticksExisted) {
|
|
|
|
|
if (done) return;
|
|
|
|
|
if (startAfterTicks > 0) {
|
|
|
|
|
startAfterTicks--;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (maxDuration != -1 && duration >= maxDuration) {
|
|
|
|
|
markDone();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (ticksExisted % updateEveryXTick == 0 && task != null) {
|
2025-06-28 09:30:21 +03:00
|
|
|
if (isThreaded)
|
2025-06-29 20:59:43 +03:00
|
|
|
actionThread.run();
|
2025-06-28 09:30:21 +03:00
|
|
|
else {
|
|
|
|
|
try {
|
|
|
|
|
task.accept(this);
|
|
|
|
|
count++;
|
|
|
|
|
} catch (Throwable t) {
|
|
|
|
|
System.err.println("Scripted action '" + name + "' threw an exception:");
|
|
|
|
|
t.printStackTrace();
|
|
|
|
|
markDone();
|
|
|
|
|
}
|
2025-05-15 20:45:22 -04:00
|
|
|
}
|
2025-04-28 03:25:01 -04:00
|
|
|
}
|
|
|
|
|
duration++;
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-28 10:42:47 +03:00
|
|
|
@Override
|
|
|
|
|
public ScriptedActionManager getManager() {
|
|
|
|
|
return manager;
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-28 03:25:01 -04:00
|
|
|
@Override
|
|
|
|
|
public int getCount() {
|
|
|
|
|
return count;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public int getDuration() {
|
|
|
|
|
return duration;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public String getName() {
|
|
|
|
|
return name;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public int getMaxDuration() {
|
|
|
|
|
return maxDuration;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public IAction setMaxDuration(int x) {
|
2025-06-29 09:07:09 +03:00
|
|
|
this.maxDuration = Math.max(-1, x);
|
2025-04-28 03:25:01 -04:00
|
|
|
return this;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void markDone() {
|
|
|
|
|
done = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public boolean isDone() {
|
|
|
|
|
return done;
|
|
|
|
|
}
|
|
|
|
|
|
2025-06-29 09:44:20 +03:00
|
|
|
public void kill() {
|
2025-06-29 20:59:43 +03:00
|
|
|
if (actionThread != null)
|
|
|
|
|
actionThread.stop();
|
2025-06-29 09:44:20 +03:00
|
|
|
}
|
|
|
|
|
|
2025-04-28 03:25:01 -04:00
|
|
|
@Override
|
|
|
|
|
public Object getData(String key) {
|
|
|
|
|
return dataStore.get(key);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
2025-05-30 04:07:56 +03:00
|
|
|
public IAction setData(String key, Object v) {
|
2025-04-28 03:25:01 -04:00
|
|
|
dataStore.put(key, v);
|
|
|
|
|
return this;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public IAction removeData(String key) {
|
|
|
|
|
dataStore.remove(key);
|
|
|
|
|
return this;
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-30 04:07:56 +03:00
|
|
|
@Override
|
|
|
|
|
public boolean hasData(String key) {
|
|
|
|
|
return dataStore.containsKey(key);
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-28 03:25:01 -04:00
|
|
|
@Override
|
|
|
|
|
public int getUpdateEveryXTick() {
|
|
|
|
|
return updateEveryXTick;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public IAction setUpdateEveryXTick(int x) {
|
2025-06-29 09:07:09 +03:00
|
|
|
this.updateEveryXTick = Math.max(1, x);
|
2025-04-28 03:25:01 -04:00
|
|
|
return this;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public int getStartAfterTicks() {
|
|
|
|
|
return startAfterTicks;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public IAction pauseFor(int ticks) {
|
2025-06-28 09:30:21 +03:00
|
|
|
if (isThreaded)
|
2025-06-29 20:59:43 +03:00
|
|
|
actionThread.pauseFor(ticks);
|
2025-06-28 19:07:19 +03:00
|
|
|
else
|
|
|
|
|
this.startAfterTicks = ticks;
|
2025-06-28 09:30:21 +03:00
|
|
|
|
2025-04-28 03:25:01 -04:00
|
|
|
return this;
|
|
|
|
|
}
|
|
|
|
|
|
2025-06-28 09:30:21 +03:00
|
|
|
@Override
|
|
|
|
|
public IAction pauseFor(long millis) {
|
2025-06-28 19:07:19 +03:00
|
|
|
if (isThreaded) {
|
2025-06-29 20:59:43 +03:00
|
|
|
actionThread.pauseFor(millis);
|
2025-06-28 19:07:19 +03:00
|
|
|
return this;
|
|
|
|
|
}
|
2025-06-28 09:30:21 +03:00
|
|
|
|
|
|
|
|
return pauseFor((int) (millis / 50));
|
|
|
|
|
}
|
|
|
|
|
|
2025-06-28 19:07:19 +03:00
|
|
|
@Override
|
|
|
|
|
public void pause() {
|
|
|
|
|
if (isThreaded)
|
2025-06-29 20:59:43 +03:00
|
|
|
actionThread.pause();
|
2025-06-28 19:07:19 +03:00
|
|
|
else
|
|
|
|
|
throw new CustomNPCsException("Must threadify() IAction before pausing!");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void pauseUntil(Supplier<Boolean> until) {
|
|
|
|
|
if (isThreaded)
|
2025-06-29 20:59:43 +03:00
|
|
|
actionThread.pauseUntil(until);
|
2025-06-28 19:07:19 +03:00
|
|
|
else
|
|
|
|
|
throw new CustomNPCsException("Must threadify() IAction before pausing!");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void resume() {
|
|
|
|
|
if (isThreaded)
|
2025-06-29 20:59:43 +03:00
|
|
|
actionThread.resume();
|
2025-06-28 19:07:19 +03:00
|
|
|
}
|
|
|
|
|
|
2025-06-28 09:30:21 +03:00
|
|
|
@Override
|
|
|
|
|
public boolean isPaused() {
|
|
|
|
|
if (isThreaded)
|
2025-06-29 20:59:43 +03:00
|
|
|
return actionThread.isPaused();
|
2025-06-28 09:30:21 +03:00
|
|
|
|
|
|
|
|
return startAfterTicks > 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
2025-06-28 19:07:19 +03:00
|
|
|
public IAction threadify() {
|
|
|
|
|
if (!isThreaded) {
|
|
|
|
|
isThreaded = true;
|
2025-06-29 20:59:43 +03:00
|
|
|
actionThread = new ActionThread(this);
|
2025-06-28 19:07:19 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return this;
|
2025-06-28 09:30:21 +03:00
|
|
|
}
|
2025-06-29 09:07:09 +03:00
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public IAction start() {
|
|
|
|
|
manager.start();
|
|
|
|
|
return this;
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-28 03:25:01 -04:00
|
|
|
@Override
|
|
|
|
|
public IAction getNext() {
|
2025-05-19 22:07:57 -04:00
|
|
|
boolean seenMe = false;
|
|
|
|
|
for (IAction a : manager.getActionQueue()) {
|
|
|
|
|
if (seenMe) {
|
|
|
|
|
return a;
|
|
|
|
|
}
|
|
|
|
|
if (a == this) {
|
|
|
|
|
seenMe = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return null;
|
2025-04-28 03:25:01 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public IAction getPrevious() {
|
2025-05-19 22:07:57 -04:00
|
|
|
IAction prev = null;
|
|
|
|
|
for (IAction a : manager.getActionQueue()) {
|
|
|
|
|
if (a == this) {
|
|
|
|
|
return prev;
|
|
|
|
|
}
|
|
|
|
|
prev = a;
|
|
|
|
|
}
|
|
|
|
|
return null;
|
2025-04-28 03:25:01 -04:00
|
|
|
}
|
|
|
|
|
|
2025-06-29 11:04:14 +03:00
|
|
|
@Override
|
|
|
|
|
public IAction parallel(IAction after) {
|
|
|
|
|
return manager.scheduleParallelAction(after);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public IAction parallel(Consumer<IAction> task) {
|
2025-06-29 20:57:59 +03:00
|
|
|
return parallel(manager.create(task));
|
2025-06-29 11:04:14 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public IAction parallel(int delay, Consumer<IAction> task) {
|
2025-06-29 20:57:59 +03:00
|
|
|
return parallel(manager.create(delay, task));
|
2025-06-29 11:04:14 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public IAction parallel(String name, Consumer<IAction> task) {
|
2025-06-29 20:57:59 +03:00
|
|
|
return parallel(manager.create(name, task));
|
2025-06-29 11:04:14 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public IAction parallel(String name, int startAfterTicks, Consumer<IAction> task) {
|
2025-06-29 20:57:59 +03:00
|
|
|
return parallel(manager.create(name, startAfterTicks, task));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public IAction parallel(String name, int maxDuration, int delay, Consumer<IAction> t) {
|
|
|
|
|
return parallel(manager.create(name, maxDuration, delay, t));
|
2025-06-29 11:04:14 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2025-04-28 03:25:01 -04:00
|
|
|
@Override
|
|
|
|
|
public IAction after(IAction after) {
|
|
|
|
|
int idx = manager.getIndex(this);
|
|
|
|
|
if (idx >= 0) manager.scheduleActionAt(idx + 1, after);
|
|
|
|
|
return after;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public IAction after(String name, int maxDuration, int delay, Consumer<IAction> t) {
|
|
|
|
|
return after(manager.create(name, maxDuration, delay, t));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public IAction after(String name, int delay, Consumer<IAction> t) {
|
|
|
|
|
return after(manager.create(name, delay, t));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public IAction after(int delay, Consumer<IAction> t) {
|
|
|
|
|
return after(manager.create(delay, t));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public IAction after(String name, Consumer<IAction> t) {
|
|
|
|
|
return after(manager.create(name, t));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public IAction after(Consumer<IAction> t) {
|
|
|
|
|
return after(manager.create(t));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public IAction before(IAction before) {
|
|
|
|
|
int idx = manager.getIndex(this);
|
|
|
|
|
if (idx >= 0) manager.scheduleActionAt(Math.max(0, idx), before);
|
|
|
|
|
return before;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public IAction before(String name, int maxDuration, int delay, Consumer<IAction> t) {
|
|
|
|
|
return before(manager.create(name, maxDuration, delay, t));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public IAction before(String name, int delay, Consumer<IAction> t) {
|
|
|
|
|
return before(manager.create(name, delay, t));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public IAction before(int delay, Consumer<IAction> t) {
|
|
|
|
|
return before(manager.create(delay, t));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public IAction before(String name, Consumer<IAction> t) {
|
|
|
|
|
return before(manager.create(name, t));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public IAction before(Consumer<IAction> t) {
|
|
|
|
|
return before(manager.create(t));
|
|
|
|
|
}
|
|
|
|
|
}
|