From 454fd102d6aa8334ce76768ba35a63d8cccf47d4 Mon Sep 17 00:00:00 2001 From: Camotoy <20743703+Camotoy@users.noreply.github.com> Date: Wed, 13 Jan 2021 13:37:20 -0500 Subject: [PATCH] Add better destroy support --- .../inventory/InventoryTranslator.java | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/inventory/InventoryTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/inventory/InventoryTranslator.java index cb000a2b5..f029a6051 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/inventory/InventoryTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/inventory/InventoryTranslator.java @@ -465,7 +465,6 @@ public abstract class InventoryTranslator { } case DESTROY: { // Only called when a creative client wants to destroy an item... I think - Camotoy - //TODO there is a Count here we don't use DestroyStackRequestActionData destroyAction = (DestroyStackRequestActionData) action; if (!session.getGameMode().equals(GameMode.CREATIVE)) { // If this happens, let's throw an error and figure out why. @@ -474,13 +473,23 @@ public abstract class InventoryTranslator { if (!isCursor(destroyAction.getSource())) { // Item exists; let's remove it from the inventory int javaSlot = bedrockSlotToJava(destroyAction.getSource()); - ClientCreativeInventoryActionPacket destroyItemPacket = new ClientCreativeInventoryActionPacket( - javaSlot, - new ItemStack(0) - ); + GeyserItemStack existingItem = inventory.getItem(javaSlot); + existingItem.setAmount(existingItem.getAmount() - destroyAction.getCount()); + ClientCreativeInventoryActionPacket destroyItemPacket; + if (existingItem.isEmpty()) { + destroyItemPacket = new ClientCreativeInventoryActionPacket( + javaSlot, + new ItemStack(0) + ); + inventory.setItem(javaSlot, GeyserItemStack.EMPTY, session); + } else { + destroyItemPacket = new ClientCreativeInventoryActionPacket( + javaSlot, + existingItem.getItemStack() + ); + } session.sendDownstreamPacket(destroyItemPacket); System.out.println(destroyItemPacket); - inventory.setItem(javaSlot, GeyserItemStack.EMPTY, session); affectedSlots.add(javaSlot); } else { // Just sync up the item on our end, since the server doesn't care what's in our cursor