From 5194988f4417dd58e72568c54433ce31b4bad216 Mon Sep 17 00:00:00 2001 From: remmintan Date: Wed, 20 Mar 2024 23:19:42 +0100 Subject: [PATCH] Add check to all tasks that contains info that task was fully finished --- .../core/interfaces/tasks/ITask.java | 2 ++ .../org/minefortress/tasks/AbstractTask.java | 9 +++++++ .../org/minefortress/tasks/CutTreesTask.java | 27 +++++++++++-------- .../org/minefortress/tasks/RoadsTask.java | 14 +++++++--- 4 files changed, 37 insertions(+), 15 deletions(-) diff --git a/src/core/java/net/remmintan/mods/minefortress/core/interfaces/tasks/ITask.java b/src/core/java/net/remmintan/mods/minefortress/core/interfaces/tasks/ITask.java index dc3519ec..b9dcd7f8 100644 --- a/src/core/java/net/remmintan/mods/minefortress/core/interfaces/tasks/ITask.java +++ b/src/core/java/net/remmintan/mods/minefortress/core/interfaces/tasks/ITask.java @@ -22,4 +22,6 @@ default void prepareTask() {} default void addFinishListener(Runnable listener) {} List toTaskInformationDto(); + boolean taskFullyFinished(); + } diff --git a/src/main/java/org/minefortress/tasks/AbstractTask.java b/src/main/java/org/minefortress/tasks/AbstractTask.java index c2e85c81..c888180b 100644 --- a/src/main/java/org/minefortress/tasks/AbstractTask.java +++ b/src/main/java/org/minefortress/tasks/AbstractTask.java @@ -99,12 +99,21 @@ public void prepareTask() { @Override public void finishPart(ITaskPart part, IWorkerPawn colonsit) { completedParts++; + if(completedParts > totalParts) { + throw new IllegalStateException("Completed parts cannot be greater than total parts"); + } + if(parts.isEmpty() && totalParts <= completedParts) { colonsit.getMasterPlayer().ifPresent(this::sendFinishTaskNotificationToPlayer); taskFinishListeners.forEach(Runnable::run); } } + @Override + public boolean taskFullyFinished() { + return totalParts <= completedParts; + } + @Override public List toTaskInformationDto() { final var blocks = new ArrayList(); diff --git a/src/main/java/org/minefortress/tasks/CutTreesTask.java b/src/main/java/org/minefortress/tasks/CutTreesTask.java index 75e624ae..1136a716 100644 --- a/src/main/java/org/minefortress/tasks/CutTreesTask.java +++ b/src/main/java/org/minefortress/tasks/CutTreesTask.java @@ -70,21 +70,26 @@ public void returnPart(Pair partStartAndEnd) { @Override public void finishPart(ITaskPart part, IWorkerPawn colonist) { final ServerWorld world = colonist.getServerWorld(); - if(part != null && part.getStartAndEnd() != null && part.getStartAndEnd().getFirst() != null) { - final BlockPos root = part.getStartAndEnd().getFirst(); - final Optional treeOpt = TreeHelper.getTreeBlocks(root.up(), world); - if(treeOpt.isPresent()) { - final TreeBlocks tree = treeOpt.get(); - TreeHelper.removeTheRestOfATree(colonist, tree, world); - } + final BlockPos root = part.getStartAndEnd().getFirst(); + final Optional treeOpt = TreeHelper.getTreeBlocks(root.up(), world); + if(treeOpt.isPresent()) { + final TreeBlocks tree = treeOpt.get(); + TreeHelper.removeTheRestOfATree(colonist, tree, world); } removedRoots++; - if(treeRoots.isEmpty() && removedRoots <= totalRootCount) { - world.getPlayers().stream().findAny().ifPresent(player -> { - FortressServerNetworkHelper.send(player, FortressChannelNames.FINISH_TASK, new ClientboundTaskExecutedPacket(this.getId())); - }); + if(removedRoots > totalRootCount) { + throw new IllegalStateException("Removed more roots than total roots"); } + + if(treeRoots.isEmpty() && removedRoots == totalRootCount) { + world.getPlayers().stream().findAny().ifPresent(player -> FortressServerNetworkHelper.send(player, FortressChannelNames.FINISH_TASK, new ClientboundTaskExecutedPacket(this.getId()))); + } + } + + @Override + public boolean taskFullyFinished() { + return removedRoots == totalRootCount; } @Override diff --git a/src/main/java/org/minefortress/tasks/RoadsTask.java b/src/main/java/org/minefortress/tasks/RoadsTask.java index 9fbb7a21..9748b4a3 100644 --- a/src/main/java/org/minefortress/tasks/RoadsTask.java +++ b/src/main/java/org/minefortress/tasks/RoadsTask.java @@ -117,10 +117,11 @@ public void returnPart(Pair partStartAndEnd) { public void finishPart(ITaskPart part, IWorkerPawn colonist) { final ServerWorld world = colonist.getServerWorld(); finishedParts++; - if(taskParts.isEmpty() && totalParts <= finishedParts){ - world.getPlayers().stream().findAny().ifPresent(player -> { - FortressServerNetworkHelper.send(player, FortressChannelNames.FINISH_TASK, new ClientboundTaskExecutedPacket(this.getId())); - }); + if(finishedParts > totalParts) + throw new IllegalStateException("Finished more parts than total parts"); + + if(taskParts.isEmpty() && totalParts == finishedParts){ + world.getPlayers().stream().findAny().ifPresent(player -> FortressServerNetworkHelper.send(player, FortressChannelNames.FINISH_TASK, new ClientboundTaskExecutedPacket(this.getId()))); taskFinishListeners.forEach(Runnable::run); } } @@ -134,4 +135,9 @@ public void addFinishListener(Runnable listener) { public List toTaskInformationDto() { return List.of(new TaskInformationDto(id, blocks, getTaskType())); } + + @Override + public boolean taskFullyFinished() { + return finishedParts == totalParts; + } }