From 24c27a03a9bea2ba60940332dafd655d0fbd142a Mon Sep 17 00:00:00 2001 From: AJ Ferguson Date: Tue, 22 Oct 2019 15:31:03 -0800 Subject: [PATCH] Various fixes Fix offhand, use AtomicInteger for transaction id, send null stack instead of air, and clear open inventory on dimension change --- .../connector/inventory/Inventory.java | 20 ++++++---- .../connector/inventory/PlayerInventory.java | 4 +- ...BedrockInventoryTransactionTranslator.java | 37 +++++++++---------- .../inventory/PlayerInventoryTranslator.java | 15 +++++++- .../java/JavaRespawnTranslator.java | 1 + .../java/window/JavaOpenWindowTranslator.java | 15 ++++++-- .../window/JavaWindowItemsTranslator.java | 11 ++++-- .../connector/utils/InventoryUtils.java | 6 +-- 8 files changed, 69 insertions(+), 40 deletions(-) diff --git a/connector/src/main/java/org/geysermc/connector/inventory/Inventory.java b/connector/src/main/java/org/geysermc/connector/inventory/Inventory.java index 215ac597..2147b070 100644 --- a/connector/src/main/java/org/geysermc/connector/inventory/Inventory.java +++ b/connector/src/main/java/org/geysermc/connector/inventory/Inventory.java @@ -31,6 +31,8 @@ import com.nukkitx.math.vector.Vector3i; import lombok.Getter; import lombok.Setter; +import java.util.concurrent.atomic.AtomicInteger; + public class Inventory { @Getter @@ -43,6 +45,9 @@ public class Inventory { @Getter protected WindowType windowType; + @Getter + protected final int size; + @Getter @Setter protected String title; @@ -59,23 +64,22 @@ public class Inventory { @Setter protected long holderId = -1; - protected short transactionId = 1; + @Getter + protected AtomicInteger transactionId = new AtomicInteger(1); - public Inventory(int id, WindowType windowType) { - this("Inventory", id, windowType); + public Inventory(int id, WindowType windowType, int size) { + this("Inventory", id, windowType, size); } - public Inventory(String title, int id, WindowType windowType) { + public Inventory(String title, int id, WindowType windowType, int size) { this.title = title; this.id = id; this.windowType = windowType; + this.size = size; + this.items = new ItemStack[size]; } public ItemStack getItem(int slot) { return items[slot]; } - - public short getNextTransactionId() { - return transactionId++; - } } diff --git a/connector/src/main/java/org/geysermc/connector/inventory/PlayerInventory.java b/connector/src/main/java/org/geysermc/connector/inventory/PlayerInventory.java index 44ad3cb6..4fd3bcd8 100644 --- a/connector/src/main/java/org/geysermc/connector/inventory/PlayerInventory.java +++ b/connector/src/main/java/org/geysermc/connector/inventory/PlayerInventory.java @@ -39,9 +39,7 @@ public class PlayerInventory extends Inventory { private ItemStack cursor; public PlayerInventory() { - super(0, null); - - items = new ItemStack[45]; + super(0, null, 46); heldItemSlot = 0; } diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockInventoryTransactionTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockInventoryTransactionTranslator.java index 78509d12..c0b805aa 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockInventoryTransactionTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockInventoryTransactionTranslator.java @@ -45,7 +45,6 @@ import com.nukkitx.protocol.bedrock.data.ItemData; import com.nukkitx.protocol.bedrock.packet.InventorySlotPacket; import com.nukkitx.protocol.bedrock.packet.InventoryTransactionPacket; import org.geysermc.connector.entity.Entity; -import org.geysermc.connector.entity.PlayerEntity; import org.geysermc.connector.inventory.Inventory; import org.geysermc.connector.network.session.GeyserSession; import org.geysermc.connector.network.translators.PacketTranslator; @@ -110,13 +109,13 @@ public class BedrockInventoryTransactionTranslator extends PacketTranslator cursorAction.getFromItem().getCount()) { //fill stack int javaSlot = session.getLastClickedSlot(); - ClientWindowActionPacket fillStackPacket = new ClientWindowActionPacket(inventory.getId(), inventory.getNextTransactionId(), + ClientWindowActionPacket fillStackPacket = new ClientWindowActionPacket(inventory.getId(), inventory.getTransactionId().getAndIncrement(), javaSlot, null, WindowAction.FILL_STACK, FillStackParam.FILL); session.getDownstream().getSession().send(fillStackPacket); translator.updateInventory(session, inventory); //bedrock fill stack can sometimes differ from java version, refresh and let server change slots @@ -153,8 +152,8 @@ public class BedrockInventoryTransactionTranslator extends PacketTranslator if (entity.getDimension() == getDimension(packet.getDimension())) return; + session.getInventoryCache().setOpenInventory(null); session.getChunkCache().getChunks().clear(); entity.setDimension(getDimension(packet.getDimension())); diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/java/window/JavaOpenWindowTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/window/JavaOpenWindowTranslator.java index 95aa618c..9e336ebd 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/java/window/JavaOpenWindowTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/java/window/JavaOpenWindowTranslator.java @@ -28,6 +28,7 @@ package org.geysermc.connector.network.translators.java.window; import com.github.steveice10.mc.protocol.data.game.entity.metadata.ItemStack; import com.github.steveice10.mc.protocol.packet.ingame.client.window.ClientCloseWindowPacket; import com.github.steveice10.mc.protocol.packet.ingame.server.window.ServerOpenWindowPacket; +import com.nukkitx.protocol.bedrock.packet.ContainerClosePacket; import org.geysermc.api.Geyser; import org.geysermc.connector.inventory.Inventory; import org.geysermc.connector.network.session.GeyserSession; @@ -42,15 +43,23 @@ public class JavaOpenWindowTranslator extends PacketTranslator { @@ -42,7 +42,12 @@ public class JavaWindowItemsTranslator extends PacketTranslator