From b719856762afa5e155f2e02cc64b0903ab9efcc6 Mon Sep 17 00:00:00 2001 From: Kam Date: Wed, 4 Feb 2026 14:45:47 -0500 Subject: [PATCH] Balance Prediction Client Side Trader --- .../npcs/client/gui/player/GuiNPCTrader.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/main/java/noppes/npcs/client/gui/player/GuiNPCTrader.java b/src/main/java/noppes/npcs/client/gui/player/GuiNPCTrader.java index b0a1c6c32..55f88ac8c 100644 --- a/src/main/java/noppes/npcs/client/gui/player/GuiNPCTrader.java +++ b/src/main/java/noppes/npcs/client/gui/player/GuiNPCTrader.java @@ -3,6 +3,7 @@ package noppes.npcs.client.gui.player; import kamkeel.npcs.network.PacketClient; import kamkeel.npcs.network.packets.player.GetTraderData; import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.ResourceLocation; @@ -332,6 +333,22 @@ public class GuiNPCTrader extends GuiContainerNPCInterface implements IGuiData { return sb.toString(); } + @Override + protected void handleMouseClick(Slot slot, int slotId, int mouseButton, int modifier) { + // Client-side balance prediction: immediately subtract currency cost on click + // so the displayed balance updates instantly without waiting for server response. + if (slotId >= 0 && slotId < 18 && mouseButton == 0) { + long cost = currencyCost[slotId]; + if (cost > 0 && playerBalance >= cost) { + ItemStack sold = role.inventorySold.items.get(slotId); + if (sold != null && container.canBuy(slotId, player)) { + playerBalance -= cost; + } + } + } + super.handleMouseClick(slot, slotId, mouseButton, modifier); + } + @Override public void save() { }