Fix trader merchants NPE when interacting with a merchant with non-active trades

This commit is contained in:
Shane Freeder 2021-12-05 03:00:10 +00:00
parent df42b6f60c
commit 55c371884e

View file

@ -180,6 +180,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
MerchantOffer merchantOffer = this.slots.getActiveOffer(); MerchantOffer merchantOffer = this.slots.getActiveOffer();
+ // Paper start + // Paper start
+ io.papermc.paper.event.player.PlayerPurchaseEvent event = null; + io.papermc.paper.event.player.PlayerPurchaseEvent event = null;
+ if (merchantOffer != null) {
+ if (this.merchant instanceof net.minecraft.world.entity.npc.AbstractVillager && this.merchant.getTradingPlayer().getBukkitEntity() instanceof org.bukkit.entity.Player) { + if (this.merchant instanceof net.minecraft.world.entity.npc.AbstractVillager && this.merchant.getTradingPlayer().getBukkitEntity() instanceof org.bukkit.entity.Player) {
+ event = new io.papermc.paper.event.player.PlayerTradeEvent((org.bukkit.entity.Player) this.merchant.getTradingPlayer().getBukkitEntity(), (org.bukkit.entity.AbstractVillager) ((net.minecraft.world.entity.npc.AbstractVillager) this.merchant).getBukkitEntity(), merchantOffer.asBukkit(), true, true); + event = new io.papermc.paper.event.player.PlayerTradeEvent((org.bukkit.entity.Player) this.merchant.getTradingPlayer().getBukkitEntity(), (org.bukkit.entity.AbstractVillager) ((net.minecraft.world.entity.npc.AbstractVillager) this.merchant).getBukkitEntity(), merchantOffer.asBukkit(), true, true);
+ } else if (this.merchant instanceof org.bukkit.craftbukkit.inventory.CraftMerchantCustom.MinecraftMerchant && this.merchant.getTradingPlayer().getBukkitEntity() instanceof org.bukkit.entity.Player) { + } else if (this.merchant instanceof org.bukkit.craftbukkit.inventory.CraftMerchantCustom.MinecraftMerchant && this.merchant.getTradingPlayer().getBukkitEntity() instanceof org.bukkit.entity.Player) {
@ -192,8 +193,12 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ return; + return;
+ } + }
+ merchantOffer = org.bukkit.craftbukkit.inventory.CraftMerchantRecipe.fromBukkit(event.getTrade()).toMinecraft(); + merchantOffer = org.bukkit.craftbukkit.inventory.CraftMerchantRecipe.fromBukkit(event.getTrade()).toMinecraft();
+ } else {
+ // TODO: Check this, I don't see how this would be hit and the logic below should be fired, warn for missing cases?
+ return;
+ } + }
+ this.checkTakeAchievements(stack); + this.checkTakeAchievements(stack);
+ }
+ // Paper end + // Paper end
if (merchantOffer != null) { if (merchantOffer != null) {
ItemStack itemStack = this.slots.getItem(0); ItemStack itemStack = this.slots.getItem(0);