Skip to content

Commit

Permalink
WIP Keep tasks on the server instead of client
Browse files Browse the repository at this point in the history
  • Loading branch information
remmintan committed Mar 16, 2024
1 parent cab2a45 commit 6554de3
Show file tree
Hide file tree
Showing 36 changed files with 262 additions and 145 deletions.
Original file line number Diff line number Diff line change
@@ -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<BlockPos> positions, TaskType type) {}
Original file line number Diff line number Diff line change
Expand Up @@ -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<BlockPos> getBlockPositions();
List<BlockPos> getBlockPositions();

Vector4f getColor();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<BlockPos> positions);
void addTask(UUID uuid, Iterable<BlockPos> blocks);
void addTasks(List<TaskInformationDto> tasks);

void removeTask(UUID id);
void addTask(UUID uuid, Iterable<BlockPos> blocks, TaskType type);
void addTask(UUID uuid, Iterable<BlockPos> blocks, TaskType type, UUID superTaskId);

void cancelAllTasks();
void cancelTask();
void cancelLatestTask();

void toggleSelectionVisibility();
boolean isSelectionHidden();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -18,5 +20,6 @@ default void prepareTask() {}
void finishPart(ITaskPart part, IWorkerPawn colonist);

default void addFinishListener(Runnable listener) {}
List<TaskInformationDto> toTaskInformationDto();

}
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,12 @@

public interface ITasksCreator extends IServerManager {

ITask createCutTreesTask(UUID uuid, List<BlockPos> treeRoots);
ITask createCutTreesTask(UUID uuid, List<BlockPos> treeRoots, List<BlockPos> positions);
default ITask createRoadsTask(UUID digUuid, TaskType type, UUID placeUuid, List<BlockPos> blocks, Item itemInHand) {
return createRoadsTask(digUuid, type, placeUuid, blocks, itemInHand, () -> {});
}
ITask createRoadsTask(UUID digUuid, TaskType type, UUID placeUuid, List<BlockPos> 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<BlockPos> positions, ServerPlayerEntity player);

}
Original file line number Diff line number Diff line change
Expand Up @@ -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 {

Expand All @@ -22,4 +26,12 @@ public static boolean isPlayerInCreative(IFortressAwareEntity colonist) {
.orElse(false);
}

public static Optional<IClientTasksHolder> getClientTasksHolder() {
return Optional
.ofNullable(MinecraftClient.getInstance())
.map(it -> it.world)
.map(ITasksInformationHolder.class::cast)
.map(ITasksInformationHolder::get_ClientTasksHolder);
}

}
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
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;
import net.minecraft.util.math.Vec3i;
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 {
Expand Down Expand Up @@ -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<BlockPos, BlockState> structureData = blockData
.getLayer(BlueprintDataLayer.GENERAL);
final int floorLevel = getSelectedStructure().getFloorLevel();
final List<BlockPos> 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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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()) {
Expand All @@ -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(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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()
Expand All @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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));
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -29,15 +29,15 @@
public abstract class ClientWorldMixin extends World implements ITasksInformationHolder {

@Shadow @Final private MinecraftClient client;
private ClientVisualTasksHolder tasksHolder;
private ClientTasksHolder tasksHolder;

protected ClientWorldMixin(MutableWorldProperties properties, RegistryKey<World> registryRef, DynamicRegistryManager registryManager, RegistryEntry<DimensionType> dimensionEntry, Supplier<Profiler> profiler, boolean isClient, boolean debugWorld, long biomeAccess, int maxChainedNeighborUpdates) {
super(properties, registryRef, registryManager, dimensionEntry, profiler, isClient, debugWorld, biomeAccess, maxChainedNeighborUpdates);
}

@Inject(method = "<init>", 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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ private static void endClientTick(MinecraftClient client) {
if(client.options.sprintKey.isPressed()) {
clientVisualTasksHolder.cancelAllTasks();
} else {
clientVisualTasksHolder.cancelTask();
clientVisualTasksHolder.cancelLatestTask();
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
),
Expand Down
16 changes: 12 additions & 4 deletions src/main/java/org/minefortress/tasks/AbstractTask.java
Original file line number Diff line number Diff line change
Expand Up @@ -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.*;

Expand All @@ -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;

Expand Down Expand Up @@ -104,6 +105,13 @@ public void finishPart(ITaskPart part, IWorkerPawn colonsit) {
}
}

@Override
public List<TaskInformationDto> toTaskInformationDto() {
final var blocks = new ArrayList<BlockPos>();
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()));
}
Expand Down
3 changes: 2 additions & 1 deletion src/main/java/org/minefortress/tasks/BlueprintDigTask.java
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Loading

0 comments on commit 6554de3

Please sign in to comment.