diff --git a/patches/api/0343-Add-PlayerItemFrameChangeEvent.patch b/patches/api/0343-Add-PlayerItemFrameChangeEvent.patch new file mode 100644 index 000000000..a62e452bb --- /dev/null +++ b/patches/api/0343-Add-PlayerItemFrameChangeEvent.patch @@ -0,0 +1,109 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: SamB440 +Date: Mon, 15 Nov 2021 18:09:46 +0000 +Subject: [PATCH] Add PlayerItemFrameChangeEvent + + +diff --git a/src/main/java/io/papermc/paper/event/player/PlayerItemFrameChangeEvent.java b/src/main/java/io/papermc/paper/event/player/PlayerItemFrameChangeEvent.java +new file mode 100644 +index 0000000000000000000000000000000000000000..451fb94a5802755c255e04aebb40f178bbfbf996 +--- /dev/null ++++ b/src/main/java/io/papermc/paper/event/player/PlayerItemFrameChangeEvent.java +@@ -0,0 +1,97 @@ ++package io.papermc.paper.event.player; ++ ++import org.bukkit.Material; ++import org.bukkit.entity.ItemFrame; ++import org.bukkit.entity.Player; ++import org.bukkit.event.Cancellable; ++import org.bukkit.event.HandlerList; ++import org.bukkit.event.player.PlayerEvent; ++import org.bukkit.inventory.ItemStack; ++import org.jetbrains.annotations.NotNull; ++import org.jetbrains.annotations.Nullable; ++ ++/** ++ * Called when an {@link ItemFrame} is having an item rotated, added, or removed from it. ++ */ ++public class PlayerItemFrameChangeEvent extends PlayerEvent implements Cancellable { ++ ++ private static final HandlerList HANDLERS = new HandlerList(); ++ private boolean cancelled; ++ private final ItemFrame itemFrame; ++ private ItemStack itemStack; ++ private final ItemFrameChangeAction action; ++ ++ public PlayerItemFrameChangeEvent(@NotNull Player player, @NotNull ItemFrame itemFrame, ++ @NotNull ItemStack itemStack, @NotNull ItemFrameChangeAction action) { ++ super(player); ++ this.itemFrame = itemFrame; ++ this.itemStack = itemStack; ++ this.action = action; ++ } ++ ++ /** ++ * Gets the {@link ItemFrame} involved in this event. ++ * @return the {@link ItemFrame} ++ */ ++ @NotNull ++ public ItemFrame getItemFrame() { ++ return itemFrame; ++ } ++ ++ /** ++ * Gets the {@link ItemStack} involved in this event. ++ * This is the item being added, rotated, or removed from the {@link ItemFrame}. ++ *

If this method returns air, then the resulting item in the ItemFrame will be empty.

++ * @return the {@link ItemStack} being added, rotated, or removed ++ */ ++ @NotNull ++ public ItemStack getItemStack() { ++ return itemStack; ++ } ++ ++ /** ++ * Sets the {@link ItemStack} that this {@link ItemFrame} holds. ++ * If null is provided, the ItemStack will become air and the result in the ItemFrame will be empty. ++ * @param itemStack {@link ItemFrame} item ++ */ ++ public void setItemStack(@Nullable ItemStack itemStack) { ++ this.itemStack = itemStack == null ? new ItemStack(Material.AIR) : itemStack; ++ } ++ ++ /** ++ * Gets the action that was performed on this {@link ItemFrame}. ++ * @see ItemFrameChangeAction ++ * @return action performed on the item frame in this event ++ */ ++ @NotNull ++ public ItemFrameChangeAction getAction() { ++ return action; ++ } ++ ++ @Override ++ public boolean isCancelled() { ++ return cancelled; ++ } ++ ++ @Override ++ public void setCancelled(boolean cancel) { ++ this.cancelled = cancel; ++ } ++ ++ @Override ++ @NotNull ++ public HandlerList getHandlers() { ++ return HANDLERS; ++ } ++ ++ @NotNull ++ public static HandlerList getHandlerList() { ++ return HANDLERS; ++ } ++ ++ public enum ItemFrameChangeAction { ++ PLACE, ++ REMOVE, ++ ROTATE ++ } ++} diff --git a/patches/server/0821-Add-PlayerItemFrameChangeEvent.patch b/patches/server/0821-Add-PlayerItemFrameChangeEvent.patch new file mode 100644 index 000000000..8e8fbb1fb --- /dev/null +++ b/patches/server/0821-Add-PlayerItemFrameChangeEvent.patch @@ -0,0 +1,57 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: SamB440 +Date: Mon, 15 Nov 2021 18:10:10 +0000 +Subject: [PATCH] Add PlayerItemFrameChangeEvent + + +diff --git a/src/main/java/net/minecraft/world/entity/decoration/ItemFrame.java b/src/main/java/net/minecraft/world/entity/decoration/ItemFrame.java +index 30159f4f387b61b50589fad61f91c9e5a4adaf12..0f8513ee6f56148cf63f4cd6a60acb7f70280ff1 100644 +--- a/src/main/java/net/minecraft/world/entity/decoration/ItemFrame.java ++++ b/src/main/java/net/minecraft/world/entity/decoration/ItemFrame.java +@@ -1,6 +1,7 @@ + package net.minecraft.world.entity.decoration; + + import javax.annotation.Nullable; ++import io.papermc.paper.event.player.PlayerItemFrameChangeEvent; // Paper + import net.minecraft.core.BlockPos; + import net.minecraft.core.Direction; + import net.minecraft.nbt.CompoundTag; +@@ -185,6 +186,13 @@ public class ItemFrame extends HangingEntity { + return true; + } + // CraftBukkit end ++ // Paper start - call PlayerItemFrameChangeEvent ++ if (source.getEntity() instanceof Player player) { ++ var event = new PlayerItemFrameChangeEvent((org.bukkit.entity.Player) player.getBukkitEntity(), (org.bukkit.entity.ItemFrame) this.getBukkitEntity(), this.getItem().asBukkitCopy(), PlayerItemFrameChangeEvent.ItemFrameChangeAction.REMOVE); ++ if (!event.callEvent()) return false; ++ this.setItem(ItemStack.fromBukkitCopy(event.getItemStack()), false); ++ } ++ // Paper end + this.dropItem(source.getEntity(), false); + this.playSound(this.getRemoveItemSound(), 1.0F, 1.0F); + } +@@ -427,13 +435,22 @@ public class ItemFrame extends HangingEntity { + return InteractionResult.FAIL; + } + } +- +- this.setItem(itemstack); ++ // Paper start - call PlayerItemFrameChangeEvent ++ var event = new PlayerItemFrameChangeEvent((org.bukkit.entity.Player) player.getBukkitEntity(), (org.bukkit.entity.ItemFrame) this.getBukkitEntity(), itemstack.asBukkitCopy(), PlayerItemFrameChangeEvent.ItemFrameChangeAction.PLACE); ++ if (!event.callEvent()) return InteractionResult.FAIL; ++ this.setItem(ItemStack.fromBukkitCopy(event.getItemStack())); ++ // this.setItem(itemstack); ++ // Paper end + if (!player.getAbilities().instabuild) { + itemstack.shrink(1); + } + } + } else { ++ // Paper start - call PlayerItemFrameChangeEvent ++ var event = new PlayerItemFrameChangeEvent((org.bukkit.entity.Player) player.getBukkitEntity(), (org.bukkit.entity.ItemFrame) this.getBukkitEntity(), this.getItem().asBukkitCopy(), PlayerItemFrameChangeEvent.ItemFrameChangeAction.ROTATE); ++ if (!event.callEvent()) return InteractionResult.FAIL; ++ setItem(ItemStack.fromBukkitCopy(event.getItemStack()), false, false); ++ // Paper end + this.playSound(this.getRotateItemSound(), 1.0F, 1.0F); + this.setRotation(this.getRotation() + 1); + }