From f702fb45b4c1f0f0095296d0f77511d2ce1dc237 Mon Sep 17 00:00:00 2001 From: Camotoy <20743703+Camotoy@users.noreply.github.com> Date: Sun, 16 Jan 2022 14:42:17 -0500 Subject: [PATCH] Handle correct internal slot for swapping from inventory --- .../geyser/inventory/BedrockContainerSlot.java | 6 +----- .../geysermc/geyser/inventory/Container.java | 6 ++++++ .../geysermc/geyser/inventory/Inventory.java | 5 ++++- .../geyser/inventory/PlayerInventory.java | 15 +++++++++++---- .../geyser/inventory/click/ClickPlan.java | 18 +++++++++--------- .../inventory/BeaconInventoryTranslator.java | 2 +- .../EnchantingInventoryTranslator.java | 2 +- .../inventory/InventoryTranslator.java | 6 +++--- .../inventory/LoomInventoryTranslator.java | 2 +- .../StonecutterInventoryTranslator.java | 2 +- 10 files changed, 38 insertions(+), 26 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/inventory/BedrockContainerSlot.java b/core/src/main/java/org/geysermc/geyser/inventory/BedrockContainerSlot.java index e225c5f4d..87c0c92a3 100644 --- a/core/src/main/java/org/geysermc/geyser/inventory/BedrockContainerSlot.java +++ b/core/src/main/java/org/geysermc/geyser/inventory/BedrockContainerSlot.java @@ -26,10 +26,6 @@ package org.geysermc.geyser.inventory; import com.nukkitx.protocol.bedrock.data.inventory.ContainerSlotType; -import lombok.Value; -@Value -public class BedrockContainerSlot { - ContainerSlotType container; - int slot; +public record BedrockContainerSlot(ContainerSlotType container, int slot) { } diff --git a/core/src/main/java/org/geysermc/geyser/inventory/Container.java b/core/src/main/java/org/geysermc/geyser/inventory/Container.java index cf47b8bd6..073887a64 100644 --- a/core/src/main/java/org/geysermc/geyser/inventory/Container.java +++ b/core/src/main/java/org/geysermc/geyser/inventory/Container.java @@ -30,6 +30,7 @@ import lombok.Getter; import lombok.NonNull; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.inventory.InventoryTranslator; +import org.jetbrains.annotations.Range; /** * Combination of {@link Inventory} and {@link PlayerInventory} @@ -59,6 +60,11 @@ public class Container extends Inventory { } } + @Override + public int getOffsetForHotbar(@Range(from = 0, to = 8) int slot) { + return playerInventory.getOffsetForHotbar(slot) - InventoryTranslator.PLAYER_INVENTORY_OFFSET + this.size; + } + @Override public void setItem(int slot, @NonNull GeyserItemStack newItem, GeyserSession session) { if (slot < this.size) { diff --git a/core/src/main/java/org/geysermc/geyser/inventory/Inventory.java b/core/src/main/java/org/geysermc/geyser/inventory/Inventory.java index a78c9cf51..3b307ba8d 100644 --- a/core/src/main/java/org/geysermc/geyser/inventory/Inventory.java +++ b/core/src/main/java/org/geysermc/geyser/inventory/Inventory.java @@ -36,11 +36,12 @@ import lombok.Setter; import lombok.ToString; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.session.GeyserSession; +import org.jetbrains.annotations.Range; import java.util.Arrays; @ToString -public class Inventory { +public abstract class Inventory { @Getter protected final int id; @@ -110,6 +111,8 @@ public class Inventory { return items[slot]; } + public abstract int getOffsetForHotbar(@Range(from = 0, to = 8) int slot); + public void setItem(int slot, @NonNull GeyserItemStack newItem, GeyserSession session) { if (slot > this.size) { session.getGeyser().getLogger().debug("Tried to set an item out of bounds! " + this); diff --git a/core/src/main/java/org/geysermc/geyser/inventory/PlayerInventory.java b/core/src/main/java/org/geysermc/geyser/inventory/PlayerInventory.java index c4a6a8363..14c796a5f 100644 --- a/core/src/main/java/org/geysermc/geyser/inventory/PlayerInventory.java +++ b/core/src/main/java/org/geysermc/geyser/inventory/PlayerInventory.java @@ -26,10 +26,12 @@ package org.geysermc.geyser.inventory; import lombok.Getter; -import lombok.NonNull; import lombok.Setter; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.session.GeyserSession; +import org.jetbrains.annotations.Range; + +import javax.annotation.Nonnull; public class PlayerInventory extends Inventory { /** @@ -41,7 +43,7 @@ public class PlayerInventory extends Inventory { private int heldItemSlot; @Getter - @NonNull + @Nonnull private GeyserItemStack cursor = GeyserItemStack.EMPTY; public PlayerInventory() { @@ -49,7 +51,12 @@ public class PlayerInventory extends Inventory { heldItemSlot = 0; } - public void setCursor(@NonNull GeyserItemStack newCursor, GeyserSession session) { + @Override + public int getOffsetForHotbar(@Range(from = 0, to = 8) int slot) { + return slot + 36; + } + + public void setCursor(@Nonnull GeyserItemStack newCursor, GeyserSession session) { updateItemNetId(cursor, newCursor, session); cursor = newCursor; } @@ -62,7 +69,7 @@ public class PlayerInventory extends Inventory { return items[36 + heldItemSlot]; } - public void setItemInHand(@NonNull GeyserItemStack item) { + public void setItemInHand(@Nonnull GeyserItemStack item) { if (36 + heldItemSlot > this.size) { GeyserImpl.getInstance().getLogger().debug("Held item slot was larger than expected!"); return; diff --git a/core/src/main/java/org/geysermc/geyser/inventory/click/ClickPlan.java b/core/src/main/java/org/geysermc/geyser/inventory/click/ClickPlan.java index 0a1d0a36e..e973beadc 100644 --- a/core/src/main/java/org/geysermc/geyser/inventory/click/ClickPlan.java +++ b/core/src/main/java/org/geysermc/geyser/inventory/click/ClickPlan.java @@ -234,31 +234,31 @@ public class ClickPlan { } break; case SWAP_TO_HOTBAR_1: - swap(action.slot, 36, clicked); + swap(action.slot, inventory.getOffsetForHotbar(0), clicked); break; case SWAP_TO_HOTBAR_2: - swap(action.slot, 37, clicked); + swap(action.slot, inventory.getOffsetForHotbar(1), clicked); break; case SWAP_TO_HOTBAR_3: - swap(action.slot, 38, clicked); + swap(action.slot, inventory.getOffsetForHotbar(2), clicked); break; case SWAP_TO_HOTBAR_4: - swap(action.slot, 39, clicked); + swap(action.slot, inventory.getOffsetForHotbar(3), clicked); break; case SWAP_TO_HOTBAR_5: - swap(action.slot, 40, clicked); + swap(action.slot, inventory.getOffsetForHotbar(4), clicked); break; case SWAP_TO_HOTBAR_6: - swap(action.slot, 41, clicked); + swap(action.slot, inventory.getOffsetForHotbar(5), clicked); break; case SWAP_TO_HOTBAR_7: - swap(action.slot, 42, clicked); + swap(action.slot, inventory.getOffsetForHotbar(6), clicked); break; case SWAP_TO_HOTBAR_8: - swap(action.slot, 43, clicked); + swap(action.slot, inventory.getOffsetForHotbar(7), clicked); break; case SWAP_TO_HOTBAR_9: - swap(action.slot, 44, clicked); + swap(action.slot, inventory.getOffsetForHotbar(8), clicked); break; case LEFT_SHIFT: //TODO diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/BeaconInventoryTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/BeaconInventoryTranslator.java index f6abdfcd2..19d9d6de5 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/inventory/BeaconInventoryTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/BeaconInventoryTranslator.java @@ -104,7 +104,7 @@ public class BeaconInventoryTranslator extends AbstractBlockInventoryTranslator } @Override - public boolean shouldHandleRequestFirst(StackRequestActionData action, Inventory inventory) { + protected boolean shouldHandleRequestFirst(StackRequestActionData action, Inventory inventory) { return action.getType() == StackRequestActionType.BEACON_PAYMENT; } diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/EnchantingInventoryTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/EnchantingInventoryTranslator.java index 97b78aec5..97ece79d8 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/inventory/EnchantingInventoryTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/EnchantingInventoryTranslator.java @@ -104,7 +104,7 @@ public class EnchantingInventoryTranslator extends AbstractBlockInventoryTransla } @Override - public boolean shouldHandleRequestFirst(StackRequestActionData action, Inventory inventory) { + protected boolean shouldHandleRequestFirst(StackRequestActionData action, Inventory inventory) { return action.getType() == StackRequestActionType.CRAFT_RECIPE; } diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/InventoryTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/InventoryTranslator.java index 8318e18f6..04d5fa3ad 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/inventory/InventoryTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/InventoryTranslator.java @@ -136,7 +136,7 @@ public abstract class InventoryTranslator { * Should be overrided if this request matches a certain criteria and shouldn't be treated normally. * E.G. anvil renaming or enchanting */ - public boolean shouldHandleRequestFirst(StackRequestActionData action, Inventory inventory) { + protected boolean shouldHandleRequestFirst(StackRequestActionData action, Inventory inventory) { return false; } @@ -864,8 +864,8 @@ public abstract class InventoryTranslator { Map> containerMap = new HashMap<>(); for (int slot : affectedSlots) { BedrockContainerSlot bedrockSlot = javaSlotToBedrockContainer(slot); - List list = containerMap.computeIfAbsent(bedrockSlot.getContainer(), k -> new ArrayList<>()); - list.add(makeItemEntry(session, bedrockSlot.getSlot(), inventory.getItem(slot))); + List list = containerMap.computeIfAbsent(bedrockSlot.container(), k -> new ArrayList<>()); + list.add(makeItemEntry(session, bedrockSlot.slot(), inventory.getItem(slot))); } List containerEntries = new ArrayList<>(); diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/LoomInventoryTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/LoomInventoryTranslator.java index acdaaf4c1..a862a7e0d 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/inventory/LoomInventoryTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/LoomInventoryTranslator.java @@ -117,7 +117,7 @@ public class LoomInventoryTranslator extends AbstractBlockInventoryTranslator { } @Override - public boolean shouldHandleRequestFirst(StackRequestActionData action, Inventory inventory) { + protected boolean shouldHandleRequestFirst(StackRequestActionData action, Inventory inventory) { // If the LOOM_MATERIAL slot is not empty, we are crafting a pattern that does not come from an item // Remove the CRAFT_NON_IMPLEMENTED_DEPRECATED when 1.17.30 is dropped return (action.getType() == StackRequestActionType.CRAFT_NON_IMPLEMENTED_DEPRECATED || action.getType() == StackRequestActionType.CRAFT_LOOM) diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/StonecutterInventoryTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/StonecutterInventoryTranslator.java index 3bc881696..ae25a9ffd 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/inventory/StonecutterInventoryTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/StonecutterInventoryTranslator.java @@ -52,7 +52,7 @@ public class StonecutterInventoryTranslator extends AbstractBlockInventoryTransl } @Override - public boolean shouldHandleRequestFirst(StackRequestActionData action, Inventory inventory) { + protected boolean shouldHandleRequestFirst(StackRequestActionData action, Inventory inventory) { // First is pre-1.18. TODO remove after 1.17.40 support is dropped and refactor stonecutter support to use CraftRecipeStackRequestActionData's recipe ID return action.getType() == StackRequestActionType.CRAFT_NON_IMPLEMENTED_DEPRECATED || action.getType() == StackRequestActionType.CRAFT_RECIPE; }