From 6554de316643f8a276afad77c8792b4cca42116a Mon Sep 17 00:00:00 2001 From: remmintan Date: Sat, 16 Mar 2024 12:59:42 +0100 Subject: [PATCH] WIP Keep tasks on the server instead of client --- .../core/dtos/tasks/TaskInformationDto.java | 9 +++ .../core/interfaces/tasks/IClientTask.java | 4 +- .../interfaces/tasks/IClientTasksHolder.java | 8 +-- .../core/interfaces/tasks/ITask.java | 3 + .../core/interfaces/tasks/ITasksCreator.java | 4 +- .../minefortress/core/utils/CoreModUtils.java | 12 ++++ .../manager/BaseClientStructureManager.java | 24 +------- .../manager/ClientBlueprintManager.java | 10 ++-- .../influence/ClientInfluenceManager.java | 6 +- .../fortress/ClientFortressManager.java | 2 +- .../automation/areas/SavedAreasHolder.java | 6 +- .../mixins/world/ClientWorldMixin.java | 6 +- .../registries/FortressClientEvents.java | 2 +- .../gui/fortress/RepairBuildingScreen.java | 7 +-- .../renderer/gui/hud/UtilsHudLayer.java | 8 +-- .../org/minefortress/tasks/AbstractTask.java | 16 ++++-- .../minefortress/tasks/BlueprintDigTask.java | 3 +- ...asksHolder.java => ClientTasksHolder.java} | 42 +++++++------- .../org/minefortress/tasks/CutTreesTask.java | 12 +++- .../tasks/RepairBuildingTask.java | 10 +++- .../org/minefortress/tasks/RoadsTask.java | 22 +++++-- .../minefortress/tasks/ServerTaskManager.java | 8 +++ .../tasks/SimpleSelectionTask.java | 10 +++- .../org/minefortress/tasks/TasksCreator.java | 8 +-- .../java/org/minefortress/utils/ModUtils.java | 12 ---- .../c2s/ServerboundBlueprintTaskPacket.java | 1 - .../c2s/ServerboundCutTreesTaskPacket.java | 19 ++++++- .../ServerboundSimpleSelectionTaskPacket.java | 26 +++++++-- .../registries/ClientNetworkReceivers.java | 1 + .../s2c/S2CAddClientTasksPacket.java | 57 +++++++++++++++++++ .../remmintan/panama/model/BuiltTasks.java | 2 +- .../{ClientSelection.java => ClientTask.java} | 20 +++---- .../net/remmintan/gobi/RoadsSelection.java | 8 +-- .../net/remmintan/gobi/TreeSelection.java | 7 +-- .../net/remmintan/gobi/TwoDotsSelection.java | 11 +--- .../net/remmintan/gobi/WallsSelection.java | 1 + 36 files changed, 262 insertions(+), 145 deletions(-) create mode 100644 src/core/java/net/remmintan/mods/minefortress/core/dtos/tasks/TaskInformationDto.java rename src/main/java/org/minefortress/tasks/{ClientVisualTasksHolder.java => ClientTasksHolder.java} (78%) create mode 100644 src/networking/java/net/remmintan/mods/minefortress/networking/s2c/S2CAddClientTasksPacket.java rename src/selections/java/net/remmintan/gobi/{ClientSelection.java => ClientTask.java} (65%) diff --git a/src/core/java/net/remmintan/mods/minefortress/core/dtos/tasks/TaskInformationDto.java b/src/core/java/net/remmintan/mods/minefortress/core/dtos/tasks/TaskInformationDto.java new file mode 100644 index 00000000..c3d0e527 --- /dev/null +++ b/src/core/java/net/remmintan/mods/minefortress/core/dtos/tasks/TaskInformationDto.java @@ -0,0 +1,9 @@ +package net.remmintan.mods.minefortress.core.dtos.tasks; + +import net.minecraft.util.math.BlockPos; +import net.remmintan.mods.minefortress.core.TaskType; + +import java.util.List; +import java.util.UUID; + +public record TaskInformationDto(UUID id, List positions, TaskType type) {} diff --git a/src/core/java/net/remmintan/mods/minefortress/core/interfaces/tasks/IClientTask.java b/src/core/java/net/remmintan/mods/minefortress/core/interfaces/tasks/IClientTask.java index 700a4f98..aa880698 100644 --- a/src/core/java/net/remmintan/mods/minefortress/core/interfaces/tasks/IClientTask.java +++ b/src/core/java/net/remmintan/mods/minefortress/core/interfaces/tasks/IClientTask.java @@ -4,11 +4,11 @@ import net.minecraft.world.World; import org.joml.Vector4f; -import java.util.Set; +import java.util.List; public interface IClientTask { - Set getBlockPositions(); + List getBlockPositions(); Vector4f getColor(); diff --git a/src/core/java/net/remmintan/mods/minefortress/core/interfaces/tasks/IClientTasksHolder.java b/src/core/java/net/remmintan/mods/minefortress/core/interfaces/tasks/IClientTasksHolder.java index 2aa96629..f041e5a9 100644 --- a/src/core/java/net/remmintan/mods/minefortress/core/interfaces/tasks/IClientTasksHolder.java +++ b/src/core/java/net/remmintan/mods/minefortress/core/interfaces/tasks/IClientTasksHolder.java @@ -2,20 +2,20 @@ import net.minecraft.util.math.BlockPos; import net.remmintan.mods.minefortress.core.TaskType; +import net.remmintan.mods.minefortress.core.dtos.tasks.TaskInformationDto; import java.util.List; import java.util.UUID; public interface IClientTasksHolder extends ITasksModelBuilderInfoProvider, ITasksRenderInfoProvider { - void addRoadsSelectionTask(UUID digTaskId, UUID placeTaskId, List positions); - void addTask(UUID uuid, Iterable blocks); + void addTasks(List tasks); + void removeTask(UUID id); - void addTask(UUID uuid, Iterable blocks, TaskType type); void addTask(UUID uuid, Iterable blocks, TaskType type, UUID superTaskId); void cancelAllTasks(); - void cancelTask(); + void cancelLatestTask(); void toggleSelectionVisibility(); boolean isSelectionHidden(); 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 58d90d4e..dc3519ec 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 @@ -4,8 +4,10 @@ import net.minecraft.server.world.ServerWorld; import net.minecraft.util.math.BlockPos; import net.remmintan.mods.minefortress.core.TaskType; +import net.remmintan.mods.minefortress.core.dtos.tasks.TaskInformationDto; import net.remmintan.mods.minefortress.core.interfaces.entities.pawns.IWorkerPawn; +import java.util.List; import java.util.UUID; public interface ITask { @@ -18,5 +20,6 @@ default void prepareTask() {} void finishPart(ITaskPart part, IWorkerPawn colonist); default void addFinishListener(Runnable listener) {} + List toTaskInformationDto(); } diff --git a/src/core/java/net/remmintan/mods/minefortress/core/interfaces/tasks/ITasksCreator.java b/src/core/java/net/remmintan/mods/minefortress/core/interfaces/tasks/ITasksCreator.java index eed08313..3f9cc76c 100644 --- a/src/core/java/net/remmintan/mods/minefortress/core/interfaces/tasks/ITasksCreator.java +++ b/src/core/java/net/remmintan/mods/minefortress/core/interfaces/tasks/ITasksCreator.java @@ -13,12 +13,12 @@ public interface ITasksCreator extends IServerManager { - ITask createCutTreesTask(UUID uuid, List treeRoots); + ITask createCutTreesTask(UUID uuid, List treeRoots, List positions); default ITask createRoadsTask(UUID digUuid, TaskType type, UUID placeUuid, List blocks, Item itemInHand) { return createRoadsTask(digUuid, type, placeUuid, blocks, itemInHand, () -> {}); } ITask createRoadsTask(UUID digUuid, TaskType type, UUID placeUuid, List blocks, Item itemInHand, Runnable onComplete); - ITask createSelectionTask(UUID id, TaskType taskType, BlockPos start, BlockPos end, ServerSelectionType selectionType, HitResult hitResult, ServerPlayerEntity player); + ITask createSelectionTask(UUID id, TaskType taskType, BlockPos start, BlockPos end, ServerSelectionType selectionType, HitResult hitResult, List positions, ServerPlayerEntity player); } diff --git a/src/core/java/net/remmintan/mods/minefortress/core/utils/CoreModUtils.java b/src/core/java/net/remmintan/mods/minefortress/core/utils/CoreModUtils.java index ffc05fdc..bf140b98 100644 --- a/src/core/java/net/remmintan/mods/minefortress/core/utils/CoreModUtils.java +++ b/src/core/java/net/remmintan/mods/minefortress/core/utils/CoreModUtils.java @@ -4,6 +4,10 @@ import net.remmintan.mods.minefortress.core.interfaces.client.IClientManagersProvider; import net.remmintan.mods.minefortress.core.interfaces.entities.pawns.IFortressAwareEntity; import net.remmintan.mods.minefortress.core.interfaces.server.IServerFortressManager; +import net.remmintan.mods.minefortress.core.interfaces.tasks.IClientTasksHolder; +import net.remmintan.mods.minefortress.core.interfaces.tasks.ITasksInformationHolder; + +import java.util.Optional; public class CoreModUtils { @@ -22,4 +26,12 @@ public static boolean isPlayerInCreative(IFortressAwareEntity colonist) { .orElse(false); } + public static Optional getClientTasksHolder() { + return Optional + .ofNullable(MinecraftClient.getInstance()) + .map(it -> it.world) + .map(ITasksInformationHolder.class::cast) + .map(ITasksInformationHolder::get_ClientTasksHolder); + } + } diff --git a/src/main/java/org/minefortress/blueprints/manager/BaseClientStructureManager.java b/src/main/java/org/minefortress/blueprints/manager/BaseClientStructureManager.java index 012a13cd..64718c54 100644 --- a/src/main/java/org/minefortress/blueprints/manager/BaseClientStructureManager.java +++ b/src/main/java/org/minefortress/blueprints/manager/BaseClientStructureManager.java @@ -1,6 +1,5 @@ package org.minefortress.blueprints.manager; -import net.minecraft.block.BlockState; import net.minecraft.client.MinecraftClient; import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.math.BlockPos; @@ -8,11 +7,12 @@ import net.remmintan.mods.minefortress.building.BuildingHelper; import net.remmintan.mods.minefortress.core.interfaces.blueprints.*; import net.remmintan.mods.minefortress.core.interfaces.client.IClientManagersProvider; -import net.remmintan.mods.minefortress.core.interfaces.tasks.ITasksInformationHolder; import org.jetbrains.annotations.Nullable; import org.minefortress.utils.ModUtils; -import java.util.*; +import java.util.Map; +import java.util.Optional; +import java.util.Set; import java.util.stream.Collectors; public abstract class BaseClientStructureManager implements IStructureRenderInfoProvider { @@ -128,24 +128,6 @@ public boolean canBuild() { return !cantBuild; } - protected void addTaskToTasksHolder(UUID taskId) { - final ITasksInformationHolder world = (ITasksInformationHolder) client.world; - if(world != null) { - final IStructureBlockData blockData = getBlockData(); - final Map structureData = blockData - .getLayer(BlueprintDataLayer.GENERAL); - final int floorLevel = getSelectedStructure().getFloorLevel(); - final List blocks = structureData - .entrySet() - .stream() - .filter(entry -> !entry.getValue().isAir()) - .map(Map.Entry::getKey) - .map(it -> it.add(structureBuildPos.down(floorLevel))) - .collect(Collectors.toList()); - world.get_ClientTasksHolder().addTask(taskId, blocks); - } - } - protected void reset() { structureBuildPos = null; cantBuild = false; diff --git a/src/main/java/org/minefortress/blueprints/manager/ClientBlueprintManager.java b/src/main/java/org/minefortress/blueprints/manager/ClientBlueprintManager.java index b66a38c1..471a7363 100644 --- a/src/main/java/org/minefortress/blueprints/manager/ClientBlueprintManager.java +++ b/src/main/java/org/minefortress/blueprints/manager/ClientBlueprintManager.java @@ -114,9 +114,8 @@ public void buildCurrentStructure() { if(!super.canBuild()) return; - UUID taskId = UUID.randomUUID(); - addTaskToTasksHolder(taskId); - final var serverboundBlueprintTaskPacket = getServerboundBlueprintTaskPacket(taskId); +// addTaskToTasksHolder(taskId); + final var serverboundBlueprintTaskPacket = getServerboundBlueprintTaskPacket(); FortressClientNetworkHelper.send(FortressChannelNames.NEW_BLUEPRINT_TASK, serverboundBlueprintTaskPacket); if(!client.options.sprintKey.isPressed()) { @@ -125,9 +124,10 @@ public void buildCurrentStructure() { } @NotNull - private ServerboundBlueprintTaskPacket getServerboundBlueprintTaskPacket(UUID taskId) { + private ServerboundBlueprintTaskPacket getServerboundBlueprintTaskPacket() { final var selectedPawnsIds = CoreModUtils.getMineFortressManagersProvider().get_PawnsSelectionManager().getSelectedPawnsIds(); - return new ServerboundBlueprintTaskPacket(taskId, + return new ServerboundBlueprintTaskPacket( + UUID.randomUUID(), selectedStructure.getId(), getStructureBuildPos(), selectedStructure.getRotation(), diff --git a/src/main/java/org/minefortress/fight/influence/ClientInfluenceManager.java b/src/main/java/org/minefortress/fight/influence/ClientInfluenceManager.java index 24265119..f084b1e1 100644 --- a/src/main/java/org/minefortress/fight/influence/ClientInfluenceManager.java +++ b/src/main/java/org/minefortress/fight/influence/ClientInfluenceManager.java @@ -7,6 +7,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.border.WorldBorder; import net.minecraft.world.border.WorldBorderStage; +import net.remmintan.mods.minefortress.core.TaskType; import net.remmintan.mods.minefortress.core.interfaces.blueprints.BlueprintDataLayer; import net.remmintan.mods.minefortress.core.interfaces.blueprints.IBlockDataProvider; import net.remmintan.mods.minefortress.core.interfaces.blueprints.IBlueprintMetadata; @@ -15,6 +16,7 @@ import net.remmintan.mods.minefortress.core.interfaces.infuence.IClientInfluenceManager; import net.remmintan.mods.minefortress.core.interfaces.infuence.IInfluencePosStateHolder; import net.remmintan.mods.minefortress.core.interfaces.professions.ProfessionsHireTypes; +import net.remmintan.mods.minefortress.core.utils.CoreModUtils; import net.remmintan.mods.minefortress.networking.c2s.C2SCaptureInfluencePositionPacket; import net.remmintan.mods.minefortress.networking.c2s.C2SUpdateNewInfluencePosition; import net.remmintan.mods.minefortress.networking.helpers.FortressClientNetworkHelper; @@ -132,7 +134,7 @@ private static boolean isHasAnyWarrior(IClientFortressManager clientFortressMana @Override public void sendCaptureTaskPacket(BlockPos pos, IStructureBlockData blockData) { final var taskId = UUID.randomUUID(); - ModUtils.getClientTasksHolder() + CoreModUtils.getClientTasksHolder() .ifPresent(it -> { final var blocks = blockData.getLayer(BlueprintDataLayer.GENERAL) .entrySet() @@ -143,7 +145,7 @@ public void sendCaptureTaskPacket(BlockPos pos, IStructureBlockData blockData) { .map(BlockPos::toImmutable) .map(p -> p.add(pos)) .toList(); - it.addTask(taskId, blocks); + it.addTask(taskId, blocks, TaskType.BUILD, null); }); final var packet = new C2SCaptureInfluencePositionPacket(taskId, pos); diff --git a/src/main/java/org/minefortress/fortress/ClientFortressManager.java b/src/main/java/org/minefortress/fortress/ClientFortressManager.java index dff6fb7a..6902c5a6 100644 --- a/src/main/java/org/minefortress/fortress/ClientFortressManager.java +++ b/src/main/java/org/minefortress/fortress/ClientFortressManager.java @@ -366,7 +366,7 @@ public void setState(FortressState state) { ModUtils.getAreasClientManager().getSavedAreasHolder().setNeedRebuild(true); } if(state == FortressState.BUILD_SELECTION || state == FortressState.BUILD_EDITING) { - ModUtils.getClientTasksHolder().ifPresent(it -> it.setNeedRebuild(true)); + CoreModUtils.getClientTasksHolder().ifPresent(it -> it.setNeedRebuild(true)); } } diff --git a/src/main/java/org/minefortress/fortress/automation/areas/SavedAreasHolder.java b/src/main/java/org/minefortress/fortress/automation/areas/SavedAreasHolder.java index 8935f190..283dfab1 100644 --- a/src/main/java/org/minefortress/fortress/automation/areas/SavedAreasHolder.java +++ b/src/main/java/org/minefortress/fortress/automation/areas/SavedAreasHolder.java @@ -1,13 +1,13 @@ package org.minefortress.fortress.automation.areas; import net.minecraft.util.math.BlockPos; -import net.remmintan.gobi.ClientSelection; +import net.remmintan.gobi.ClientTask; +import net.remmintan.mods.minefortress.building.BuildingHelper; import net.remmintan.mods.minefortress.core.interfaces.automation.IAutomationAreaInfo; import net.remmintan.mods.minefortress.core.interfaces.tasks.IClientTask; import net.remmintan.mods.minefortress.core.interfaces.tasks.ISavedAreasHolder; import net.remmintan.mods.minefortress.core.interfaces.tasks.ITasksModelBuilderInfoProvider; import net.remmintan.mods.minefortress.core.interfaces.tasks.ITasksRenderInfoProvider; -import net.remmintan.mods.minefortress.building.BuildingHelper; import java.util.Collections; import java.util.List; @@ -54,7 +54,7 @@ public boolean shouldRender() { } private IClientTask toClientSelection(IAutomationAreaInfo info) { - return new ClientSelection( + return new ClientTask( info.getClientArea(), info.getAreaType().getColor(), BuildingHelper::canRemoveBlock diff --git a/src/main/java/org/minefortress/mixins/world/ClientWorldMixin.java b/src/main/java/org/minefortress/mixins/world/ClientWorldMixin.java index e2b62b0d..55eb8c39 100644 --- a/src/main/java/org/minefortress/mixins/world/ClientWorldMixin.java +++ b/src/main/java/org/minefortress/mixins/world/ClientWorldMixin.java @@ -14,7 +14,7 @@ import net.remmintan.mods.minefortress.core.interfaces.client.IClientManagersProvider; import net.remmintan.mods.minefortress.core.interfaces.tasks.IClientTasksHolder; import net.remmintan.mods.minefortress.core.interfaces.tasks.ITasksInformationHolder; -import org.minefortress.tasks.ClientVisualTasksHolder; +import org.minefortress.tasks.ClientTasksHolder; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -29,7 +29,7 @@ public abstract class ClientWorldMixin extends World implements ITasksInformationHolder { @Shadow @Final private MinecraftClient client; - private ClientVisualTasksHolder tasksHolder; + private ClientTasksHolder tasksHolder; protected ClientWorldMixin(MutableWorldProperties properties, RegistryKey registryRef, DynamicRegistryManager registryManager, RegistryEntry dimensionEntry, Supplier profiler, boolean isClient, boolean debugWorld, long biomeAccess, int maxChainedNeighborUpdates) { super(properties, registryRef, registryManager, dimensionEntry, profiler, isClient, debugWorld, biomeAccess, maxChainedNeighborUpdates); @@ -37,7 +37,7 @@ protected ClientWorldMixin(MutableWorldProperties properties, RegistryKey @Inject(method = "", at = @At("RETURN")) public void constructor(ClientPlayNetworkHandler netHandler, ClientWorld.Properties properties, RegistryKey registryRef, RegistryEntry registryEntry, int loadDistance, int simulationDistance, Supplier profiler, WorldRenderer worldRenderer, boolean debugWorld, long seed, CallbackInfo ci) { - tasksHolder = new ClientVisualTasksHolder(); + tasksHolder = new ClientTasksHolder(); } @Override diff --git a/src/main/java/org/minefortress/registries/FortressClientEvents.java b/src/main/java/org/minefortress/registries/FortressClientEvents.java index 8f628e17..3dc61699 100644 --- a/src/main/java/org/minefortress/registries/FortressClientEvents.java +++ b/src/main/java/org/minefortress/registries/FortressClientEvents.java @@ -78,7 +78,7 @@ private static void endClientTick(MinecraftClient client) { if(client.options.sprintKey.isPressed()) { clientVisualTasksHolder.cancelAllTasks(); } else { - clientVisualTasksHolder.cancelTask(); + clientVisualTasksHolder.cancelLatestTask(); } } } diff --git a/src/main/java/org/minefortress/renderer/gui/fortress/RepairBuildingScreen.java b/src/main/java/org/minefortress/renderer/gui/fortress/RepairBuildingScreen.java index d6eaaf03..6c149045 100644 --- a/src/main/java/org/minefortress/renderer/gui/fortress/RepairBuildingScreen.java +++ b/src/main/java/org/minefortress/renderer/gui/fortress/RepairBuildingScreen.java @@ -12,7 +12,6 @@ import net.remmintan.mods.minefortress.networking.helpers.FortressClientNetworkHelper; import org.minefortress.fortress.resources.ItemInfo; import org.minefortress.renderer.gui.WindowScreen; -import org.minefortress.utils.ModUtils; import java.util.*; import java.util.stream.Collectors; @@ -66,12 +65,8 @@ protected void init() { .builder( Text.of("Repair"), button -> { - final var taskId = UUID.randomUUID(); - - ModUtils.getClientTasksHolder().ifPresent(it -> it.addTask(taskId, blocksToRepair)); - final var selectedPawnsIds = CoreModUtils.getMineFortressManagersProvider().get_PawnsSelectionManager().getSelectedPawnsIds(); - final var packet = new C2SRepairBuilding(taskId, buildingId, selectedPawnsIds); + final var packet = new C2SRepairBuilding(UUID.randomUUID(), buildingId, selectedPawnsIds); FortressClientNetworkHelper.send(C2SRepairBuilding.CHANNEL, packet); Optional.ofNullable(this.client).ifPresent(it -> it.setScreen(null)); } diff --git a/src/main/java/org/minefortress/renderer/gui/hud/UtilsHudLayer.java b/src/main/java/org/minefortress/renderer/gui/hud/UtilsHudLayer.java index d63bd3c0..dba849ab 100644 --- a/src/main/java/org/minefortress/renderer/gui/hud/UtilsHudLayer.java +++ b/src/main/java/org/minefortress/renderer/gui/hud/UtilsHudLayer.java @@ -2,9 +2,9 @@ import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.screen.ingame.BookScreen; -import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.item.Items; import net.remmintan.mods.minefortress.core.interfaces.tasks.IClientTasksHolder; +import net.remmintan.mods.minefortress.core.utils.CoreModUtils; import net.remmintan.mods.minefortress.networking.c2s.ServerboundSleepPacket; import net.remmintan.mods.minefortress.networking.helpers.FortressChannelNames; import net.remmintan.mods.minefortress.networking.helpers.FortressClientNetworkHelper; @@ -47,10 +47,10 @@ protected UtilsHudLayer(MinecraftClient client) { 0, 100, Items.ENDER_EYE, - (btn) -> ModUtils.getClientTasksHolder().ifPresent(IClientTasksHolder::toggleSelectionVisibility), - (button) -> ModUtils.getClientTasksHolder().map(IClientTasksHolder::isSelectionHidden) + (btn) -> CoreModUtils.getClientTasksHolder().ifPresent(IClientTasksHolder::toggleSelectionVisibility), + (button) -> CoreModUtils.getClientTasksHolder().map(IClientTasksHolder::isSelectionHidden) .map(it -> it ? "Show Tasks outline" : "Hide Tasks outline"), - () -> ModUtils.getClientTasksHolder().map(IClientTasksHolder::isSelectionHidden).orElse(false), + () -> CoreModUtils.getClientTasksHolder().map(IClientTasksHolder::isSelectionHidden).orElse(false), () -> true, Items.ENDER_PEARL ), diff --git a/src/main/java/org/minefortress/tasks/AbstractTask.java b/src/main/java/org/minefortress/tasks/AbstractTask.java index c2d1b33d..c2e85c81 100644 --- a/src/main/java/org/minefortress/tasks/AbstractTask.java +++ b/src/main/java/org/minefortress/tasks/AbstractTask.java @@ -8,13 +8,14 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3i; import net.remmintan.mods.minefortress.core.TaskType; +import net.remmintan.mods.minefortress.core.dtos.tasks.TaskInformationDto; +import net.remmintan.mods.minefortress.core.interfaces.entities.pawns.IWorkerPawn; +import net.remmintan.mods.minefortress.core.interfaces.tasks.ITask; import net.remmintan.mods.minefortress.core.interfaces.tasks.ITaskPart; import net.remmintan.mods.minefortress.core.utils.PathUtils; -import net.remmintan.mods.minefortress.core.interfaces.entities.pawns.IWorkerPawn; import net.remmintan.mods.minefortress.networking.helpers.FortressChannelNames; import net.remmintan.mods.minefortress.networking.helpers.FortressServerNetworkHelper; import net.remmintan.mods.minefortress.networking.s2c.ClientboundTaskExecutedPacket; -import net.remmintan.mods.minefortress.core.interfaces.tasks.ITask; import java.util.*; @@ -23,8 +24,8 @@ public abstract class AbstractTask implements ITask { protected static final int PART_SIZE = 3; // CAUTION: not actually unique - private final UUID id; - private final TaskType taskType; + protected final UUID id; + protected final TaskType taskType; protected BlockPos startingBlock; protected BlockPos endingBlock; @@ -104,6 +105,13 @@ public void finishPart(ITaskPart part, IWorkerPawn colonsit) { } } + @Override + public List toTaskInformationDto() { + final var blocks = new ArrayList(); + BlockPos.iterate(startingBlock, endingBlock).forEach(it -> blocks.add(it.toImmutable())); + return Collections.singletonList(new TaskInformationDto(id, blocks, taskType)); + } + protected void sendFinishTaskNotificationToPlayer(ServerPlayerEntity randomPlayer) { FortressServerNetworkHelper.send(randomPlayer, FortressChannelNames.FINISH_TASK, new ClientboundTaskExecutedPacket(this.getId())); } diff --git a/src/main/java/org/minefortress/tasks/BlueprintDigTask.java b/src/main/java/org/minefortress/tasks/BlueprintDigTask.java index 2159120e..53315368 100644 --- a/src/main/java/org/minefortress/tasks/BlueprintDigTask.java +++ b/src/main/java/org/minefortress/tasks/BlueprintDigTask.java @@ -6,10 +6,11 @@ import net.remmintan.mods.minefortress.core.interfaces.selections.ServerSelectionType; import java.util.UUID; +import java.util.stream.StreamSupport; public class BlueprintDigTask extends SimpleSelectionTask { public BlueprintDigTask(UUID id, BlockPos startingBlock, BlockPos endingBlock) { - super(id, TaskType.REMOVE, startingBlock, endingBlock, null, ServerSelectionType.SQUARES); + super(id, TaskType.REMOVE, startingBlock, endingBlock, null, ServerSelectionType.SQUARES, StreamSupport.stream(BlockPos.iterate(startingBlock, endingBlock).spliterator(), false).map(BlockPos::toImmutable).toList()); } @Override diff --git a/src/main/java/org/minefortress/tasks/ClientVisualTasksHolder.java b/src/main/java/org/minefortress/tasks/ClientTasksHolder.java similarity index 78% rename from src/main/java/org/minefortress/tasks/ClientVisualTasksHolder.java rename to src/main/java/org/minefortress/tasks/ClientTasksHolder.java index 4eaa2592..da6d24d6 100644 --- a/src/main/java/org/minefortress/tasks/ClientVisualTasksHolder.java +++ b/src/main/java/org/minefortress/tasks/ClientTasksHolder.java @@ -1,9 +1,10 @@ package org.minefortress.tasks; import net.minecraft.util.math.BlockPos; -import net.remmintan.gobi.ClientSelection; +import net.remmintan.gobi.ClientTask; import net.remmintan.mods.minefortress.building.BuildingHelper; import net.remmintan.mods.minefortress.core.TaskType; +import net.remmintan.mods.minefortress.core.dtos.tasks.TaskInformationDto; import net.remmintan.mods.minefortress.core.interfaces.tasks.IClientTask; import net.remmintan.mods.minefortress.core.interfaces.tasks.IClientTasksHolder; import net.remmintan.mods.minefortress.core.interfaces.tasks.ITasksModelBuilderInfoProvider; @@ -16,7 +17,7 @@ import java.util.*; -public class ClientVisualTasksHolder implements ITasksModelBuilderInfoProvider, ITasksRenderInfoProvider, IClientTasksHolder { +public class ClientTasksHolder implements ITasksModelBuilderInfoProvider, ITasksRenderInfoProvider, IClientTasksHolder { private static final Vector4f DESTROY_COLOR = new Vector4f(170f/255f, 0, 0, 1f); private static final Vector4f BUILD_COLOR = new Vector4f(0, 170f/255f, 0, 1f); @@ -30,7 +31,8 @@ public class ClientVisualTasksHolder implements ITasksModelBuilderInfoProvider, private boolean selectionHidden = false; private boolean needRebuild = false; - public void cancelTask() { + @Override + public void cancelLatestTask() { if(tasksStack.empty()) return; final UUID lastTaskId = tasksStack.pop(); subtasksMap.entrySet().stream().filter(it -> it.getValue().equals(lastTaskId)).map(Map.Entry::getKey).forEach(it -> { @@ -44,28 +46,23 @@ public void cancelTask() { } } + @Override public void cancelAllTasks() { while(!tasksStack.empty()) { - cancelTask(); + cancelLatestTask(); } } @Override - public void addRoadsSelectionTask(UUID digTaskId, UUID placeTaskId, List positions) { - addTask(digTaskId, positions, TaskType.REMOVE); - addTask(placeTaskId, positions, TaskType.BUILD); - } - - public void addTask(UUID uuid, Iterable blocks) { - addTask(uuid, blocks, TaskType.BUILD); - } - - public void addTask(UUID uuid, Iterable blocks, TaskType type) { - addTask(uuid, blocks, type, null); + public void addTasks(List tasks) { + for(TaskInformationDto task: tasks) { + addTask(task.id(), task.positions(), task.type(), null); + } } + @Override public void addTask(UUID uuid, Iterable blocks, TaskType type, UUID superTaskId) { - IClientTask newTask = new ClientSelection( + IClientTask newTask = new ClientTask( blocks, type == TaskType.REMOVE ? DESTROY_COLOR: BUILD_COLOR, (w, p) -> type == TaskType.REMOVE ? BuildingHelper.canRemoveBlock(w, p) : BuildingHelper.canPlaceBlock(w, p) @@ -86,11 +83,12 @@ public void addTask(UUID uuid, Iterable blocks, TaskType type, UUID su @Override public Set getAllSelections() { - final var clientSelections = new HashSet(buildTasks.values()); + final var clientSelections = new HashSet<>(buildTasks.values()); clientSelections.addAll(removeTasks.values()); return clientSelections; } + @Override public void removeTask(UUID uuid) { if(buildTasks.containsKey(uuid)) { buildTasks.remove(uuid); @@ -104,28 +102,28 @@ public void removeTask(UUID uuid) { this.setNeedRebuild(true); } + @Override public boolean isNeedRebuild() { return needRebuild; } + @Override public void setNeedRebuild(boolean needRebuild) { this.needRebuild = needRebuild; } @Override public boolean shouldRender() { - return !selectionHidden && (removeTasks.size() > 0 || buildTasks.size() > 0); + return !selectionHidden && (!removeTasks.isEmpty() || !buildTasks.isEmpty()); } + @Override public void toggleSelectionVisibility() { this.selectionHidden = !this.selectionHidden; } + @Override public boolean isSelectionHidden() { return selectionHidden; } - - public boolean isEmpty() { - return buildTasks.isEmpty() && removeTasks.isEmpty(); - } } diff --git a/src/main/java/org/minefortress/tasks/CutTreesTask.java b/src/main/java/org/minefortress/tasks/CutTreesTask.java index 1abbac62..75e624ae 100644 --- a/src/main/java/org/minefortress/tasks/CutTreesTask.java +++ b/src/main/java/org/minefortress/tasks/CutTreesTask.java @@ -6,6 +6,7 @@ import net.remmintan.gobi.helpers.TreeBlocks; import net.remmintan.gobi.helpers.TreeHelper; import net.remmintan.mods.minefortress.core.TaskType; +import net.remmintan.mods.minefortress.core.dtos.tasks.TaskInformationDto; import net.remmintan.mods.minefortress.core.interfaces.entities.pawns.IWorkerPawn; import net.remmintan.mods.minefortress.core.interfaces.tasks.ITask; import net.remmintan.mods.minefortress.core.interfaces.tasks.ITaskBlockInfo; @@ -25,10 +26,13 @@ public class CutTreesTask implements ITask { private int removedRoots = 0; - public CutTreesTask(UUID uuid, List treeRoots) { + private final List positions; + + public CutTreesTask(UUID uuid, List treeRoots, List positions) { this.uuid = uuid; this.treeRoots = new ArrayDeque<>(treeRoots); this.totalRootCount = treeRoots.size(); + this.positions = positions; } @Override @@ -82,4 +86,10 @@ public void finishPart(ITaskPart part, IWorkerPawn colonist) { }); } } + + @Override + public List toTaskInformationDto() { + final var taskInformationDto = new TaskInformationDto(getId(), positions, TaskType.REMOVE); + return List.of(taskInformationDto); + } } diff --git a/src/main/java/org/minefortress/tasks/RepairBuildingTask.java b/src/main/java/org/minefortress/tasks/RepairBuildingTask.java index 3390a5ee..837d7cc9 100644 --- a/src/main/java/org/minefortress/tasks/RepairBuildingTask.java +++ b/src/main/java/org/minefortress/tasks/RepairBuildingTask.java @@ -5,12 +5,14 @@ import net.minecraft.server.world.ServerWorld; import net.minecraft.util.math.BlockPos; import net.remmintan.mods.minefortress.core.TaskType; +import net.remmintan.mods.minefortress.core.dtos.tasks.TaskInformationDto; import net.remmintan.mods.minefortress.core.interfaces.entities.pawns.IWorkerPawn; import net.remmintan.mods.minefortress.core.interfaces.tasks.ITaskBlockInfo; import net.remmintan.mods.minefortress.core.interfaces.tasks.ITaskPart; import org.minefortress.tasks.block.info.BlockStateTaskBlockInfo; -import com.mojang.datafixers.util.Pair; + import java.util.Collections; +import java.util.List; import java.util.Map; import java.util.UUID; @@ -39,4 +41,10 @@ public ITaskPart getNextPart(ServerWorld level, IWorkerPawn colonist) { return new TaskPart(part, taskBlocks, this); } + + @Override + public List toTaskInformationDto() { + final var taskInfoDto = new TaskInformationDto(id, blocksToRepair.keySet().stream().toList(), taskType); + return List.of(taskInfoDto); + } } diff --git a/src/main/java/org/minefortress/tasks/RoadsTask.java b/src/main/java/org/minefortress/tasks/RoadsTask.java index 3760fa26..89abcb2b 100644 --- a/src/main/java/org/minefortress/tasks/RoadsTask.java +++ b/src/main/java/org/minefortress/tasks/RoadsTask.java @@ -5,16 +5,17 @@ import net.minecraft.server.world.ServerWorld; import net.minecraft.util.math.BlockPos; import net.remmintan.mods.minefortress.core.TaskType; -import net.remmintan.mods.minefortress.core.interfaces.tasks.ITaskPart; -import org.jetbrains.annotations.NotNull; +import net.remmintan.mods.minefortress.core.dtos.tasks.TaskInformationDto; import net.remmintan.mods.minefortress.core.interfaces.entities.pawns.IWorkerPawn; -import net.remmintan.mods.minefortress.networking.s2c.ClientboundTaskExecutedPacket; +import net.remmintan.mods.minefortress.core.interfaces.tasks.ITask; +import net.remmintan.mods.minefortress.core.interfaces.tasks.ITaskBlockInfo; +import net.remmintan.mods.minefortress.core.interfaces.tasks.ITaskPart; import net.remmintan.mods.minefortress.networking.helpers.FortressChannelNames; import net.remmintan.mods.minefortress.networking.helpers.FortressServerNetworkHelper; +import net.remmintan.mods.minefortress.networking.s2c.ClientboundTaskExecutedPacket; +import org.jetbrains.annotations.NotNull; import org.minefortress.tasks.block.info.BlockStateTaskBlockInfo; import org.minefortress.tasks.block.info.DigTaskBlockInfo; -import net.remmintan.mods.minefortress.core.interfaces.tasks.ITaskBlockInfo; -import net.remmintan.mods.minefortress.core.interfaces.tasks.ITask; import org.minefortress.utils.BlockUtils; import java.util.*; @@ -126,4 +127,15 @@ public void finishPart(ITaskPart part, IWorkerPawn colonist) { onComplete.run(); } } + + @Override + public List toTaskInformationDto() { + if(taskType == TaskType.BUILD){ + final var digTask = new TaskInformationDto(id, blocks, TaskType.REMOVE); + final var placeTask = new TaskInformationDto(id, blocks, TaskType.BUILD); + return List.of(digTask, placeTask); + } else { + return List.of(); + } + } } diff --git a/src/main/java/org/minefortress/tasks/ServerTaskManager.java b/src/main/java/org/minefortress/tasks/ServerTaskManager.java index 210accd8..3f4f3529 100644 --- a/src/main/java/org/minefortress/tasks/ServerTaskManager.java +++ b/src/main/java/org/minefortress/tasks/ServerTaskManager.java @@ -11,6 +11,8 @@ import net.remmintan.mods.minefortress.core.interfaces.server.IServerManagersProvider; import net.remmintan.mods.minefortress.core.interfaces.tasks.IServerTaskManager; import net.remmintan.mods.minefortress.core.interfaces.tasks.ITask; +import net.remmintan.mods.minefortress.networking.helpers.FortressServerNetworkHelper; +import net.remmintan.mods.minefortress.networking.s2c.S2CAddClientTasksPacket; import org.minefortress.fortress.resources.ItemInfo; import java.util.*; @@ -19,6 +21,7 @@ public class ServerTaskManager implements IServerTaskManager { private final Set cancelledTasks = new HashSet<>(); + private final Map nonFinishedTasks = new HashMap<>(); @Override public void addTask(ITask task, IServerManagersProvider provider, IServerFortressManager manager, List selectedPawns, ServerPlayerEntity player) { @@ -49,11 +52,16 @@ public void addTask(ITask task, IServerManagersProvider provider, IServerFortres .toList(); assignPawnsToTask(player, task, selectedWorkers); + + final var packet = new S2CAddClientTasksPacket(task.toTaskInformationDto()); + FortressServerNetworkHelper.send(player, S2CAddClientTasksPacket.CHANNEL, packet); + nonFinishedTasks.put(task.getId(), task); } @Override public void cancelTask(UUID id, IServerManagersProvider provider, IServerFortressManager manager) { cancelledTasks.add(id); + nonFinishedTasks.remove(id); provider.getResourceManager().returnReservedItems(id); } diff --git a/src/main/java/org/minefortress/tasks/SimpleSelectionTask.java b/src/main/java/org/minefortress/tasks/SimpleSelectionTask.java index dd3c42bb..518d380d 100644 --- a/src/main/java/org/minefortress/tasks/SimpleSelectionTask.java +++ b/src/main/java/org/minefortress/tasks/SimpleSelectionTask.java @@ -10,6 +10,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.remmintan.mods.minefortress.core.TaskType; +import net.remmintan.mods.minefortress.core.dtos.tasks.TaskInformationDto; import net.remmintan.mods.minefortress.core.interfaces.entities.pawns.IWorkerPawn; import net.remmintan.mods.minefortress.core.interfaces.selections.ServerSelectionType; import net.remmintan.mods.minefortress.core.interfaces.tasks.ITaskBlockInfo; @@ -32,8 +33,9 @@ public class SimpleSelectionTask extends AbstractTask { private final ServerSelectionType selectionType; private Item placingItem; + private List positions; - public SimpleSelectionTask(UUID id, TaskType taskType, BlockPos startingBlock, BlockPos endingBlock, HitResult hitResult, ServerSelectionType selectionType) { + public SimpleSelectionTask(UUID id, TaskType taskType, BlockPos startingBlock, BlockPos endingBlock, HitResult hitResult, ServerSelectionType selectionType, List positions) { super(id, taskType, startingBlock, endingBlock); this.selectionType = selectionType; @@ -56,6 +58,8 @@ public SimpleSelectionTask(UUID id, TaskType taskType, BlockPos startingBlock, B this.hitResult = hitResult; this.horizontalDirection = null; } + + this.positions = positions; } private boolean isShouldSwapEnds(TaskType taskType, BlockPos startingBlock, BlockPos endingBlock, ServerSelectionType selectionType) { @@ -122,4 +126,8 @@ public Iterable getBlocksForPart(Pair part) { } } + @Override + public List toTaskInformationDto() { + return List.of(new TaskInformationDto(id, positions, taskType)); + } } diff --git a/src/main/java/org/minefortress/tasks/TasksCreator.java b/src/main/java/org/minefortress/tasks/TasksCreator.java index 893e572f..6ec10663 100644 --- a/src/main/java/org/minefortress/tasks/TasksCreator.java +++ b/src/main/java/org/minefortress/tasks/TasksCreator.java @@ -17,8 +17,8 @@ public class TasksCreator implements ITasksCreator { @Override - public ITask createCutTreesTask(UUID uuid, List treeRoots) { - return new CutTreesTask(uuid, treeRoots); + public ITask createCutTreesTask(UUID uuid, List treeRoots, List positions) { + return new CutTreesTask(uuid, treeRoots, positions); } @Override @@ -27,8 +27,8 @@ public ITask createRoadsTask(UUID digUuid, TaskType type, UUID placeUuid, List positions, ServerPlayerEntity player) { + SimpleSelectionTask simpleSelectionTask = new SimpleSelectionTask(id, taskType, start, end, hitResult, selectionType, positions); if(simpleSelectionTask.getTaskType() == TaskType.BUILD) { final ItemStack itemInHand = player.getStackInHand(Hand.MAIN_HAND); if(itemInHand != ItemStack.EMPTY) { diff --git a/src/main/java/org/minefortress/utils/ModUtils.java b/src/main/java/org/minefortress/utils/ModUtils.java index de04fb64..768ce5d3 100644 --- a/src/main/java/org/minefortress/utils/ModUtils.java +++ b/src/main/java/org/minefortress/utils/ModUtils.java @@ -15,8 +15,6 @@ import net.remmintan.mods.minefortress.core.interfaces.professions.IClientProfessionManager; import net.remmintan.mods.minefortress.core.interfaces.selections.ISelectionManager; import net.remmintan.mods.minefortress.core.interfaces.tasks.IAreasClientManager; -import net.remmintan.mods.minefortress.core.interfaces.tasks.IClientTasksHolder; -import net.remmintan.mods.minefortress.core.interfaces.tasks.ITasksInformationHolder; import org.jetbrains.annotations.NotNull; import org.minefortress.MineFortressMod; import org.minefortress.interfaces.IFortressMinecraftClient; @@ -95,16 +93,6 @@ public static ISelectionManager getSelectionManager() { return getClientManagersProvider().get_SelectionManager(); } - public static Optional getFortressClientWorld() { - return Optional.ofNullable(MinecraftClient.getInstance()) - .map(it -> it.world) - .map(ITasksInformationHolder.class::cast); - } - - public static Optional getClientTasksHolder() { - return getFortressClientWorld().map(ITasksInformationHolder::get_ClientTasksHolder); - } - @NotNull public static ClientPlayerEntity getClientPlayer() { return Objects.requireNonNull(MinecraftClient.getInstance().player); diff --git a/src/networking/java/net/remmintan/mods/minefortress/networking/c2s/ServerboundBlueprintTaskPacket.java b/src/networking/java/net/remmintan/mods/minefortress/networking/c2s/ServerboundBlueprintTaskPacket.java index 37fe0ccc..c608c202 100644 --- a/src/networking/java/net/remmintan/mods/minefortress/networking/c2s/ServerboundBlueprintTaskPacket.java +++ b/src/networking/java/net/remmintan/mods/minefortress/networking/c2s/ServerboundBlueprintTaskPacket.java @@ -71,7 +71,6 @@ public void handle(MinecraftServer server, ServerPlayerEntity player) { final var provider = getManagersProvider(server, player); if(manager.isSurvival()) { - final var serverResourceManager = provider.getResourceManager(); final var stacks = blueprintManager.getBlockDataManager().getBlockData(blueprintId, rotation).getStacks(); try { diff --git a/src/networking/java/net/remmintan/mods/minefortress/networking/c2s/ServerboundCutTreesTaskPacket.java b/src/networking/java/net/remmintan/mods/minefortress/networking/c2s/ServerboundCutTreesTaskPacket.java index b0008a41..1aa2cc31 100644 --- a/src/networking/java/net/remmintan/mods/minefortress/networking/c2s/ServerboundCutTreesTaskPacket.java +++ b/src/networking/java/net/remmintan/mods/minefortress/networking/c2s/ServerboundCutTreesTaskPacket.java @@ -15,16 +15,25 @@ public class ServerboundCutTreesTaskPacket implements FortressC2SPacket { private final UUID uuid; private final List treeRoots; private final List selectedPawns; + private final List selection; - public ServerboundCutTreesTaskPacket(UUID uuid, List treeRoots, List selectedPawns) { + public ServerboundCutTreesTaskPacket(UUID uuid, List treeRoots, List selection, List selectedPawns) { this.uuid = uuid; this.treeRoots = treeRoots; + this.selection = selection; this.selectedPawns = selectedPawns; } public ServerboundCutTreesTaskPacket(PacketByteBuf buf) { this.uuid = buf.readUuid(); this.treeRoots = buf.readCollection(ArrayList::new, PacketByteBuf::readBlockPos); + + selection = new ArrayList<>(); + final int selectionSize = buf.readInt(); + for (int i = 0; i < selectionSize; i++) { + selection.add(buf.readBlockPos()); + } + selectedPawns = new ArrayList<>(); final int size = buf.readInt(); for (int i = 0; i < size; i++) { @@ -36,6 +45,12 @@ public ServerboundCutTreesTaskPacket(PacketByteBuf buf) { public void write(PacketByteBuf buf) { buf.writeUuid(uuid); buf.writeCollection(treeRoots, PacketByteBuf::writeBlockPos); + + buf.writeInt(selection.size()); + for (BlockPos blockPos : selection) { + buf.writeBlockPos(blockPos); + } + buf.writeInt(selectedPawns.size()); for (Integer selectedPawn : selectedPawns) { buf.writeInt(selectedPawn); @@ -47,7 +62,7 @@ public void handle(MinecraftServer server, ServerPlayerEntity player) { final var provider = getManagersProvider(server, player); final var taskManager = provider.getTaskManager(); final var tasksCreator = provider.getTasksCreator(); - final var cutTreesTask = tasksCreator.createCutTreesTask(uuid, treeRoots); + final var cutTreesTask = tasksCreator.createCutTreesTask(uuid, treeRoots, selection); final var manager = getFortressManager(server, player); taskManager.addTask(cutTreesTask, provider, manager, selectedPawns, player); } diff --git a/src/networking/java/net/remmintan/mods/minefortress/networking/c2s/ServerboundSimpleSelectionTaskPacket.java b/src/networking/java/net/remmintan/mods/minefortress/networking/c2s/ServerboundSimpleSelectionTaskPacket.java index 03a7bb46..2492f33a 100644 --- a/src/networking/java/net/remmintan/mods/minefortress/networking/c2s/ServerboundSimpleSelectionTaskPacket.java +++ b/src/networking/java/net/remmintan/mods/minefortress/networking/c2s/ServerboundSimpleSelectionTaskPacket.java @@ -24,14 +24,15 @@ public class ServerboundSimpleSelectionTaskPacket implements FortressC2SPacket { private final HitResult hitResult; private final String selectionType; private final List selectedPawns; - - public ServerboundSimpleSelectionTaskPacket(UUID id, TaskType taskType, BlockPos start, BlockPos end, HitResult hitResult, String selectionType, List selectedPawns) { + private final List positions; + public ServerboundSimpleSelectionTaskPacket(UUID id, TaskType taskType, BlockPos start, BlockPos end, HitResult hitResult, String selectionType, List positions, List selectedPawns) { this.id = id; this.taskType = taskType; this.start = start; this.end = end; this.hitResult = hitResult; this.selectionType = selectionType; + this.positions = positions; this.selectedPawns = selectedPawns; } @@ -47,9 +48,16 @@ public ServerboundSimpleSelectionTaskPacket(PacketByteBuf buffer) { this.hitResult = null; } this.selectionType = buffer.readString(); + + this.positions = new ArrayList<>(); + int selectionSize = buffer.readInt(); + for (int i = 0; i < selectionSize; i++) { + this.positions.add(buffer.readBlockPos()); + } + this.selectedPawns = new ArrayList<>(); - int size = buffer.readInt(); - for (int i = 0; i < size; i++) { + int pawnsSize = buffer.readInt(); + for (int i = 0; i < pawnsSize; i++) { this.selectedPawns.add(buffer.readInt()); } } @@ -66,6 +74,12 @@ public void write(PacketByteBuf buffer) { buffer.writeBlockHitResult((BlockHitResult) this.hitResult); } buffer.writeString(selectionType); + + buffer.writeInt(positions.size()); + for (BlockPos blockPos : positions) { + buffer.writeBlockPos(blockPos); + } + buffer.writeInt(selectedPawns.size()); for (Integer selectedPawn : selectedPawns) { buffer.writeInt(selectedPawn); @@ -107,9 +121,9 @@ public void handle(MinecraftServer server, ServerPlayerEntity player) { final var endingBlock = this.getEnd(); final var hitResult = this.getHitResult(); final var selectionType = this.getSelectionType(); - final var task = tasksCreator.createSelectionTask(id, taskType, startingBlock, endingBlock, selectionType, hitResult, player); + final var task = tasksCreator.createSelectionTask(id, taskType, startingBlock, endingBlock, selectionType, hitResult, positions, player); final var manager = getFortressManager(server, player); - taskManager.addTask(task, provider, manager, selectedPawns,player); + taskManager.addTask(task, provider, manager, selectedPawns, player); } } diff --git a/src/networking/java/net/remmintan/mods/minefortress/networking/registries/ClientNetworkReceivers.java b/src/networking/java/net/remmintan/mods/minefortress/networking/registries/ClientNetworkReceivers.java index 6be01124..597e14db 100644 --- a/src/networking/java/net/remmintan/mods/minefortress/networking/registries/ClientNetworkReceivers.java +++ b/src/networking/java/net/remmintan/mods/minefortress/networking/registries/ClientNetworkReceivers.java @@ -30,6 +30,7 @@ public static void registerReceivers() { registerReceiver(S2CUpdateInfluenceBorderStage.CHANNEL, S2CUpdateInfluenceBorderStage::new); registerReceiver(S2COpenBuildingRepairScreen.CHANNEL, S2COpenBuildingRepairScreen::new); registerReceiver(S2CSyncFightManager.CHANNEL, S2CSyncFightManager::new); + registerReceiver(S2CAddClientTasksPacket.CHANNEL, S2CAddClientTasksPacket::new); } private static void registerReceiver(String channelName, Function packetConstructor) { diff --git a/src/networking/java/net/remmintan/mods/minefortress/networking/s2c/S2CAddClientTasksPacket.java b/src/networking/java/net/remmintan/mods/minefortress/networking/s2c/S2CAddClientTasksPacket.java new file mode 100644 index 00000000..30bea2a1 --- /dev/null +++ b/src/networking/java/net/remmintan/mods/minefortress/networking/s2c/S2CAddClientTasksPacket.java @@ -0,0 +1,57 @@ +package net.remmintan.mods.minefortress.networking.s2c; + +import net.minecraft.client.MinecraftClient; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.util.math.BlockPos; +import net.remmintan.mods.minefortress.core.TaskType; +import net.remmintan.mods.minefortress.core.dtos.tasks.TaskInformationDto; +import net.remmintan.mods.minefortress.core.interfaces.networking.FortressS2CPacket; +import net.remmintan.mods.minefortress.core.utils.CoreModUtils; + +import java.util.ArrayList; +import java.util.List; + +public class S2CAddClientTasksPacket implements FortressS2CPacket { + + public static final String CHANNEL = "minefortress:client_task_state"; + + private final List tasks; + + public S2CAddClientTasksPacket(List tasks) { + this.tasks = tasks; + } + + public S2CAddClientTasksPacket(PacketByteBuf buf) { + final int size = buf.readVarInt(); + this.tasks = new ArrayList<>(size); + for(int i = 0; i < size; i++) { + final var id = buf.readUuid(); + final var positions = new ArrayList(); + final int positionsSize = buf.readInt(); + for(int j = 0; j < positionsSize; j++) { + positions.add(buf.readBlockPos()); + } + final var type = buf.readEnumConstant(TaskType.class); + this.tasks.add(new TaskInformationDto(id, positions, type)); + } + } + + @Override + public void write(PacketByteBuf buf) { + buf.writeVarInt(tasks.size()); + for(TaskInformationDto task: tasks) { + buf.writeUuid(task.id()); + final var blockPositions = task.positions(); + buf.writeInt(blockPositions.size()); + for(BlockPos pos: blockPositions) { + buf.writeBlockPos(pos); + } + buf.writeEnumConstant(task.type()); + } + } + + @Override + public void handle(MinecraftClient client) { + CoreModUtils.getClientTasksHolder().orElseThrow().addTasks(tasks); + } +} diff --git a/src/panama/java/net/remmintan/panama/model/BuiltTasks.java b/src/panama/java/net/remmintan/panama/model/BuiltTasks.java index 16d84753..1cb2d793 100644 --- a/src/panama/java/net/remmintan/panama/model/BuiltTasks.java +++ b/src/panama/java/net/remmintan/panama/model/BuiltTasks.java @@ -69,7 +69,7 @@ private void render(BufferBuilder bufferBuilder) { private void renderBlock(BufferBuilder bufferBuilder, MatrixStack matrices, BiFunction shouldRender, IClientTask selection, Vector4f color) { init(bufferBuilder); - final Set positions = selection.getBlockPositions(); + final var positions = selection.getBlockPositions(); for(BlockPos pos: positions) { if(!shouldRender.apply(getWorld(), pos)) continue; matrices.push(); diff --git a/src/selections/java/net/remmintan/gobi/ClientSelection.java b/src/selections/java/net/remmintan/gobi/ClientTask.java similarity index 65% rename from src/selections/java/net/remmintan/gobi/ClientSelection.java rename to src/selections/java/net/remmintan/gobi/ClientTask.java index b7b5fe52..54f9fd54 100644 --- a/src/selections/java/net/remmintan/gobi/ClientSelection.java +++ b/src/selections/java/net/remmintan/gobi/ClientTask.java @@ -5,20 +5,19 @@ import net.remmintan.mods.minefortress.core.interfaces.tasks.IClientTask; import org.joml.Vector4f; -import java.util.HashSet; -import java.util.Set; +import java.util.ArrayList; +import java.util.List; import java.util.function.BiFunction; -public final class ClientSelection implements IClientTask { - - private final Set blockPositions; +public final class ClientTask implements IClientTask { + private final List blockPositions; private final Vector4f color; private final BiFunction shouldRenderBlock; - public ClientSelection(Iterable blockPositions, - Vector4f color, - BiFunction shouldRenderBlock) { - HashSet positions = new HashSet<>(); + public ClientTask(Iterable blockPositions, + Vector4f color, + BiFunction shouldRenderBlock) { + List positions = new ArrayList<>(); for(BlockPos pos: blockPositions) { positions.add(pos.toImmutable()); } @@ -28,11 +27,10 @@ public ClientSelection(Iterable blockPositions, } @Override - public Set getBlockPositions() { + public List getBlockPositions() { return blockPositions; } - @Override public Vector4f getColor() { return color; diff --git a/src/selections/java/net/remmintan/gobi/RoadsSelection.java b/src/selections/java/net/remmintan/gobi/RoadsSelection.java index 6a3b4444..f5fcb3eb 100644 --- a/src/selections/java/net/remmintan/gobi/RoadsSelection.java +++ b/src/selections/java/net/remmintan/gobi/RoadsSelection.java @@ -11,8 +11,6 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.remmintan.mods.minefortress.core.interfaces.selections.ClickType; -import net.remmintan.mods.minefortress.core.interfaces.tasks.IClientTasksHolder; -import net.remmintan.mods.minefortress.core.interfaces.tasks.ITasksInformationHolder; import net.remmintan.mods.minefortress.core.utils.CoreModUtils; import net.remmintan.mods.minefortress.networking.c2s.ServerboundRoadsTaskPacket; import net.remmintan.mods.minefortress.networking.helpers.FortressChannelNames; @@ -33,11 +31,11 @@ public boolean selectBlock(World level, Item mainHandItem, BlockPos pickedBlock, final UUID digTaskId = UUID.randomUUID(); final UUID placeTaskId = UUID.randomUUID(); - final IClientTasksHolder tasksHolder = ((ITasksInformationHolder) level).get_ClientTasksHolder(); - tasksHolder.addRoadsSelectionTask(digTaskId, placeTaskId, getSelection()); +// final IClientTasksHolder tasksHolder = ((ITasksInformationHolder) level).get_ClientTasksHolder(); +// tasksHolder.addRoadsSelectionTask(digTaskId, placeTaskId, getSelection()); final var selectedPawnsIds = CoreModUtils.getMineFortressManagersProvider().get_PawnsSelectionManager().getSelectedPawnsIds(); - final var packet = new ServerboundRoadsTaskPacket(digTaskId, placeTaskId, selection, selectedPawnsIds); + final var packet = new ServerboundRoadsTaskPacket(digTaskId, placeTaskId, getSelection(), selectedPawnsIds); FortressClientNetworkHelper.send(FortressChannelNames.FORTRESS_ROADS_TASK, packet); return true; } diff --git a/src/selections/java/net/remmintan/gobi/TreeSelection.java b/src/selections/java/net/remmintan/gobi/TreeSelection.java index 6d267703..6f869fe9 100644 --- a/src/selections/java/net/remmintan/gobi/TreeSelection.java +++ b/src/selections/java/net/remmintan/gobi/TreeSelection.java @@ -11,9 +11,7 @@ import net.minecraft.world.World; import net.remmintan.gobi.helpers.TreeBlocks; import net.remmintan.gobi.helpers.TreeHelper; -import net.remmintan.mods.minefortress.core.TaskType; import net.remmintan.mods.minefortress.core.interfaces.selections.ClickType; -import net.remmintan.mods.minefortress.core.interfaces.tasks.ITasksInformationHolder; import net.remmintan.mods.minefortress.core.utils.CoreModUtils; import net.remmintan.mods.minefortress.networking.c2s.ServerboundCutTreesTaskPacket; import net.remmintan.mods.minefortress.networking.helpers.FortressChannelNames; @@ -58,11 +56,8 @@ public boolean selectBlock(World level, Item mainHandItem, BlockPos pickedBlock, if(!treeRoots.isEmpty()) { this.selectedTreeBlocks.remove(start); final UUID newTaskId = UUID.randomUUID(); - if(level instanceof ITasksInformationHolder holder) { - holder.get_ClientTasksHolder().addTask(newTaskId, getSelection(), TaskType.REMOVE); - } final var selectedPawnsIds = CoreModUtils.getMineFortressManagersProvider().get_PawnsSelectionManager().getSelectedPawnsIds(); - final var packet = new ServerboundCutTreesTaskPacket(newTaskId, Collections.unmodifiableList(treeRoots), selectedPawnsIds); + final var packet = new ServerboundCutTreesTaskPacket(newTaskId, Collections.unmodifiableList(treeRoots), getSelection(), selectedPawnsIds); FortressClientNetworkHelper.send(FortressChannelNames.FORTRESS_CUT_TREES_TASK, packet); } diff --git a/src/selections/java/net/remmintan/gobi/TwoDotsSelection.java b/src/selections/java/net/remmintan/gobi/TwoDotsSelection.java index 9e64cf4c..7d4e0e70 100644 --- a/src/selections/java/net/remmintan/gobi/TwoDotsSelection.java +++ b/src/selections/java/net/remmintan/gobi/TwoDotsSelection.java @@ -9,10 +9,8 @@ import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3i; import net.minecraft.world.World; -import net.remmintan.mods.minefortress.core.TaskType; import net.remmintan.mods.minefortress.core.interfaces.selections.ClickType; import net.remmintan.mods.minefortress.core.interfaces.selections.ISelectionType; -import net.remmintan.mods.minefortress.core.interfaces.tasks.ITasksInformationHolder; import net.remmintan.mods.minefortress.core.utils.CoreModUtils; import net.remmintan.mods.minefortress.networking.c2s.ServerboundSimpleSelectionTaskPacket; import net.remmintan.mods.minefortress.networking.helpers.FortressChannelNames; @@ -63,19 +61,16 @@ public boolean selectBlock(World level, return false; } else { if(pickedBlock != null && hitResult instanceof BlockHitResult && click == this.clickType && connection != null && selectionEnd != null) { - UUID newTaskId = UUID.randomUUID(); - TaskType taskType = mapClickTypeToTaskType(clickType); - if(level instanceof ITasksInformationHolder holder) { - holder.get_ClientTasksHolder().addTask(newTaskId, getSelection(), taskType); - } + final var taskType = mapClickTypeToTaskType(clickType); final var selectedPawnsIds = CoreModUtils.getMineFortressManagersProvider().get_PawnsSelectionManager().getSelectedPawnsIds(); final var packet = new ServerboundSimpleSelectionTaskPacket( - newTaskId, + UUID.randomUUID(), taskType, this.selectionStart, this.selectionEnd, hitResult, getSelectionType().name(), + getSelection(), selectedPawnsIds ); diff --git a/src/selections/java/net/remmintan/gobi/WallsSelection.java b/src/selections/java/net/remmintan/gobi/WallsSelection.java index b731cd38..aaa05b58 100644 --- a/src/selections/java/net/remmintan/gobi/WallsSelection.java +++ b/src/selections/java/net/remmintan/gobi/WallsSelection.java @@ -194,6 +194,7 @@ public boolean selectBlock( p.getSecond().up(upDelta), hitResult, getSelectionType().name(), + getSelection(), selectedPawnsIds );