diff --git a/api/src/main/java/com/bartlomiejpluta/base/util/path/BasePath.java b/api/src/main/java/com/bartlomiejpluta/base/util/path/BasePath.java index aef70e97..2a0fed6a 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/util/path/BasePath.java +++ b/api/src/main/java/com/bartlomiejpluta/base/util/path/BasePath.java @@ -6,7 +6,9 @@ import lombok.Getter; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.CompletableFuture; import java.util.function.Predicate; +import java.util.function.Supplier; public class BasePath implements Path { @@ -47,4 +49,9 @@ public class BasePath implements Path { path.add(new SuspendSegment<>(predicate)); return this; } + + public Path suspend(Supplier> future) { + path.add(new CompletableFutureSegment<>(future)); + return this; + } } diff --git a/api/src/main/java/com/bartlomiejpluta/base/util/path/CharacterPath.java b/api/src/main/java/com/bartlomiejpluta/base/util/path/CharacterPath.java index a6478fb5..ae14881b 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/util/path/CharacterPath.java +++ b/api/src/main/java/com/bartlomiejpluta/base/util/path/CharacterPath.java @@ -6,7 +6,9 @@ import lombok.Getter; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.CompletableFuture; import java.util.function.Predicate; +import java.util.function.Supplier; public class CharacterPath implements Path { @@ -57,4 +59,9 @@ public class CharacterPath implements Path { path.add(new SuspendSegment<>(predicate)); return this; } + + public CharacterPath suspend(Supplier> future) { + path.add(new CompletableFutureSegment<>(future)); + return this; + } } diff --git a/api/src/main/java/com/bartlomiejpluta/base/util/path/CompletableFutureSegment.java b/api/src/main/java/com/bartlomiejpluta/base/util/path/CompletableFutureSegment.java new file mode 100644 index 00000000..6f429ce1 --- /dev/null +++ b/api/src/main/java/com/bartlomiejpluta/base/util/path/CompletableFutureSegment.java @@ -0,0 +1,28 @@ +package com.bartlomiejpluta.base.util.path; + +import com.bartlomiejpluta.base.api.map.layer.object.ObjectLayer; +import com.bartlomiejpluta.base.api.move.Movable; +import lombok.RequiredArgsConstructor; + +import java.util.concurrent.CompletableFuture; +import java.util.function.Supplier; + +@RequiredArgsConstructor +public class CompletableFutureSegment implements PathSegment { + private final Supplier> futureSupplier; + + @Override + public PathProgress perform(T movable, ObjectLayer layer, float dt) { + var future = futureSupplier.get(); + + if (future.isCancelled() || future.isCompletedExceptionally()) { + return PathProgress.SEGMENT_FAILED; + } + + if (future.isDone()) { + return PathProgress.SEGMENT_DONE; + } + + return PathProgress.ONGOING; + } +}