Skip to content

Commit 5ae3fdc

Browse files
committed
Make merchant accessible in PlayerPurchaseEvent
1 parent 29c8822 commit 5ae3fdc

File tree

3 files changed

+27
-9
lines changed

3 files changed

+27
-9
lines changed

paper-api/src/main/java/io/papermc/paper/event/player/PlayerPurchaseEvent.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@
55
import org.bukkit.event.Cancellable;
66
import org.bukkit.event.HandlerList;
77
import org.bukkit.event.player.PlayerEvent;
8+
import org.bukkit.inventory.Merchant;
89
import org.bukkit.inventory.MerchantRecipe;
910
import org.jetbrains.annotations.ApiStatus;
11+
import org.jetbrains.annotations.NotNull;
1012
import org.jspecify.annotations.NullMarked;
1113

1214
/**
@@ -17,20 +19,31 @@ public class PlayerPurchaseEvent extends PlayerEvent implements Cancellable {
1719

1820
private static final HandlerList HANDLER_LIST = new HandlerList();
1921

22+
private final Merchant merchant;
2023
private boolean rewardExp;
2124
private boolean increaseTradeUses;
2225
private MerchantRecipe trade;
2326

2427
private boolean cancelled;
2528

2629
@ApiStatus.Internal
27-
public PlayerPurchaseEvent(final Player player, final MerchantRecipe trade, final boolean rewardExp, final boolean increaseTradeUses) {
30+
public PlayerPurchaseEvent(final Player player, final Merchant merchant, final MerchantRecipe trade, final boolean rewardExp, final boolean increaseTradeUses) {
2831
super(player);
32+
this.merchant = merchant;
2933
this.trade = trade;
3034
this.rewardExp = rewardExp;
3135
this.increaseTradeUses = increaseTradeUses;
3236
}
3337

38+
/**
39+
* Gets the merchant that the player is trading with
40+
*
41+
* @return the merchant
42+
*/
43+
public @NotNull Merchant getMerchant() {
44+
return merchant;
45+
}
46+
3447
/**
3548
* Gets the associated trade with this event
3649
*
@@ -45,7 +58,7 @@ public MerchantRecipe getTrade() {
4558
*
4659
* @param trade the trade to use
4760
*/
48-
public void setTrade(final MerchantRecipe trade) {
61+
public void setTrade(@NotNull final MerchantRecipe trade) {
4962
Preconditions.checkArgument(trade != null, "Trade cannot be null!");
5063
this.trade = trade;
5164
}

paper-api/src/main/java/io/papermc/paper/event/player/PlayerTradeEvent.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import org.bukkit.entity.Player;
55
import org.bukkit.inventory.MerchantRecipe;
66
import org.jetbrains.annotations.ApiStatus;
7+
import org.jetbrains.annotations.NotNull;
78
import org.jspecify.annotations.NullMarked;
89

910
/**
@@ -12,21 +13,25 @@
1213
@NullMarked
1314
public class PlayerTradeEvent extends PlayerPurchaseEvent {
1415

15-
private final AbstractVillager villager;
16-
1716
@ApiStatus.Internal
1817
public PlayerTradeEvent(final Player player, final AbstractVillager villager, final MerchantRecipe trade, final boolean rewardExp, final boolean increaseTradeUses) {
19-
super(player, trade, rewardExp, increaseTradeUses);
20-
this.villager = villager;
18+
super(player, villager, trade, rewardExp, increaseTradeUses);
19+
}
20+
21+
@Override
22+
public @NotNull AbstractVillager getMerchant() {
23+
return (AbstractVillager) super.getMerchant();
2124
}
2225

2326
/**
2427
* Gets the Villager or Wandering trader associated with this event
2528
*
2629
* @return the villager or wandering trader
30+
* @see #getMerchant()
2731
*/
32+
@ApiStatus.Obsolete
2833
public AbstractVillager getVillager() {
29-
return this.villager;
34+
return getMerchant();
3035
}
3136

3237
}

paper-server/patches/sources/net/minecraft/world/inventory/MerchantResultSlot.java.patch

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
+ if (activeOffer != null && player instanceof net.minecraft.server.level.ServerPlayer serverPlayer) {
1313
+ if (this.merchant instanceof net.minecraft.world.entity.npc.AbstractVillager abstractVillager) {
1414
+ event = new io.papermc.paper.event.player.PlayerTradeEvent(serverPlayer.getBukkitEntity(), (org.bukkit.entity.AbstractVillager) abstractVillager.getBukkitEntity(), activeOffer.asBukkit(), true, true);
15-
+ } else if (this.merchant instanceof org.bukkit.craftbukkit.inventory.CraftMerchantCustom.MinecraftMerchant) {
16-
+ event = new io.papermc.paper.event.player.PlayerPurchaseEvent(serverPlayer.getBukkitEntity(), activeOffer.asBukkit(), false, true);
15+
+ } else if (this.merchant instanceof org.bukkit.craftbukkit.inventory.CraftMerchantCustom.MinecraftMerchant minecraftMerchant) {
16+
+ event = new io.papermc.paper.event.player.PlayerPurchaseEvent(serverPlayer.getBukkitEntity(), minecraftMerchant.getCraftMerchant(), activeOffer.asBukkit(), false, true);
1717
+ }
1818
+ if (event != null) {
1919
+ if (!event.callEvent()) {

0 commit comments

Comments
 (0)