diff --git a/core/src/main/java/org/geysermc/geyser/inventory/MerchantContainer.java b/core/src/main/java/org/geysermc/geyser/inventory/MerchantContainer.java index 916fa775a..fecb79580 100644 --- a/core/src/main/java/org/geysermc/geyser/inventory/MerchantContainer.java +++ b/core/src/main/java/org/geysermc/geyser/inventory/MerchantContainer.java @@ -27,6 +27,7 @@ package org.geysermc.geyser.inventory; import com.github.steveice10.mc.protocol.data.game.inventory.VillagerTrade; import com.github.steveice10.mc.protocol.data.game.inventory.ContainerType; +import com.github.steveice10.mc.protocol.packet.ingame.clientbound.inventory.ClientboundMerchantOffersPacket; import lombok.Getter; import lombok.Setter; import org.geysermc.geyser.entity.type.Entity; @@ -36,6 +37,7 @@ import org.geysermc.geyser.entity.type.Entity; public class MerchantContainer extends Container { private Entity villager; private VillagerTrade[] villagerTrades; + private ClientboundMerchantOffersPacket pendingOffersPacket; public MerchantContainer(String title, int id, int size, ContainerType containerType, PlayerInventory playerInventory) { super(title, id, size, containerType, playerInventory); diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockContainerCloseTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockContainerCloseTranslator.java index 4c1f55018..daf61acef 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockContainerCloseTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockContainerCloseTranslator.java @@ -32,6 +32,7 @@ import org.geysermc.geyser.inventory.MerchantContainer; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.protocol.PacketTranslator; import org.geysermc.geyser.translator.protocol.Translator; +import org.geysermc.geyser.translator.protocol.java.inventory.JavaMerchantOffersTranslator; import org.geysermc.geyser.util.InventoryUtils; @Translator(packet = ContainerClosePacket.class) @@ -59,6 +60,10 @@ public class BedrockContainerCloseTranslator extends PacketTranslator no need of queuing the merchant inventory + if (!openInventory.isPending()) { + openMerchant(session, packet, merchantInventory); + return; + } + + // The inventory is declared as pending due to previous closing inventory -> leads to an incorrect order of execution + // Handled in BedrockContainerCloseTranslator + merchantInventory.setPendingOffersPacket(packet); + } + + public static void openMerchant(GeyserSession session, ClientboundMerchantOffersPacket packet, MerchantContainer merchantInventory) { // Retrieve the fake villager involved in the trade, and update its metadata to match with the window information merchantInventory.setVillagerTrades(packet.getTrades()); Entity villager = merchantInventory.getVillager(); @@ -70,7 +82,7 @@ public class JavaMerchantOffersTranslator extends PacketTranslator