From 01e4c119f78bd3f0db99a748b5ce34499014e6e7 Mon Sep 17 00:00:00 2001 From: remmintan Date: Wed, 25 Dec 2024 12:39:38 +0100 Subject: [PATCH] WIP Fixing bugs in the workforce tab --- .../client/IClientFortressManager.java | 8 -- .../professions/IClientProfessionManager.java | 2 - .../IServerProfessionsManager.java | 3 - .../gui/building/BuildingScreen.kt | 2 - .../minefortress/gui/building/WorkforceTab.kt | 35 +++-- .../fortress/ClientFortressManager.java | 13 -- .../professions/ClientProfessionManager.java | 18 +-- .../professions/ServerProfessionManager.java | 58 ++------ .../professions/hire/ClientHireHandler.java | 84 ------------ .../professions/hire/IHireScreenHandler.java | 46 ------- .../renderer/gui/hire/HirePawnScreen.java | 124 ------------------ .../c2s/C2SCloseHireMenuPacket.java | 25 ---- .../c2s/C2SHirePawnWithScreenPacket.java | 34 ----- ...erverboundChangeProfessionStatePacket.java | 20 ++- .../registries/ClientNetworkReceivers.java | 2 - .../registries/ServerNetworkReceivers.java | 2 - .../networking/s2c/S2COpenHireMenuPacket.java | 56 -------- .../networking/s2c/SyncHireProgress.java | 53 -------- 18 files changed, 48 insertions(+), 537 deletions(-) delete mode 100644 src/main/java/org/minefortress/professions/hire/ClientHireHandler.java delete mode 100644 src/main/java/org/minefortress/professions/hire/IHireScreenHandler.java delete mode 100644 src/main/java/org/minefortress/renderer/gui/hire/HirePawnScreen.java delete mode 100644 src/networking/java/net/remmintan/mods/minefortress/networking/c2s/C2SCloseHireMenuPacket.java delete mode 100644 src/networking/java/net/remmintan/mods/minefortress/networking/c2s/C2SHirePawnWithScreenPacket.java delete mode 100644 src/networking/java/net/remmintan/mods/minefortress/networking/s2c/S2COpenHireMenuPacket.java delete mode 100644 src/networking/java/net/remmintan/mods/minefortress/networking/s2c/SyncHireProgress.java diff --git a/src/core/java/net/remmintan/mods/minefortress/core/interfaces/client/IClientFortressManager.java b/src/core/java/net/remmintan/mods/minefortress/core/interfaces/client/IClientFortressManager.java index d60c43b4..e34c78f0 100644 --- a/src/core/java/net/remmintan/mods/minefortress/core/interfaces/client/IClientFortressManager.java +++ b/src/core/java/net/remmintan/mods/minefortress/core/interfaces/client/IClientFortressManager.java @@ -1,24 +1,16 @@ package net.remmintan.mods.minefortress.core.interfaces.client; -import net.minecraft.client.MinecraftClient; import net.minecraft.util.math.BlockPos; import net.remmintan.mods.minefortress.core.FortressGamemode; import net.remmintan.mods.minefortress.core.FortressState; import net.remmintan.mods.minefortress.core.interfaces.IFortressManager; import net.remmintan.mods.minefortress.core.interfaces.combat.IClientFightManager; import net.remmintan.mods.minefortress.core.interfaces.professions.IClientProfessionManager; -import net.remmintan.mods.minefortress.core.interfaces.professions.IHireInfo; import net.remmintan.mods.minefortress.core.interfaces.resources.IClientResourceManager; -import java.util.List; -import java.util.Map; - public interface IClientFortressManager extends IFortressManager { void jumpToCampfire(); - - void open_HireScreen(MinecraftClient client, String screenName, Map professions, List additionalInfo); - void sync( int colonistsCount, BlockPos fortressCenter, diff --git a/src/core/java/net/remmintan/mods/minefortress/core/interfaces/professions/IClientProfessionManager.java b/src/core/java/net/remmintan/mods/minefortress/core/interfaces/professions/IClientProfessionManager.java index e1f4a91a..c19084cf 100644 --- a/src/core/java/net/remmintan/mods/minefortress/core/interfaces/professions/IClientProfessionManager.java +++ b/src/core/java/net/remmintan/mods/minefortress/core/interfaces/professions/IClientProfessionManager.java @@ -4,12 +4,10 @@ import net.remmintan.mods.minefortress.core.dtos.professions.ProfessionFullInfo; import java.util.List; -import java.util.Map; public interface IClientProfessionManager extends IProfessionsManager { void initProfessions(List fullInfos, String treeJson); void updateProfessions(List info); - void syncCurrentScreenHandler(Map hireInfos, List additionalInfo); } diff --git a/src/core/java/net/remmintan/mods/minefortress/core/interfaces/professions/IServerProfessionsManager.java b/src/core/java/net/remmintan/mods/minefortress/core/interfaces/professions/IServerProfessionsManager.java index 50970c8d..59c780e5 100644 --- a/src/core/java/net/remmintan/mods/minefortress/core/interfaces/professions/IServerProfessionsManager.java +++ b/src/core/java/net/remmintan/mods/minefortress/core/interfaces/professions/IServerProfessionsManager.java @@ -9,9 +9,6 @@ public interface IServerProfessionsManager extends IProfessionsManager, IServerManager { Optional getProfessionsWithAvailablePlaces(boolean professionRequiresReservation); - void closeHireMenu(); - void sendHireRequestToCurrentHandler(String professionId); - void openHireMenu(ProfessionsHireTypes hireType, ServerPlayerEntity player); EntityType getEntityTypeForProfession(String professionId); void decreaseAmount(String professionId, boolean b); void scheduleSync(); diff --git a/src/gui/java/net/remmintan/mods/minefortress/gui/building/BuildingScreen.kt b/src/gui/java/net/remmintan/mods/minefortress/gui/building/BuildingScreen.kt index a1acf808..665cddd1 100644 --- a/src/gui/java/net/remmintan/mods/minefortress/gui/building/BuildingScreen.kt +++ b/src/gui/java/net/remmintan/mods/minefortress/gui/building/BuildingScreen.kt @@ -33,8 +33,6 @@ class BuildingScreen(handler: BuildingScreenHandler, playerInventory: PlayerInve override fun init() { super.init() resizeAllTabs() - - workforceTab.init() } override fun resize(client: MinecraftClient?, width: Int, height: Int) { diff --git a/src/gui/java/net/remmintan/mods/minefortress/gui/building/WorkforceTab.kt b/src/gui/java/net/remmintan/mods/minefortress/gui/building/WorkforceTab.kt index f44f8b5b..c5b7c3b6 100644 --- a/src/gui/java/net/remmintan/mods/minefortress/gui/building/WorkforceTab.kt +++ b/src/gui/java/net/remmintan/mods/minefortress/gui/building/WorkforceTab.kt @@ -8,6 +8,7 @@ import net.minecraft.text.Text import net.remmintan.mods.minefortress.core.utils.CoreModUtils import net.remmintan.mods.minefortress.gui.building.handlers.IWorkforceTabHandler import net.remmintan.mods.minefortress.gui.widget.* +import kotlin.properties.Delegates class WorkforceTab(private val handler: IWorkforceTabHandler, private val textRenderer: TextRenderer) : ResizableTab { @@ -19,21 +20,13 @@ class WorkforceTab(private val handler: IWorkforceTabHandler, private val textRe private val hireButtons = mutableListOf() private val drawables = mutableListOf() - fun init() { - drawables.clear() - hireButtons.clear() - - val professions = handler.getProfessions() - val rowY = y + 40 - val leftX = x + 10 - val rightX = x + backgroundWidth - 10 - - for (i in professions.indices) { - addNewRow(professions[i], rowY + i * 30, leftX, rightX) - } - } + private var initialized: Boolean by Delegates.vetoable(false) { _, _, new -> new } fun tick() { + if (!initialized) { + init() + initialized = true + } for ((button, costs, profId) in hireButtons) { val enoughPlaceForNew = (handler.getCurrentCount(profId) + handler.getHireQueue(profId)) < handler.getMaxCount(profId) @@ -49,6 +42,22 @@ class WorkforceTab(private val handler: IWorkforceTabHandler, private val textRe return hireButtons.any { it.button.mouseClicked(mouseX, mouseY, button) } } + private fun init() { + drawables.clear() + hireButtons.clear() + + val professions = handler.getProfessions() + val rowY = y + 40 + val leftX = x + 10 + val rightX = x + backgroundWidth - 10 + + for (i in professions.indices) { + addNewRow(professions[i], rowY + i * 30, leftX, rightX) + } + + + } + private fun addNewRow(profId: String, rowY: Int, leftX: Int, rightX: Int) { this.addDrawable( ProgressArrowWidget( diff --git a/src/main/java/org/minefortress/fortress/ClientFortressManager.java b/src/main/java/org/minefortress/fortress/ClientFortressManager.java index 60b7f4f8..6771d785 100644 --- a/src/main/java/org/minefortress/fortress/ClientFortressManager.java +++ b/src/main/java/org/minefortress/fortress/ClientFortressManager.java @@ -10,7 +10,6 @@ import net.remmintan.mods.minefortress.core.interfaces.client.IHoveredBlockProvider; import net.remmintan.mods.minefortress.core.interfaces.combat.IClientFightManager; import net.remmintan.mods.minefortress.core.interfaces.professions.IClientProfessionManager; -import net.remmintan.mods.minefortress.core.interfaces.professions.IHireInfo; import net.remmintan.mods.minefortress.core.interfaces.resources.IClientResourceManager; import net.remmintan.mods.minefortress.core.utils.CoreModUtils; import net.remmintan.mods.minefortress.networking.c2s.C2SJumpToCampfire; @@ -20,11 +19,6 @@ import org.minefortress.fight.ClientFightManager; import org.minefortress.fortress.resources.client.ClientResourceManagerImpl; import org.minefortress.professions.ClientProfessionManager; -import org.minefortress.professions.hire.ClientHireHandler; -import org.minefortress.renderer.gui.hire.HirePawnScreen; - -import java.util.List; -import java.util.Map; public final class ClientFortressManager implements IClientFortressManager { @@ -104,13 +98,6 @@ private void resetBuildEditState() { } } - @Override - public void open_HireScreen(MinecraftClient client, String screenName, Map professions, List additionalInfo) { - final var handler = new ClientHireHandler(screenName, professions, additionalInfo); - final var screen = new HirePawnScreen(handler); - client.setScreen(screen); - } - @Override public boolean isConnectedToTheServer() { return initialized && connectedToTheServer; diff --git a/src/main/java/org/minefortress/professions/ClientProfessionManager.java b/src/main/java/org/minefortress/professions/ClientProfessionManager.java index 35c10f4c..7486db05 100644 --- a/src/main/java/org/minefortress/professions/ClientProfessionManager.java +++ b/src/main/java/org/minefortress/professions/ClientProfessionManager.java @@ -5,14 +5,15 @@ import net.remmintan.mods.minefortress.core.dtos.professions.IProfessionEssentialInfo; import net.remmintan.mods.minefortress.core.dtos.professions.ProfessionFullInfo; import net.remmintan.mods.minefortress.core.interfaces.IFortressManager; -import net.remmintan.mods.minefortress.core.interfaces.professions.*; +import net.remmintan.mods.minefortress.core.interfaces.professions.CountProfessionals; +import net.remmintan.mods.minefortress.core.interfaces.professions.IClientProfessionManager; +import net.remmintan.mods.minefortress.core.interfaces.professions.IProfession; +import net.remmintan.mods.minefortress.core.interfaces.professions.ProfessionResearchState; import net.remmintan.mods.minefortress.networking.c2s.ServerboundChangeProfessionStatePacket; import net.remmintan.mods.minefortress.networking.helpers.FortressChannelNames; import net.remmintan.mods.minefortress.networking.helpers.FortressClientNetworkHelper; -import org.minefortress.renderer.gui.hire.HirePawnScreen; import java.util.List; -import java.util.Map; import java.util.Optional; import java.util.function.Supplier; import java.util.stream.Collectors; @@ -85,15 +86,4 @@ public void updateProfessions(List info) { } } - @Override - public void syncCurrentScreenHandler(Map hireInfos, List additionalProfessionsInfo) { - final var currentScreen = MinecraftClient.getInstance().currentScreen; - if (currentScreen instanceof HirePawnScreen screen) { - final var handler = screen.getHandler(); - if(handler != null) { - handler.sync(hireInfos, additionalProfessionsInfo); - } - } - } - } diff --git a/src/main/java/org/minefortress/professions/ServerProfessionManager.java b/src/main/java/org/minefortress/professions/ServerProfessionManager.java index a76f2bfb..5d8551d9 100644 --- a/src/main/java/org/minefortress/professions/ServerProfessionManager.java +++ b/src/main/java/org/minefortress/professions/ServerProfessionManager.java @@ -10,8 +10,10 @@ import net.remmintan.mods.minefortress.core.dtos.professions.ProfessionFullInfo; import net.remmintan.mods.minefortress.core.interfaces.IFortressManager; import net.remmintan.mods.minefortress.core.interfaces.entities.pawns.IProfessional; -import net.remmintan.mods.minefortress.core.interfaces.professions.*; -import net.remmintan.mods.minefortress.core.interfaces.server.IServerFortressManager; +import net.remmintan.mods.minefortress.core.interfaces.professions.CountProfessionals; +import net.remmintan.mods.minefortress.core.interfaces.professions.IProfession; +import net.remmintan.mods.minefortress.core.interfaces.professions.IServerProfessionsManager; +import net.remmintan.mods.minefortress.core.interfaces.professions.ProfessionResearchState; 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; @@ -19,16 +21,15 @@ import net.remmintan.mods.minefortress.networking.helpers.FortressServerNetworkHelper; import net.remmintan.mods.minefortress.networking.s2c.ClientboundProfessionSyncPacket; import net.remmintan.mods.minefortress.networking.s2c.ClientboundProfessionsInitPacket; -import net.remmintan.mods.minefortress.networking.s2c.S2COpenHireMenuPacket; -import net.remmintan.mods.minefortress.networking.s2c.SyncHireProgress; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.minefortress.entity.Colonist; import org.minefortress.fortress.ServerFortressManager; -import org.minefortress.professions.hire.ServerHireHandler; import org.slf4j.LoggerFactory; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; import java.util.function.Supplier; import java.util.stream.Collectors; @@ -42,8 +43,6 @@ public final class ServerProfessionManager extends ProfessionManager implements private String professionsTree; private boolean needsUpdate = false; - private final Map hireHandlers = new HashMap<>(); - private ServerHireHandler currentHireHandler; private final Supplier serverManagersProviderSupplier; @@ -53,41 +52,6 @@ public ServerProfessionManager(Supplier fortressManagerSupplie this.serverManagersProviderSupplier = serverManagersProviderSupplier; } - public void openHireMenu(ProfessionsHireTypes hireType, ServerPlayerEntity player) { - currentHireHandler = hireHandlers.computeIfAbsent(hireType, k -> new ServerHireHandler(k.getIds(), this)); - final var professions = currentHireHandler.getProfessions(); - final var additionalInfo = currentHireHandler.getUnlockedProfessions(); - final var screenName = hireType.getScreenName(); - final var packet = new S2COpenHireMenuPacket(screenName, professions, additionalInfo); - FortressServerNetworkHelper.send(player, S2COpenHireMenuPacket.CHANNEL, packet); - } - - @Override - public void closeHireMenu() { - currentHireHandler = null; - } - - @Override - public void sendHireRequestToCurrentHandler(String professionId) { - if(currentHireHandler != null) { - final var profession = getProfession(professionId); - if(!profession.isHireMenu()) { - throw new IllegalArgumentException("Profession " + professionId + " is not a hire menu profession"); - } - final var canHire = isRequirementsFulfilled(profession, CountProfessionals.INCREASE, true); - final var abstractFortressManager = (IServerFortressManager)fortressManagerSupplier.get(); - if(canHire == ProfessionResearchState.UNLOCKED && getFreeColonists() > 0 && abstractFortressManager instanceof ServerFortressManager fsm) { - final var resourceManager = serverManagersProviderSupplier.get().getResourceManager(); - resourceManager.removeItems(profession.getItemsRequirement()); - fsm.getPawnWithoutAProfession().ifPresent(Colonist::reserveColonist); - fsm.scheduleSync(); - currentHireHandler.hire(professionId); - } - } else { - throw new IllegalStateException("No current hire handler"); - } - } - @Override public void increaseAmount(String professionId, boolean itemsAlreadyCharged) { final IProfession profession = super.getProfession(professionId); @@ -130,12 +94,6 @@ public void decreaseAmount(String professionId, boolean force) { public void tick(@Nullable ServerPlayerEntity player) { if(player == null) return; - hireHandlers.forEach((k, v) -> v.tick()); - if(currentHireHandler != null) { - final var packet = new SyncHireProgress(currentHireHandler.getProfessions(), currentHireHandler.getUnlockedProfessions()); - FortressServerNetworkHelper.send(player, SyncHireProgress.CHANNEL, packet); - } - tickRemoveFromProfession(); if(needsUpdate) { diff --git a/src/main/java/org/minefortress/professions/hire/ClientHireHandler.java b/src/main/java/org/minefortress/professions/hire/ClientHireHandler.java deleted file mode 100644 index 2ed750b1..00000000 --- a/src/main/java/org/minefortress/professions/hire/ClientHireHandler.java +++ /dev/null @@ -1,84 +0,0 @@ -package org.minefortress.professions.hire; - -import net.remmintan.mods.minefortress.core.dtos.ItemInfo; -import net.remmintan.mods.minefortress.core.interfaces.professions.IHireCost; -import net.remmintan.mods.minefortress.core.interfaces.professions.IHireInfo; -import net.remmintan.mods.minefortress.core.utils.CoreModUtils; -import net.remmintan.mods.minefortress.networking.c2s.C2SHirePawnWithScreenPacket; -import net.remmintan.mods.minefortress.networking.helpers.FortressClientNetworkHelper; - -import java.util.List; -import java.util.Map; - -public final class ClientHireHandler implements IHireScreenHandler { - - private final String screenName; - private Map professions; - private List additionalInfo; - - public ClientHireHandler(String screenName, Map professions, List additionalInfo) { - this.screenName = screenName; - this.professions = professions; - this.additionalInfo = additionalInfo; - } - - @Override - public String getScreenName() { - return screenName; - } - - @Override - public List getProfessions() { - return additionalInfo; - } - - @Override - public int getHireProgress(String professionId) { - return professions.get(professionId).hireProgress(); - } - - @Override - public int getHireQueue(String professionId) { - return professions.get(professionId).hireQueue(); - } - - @Override - public List getCost(String professionId) { - return professions.get(professionId).cost().stream().map(IHireCost::toItemInfo).toList(); - } - - @Override - public int getCurrentCount(String professionId) { - return CoreModUtils - .getFortressClientManager() - .getProfessionManager() - .getProfession(professionId) - .getAmount(); - } - - public int getMaxCount(String professionId) { - final var profession = CoreModUtils - .getFortressClientManager() - .getProfessionManager() - .getProfession(professionId); - final var requirementType = profession.getRequirementType(); - final var requirementLevel = profession.getRequirementLevel(); - return CoreModUtils.getBuildingsManager().countBuildings(requirementType, requirementLevel) * 10; - } - - @Override - public void increaseAmount(String professionId) { - final var packet = new C2SHirePawnWithScreenPacket(professionId); - FortressClientNetworkHelper.send(C2SHirePawnWithScreenPacket.CHANNEL, packet); - } - - @Override - public void sync(Map professions, List additionalInfo) { - if(professions == null) { - throw new IllegalArgumentException("Professions cannot be null"); - } - this.professions = professions; - this.additionalInfo = additionalInfo; - } - -} diff --git a/src/main/java/org/minefortress/professions/hire/IHireScreenHandler.java b/src/main/java/org/minefortress/professions/hire/IHireScreenHandler.java deleted file mode 100644 index 509f06b9..00000000 --- a/src/main/java/org/minefortress/professions/hire/IHireScreenHandler.java +++ /dev/null @@ -1,46 +0,0 @@ -package org.minefortress.professions.hire; - -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.remmintan.mods.minefortress.core.dtos.ItemInfo; -import net.remmintan.mods.minefortress.core.interfaces.professions.IHireInfo; -import net.remmintan.mods.minefortress.core.interfaces.professions.IProfession; -import net.remmintan.mods.minefortress.core.utils.CoreModUtils; -import org.jetbrains.annotations.NotNull; - -import java.util.List; -import java.util.Map; -import java.util.Optional; - -public interface IHireScreenHandler { - - String getScreenName(); - - List getProfessions(); - int getHireProgress(String professionId); - int getHireQueue(String professionId); - - List getCost(String professionId); - static ItemStack getProfessionItem(String professionId) { - return getProfession(professionId).map(IProfession::getIcon).orElse(Items.PLAYER_HEAD.getDefaultStack()); - } - int getCurrentCount(String professionId); - int getMaxCount(String professionId); - void increaseAmount(String professionId); - static String getProfessionName(String professionId) { - return getProfession(professionId) - .map(IProfession::getTitle) - .orElse("Unknown"); - } - - @NotNull - private static Optional getProfession(String professionId) { - final var manager = CoreModUtils.getProfessionManager(); - final var profession = manager.getProfession(professionId); - return Optional.ofNullable(profession); - } - - void sync(Map professions, List additionalProfessionsInfo); - - -} diff --git a/src/main/java/org/minefortress/renderer/gui/hire/HirePawnScreen.java b/src/main/java/org/minefortress/renderer/gui/hire/HirePawnScreen.java deleted file mode 100644 index 908b7706..00000000 --- a/src/main/java/org/minefortress/renderer/gui/hire/HirePawnScreen.java +++ /dev/null @@ -1,124 +0,0 @@ -package org.minefortress.renderer.gui.hire; - -import net.minecraft.client.gui.widget.ButtonWidget; -import net.minecraft.text.Text; -import net.remmintan.mods.minefortress.core.utils.CoreModUtils; -import net.remmintan.mods.minefortress.gui.widget.*; -import net.remmintan.mods.minefortress.networking.c2s.C2SCloseHireMenuPacket; -import net.remmintan.mods.minefortress.networking.helpers.FortressClientNetworkHelper; -import org.jetbrains.annotations.NotNull; -import org.minefortress.professions.hire.IHireScreenHandler; -import org.minefortress.renderer.gui.WindowScreen; - -import java.util.ArrayList; -import java.util.List; - -public class HirePawnScreen extends WindowScreen { - - private final List hireButtons = new ArrayList<>(); - - private final IHireScreenHandler handler; - - public HirePawnScreen(@NotNull IHireScreenHandler handler) { - super(Text.literal(handler.getScreenName())); - this.handler = handler; - } - - @Override - protected void init() { - super.init(); - - final var professions = handler.getProfessions(); - hireButtons.clear(); - - final var startY = getScreenTopY() + 40; - addDrawable(new FreePawnsWidget(getScreenLeftX() + 10, startY - 15)); - var i = 0; - for(final String profId : professions) { - final var rowY = startY + i * 25; - addNewRow(profId, rowY, getScreenLeftX(), getScreenRightX()); - i++; - } - } - - @Override - public void tick() { - super.tick(); - for (HireButtonWithInfo btn : hireButtons) { - final var button = btn.button; - final var profId = btn.profId; - final var enoughPlaceForNew = (handler.getCurrentCount(profId) + handler.getHireQueue(profId)) < this.handler.getMaxCount(profId); - button.active = btn.costs.isEnough() && CoreModUtils.getProfessionManager().getFreeColonists() > 0 && enoughPlaceForNew; - } - } - - private void addNewRow(String profId, int rowY, int leftX, int rightX) { - this.addDrawable( - new ProgressArrowWidget( - rightX - 48, - rowY, - () -> this.handler.getHireProgress(profId) - ) - ); - final var professionName = new ProfessionNameWidget( - IHireScreenHandler.getProfessionName(profId), - leftX + 10, - rowY + textRenderer.fontHeight / 2 + 3 - ); - this.addDrawable(professionName); - final var costs = new CostsWidget( - leftX + professionName.getOffset() + 15, - rowY, - this.handler.getCost(profId) - ); - this.addDrawable(costs); - final var hireButton = ButtonWidget.builder( - Text.literal("+"), - (btn) -> { - if(canIncreaseAmount(costs, profId)) { - this.handler.increaseAmount(profId); - } - } - ) - .dimensions(rightX - 100, rowY, 20, 20) - .build(); - - this.addDrawableChild(hireButton); - hireButtons.add(new HireButtonWithInfo(hireButton, costs, profId)); - this.addDrawable( - new ProfessionQueueWidget( - rightX - 80, - rowY, - () -> handler.getHireQueue(profId) - ) - ); - - this.addDrawable( - new ProfessionAmountWidget( - rightX - 35, - rowY, - IHireScreenHandler.getProfessionItem(profId), - () -> this.handler.getCurrentCount(profId), - () -> this.handler.getMaxCount(profId) - ) - ); - } - - private boolean canIncreaseAmount(CostsWidget costs, String profId) { - final var enoughPlaceForNew = (handler.getCurrentCount(profId) + handler.getHireQueue(profId)) < this.handler.getMaxCount(profId); - return costs.isEnough() && CoreModUtils.getProfessionManager().getFreeColonists() > 0 && enoughPlaceForNew; - } - - public IHireScreenHandler getHandler() { - return handler; - } - - @Override - public void close() { - super.close(); - final var packet = new C2SCloseHireMenuPacket(); - FortressClientNetworkHelper.send(C2SCloseHireMenuPacket.CHANNEL, packet); - } - - private record HireButtonWithInfo(ButtonWidget button, CostsWidget costs, String profId) {} -} diff --git a/src/networking/java/net/remmintan/mods/minefortress/networking/c2s/C2SCloseHireMenuPacket.java b/src/networking/java/net/remmintan/mods/minefortress/networking/c2s/C2SCloseHireMenuPacket.java deleted file mode 100644 index dcfcd655..00000000 --- a/src/networking/java/net/remmintan/mods/minefortress/networking/c2s/C2SCloseHireMenuPacket.java +++ /dev/null @@ -1,25 +0,0 @@ -package net.remmintan.mods.minefortress.networking.c2s; - -import net.minecraft.network.PacketByteBuf; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.network.ServerPlayerEntity; -import net.remmintan.mods.minefortress.core.interfaces.networking.FortressC2SPacket; - -public class C2SCloseHireMenuPacket implements FortressC2SPacket { - - public static final String CHANNEL = "close_hire_menu"; - - public C2SCloseHireMenuPacket() { - } - - public C2SCloseHireMenuPacket(PacketByteBuf ignoredBuffer) { - } - - public void write(PacketByteBuf buf) { - } - - @Override - public void handle(MinecraftServer server, ServerPlayerEntity player) { - getManagersProvider(server, player).getProfessionsManager().closeHireMenu(); - } -} diff --git a/src/networking/java/net/remmintan/mods/minefortress/networking/c2s/C2SHirePawnWithScreenPacket.java b/src/networking/java/net/remmintan/mods/minefortress/networking/c2s/C2SHirePawnWithScreenPacket.java deleted file mode 100644 index e18a5a18..00000000 --- a/src/networking/java/net/remmintan/mods/minefortress/networking/c2s/C2SHirePawnWithScreenPacket.java +++ /dev/null @@ -1,34 +0,0 @@ -package net.remmintan.mods.minefortress.networking.c2s; - -import net.minecraft.network.PacketByteBuf; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.network.ServerPlayerEntity; -import net.remmintan.mods.minefortress.core.interfaces.networking.FortressC2SPacket; - -public class C2SHirePawnWithScreenPacket implements FortressC2SPacket { - - public static final String CHANNEL = "hire_pawn_with_screen"; - - private final String professionId; - - public C2SHirePawnWithScreenPacket(String professionId) { - this.professionId = professionId; - } - - public C2SHirePawnWithScreenPacket(PacketByteBuf buffer) { - this.professionId = buffer.readString(); - } - - @Override - public void write(PacketByteBuf buf) { - buf.writeString(professionId); - } - - @Override - public void handle(MinecraftServer server, ServerPlayerEntity player) { - getManagersProvider(server, player) - .getProfessionsManager() - .sendHireRequestToCurrentHandler(professionId); - } - -} diff --git a/src/networking/java/net/remmintan/mods/minefortress/networking/c2s/ServerboundChangeProfessionStatePacket.java b/src/networking/java/net/remmintan/mods/minefortress/networking/c2s/ServerboundChangeProfessionStatePacket.java index 85fb0ff1..5e222978 100644 --- a/src/networking/java/net/remmintan/mods/minefortress/networking/c2s/ServerboundChangeProfessionStatePacket.java +++ b/src/networking/java/net/remmintan/mods/minefortress/networking/c2s/ServerboundChangeProfessionStatePacket.java @@ -1,10 +1,10 @@ package net.remmintan.mods.minefortress.networking.c2s; import net.minecraft.network.PacketByteBuf; +import net.minecraft.screen.NamedScreenHandlerFactory; import net.minecraft.server.MinecraftServer; import net.minecraft.server.network.ServerPlayerEntity; import net.remmintan.mods.minefortress.core.interfaces.networking.FortressC2SPacket; -import net.remmintan.mods.minefortress.core.interfaces.professions.ProfessionsHireTypes; public class ServerboundChangeProfessionStatePacket implements FortressC2SPacket { @@ -29,14 +29,22 @@ public void write(PacketByteBuf buf) { @Override public void handle(MinecraftServer server, ServerPlayerEntity player) { - final var manager = getManagersProvider(server, player).getProfessionsManager(); + final var provider = getManagersProvider(server, player); + final var manager = provider.getProfessionsManager(); if (amountChange == AmountChange.ADD) { final var profession = manager.getProfession(professionId); if(profession.isHireMenu()) { - final var professionsHireType = ProfessionsHireTypes - .getHireType(professionId) - .orElseThrow(() -> new RuntimeException("Hire type not found for profession: " + professionId)); - manager.openHireMenu(professionsHireType, player); + final var requirementType = profession.getRequirementType(); + final var requirementLevel = profession.getRequirementLevel(); + final var buildings = provider.getBuildingsManager().getBuildings(requirementType, requirementLevel); + if (!buildings.isEmpty()) { + final var building = buildings.get(0); + if (building instanceof NamedScreenHandlerFactory factory) { + player.openHandledScreen(factory); + //player.currentScreenHandler. + // TODO tell screen handler or building to open hire menu + } + } } else { manager.increaseAmount(professionId, false); } 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 dee0ea3e..baa085f9 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 @@ -22,8 +22,6 @@ public static void registerReceivers() { registerReceiver(FortressChannelNames.FORTRESS_RESOURCES_SYNC, ClientboundSyncItemsPacket::new); registerReceiver(FortressChannelNames.FORTRESS_PROFESSION_INIT, ClientboundProfessionsInitPacket::new); registerReceiver(FortressChannelNames.FORTRESS_BLUEPRINTS_PROCESS_IMPORT_EXPORT, ClientboundBlueprintsProcessImportExportPacket::new); - registerReceiver(S2COpenHireMenuPacket.CHANNEL, S2COpenHireMenuPacket::new); - registerReceiver(SyncHireProgress.CHANNEL, SyncHireProgress::new); registerReceiver(S2CSyncAreasPacket.CHANNEL, S2CSyncAreasPacket::new); registerReceiver(S2CSyncFightManager.CHANNEL, S2CSyncFightManager::new); registerReceiver(S2CAddClientTasksPacket.CHANNEL, S2CAddClientTasksPacket::new); diff --git a/src/networking/java/net/remmintan/mods/minefortress/networking/registries/ServerNetworkReceivers.java b/src/networking/java/net/remmintan/mods/minefortress/networking/registries/ServerNetworkReceivers.java index e6c36ad0..042c0140 100644 --- a/src/networking/java/net/remmintan/mods/minefortress/networking/registries/ServerNetworkReceivers.java +++ b/src/networking/java/net/remmintan/mods/minefortress/networking/registries/ServerNetworkReceivers.java @@ -28,8 +28,6 @@ public static void registerReceivers() { registerReceiver(FortressChannelNames.FORTRESS_BLUEPRINTS_IMPORT_EXPORT, ServerboundBlueprintsImportExportPacket::new); registerReceiver(C2SMoveTargetPacket.CHANNEL, C2SMoveTargetPacket::new); registerReceiver(C2SFollowTargetPacket.CHANNEL, C2SFollowTargetPacket::new); - registerReceiver(C2SCloseHireMenuPacket.CHANNEL, C2SCloseHireMenuPacket::new); - registerReceiver(C2SHirePawnWithScreenPacket.CHANNEL, C2SHirePawnWithScreenPacket::new); registerReceiver(C2SAddAreaPacket.CHANNEL, C2SAddAreaPacket::new); registerReceiver(C2SRemoveAutomationAreaPacket.CHANNEL, C2SRemoveAutomationAreaPacket::new); registerReceiver(C2SJumpToCampfire.CHANNEL, C2SJumpToCampfire::new); diff --git a/src/networking/java/net/remmintan/mods/minefortress/networking/s2c/S2COpenHireMenuPacket.java b/src/networking/java/net/remmintan/mods/minefortress/networking/s2c/S2COpenHireMenuPacket.java deleted file mode 100644 index 70ff3368..00000000 --- a/src/networking/java/net/remmintan/mods/minefortress/networking/s2c/S2COpenHireMenuPacket.java +++ /dev/null @@ -1,56 +0,0 @@ -package net.remmintan.mods.minefortress.networking.s2c; - -import io.netty.buffer.ByteBufInputStream; -import io.netty.buffer.ByteBufOutputStream; -import net.minecraft.client.MinecraftClient; -import net.minecraft.network.PacketByteBuf; -import net.remmintan.mods.minefortress.core.interfaces.networking.FortressS2CPacket; -import net.remmintan.mods.minefortress.core.interfaces.professions.IHireInfo; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.util.List; -import java.util.Map; - -public class S2COpenHireMenuPacket implements FortressS2CPacket { - - public static final String CHANNEL = "open_hire_menu"; - private final String screenName; - private final Map professions; - private final List additionalProfessionsInfo; - - public S2COpenHireMenuPacket(String screenName, Map professions, List additionalProfessionsInfo) { - this.screenName = screenName; - this.professions = professions; - this.additionalProfessionsInfo = additionalProfessionsInfo; - } - - @SuppressWarnings("unchecked") - public S2COpenHireMenuPacket(PacketByteBuf buf) { - this.screenName = buf.readString(); - try(var stream = new ObjectInputStream(new ByteBufInputStream(buf))) { - this.professions = (Map) stream.readObject(); - this.additionalProfessionsInfo = (List) stream.readObject(); - } catch (IOException | ClassNotFoundException e) { - throw new RuntimeException(e); - } - } - - @Override - public void write(PacketByteBuf buf) { - buf.writeString(screenName); - try(var stream = new ObjectOutputStream(new ByteBufOutputStream(buf))) { - stream.writeObject(professions); - stream.writeObject(additionalProfessionsInfo); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - @Override - public void handle(MinecraftClient client) { - final var manager = getManagersProvider().get_ClientFortressManager(); - manager.open_HireScreen(client, screenName, professions, additionalProfessionsInfo); - } -} diff --git a/src/networking/java/net/remmintan/mods/minefortress/networking/s2c/SyncHireProgress.java b/src/networking/java/net/remmintan/mods/minefortress/networking/s2c/SyncHireProgress.java deleted file mode 100644 index 4c1aa9f8..00000000 --- a/src/networking/java/net/remmintan/mods/minefortress/networking/s2c/SyncHireProgress.java +++ /dev/null @@ -1,53 +0,0 @@ -package net.remmintan.mods.minefortress.networking.s2c; - -import io.netty.buffer.ByteBufInputStream; -import io.netty.buffer.ByteBufOutputStream; -import net.minecraft.client.MinecraftClient; -import net.minecraft.network.PacketByteBuf; -import net.remmintan.mods.minefortress.core.interfaces.networking.FortressS2CPacket; -import net.remmintan.mods.minefortress.core.interfaces.professions.IHireInfo; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.util.List; -import java.util.Map; - -public class SyncHireProgress implements FortressS2CPacket { - - public static final String CHANNEL = "sync_hire_progress"; - - private Map professions; - private List additionalProfessionsInfo; - - @SuppressWarnings("unchecked") - public SyncHireProgress(PacketByteBuf buf) { - try (var ois = new ObjectInputStream(new ByteBufInputStream(buf))) { - this.professions = (Map) ois.readObject(); - this.additionalProfessionsInfo = (List) ois.readObject(); - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - } - } - - public SyncHireProgress(Map professions, List additionalProfessionsInfo) { - this.professions = professions; - this.additionalProfessionsInfo = additionalProfessionsInfo; - } - - @Override - public void write(PacketByteBuf buf) { - try(var stream = new ObjectOutputStream(new ByteBufOutputStream(buf))) { - stream.writeObject(this.professions); - stream.writeObject(this.additionalProfessionsInfo); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - @Override - public void handle(MinecraftClient client) { - final var professions = getManagersProvider().get_ClientFortressManager().getProfessionManager(); - professions.syncCurrentScreenHandler(this.professions, this.additionalProfessionsInfo); - } -}