From 6dc567e054dcab231167523fab2890af5195986d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Thu, 16 Nov 2023 14:13:32 +0100 Subject: [PATCH] Improve Paths and fix some path issues - implement insertPath() method which should be especially useful to insert some automatically generated path with pathfinder algorithms - fix CompletableFutureSegment - the supplier should be invoked only once and then it should be cached instead of triggering it over and over again - make FollowPathAI aware of the path progress - also expose it with getter --- .../bartlomiejpluta/base/lib/ai/FollowPathAI.java | 12 +++++++++++- .../com/bartlomiejpluta/base/util/path/BasePath.java | 5 +++++ .../base/util/path/CharacterPath.java | 5 +++++ .../base/util/path/CompletableFutureSegment.java | 5 ++++- .../bartlomiejpluta/base/util/path/PathProgress.java | 1 + 5 files changed, 26 insertions(+), 2 deletions(-) diff --git a/api/src/main/java/com/bartlomiejpluta/base/lib/ai/FollowPathAI.java b/api/src/main/java/com/bartlomiejpluta/base/lib/ai/FollowPathAI.java index f3315ecc..5b401f8d 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/lib/ai/FollowPathAI.java +++ b/api/src/main/java/com/bartlomiejpluta/base/lib/ai/FollowPathAI.java @@ -5,10 +5,15 @@ import com.bartlomiejpluta.base.api.ai.NPC; import com.bartlomiejpluta.base.api.map.layer.object.ObjectLayer; import com.bartlomiejpluta.base.util.path.Path; import com.bartlomiejpluta.base.util.path.PathExecutor; +import com.bartlomiejpluta.base.util.path.PathProgress; +import lombok.Getter; public class FollowPathAI implements AI { private final PathExecutor executor; + @Getter + private PathProgress progress = PathProgress.NOT_STARTED; + public FollowPathAI(T npc) { this.executor = new PathExecutor<>(npc); } @@ -23,8 +28,13 @@ public class FollowPathAI implements AI { return this; } + public FollowPathAI reset() { + executor.reset(); + return this; + } + @Override public void nextActivity(ObjectLayer layer, float dt) { - executor.execute(layer, dt); + progress = executor.execute(layer, dt); } } 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 9f155fb4..f34e9f49 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 @@ -35,6 +35,11 @@ public class BasePath implements Path { return this; } + public Path insertPath(Path path) { + this.path.addAll(path.getPath()); + return this; + } + public Path move(Direction direction) { path.add(new MoveSegment<>(direction)); 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 b9dc916a..25dcac5a 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 @@ -35,6 +35,11 @@ public class CharacterPath implements Path { return this; } + public CharacterPath insertPath(Path path) { + this.path.addAll(path.getPath()); + return this; + } + public CharacterPath move(Direction direction) { path.add(new MoveSegment<>(direction)); 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 index 6f429ce1..68060d83 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/util/path/CompletableFutureSegment.java +++ b/api/src/main/java/com/bartlomiejpluta/base/util/path/CompletableFutureSegment.java @@ -10,10 +10,13 @@ import java.util.function.Supplier; @RequiredArgsConstructor public class CompletableFutureSegment implements PathSegment { private final Supplier> futureSupplier; + private CompletableFuture future; @Override public PathProgress perform(T movable, ObjectLayer layer, float dt) { - var future = futureSupplier.get(); + if (future == null) { + future = futureSupplier.get(); + } if (future.isCancelled() || future.isCompletedExceptionally()) { return PathProgress.SEGMENT_FAILED; diff --git a/api/src/main/java/com/bartlomiejpluta/base/util/path/PathProgress.java b/api/src/main/java/com/bartlomiejpluta/base/util/path/PathProgress.java index 23c05ab4..0e5c8f45 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/util/path/PathProgress.java +++ b/api/src/main/java/com/bartlomiejpluta/base/util/path/PathProgress.java @@ -1,6 +1,7 @@ package com.bartlomiejpluta.base.util.path; public enum PathProgress { + NOT_STARTED, ONGOING, SEGMENT_DONE, SEGMENT_FAILED,