Skip to content

Commit

Permalink
Finished building upgrades functionality
Browse files Browse the repository at this point in the history
  • Loading branch information
remmintan committed Dec 29, 2024
1 parent 6433043 commit 6a3fdca
Show file tree
Hide file tree
Showing 13 changed files with 96 additions and 103 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,10 @@ List<BlockPos> getAllPresevedBlockPositions() {
return preservedPositions;
}

List<BlockPos> getActualState() {
return new ArrayList<>(actualState.keySet());
}

private enum BuildingBlockState {
DESTROYED,
PRESERVED,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ class FortressBuildingBlockEntity(pos: BlockPos?, state: BlockState?) :
}

override fun destroy() {
blockData?.allPresevedBlockPositions?.forEach {
blockData?.actualState?.forEach {
world?.removeBlock(it, false)
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,16 @@
package net.remmintan.mods.minefortress.core.interfaces.server;

import net.minecraft.server.network.ServerPlayerEntity;
import net.remmintan.mods.minefortress.core.utils.CoreModUtils;

public interface IServerManager {

default IServerManagersProvider getManagersProvider(ServerPlayerEntity player) {
return CoreModUtils.getManagersProvider(player);
}

default IServerFortressManager getFortressManager(ServerPlayerEntity player) {
return CoreModUtils.getFortressManager(player);
}

}
Original file line number Diff line number Diff line change
@@ -1,16 +1,15 @@
package net.remmintan.mods.minefortress.core.interfaces.tasks;

import net.minecraft.server.network.ServerPlayerEntity;
import net.remmintan.mods.minefortress.core.interfaces.server.IServerFortressManager;
import net.remmintan.mods.minefortress.core.interfaces.server.IServerManager;
import net.remmintan.mods.minefortress.core.interfaces.server.IServerManagersProvider;

import java.util.List;
import java.util.UUID;

public interface IServerTaskManager extends IServerManager {
boolean addTask(ITask task, IServerManagersProvider provider, IServerFortressManager manager, List<Integer> selectedPawns, ServerPlayerEntity player);
void addTask(ITask task, List<Integer> selectedPawnIds, ServerPlayerEntity player);

void executeInstantTask(IInstantTask task, ServerPlayerEntity player, IServerManagersProvider provider);
void cancelTask(UUID id, IServerManagersProvider provider, IServerFortressManager manager);
void executeInstantTask(IInstantTask task, ServerPlayerEntity player);

void cancelTask(UUID id, ServerPlayerEntity player);
}
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ class WorkforceTab(private val handler: IWorkforceTabHandler, private val textRe
val (translatedMouseX, translatedMouseY) = context.matrices.translateMousePosition(mouseX, mouseY)
drawables.forEach { it.render(context, translatedMouseX, translatedMouseY, 0f) }

context.drawText(this.textRenderer, "Enhance Skills", 7, 100, BuildingScreen.PRIMARY_COLOR, false)
context.drawText(this.textRenderer, "Enhance Skills", 7, 105, BuildingScreen.PRIMARY_COLOR, false)
}

fun onMouseClicked(mouseX: Double, mouseY: Double, button: Int): Boolean {
Expand All @@ -76,9 +76,9 @@ class WorkforceTab(private val handler: IWorkforceTabHandler, private val textRe
val profId = professions[i]
val legacy = handler.getCost(profId).isEmpty()
if (legacy)
addNewLegacyHireRow(profId, rowY + i * 30, leftX, rightX)
addNewLegacyHireRow(profId, rowY + i * 24, leftX, rightX)
else
addNewHireProgressRow(profId, rowY + i * 30, leftX, rightX)
addNewHireProgressRow(profId, rowY + i * 24, leftX, rightX)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,16 +68,16 @@ public List<BlueprintMetadata> getAllBlueprints(BlueprintGroup group) {

@Override
public void buildCurrentStructure() {
if(selectedStructure == null) {
if (selectedStructure == null) {
ModLogger.LOGGER.error("No structure selected in client blueprint manager");
return;
}
if(super.getStructureRenderPos().isEmpty()) {
if (super.getStructureRenderPos().isEmpty()) {
ModLogger.LOGGER.error("No position selected in client blueprint manager");
return;
}

if(!super.canBuild()) return;
if (!super.canBuild()) return;

final var selectionManager = CoreModUtils.getManagersProvider().get_PawnsSelectionManager();
final var serverboundBlueprintTaskPacket = getServerboundBlueprintTaskPacket(selectionManager);
Expand All @@ -92,12 +92,13 @@ public void buildCurrentStructure() {
private ServerboundBlueprintTaskPacket getServerboundBlueprintTaskPacket(IClientPawnsSelectionManager manager) {
final var selectedPawnsIds = manager.getSelectedPawnsIds();
return new ServerboundBlueprintTaskPacket(
selectedStructure.getId(),
getStructureBuildPos(),
selectedStructure.getId(),
getStructureBuildPos(),
selectedRotation.getRotation(),
getSelectedStructure().getFloorLevel(),
selectedPawnsIds
);
getSelectedStructure().getFloorLevel(),
selectedPawnsIds,
this.upgradingBuildingPos
);
}

@Override
Expand Down Expand Up @@ -164,17 +165,18 @@ public void reset() {
this.clearStructure();
this.blueprintMetadataManager.reset();
this.blockDataManager.reset();
if(client instanceof IFortressMinecraftClient fortressClient) {
if (client instanceof IFortressMinecraftClient fortressClient) {
try {
fortressClient.get_BlueprintRenderer().getBlueprintsModelBuilder().reset();
}catch (Exception ignore) {}
} catch (Exception ignore) {
}
}
}

@Override
public void updateSlotsInBlueprintsScreen() {
final var currentScreen = MinecraftClient.getInstance().currentScreen;
if(currentScreen instanceof BlueprintsScreen bps) {
if (currentScreen instanceof BlueprintsScreen bps) {
bps.updateSlots();
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -595,10 +595,7 @@ public void repairBuilding(ServerPlayerEntity player, BlockPos pos, List<Integer
}

final var task = new RepairBuildingTask(taskId, building.getStart(), building.getEnd(), blocksToRepair);
final var wasAssigned = getTaskManager().addTask(task, this, this, selectedPawns, player);
if (!wasAssigned) {
resourceManager.returnReservedItems(taskId);
}
getTaskManager().addTask(task, selectedPawns, player);
} catch (RuntimeException exp) {
LogManager.getLogger().error("Error while repairing building", exp);
FortressServerNetworkHelper.send(player, FortressChannelNames.FINISH_TASK, new ClientboundTaskExecutedPacket(taskId));
Expand Down
83 changes: 29 additions & 54 deletions src/main/java/org/minefortress/tasks/ServerTaskManager.java
Original file line number Diff line number Diff line change
@@ -1,16 +1,11 @@
package org.minefortress.tasks;


import com.mojang.datafixers.util.Pair;
import net.minecraft.entity.Entity;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.text.Text;
import net.remmintan.mods.minefortress.core.TaskType;
import net.remmintan.mods.minefortress.core.dtos.ItemInfo;
import net.remmintan.mods.minefortress.core.interfaces.entities.pawns.IWorkerPawn;
import net.remmintan.mods.minefortress.core.interfaces.server.IServerFortressManager;
import net.remmintan.mods.minefortress.core.interfaces.server.IServerManagersProvider;
import net.remmintan.mods.minefortress.core.interfaces.server.ITickableManager;
import net.remmintan.mods.minefortress.core.interfaces.server.IWritableManager;
import net.remmintan.mods.minefortress.core.interfaces.tasks.IInstantTask;
Expand All @@ -19,58 +14,48 @@
import net.remmintan.mods.minefortress.core.utils.CoreModUtils;
import net.remmintan.mods.minefortress.networking.helpers.FortressServerNetworkHelper;
import net.remmintan.mods.minefortress.networking.s2c.S2CAddClientTasksPacket;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.*;
import java.util.stream.StreamSupport;

public class ServerTaskManager implements IServerTaskManager, IWritableManager, ITickableManager {
private final Map<UUID, ITask> nonFinishedTasks = new HashMap<>();
private final Queue<ITask> notStartedTasks = new LinkedList<>();

@Override
public boolean addTask(ITask task, IServerManagersProvider provider, IServerFortressManager manager, List<Integer> selectedPawns, ServerPlayerEntity player) {
removeAllFinishedTasks();
task.prepareTask();
if(task.hasAvailableParts()) {
if(task instanceof SimpleSelectionTask simpleSelectionTask) {
if(manager.isSurvival() && task.getTaskType() == TaskType.BUILD) {
final var spliterator = simpleSelectionTask
.getBlocksForPart(Pair.of(simpleSelectionTask.getStartingBlock(), simpleSelectionTask.getEndingBlock()))
.spliterator();

final var blocksCount = (int)StreamSupport.stream(spliterator, false).count();
final var placingItem = simpleSelectionTask.getPlacingItem();

final var info = new ItemInfo(placingItem, blocksCount);

provider.getResourceManager().reserveItems(task.getId(), Collections.singletonList(info));
}
}
}

if (selectedPawns.isEmpty()) {
notStartedTasks.add(task);
return false;
}

private static @NotNull List<IWorkerPawn> filterWorkers(List<Integer> selectedPawnIds, ServerPlayerEntity player) {
final var serverWorld = player.getWorld();
final var selectedWorkers = selectedPawns
return selectedPawnIds
.stream()
.map(serverWorld::getEntityById)
.filter(IWorkerPawn.class::isInstance)
.map(IWorkerPawn.class::cast)
.filter(worker -> !worker.getTaskControl().isDoingEverydayTasks())
.toList();
}

final var assignmentResult = assignPawnsToTask(player, task, selectedWorkers);
@Override
public void addTask(ITask task, List<Integer> selectedPawnIds, ServerPlayerEntity player) {
removeAllFinishedTasks();

final var packet = new S2CAddClientTasksPacket(task.toTaskInformationDto());
FortressServerNetworkHelper.send(player, S2CAddClientTasksPacket.CHANNEL, packet);
nonFinishedTasks.put(task.getId(), task);

if(assignmentResult) {
final var packet = new S2CAddClientTasksPacket(task.toTaskInformationDto());
FortressServerNetworkHelper.send(player, S2CAddClientTasksPacket.CHANNEL, packet);
nonFinishedTasks.put(task.getId(), task);
if (selectedPawnIds.isEmpty()) {
notStartedTasks.add(task);
return;
}

return assignmentResult;
final var selectedWorkers = filterWorkers(selectedPawnIds, player);
if (selectedWorkers.isEmpty()) {
player.sendMessage(Text.of("No appropriate workers selected. Put the task in the queue"), false);
notStartedTasks.add(task);
return;
}

task.prepareTask();
setPawnsToTask(task, selectedWorkers);
}

@Override
Expand All @@ -81,22 +66,22 @@ public void tick(@Nullable ServerPlayerEntity player) {
if (freeWorkers.size() > 2) {
final var task = notStartedTasks.remove();
final var freeWorkersIds = freeWorkers.stream().map(it -> ((Entity) it).getId()).toList();
this.addTask(task, CoreModUtils.getManagersProvider(player), CoreModUtils.getFortressManager(player), freeWorkersIds, player);
this.addTask(task, freeWorkersIds, player);
}
}

@Override
public void executeInstantTask(IInstantTask task, ServerPlayerEntity player, IServerManagersProvider provider) {
task.execute(player.getServerWorld(), player, provider::getBuildingsManager);
public void executeInstantTask(IInstantTask task, ServerPlayerEntity player) {
task.execute(player.getServerWorld(), player, getManagersProvider(player)::getBuildingsManager);
}

@Override
public void cancelTask(UUID id, IServerManagersProvider provider, IServerFortressManager manager) {
public void cancelTask(UUID id, ServerPlayerEntity player) {
removeAllFinishedTasks();
final var removedTask = nonFinishedTasks.remove(id);
if(removedTask != null)
removedTask.cancel();
provider.getResourceManager().returnReservedItems(id);
getManagersProvider(player).getResourceManager().returnReservedItems(id);
}

private void removeAllFinishedTasks() {
Expand All @@ -107,16 +92,6 @@ private void removeAllFinishedTasks() {
finishedTasks.forEach(e -> nonFinishedTasks.remove(e.getKey()));
}

private boolean assignPawnsToTask(ServerPlayerEntity player, ITask task, List<IWorkerPawn> workers) {
workers = workers.stream().filter(worker -> !worker.getTaskControl().isDoingEverydayTasks()).toList();
if(workers.isEmpty()) {
player.sendMessage(Text.of("No appropriate workers selected"), false);
return false;
}
setPawnsToTask(task, workers);
return true;
}

private void setPawnsToTask(ITask task, List<IWorkerPawn> workers) {
for(IWorkerPawn worker : workers) {
if(!task.hasAvailableParts()) break;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,16 @@ public class ServerboundBlueprintTaskPacket implements FortressC2SPacket {
private final BlockPos startPos;
private final BlockRotation rotation;
private final int floorLevel;

private final List<Integer> selectedPawns;
private final BlockPos upgradedBuildingPos;

public ServerboundBlueprintTaskPacket(String blueprintId, BlockPos startPos, BlockRotation rotation, int floorLevel, List<Integer> selectedPawns) {
public ServerboundBlueprintTaskPacket(String blueprintId, BlockPos startPos, BlockRotation rotation, int floorLevel, List<Integer> selectedPawns, BlockPos upgradedBuildingPos) {
this.blueprintId = blueprintId;
this.startPos = startPos;
this.rotation = rotation;
this.floorLevel = floorLevel;
this.selectedPawns = selectedPawns;
this.upgradedBuildingPos = upgradedBuildingPos;
}

public ServerboundBlueprintTaskPacket(PacketByteBuf buf) {
Expand All @@ -43,7 +44,7 @@ public ServerboundBlueprintTaskPacket(PacketByteBuf buf) {
for (int i = 0; i < size; i++) {
selectedPawns.add(buf.readInt());
}

this.upgradedBuildingPos = buf.readNullable(PacketByteBuf::readBlockPos);
}

@Override
Expand All @@ -56,6 +57,7 @@ public void write(PacketByteBuf buf) {
for (Integer selectedPawn : selectedPawns) {
buf.writeInt(selectedPawn);
}
buf.writeNullable(upgradedBuildingPos, PacketByteBuf::writeBlockPos);
}

@Override
Expand All @@ -75,10 +77,14 @@ public void handle(MinecraftServer server, ServerPlayerEntity player) {
manager.setupCenter(center, player);
return Unit.INSTANCE;
});
provider.getTaskManager().executeInstantTask(task, player, provider);
provider.getTaskManager().executeInstantTask(task, player);
return;
}

if (upgradedBuildingPos != null) {
provider.getBuildingsManager().destroyBuilding(upgradedBuildingPos);
}

Runnable executeBuildTask = () -> {
final var taskId = UUID.randomUUID();
final var task = blueprintManager.createTask(taskId, blueprintId, startPos, rotation, floorLevel);
Expand All @@ -94,15 +100,12 @@ public void handle(MinecraftServer server, ServerPlayerEntity player) {
return;
}
}
final var ableToAssign = provider.getTaskManager().addTask(task, provider, manager, selectedPawns, player);
if (!ableToAssign) {
serverResourceManager.returnReservedItems(taskId);
}
provider.getTaskManager().addTask(task, selectedPawns, player);
};
if (floorLevel > 0) {
final var digTask = blueprintManager.createDigTask(UUID.randomUUID(), startPos, floorLevel, blueprintId, rotation);
digTask.addFinishListener(executeBuildTask);
provider.getTaskManager().addTask(digTask, provider, manager, selectedPawns, player);
provider.getTaskManager().addTask(digTask, selectedPawns, player);
} else {
executeBuildTask.run();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@ public void handle(MinecraftServer server, ServerPlayerEntity player) {
final var id = this.getTaskId();
final var provider = getManagersProvider(player);
final var taskManager = provider.getTaskManager();
final var manager = getFortressManager(player);
taskManager.cancelTask(id, provider, manager);
taskManager.cancelTask(id, player);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,6 @@ public void handle(MinecraftServer server, ServerPlayerEntity player) {
final var taskManager = provider.getTaskManager();
final var tasksCreator = provider.getTasksCreator();
final var cutTreesTask = tasksCreator.createCutTreesTask(uuid, treeRoots, selection);
final var manager = getFortressManager(player);
taskManager.addTask(cutTreesTask, provider, manager, selectedPawns, player);
taskManager.addTask(cutTreesTask, selectedPawns, player);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -66,12 +66,8 @@ public void handle(MinecraftServer server, ServerPlayerEntity player) {
final var digTask = tasksCreator.createRoadsTask(digUuid, blocks, null);
digTask.addFinishListener(() -> {
final var buildTask = tasksCreator.createRoadsTask(placeUuid, blocks, item);
final var buildWasAssigned = taskManager.addTask(buildTask, provider, manager, selectedPawns, player);
if (!buildWasAssigned)
resourceManager.returnReservedItems(placeUuid);
taskManager.addTask(buildTask, selectedPawns, player);
});
final var digWasAssigned = taskManager.addTask(digTask, provider, manager, selectedPawns, player);
if (!digWasAssigned)
resourceManager.returnReservedItems(placeUuid);
taskManager.addTask(digTask, selectedPawns, player);
}
}
Loading

0 comments on commit 6a3fdca

Please sign in to comment.