diff --git a/src/main/java/noppes/npcs/scripted/ScriptedActionManager.java b/src/main/java/noppes/npcs/scripted/ScriptedActionManager.java index 60ed59925..d01768857 100644 --- a/src/main/java/noppes/npcs/scripted/ScriptedActionManager.java +++ b/src/main/java/noppes/npcs/scripted/ScriptedActionManager.java @@ -58,13 +58,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 @@ -450,11 +460,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; @@ -465,27 +476,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++; } @@ -496,6 +527,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; } @@ -519,15 +573,26 @@ 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)); + } + + } }