diff --git a/src/main/java/noppes/npcs/scripted/ScriptedActionManager.java b/src/main/java/noppes/npcs/scripted/ScriptedActionManager.java index c94ebef5a..743840273 100644 --- a/src/main/java/noppes/npcs/scripted/ScriptedActionManager.java +++ b/src/main/java/noppes/npcs/scripted/ScriptedActionManager.java @@ -60,13 +60,23 @@ public class ScriptedActionManager implements IActionManager { } @Override - public IConditionalAction create(Supplier predicate, Supplier terminate, Consumer task) { - return new ConditionalAction(predicate, terminate, task); + public IConditionalAction create(Supplier predicate, Supplier terminateWhen, Consumer task) { + return new ConditionalAction(predicate, terminateWhen, task); } @Override - public IConditionalAction create(String name, Supplier predicate, Supplier terminate, Consumer task) { - return new ConditionalAction(name, predicate, terminate, task); + public IConditionalAction create(String name, Supplier predicate, Supplier terminateWhen, Consumer task) { + return new ConditionalAction(name, predicate, terminateWhen, task); + } + + @Override + public IConditionalAction create(Supplier predicate, Supplier terminateWhen, Consumer onTermination, Consumer task) { + return new ConditionalAction(predicate, terminateWhen, onTermination, task); + } + + @Override + public IConditionalAction create(String name, Supplier predicate, Supplier terminateWhen, Consumer onTermination, Consumer task) { + return new ConditionalAction(name, predicate, terminateWhen, onTermination, task); } @Override @@ -503,11 +513,12 @@ public class ScriptedActionManager implements IActionManager { } private class ConditionalAction extends ActionBase implements IConditionalAction { - private final Supplier predicate; - private Supplier terminate; + private Supplier predicate; + private Supplier terminateWhen; + private Consumer onTermination; private int maxChecks = -1; private int checkCount = 0; - + private boolean taskExecuted; public ConditionalAction(Supplier predicate, Consumer task) { super(task); this.predicate = predicate; @@ -518,27 +529,47 @@ public class ScriptedActionManager implements IActionManager { this.predicate = predicate; } - public ConditionalAction(Supplier predicate, Supplier terminate, Consumer task) { + public ConditionalAction(Supplier predicate, Supplier terminateWhen, Consumer task) { this(predicate, task); - this.terminate = terminate; + this.terminateWhen = terminateWhen; } - public ConditionalAction(String name, Supplier predicate, Supplier terminate, Consumer task) { + public ConditionalAction(String name, Supplier predicate, Supplier terminateWhen, Consumer task) { this(name, predicate, task); - this.terminate = terminate; + this.terminateWhen = terminateWhen; } + public ConditionalAction(Supplier predicate, Supplier terminateWhen, Consumer onTerminate, Consumer task) { + this(predicate, task); + this.terminateWhen = terminateWhen; + this.onTermination = onTerminate; + } + + public ConditionalAction(String name, Supplier predicate, Supplier terminateWhen, Consumer onTerminate, Consumer task) { + this(name, predicate, task); + this.terminateWhen = terminateWhen; + this.onTermination = onTerminate; + } + + @Override public void tick(int ticksExisted) { if (isDone()) return; if (ticksExisted % updateEveryXTick == 0) { checkCount++; - if ((maxChecks >= 0 && checkCount > maxChecks) || terminate != null && terminate.get()) { + boolean terminated = terminateWhen != null && terminateWhen.get(); + + if (terminated && onTermination != null) + onTermination.accept(this); + + if ((maxChecks >= 0 && checkCount > maxChecks) || terminated) { markDone(); return; } - if (predicate.get()) + if (predicate.get()) { task.accept(this); + taskExecuted = true; + } } duration++; } @@ -549,6 +580,29 @@ public class ScriptedActionManager implements IActionManager { return this; } + @Override + public IConditionalAction setPredicate(Supplier predicate) { + this.predicate = predicate; + return this; + } + + @Override + public IConditionalAction setTerminationPredicate(Supplier terminateWhen) { + this.terminateWhen = terminateWhen; + return this; + } + + @Override + public IConditionalAction setTerminationTask(Consumer onTermination) { + this.onTermination = onTermination; + return this; + } + + @Override + public boolean wasTaskExecuted() { + return taskExecuted; + } + @Override public int getCheckCount() { return checkCount; } @Override public int getMaxChecks() { return maxChecks; } @@ -572,13 +626,23 @@ public class ScriptedActionManager implements IActionManager { } @Override - public IConditionalAction after(Supplier predicate, Supplier terminate, Consumer task) { - return after(create(predicate, terminate, task)); + public IConditionalAction after(Supplier predicate, Supplier terminateWhen, Consumer task) { + return after(create(predicate, terminateWhen, task)); } @Override - public IConditionalAction after(String name, Supplier predicate, Supplier terminate, Consumer task) { - return after(create(name, predicate, terminate, task)); + public IConditionalAction after(String name, Supplier predicate, Supplier terminateWhen, Consumer task) { + return after(create(name, predicate, terminateWhen, task)); + } + + @Override + public IConditionalAction after(Supplier predicate, Supplier terminateWhen, Consumer onTermination, Consumer task) { + return after(create(predicate, terminateWhen, onTermination, task)); + } + + @Override + public IConditionalAction after(String name, Supplier predicate, Supplier terminateWhen, Consumer onTermination, Consumer task) { + return after(create(name, predicate, terminateWhen, onTermination, task)); } } }