From 4c74270207b2c9eb6e22e81c2a407f194368c453 Mon Sep 17 00:00:00 2001 From: Doc Date: Sat, 23 May 2026 12:12:07 -0400 Subject: [PATCH] Update Villager Prices before opening trade inventory to Player using API --- build-data/paper.at | 1 + .../craftbukkit/entity/CraftHumanEntity.java | 19 ++++++++++--------- .../inventory/util/CraftMenus.java | 1 + 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/build-data/paper.at b/build-data/paper.at index fc06d593c438..ef2c47e556cf 100644 --- a/build-data/paper.at +++ b/build-data/paper.at @@ -442,6 +442,7 @@ public net.minecraft.world.entity.npc.villager.Villager numberOfRestocksToday public net.minecraft.world.entity.npc.villager.Villager releaseAllPois()V public net.minecraft.world.entity.npc.villager.Villager setUnhappy()V public net.minecraft.world.entity.npc.villager.Villager updateDemand()V +public net.minecraft.world.entity.npc.villager.Villager updateSpecialPrices(Lnet/minecraft/world/entity/player/Player;)V public net.minecraft.world.entity.npc.wanderingtrader.WanderingTrader getWanderTarget()Lnet/minecraft/core/BlockPos; public net.minecraft.world.entity.player.Abilities flyingSpeed public net.minecraft.world.entity.player.Abilities walkingSpeed diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java b/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java index 0c98e3ec53b4..8a11100991e9 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java @@ -512,17 +512,18 @@ public InventoryView openMerchant(Merchant merchant, boolean force) { net.minecraft.world.item.trading.Merchant mcMerchant; Component name; int level = 1; // note: using level 0 with active 'is-regular-villager'-flag allows hiding the name suffix - if (merchant instanceof CraftAbstractVillager) { - mcMerchant = ((CraftAbstractVillager) merchant).getHandle(); - name = ((CraftAbstractVillager) merchant).getHandle().getDisplayName(); - if (merchant instanceof CraftVillager) { - level = ((CraftVillager) merchant).getHandle().getVillagerData().level(); + if (merchant instanceof CraftAbstractVillager craftAbstractVillager) { + mcMerchant = craftAbstractVillager.getHandle(); + name = craftAbstractVillager.getHandle().getDisplayName(); + if (merchant instanceof CraftVillager craftVillager) { + level = craftVillager.getHandle().getVillagerData().level(); + craftVillager.getHandle().updateSpecialPrices(this.getHandle()); // Update villager prices before to open to player } - } else if (merchant instanceof CraftMerchantCustom) { - mcMerchant = ((CraftMerchantCustom) merchant).getMerchant(); - name = ((CraftMerchantCustom) merchant).getMerchant().getScoreboardDisplayName(); + } else if (merchant instanceof CraftMerchantCustom craftMerchantCustom) { + mcMerchant = craftMerchantCustom.getMerchant(); + name = craftMerchantCustom.getMerchant().getScoreboardDisplayName(); } else { - throw new IllegalArgumentException("Can't open merchant " + merchant.toString()); + throw new IllegalArgumentException("Can't open merchant " + merchant); } mcMerchant.setTradingPlayer(this.getHandle()); diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/util/CraftMenus.java b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/util/CraftMenus.java index 707148e0bcb3..3d91f9595b91 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/util/CraftMenus.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/util/CraftMenus.java @@ -54,6 +54,7 @@ public static void openMerchantMenu(final ServerPlayer player, final MerchantMen int level = 1; if (minecraftMerchant instanceof final Villager villager) { level = villager.getVillagerData().level(); + villager.updateSpecialPrices(player); // Update villager prices before to open to player } if (minecraftMerchant.getTradingPlayer() != null) { // merchant's can only have one trader