From 9f204c2a91ffb9e872413f012079e82c9fe3141d Mon Sep 17 00:00:00 2001 From: Aikar Date: Tue, 19 Dec 2017 22:05:16 -0500 Subject: [PATCH] PlayerPickupExperienceEvent Allows plugins to cancel a player picking up an experience orb --- .../0077-PlayerPickupExperienceEvent.patch | 99 +++++++++++++++++++ .../0257-PlayerPickupExperienceEvent.patch | 23 +++++ 2 files changed, 122 insertions(+) create mode 100644 Spigot-API-Patches/0077-PlayerPickupExperienceEvent.patch create mode 100644 Spigot-Server-Patches/0257-PlayerPickupExperienceEvent.patch diff --git a/Spigot-API-Patches/0077-PlayerPickupExperienceEvent.patch b/Spigot-API-Patches/0077-PlayerPickupExperienceEvent.patch new file mode 100644 index 0000000000..547760a5fc --- /dev/null +++ b/Spigot-API-Patches/0077-PlayerPickupExperienceEvent.patch @@ -0,0 +1,99 @@ +From c35ec3d0d0ad4bab56dc760a99a53bdff3c2e4a7 Mon Sep 17 00:00:00 2001 +From: Aikar +Date: Tue, 19 Dec 2017 22:00:41 -0500 +Subject: [PATCH] PlayerPickupExperienceEvent + +Allows plugins to cancel a player picking up an experience orb + +diff --git a/src/main/java/com/destroystokyo/paper/event/player/PlayerPickupExperienceEvent.java b/src/main/java/com/destroystokyo/paper/event/player/PlayerPickupExperienceEvent.java +new file mode 100644 +index 00000000..0b1b5ae7 +--- /dev/null ++++ b/src/main/java/com/destroystokyo/paper/event/player/PlayerPickupExperienceEvent.java +@@ -0,0 +1,83 @@ ++/* ++ * Copyright (c) 2017 Daniel Ennis (Aikar) MIT License ++ * ++ * Permission is hereby granted, free of charge, to any person obtaining ++ * a copy of this software and associated documentation files (the ++ * "Software"), to deal in the Software without restriction, including ++ * without limitation the rights to use, copy, modify, merge, publish, ++ * distribute, sublicense, and/or sell copies of the Software, and to ++ * permit persons to whom the Software is furnished to do so, subject to ++ * the following conditions: ++ * ++ * The above copyright notice and this permission notice shall be ++ * included in all copies or substantial portions of the Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ++ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE ++ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION ++ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION ++ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ++ */ ++ ++package com.destroystokyo.paper.event.player; ++ ++import org.bukkit.entity.ExperienceOrb; ++import org.bukkit.entity.Player; ++import org.bukkit.event.Cancellable; ++import org.bukkit.event.Event; ++import org.bukkit.event.HandlerList; ++ ++/** ++ * Fired when a player is attempting to pick up an experience orb ++ */ ++public class PlayerPickupExperienceEvent extends Event implements Cancellable { ++ private final Player player; ++ private final ExperienceOrb experienceOrb; ++ ++ public PlayerPickupExperienceEvent(Player player, ExperienceOrb experienceOrb) { ++ this.player = player; ++ this.experienceOrb = experienceOrb; ++ } ++ ++ /** ++ * @return The player picking up an experience orb ++ */ ++ public Player getPlayer() { ++ return player; ++ } ++ ++ /** ++ * @return Returns the Orb that the player is picking up ++ */ ++ public ExperienceOrb getExperienceOrb() { ++ return experienceOrb; ++ } ++ ++ private static final HandlerList handlers = new HandlerList(); ++ ++ public HandlerList getHandlers() { ++ return handlers; ++ } ++ ++ public static HandlerList getHandlerList() { ++ return handlers; ++ } ++ ++ private boolean cancelled = false; ++ ++ @Override ++ public boolean isCancelled() { ++ return cancelled; ++ } ++ ++ /** ++ * If true, Cancels picking up the experience orb, leaving it in the world ++ * @param cancel true if you wish to cancel this event ++ */ ++ @Override ++ public void setCancelled(boolean cancel) { ++ cancelled = cancel; ++ } ++} +-- +2.15.1 + diff --git a/Spigot-Server-Patches/0257-PlayerPickupExperienceEvent.patch b/Spigot-Server-Patches/0257-PlayerPickupExperienceEvent.patch new file mode 100644 index 0000000000..2c9c66e808 --- /dev/null +++ b/Spigot-Server-Patches/0257-PlayerPickupExperienceEvent.patch @@ -0,0 +1,23 @@ +From 3c0f08275341119adc37284eaea3f9585f30438c Mon Sep 17 00:00:00 2001 +From: Aikar +Date: Tue, 19 Dec 2017 22:02:53 -0500 +Subject: [PATCH] PlayerPickupExperienceEvent + +Allows plugins to cancel a player picking up an experience orb + +diff --git a/src/main/java/net/minecraft/server/EntityExperienceOrb.java b/src/main/java/net/minecraft/server/EntityExperienceOrb.java +index d567ad4a5..ff5cc74ba 100644 +--- a/src/main/java/net/minecraft/server/EntityExperienceOrb.java ++++ b/src/main/java/net/minecraft/server/EntityExperienceOrb.java +@@ -206,7 +206,7 @@ public class EntityExperienceOrb extends Entity { + + public void d(EntityHuman entityhuman) { + if (!this.world.isClientSide) { +- if (this.c == 0 && entityhuman.bD == 0) { ++ if (this.c == 0 && entityhuman.bD == 0 && new com.destroystokyo.paper.event.player.PlayerPickupExperienceEvent(((EntityPlayer) entityhuman).getBukkitEntity(), (org.bukkit.entity.ExperienceOrb) this.getBukkitEntity()).callEvent()) { // Paper + entityhuman.bD = 2; + entityhuman.receive(this, 1); + ItemStack itemstack = EnchantmentManager.b(Enchantments.C, (EntityLiving) entityhuman); +-- +2.15.1 +