diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/player/SessionPlayerEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/player/SessionPlayerEntity.java index 279429242..540aa989f 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/player/SessionPlayerEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/player/SessionPlayerEntity.java @@ -67,10 +67,6 @@ public class SessionPlayerEntity extends PlayerEntity { */ @Getter private boolean isRidingInFront; - /** - * Used for villager inventory emulation. - */ - private int fakeTradeXp; public SessionPlayerEntity(GeyserSession session) { super(session, -1, 1, null, Vector3f.ZERO, Vector3f.ZERO, 0, 0, 0, null, null); @@ -175,11 +171,6 @@ public class SessionPlayerEntity extends PlayerEntity { this.isRidingInFront = position != null && position.getX() > 0; } - public void addFakeTradeExperience(int tradeXp) { - fakeTradeXp += tradeXp; - dirtyMetadata.put(EntityDataTypes.TRADE_EXPERIENCE, fakeTradeXp); - } - @Override public AttributeData createHealthAttribute() { // Max health must be divisible by two in bedrock 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 93c1917d2..105b5ca5b 100644 --- a/core/src/main/java/org/geysermc/geyser/inventory/MerchantContainer.java +++ b/core/src/main/java/org/geysermc/geyser/inventory/MerchantContainer.java @@ -30,6 +30,7 @@ import com.github.steveice10.mc.protocol.data.game.inventory.VillagerTrade; import com.github.steveice10.mc.protocol.packet.ingame.clientbound.inventory.ClientboundMerchantOffersPacket; import lombok.Getter; import lombok.Setter; +import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes; import org.geysermc.geyser.entity.type.Entity; import org.geysermc.geyser.session.GeyserSession; @@ -40,6 +41,8 @@ public class MerchantContainer extends Container { private VillagerTrade[] villagerTrades; @Getter @Setter private ClientboundMerchantOffersPacket pendingOffersPacket; + @Getter @Setter + private int tradeExperience; public MerchantContainer(String title, int id, int size, ContainerType containerType, PlayerInventory playerInventory) { super(title, id, size, containerType, playerInventory); @@ -49,9 +52,10 @@ public class MerchantContainer extends Container { if (villagerTrades != null && slot >= 0 && slot < villagerTrades.length) { VillagerTrade trade = villagerTrades[slot]; setItem(2, GeyserItemStack.from(trade.getOutput()), session); - // TODO this logic doesn't add up - session.getPlayerEntity().addFakeTradeExperience(trade.getXp()); - session.getPlayerEntity().updateBedrockMetadata(); + + tradeExperience += trade.getXp(); + villager.getDirtyMetadata().put(EntityDataTypes.TRADE_EXPERIENCE, tradeExperience); + villager.updateBedrockMetadata(); } } } diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/inventory/JavaMerchantOffersTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/inventory/JavaMerchantOffersTranslator.java index d4cb46a1c..2758902d4 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/inventory/JavaMerchantOffersTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/inventory/JavaMerchantOffersTranslator.java @@ -73,9 +73,17 @@ public class JavaMerchantOffersTranslator extends PacketTranslator