2025-04-28 03:25:01 -04:00
|
|
|
package noppes.npcs.controllers.data.action;
|
|
|
|
|
|
|
|
|
|
import noppes.npcs.api.handler.data.IAction;
|
|
|
|
|
import noppes.npcs.scripted.ScriptedActionManager;
|
|
|
|
|
|
|
|
|
|
import java.util.HashMap;
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
import java.util.function.Consumer;
|
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
private boolean done;
|
|
|
|
|
private final Map<String, Object> dataStore = new HashMap<>();
|
|
|
|
|
|
|
|
|
|
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-05-15 20:45:22 -04:00
|
|
|
try {
|
|
|
|
|
task.accept(this);
|
|
|
|
|
count++;
|
|
|
|
|
} catch (Throwable t) {
|
|
|
|
|
System.err.println("Scripted action '" + name + "' threw an exception:");
|
|
|
|
|
t.printStackTrace();
|
|
|
|
|
markDone();
|
|
|
|
|
}
|
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) {
|
|
|
|
|
this.maxDuration = x;
|
|
|
|
|
return this;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void markDone() {
|
|
|
|
|
done = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public boolean isDone() {
|
|
|
|
|
return done;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@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) {
|
|
|
|
|
this.updateEveryXTick = x;
|
|
|
|
|
return this;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public int getStartAfterTicks() {
|
|
|
|
|
return startAfterTicks;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public IAction pauseFor(int ticks) {
|
|
|
|
|
this.startAfterTicks = ticks;
|
|
|
|
|
return this;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@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
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@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));
|
|
|
|
|
}
|
|
|
|
|
}
|