mirror of
https://github.com/GeyserMC/Geyser.git
synced 2024-08-14 23:57:35 +00:00
Fix custom merchant inventory not opening (#2672)
This commit is contained in:
parent
70ec77b1e3
commit
1840172c8d
3 changed files with 23 additions and 4 deletions
|
@ -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.VillagerTrade;
|
||||||
import com.github.steveice10.mc.protocol.data.game.inventory.ContainerType;
|
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.Getter;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
import org.geysermc.geyser.entity.type.Entity;
|
import org.geysermc.geyser.entity.type.Entity;
|
||||||
|
@ -36,6 +37,7 @@ import org.geysermc.geyser.entity.type.Entity;
|
||||||
public class MerchantContainer extends Container {
|
public class MerchantContainer extends Container {
|
||||||
private Entity villager;
|
private Entity villager;
|
||||||
private VillagerTrade[] villagerTrades;
|
private VillagerTrade[] villagerTrades;
|
||||||
|
private ClientboundMerchantOffersPacket pendingOffersPacket;
|
||||||
|
|
||||||
public MerchantContainer(String title, int id, int size, ContainerType containerType, PlayerInventory playerInventory) {
|
public MerchantContainer(String title, int id, int size, ContainerType containerType, PlayerInventory playerInventory) {
|
||||||
super(title, id, size, containerType, playerInventory);
|
super(title, id, size, containerType, playerInventory);
|
||||||
|
|
|
@ -32,6 +32,7 @@ import org.geysermc.geyser.inventory.MerchantContainer;
|
||||||
import org.geysermc.geyser.session.GeyserSession;
|
import org.geysermc.geyser.session.GeyserSession;
|
||||||
import org.geysermc.geyser.translator.protocol.PacketTranslator;
|
import org.geysermc.geyser.translator.protocol.PacketTranslator;
|
||||||
import org.geysermc.geyser.translator.protocol.Translator;
|
import org.geysermc.geyser.translator.protocol.Translator;
|
||||||
|
import org.geysermc.geyser.translator.protocol.java.inventory.JavaMerchantOffersTranslator;
|
||||||
import org.geysermc.geyser.util.InventoryUtils;
|
import org.geysermc.geyser.util.InventoryUtils;
|
||||||
|
|
||||||
@Translator(packet = ContainerClosePacket.class)
|
@Translator(packet = ContainerClosePacket.class)
|
||||||
|
@ -59,6 +60,10 @@ public class BedrockContainerCloseTranslator extends PacketTranslator<ContainerC
|
||||||
} else if (openInventory.isPending()) {
|
} else if (openInventory.isPending()) {
|
||||||
InventoryUtils.displayInventory(session, openInventory);
|
InventoryUtils.displayInventory(session, openInventory);
|
||||||
openInventory.setPending(false);
|
openInventory.setPending(false);
|
||||||
|
|
||||||
|
if (openInventory instanceof MerchantContainer merchantContainer && merchantContainer.getPendingOffersPacket() != null) {
|
||||||
|
JavaMerchantOffersTranslator.openMerchant(session, merchantContainer.getPendingOffersPacket(), merchantContainer);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,11 +38,11 @@ import com.nukkitx.protocol.bedrock.packet.UpdateTradePacket;
|
||||||
import org.geysermc.geyser.entity.type.Entity;
|
import org.geysermc.geyser.entity.type.Entity;
|
||||||
import org.geysermc.geyser.inventory.Inventory;
|
import org.geysermc.geyser.inventory.Inventory;
|
||||||
import org.geysermc.geyser.inventory.MerchantContainer;
|
import org.geysermc.geyser.inventory.MerchantContainer;
|
||||||
|
import org.geysermc.geyser.registry.type.ItemMapping;
|
||||||
import org.geysermc.geyser.session.GeyserSession;
|
import org.geysermc.geyser.session.GeyserSession;
|
||||||
|
import org.geysermc.geyser.translator.inventory.item.ItemTranslator;
|
||||||
import org.geysermc.geyser.translator.protocol.PacketTranslator;
|
import org.geysermc.geyser.translator.protocol.PacketTranslator;
|
||||||
import org.geysermc.geyser.translator.protocol.Translator;
|
import org.geysermc.geyser.translator.protocol.Translator;
|
||||||
import org.geysermc.geyser.translator.inventory.item.ItemTranslator;
|
|
||||||
import org.geysermc.geyser.registry.type.ItemMapping;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -57,6 +57,18 @@ public class JavaMerchantOffersTranslator extends PacketTranslator<ClientboundMe
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// No previous inventory was closed -> 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
|
// Retrieve the fake villager involved in the trade, and update its metadata to match with the window information
|
||||||
merchantInventory.setVillagerTrades(packet.getTrades());
|
merchantInventory.setVillagerTrades(packet.getTrades());
|
||||||
Entity villager = merchantInventory.getVillager();
|
Entity villager = merchantInventory.getVillager();
|
||||||
|
@ -70,7 +82,7 @@ public class JavaMerchantOffersTranslator extends PacketTranslator<ClientboundMe
|
||||||
updateTradePacket.setTradeTier(packet.getVillagerLevel() - 1);
|
updateTradePacket.setTradeTier(packet.getVillagerLevel() - 1);
|
||||||
updateTradePacket.setContainerId((short) packet.getContainerId());
|
updateTradePacket.setContainerId((short) packet.getContainerId());
|
||||||
updateTradePacket.setContainerType(ContainerType.TRADE);
|
updateTradePacket.setContainerType(ContainerType.TRADE);
|
||||||
updateTradePacket.setDisplayName(openInventory.getTitle());
|
updateTradePacket.setDisplayName(session.getOpenInventory().getTitle());
|
||||||
updateTradePacket.setSize(0);
|
updateTradePacket.setSize(0);
|
||||||
updateTradePacket.setNewTradingUi(true);
|
updateTradePacket.setNewTradingUi(true);
|
||||||
updateTradePacket.setUsingEconomyTrade(true);
|
updateTradePacket.setUsingEconomyTrade(true);
|
||||||
|
@ -132,7 +144,7 @@ public class JavaMerchantOffersTranslator extends PacketTranslator<ClientboundMe
|
||||||
session.sendUpstreamPacket(updateTradePacket);
|
session.sendUpstreamPacket(updateTradePacket);
|
||||||
}
|
}
|
||||||
|
|
||||||
private NbtMap getItemTag(GeyserSession session, ItemStack stack, int specialPrice) {
|
private static NbtMap getItemTag(GeyserSession session, ItemStack stack, int specialPrice) {
|
||||||
ItemData itemData = ItemTranslator.translateToBedrock(session, stack);
|
ItemData itemData = ItemTranslator.translateToBedrock(session, stack);
|
||||||
ItemMapping mapping = session.getItemMappings().getMapping(stack);
|
ItemMapping mapping = session.getItemMappings().getMapping(stack);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue