From 1840172c8dcd37587d7659abc9c2c41dbc9ac046 Mon Sep 17 00:00:00 2001 From: Kenox Date: Mon, 6 Dec 2021 16:43:36 +0100 Subject: [PATCH] Fix custom merchant inventory not opening (#2672) --- .../geyser/inventory/MerchantContainer.java | 2 ++ .../BedrockContainerCloseTranslator.java | 5 +++++ .../JavaMerchantOffersTranslator.java | 20 +++++++++++++++---- 3 files changed, 23 insertions(+), 4 deletions(-) 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