mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-29 07:48:53 +01:00
Add PlayerArmorChangeEvent
Closes GH-928
This commit is contained in:
parent
072d6ec8cb
commit
3438e96192
2 changed files with 184 additions and 0 deletions
150
Spigot-API-Patches/0072-Add-PlayerArmorChangeEvent.patch
Normal file
150
Spigot-API-Patches/0072-Add-PlayerArmorChangeEvent.patch
Normal file
|
@ -0,0 +1,150 @@
|
||||||
|
From feabeac37f30a2a99bbf59e58386a2585aabe8e2 Mon Sep 17 00:00:00 2001
|
||||||
|
From: pkt77 <parkerkt77@gmail.com>
|
||||||
|
Date: Fri, 10 Nov 2017 23:45:59 -0500
|
||||||
|
Subject: [PATCH] Add PlayerArmorChangeEvent
|
||||||
|
|
||||||
|
|
||||||
|
diff --git a/src/main/java/com/destroystokyo/paper/event/player/PlayerArmorChangeEvent.java b/src/main/java/com/destroystokyo/paper/event/player/PlayerArmorChangeEvent.java
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000..9d56a9e7
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/src/main/java/com/destroystokyo/paper/event/player/PlayerArmorChangeEvent.java
|
||||||
|
@@ -0,0 +1,135 @@
|
||||||
|
+package com.destroystokyo.paper.event.player;
|
||||||
|
+
|
||||||
|
+import org.bukkit.Material;
|
||||||
|
+import org.bukkit.entity.Player;
|
||||||
|
+import org.bukkit.event.HandlerList;
|
||||||
|
+import org.bukkit.event.player.PlayerEvent;
|
||||||
|
+import org.bukkit.inventory.ItemStack;
|
||||||
|
+
|
||||||
|
+import javax.annotation.Nonnull;
|
||||||
|
+import javax.annotation.Nullable;
|
||||||
|
+import java.util.Arrays;
|
||||||
|
+import java.util.Collections;
|
||||||
|
+import java.util.HashSet;
|
||||||
|
+import java.util.Set;
|
||||||
|
+
|
||||||
|
+import static org.bukkit.Material.*;
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * Called when the player themselves change their armor items
|
||||||
|
+ * <p>
|
||||||
|
+ * Not currently called for environmental factors though it <strong>MAY BE IN THE FUTURE</strong>
|
||||||
|
+ */
|
||||||
|
+public class PlayerArmorChangeEvent extends PlayerEvent {
|
||||||
|
+ private static final HandlerList HANDLERS = new HandlerList();
|
||||||
|
+
|
||||||
|
+ private final SlotType slotType;
|
||||||
|
+ private final ItemStack oldItem;
|
||||||
|
+ private final ItemStack newItem;
|
||||||
|
+
|
||||||
|
+ public PlayerArmorChangeEvent(Player player, SlotType slotType, ItemStack oldItem, ItemStack newItem) {
|
||||||
|
+ super(player);
|
||||||
|
+ this.slotType = slotType;
|
||||||
|
+ this.oldItem = oldItem;
|
||||||
|
+ this.newItem = newItem;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /**
|
||||||
|
+ * Gets the type of slot being altered.
|
||||||
|
+ *
|
||||||
|
+ * @return type of slot being altered
|
||||||
|
+ */
|
||||||
|
+ @Nonnull
|
||||||
|
+ public SlotType getSlotType() {
|
||||||
|
+ return this.slotType;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /**
|
||||||
|
+ * Gets the existing item that's being replaced
|
||||||
|
+ *
|
||||||
|
+ * @return old item
|
||||||
|
+ */
|
||||||
|
+ @Nullable
|
||||||
|
+ public ItemStack getOldItem() {
|
||||||
|
+ return this.oldItem;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /**
|
||||||
|
+ * Gets the new item that's replacing the old
|
||||||
|
+ *
|
||||||
|
+ * @return new item
|
||||||
|
+ */
|
||||||
|
+ @Nullable
|
||||||
|
+ public ItemStack getNewItem() {
|
||||||
|
+ return this.newItem;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ @Override
|
||||||
|
+ public String toString() {
|
||||||
|
+ return "ArmorChangeEvent{" + "player=" + player + ", slotType=" + slotType + ", oldItem=" + oldItem + ", newItem=" + newItem + '}';
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ @Override
|
||||||
|
+ public HandlerList getHandlers() {
|
||||||
|
+ return HANDLERS;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ public static HandlerList getHandlerList() {
|
||||||
|
+ return HANDLERS;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ public enum SlotType {
|
||||||
|
+ HEAD(DIAMOND_HELMET, GOLD_HELMET, IRON_HELMET, CHAINMAIL_HELMET, LEATHER_HELMET, PUMPKIN, JACK_O_LANTERN),
|
||||||
|
+ CHEST(DIAMOND_CHESTPLATE, GOLD_CHESTPLATE, IRON_CHESTPLATE, CHAINMAIL_CHESTPLATE, LEATHER_CHESTPLATE, ELYTRA),
|
||||||
|
+ LEGS(DIAMOND_LEGGINGS, GOLD_LEGGINGS, IRON_LEGGINGS, CHAINMAIL_LEGGINGS, LEATHER_LEGGINGS),
|
||||||
|
+ FEET(DIAMOND_BOOTS, GOLD_BOOTS, IRON_BOOTS, CHAINMAIL_BOOTS, LEATHER_BOOTS);
|
||||||
|
+
|
||||||
|
+ private final Set<Material> mutableTypes = new HashSet<>();
|
||||||
|
+ private Set<Material> immutableTypes;
|
||||||
|
+
|
||||||
|
+ SlotType(Material... types) {
|
||||||
|
+ this.mutableTypes.addAll(Arrays.asList(types));
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /**
|
||||||
|
+ * Gets an immutable set of all allowed material types that can be placed in an
|
||||||
|
+ * armor slot.
|
||||||
|
+ *
|
||||||
|
+ * @return immutable set of material types
|
||||||
|
+ */
|
||||||
|
+ @Nonnull
|
||||||
|
+ public Set<Material> getTypes() {
|
||||||
|
+ if (immutableTypes == null) {
|
||||||
|
+ immutableTypes = Collections.unmodifiableSet(mutableTypes);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return immutableTypes;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /**
|
||||||
|
+ * Gets the type of slot via the specified material
|
||||||
|
+ *
|
||||||
|
+ * @param material material to get slot by
|
||||||
|
+ * @return slot type the material will go in, or null if it won't
|
||||||
|
+ */
|
||||||
|
+ @Nullable
|
||||||
|
+ public static SlotType getByMaterial(Material material) {
|
||||||
|
+ for (SlotType slotType : values()) {
|
||||||
|
+ if (slotType.getTypes().contains(material)) {
|
||||||
|
+ return slotType;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ return null;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /**
|
||||||
|
+ * Gets whether or not this material can be equipped to a slot
|
||||||
|
+ *
|
||||||
|
+ * @param material material to check
|
||||||
|
+ * @return whether or not this material can be equipped
|
||||||
|
+ */
|
||||||
|
+ public static boolean isEquipable(Material material) {
|
||||||
|
+ return getByMaterial(material) != null;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
--
|
||||||
|
2.14.2
|
||||||
|
|
34
Spigot-Server-Patches/0250-Add-PlayerArmorChangeEvent.patch
Normal file
34
Spigot-Server-Patches/0250-Add-PlayerArmorChangeEvent.patch
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
From e2873d6dbc62fb4bfa94eb918e83c606937d95ae Mon Sep 17 00:00:00 2001
|
||||||
|
From: pkt77 <parkerkt77@gmail.com>
|
||||||
|
Date: Fri, 10 Nov 2017 23:46:34 -0500
|
||||||
|
Subject: [PATCH] Add PlayerArmorChangeEvent
|
||||||
|
|
||||||
|
|
||||||
|
diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java
|
||||||
|
index 135a9c0e..5e17d107 100644
|
||||||
|
--- a/src/main/java/net/minecraft/server/EntityLiving.java
|
||||||
|
+++ b/src/main/java/net/minecraft/server/EntityLiving.java
|
||||||
|
@@ -1,5 +1,6 @@
|
||||||
|
package net.minecraft.server;
|
||||||
|
|
||||||
|
+import com.destroystokyo.paper.event.player.PlayerArmorChangeEvent;
|
||||||
|
import com.google.common.base.Objects;
|
||||||
|
import com.google.common.collect.Maps;
|
||||||
|
import java.util.Collection;
|
||||||
|
@@ -1929,6 +1930,13 @@ public abstract class EntityLiving extends Entity {
|
||||||
|
ItemStack itemstack1 = this.getEquipment(enumitemslot);
|
||||||
|
|
||||||
|
if (!ItemStack.matches(itemstack1, itemstack)) {
|
||||||
|
+ // Paper start - PlayerArmorChangeEvent
|
||||||
|
+ if (this instanceof EntityPlayer && enumitemslot.a() == EnumItemSlot.Function.ARMOR && !itemstack.getItem().equals(itemstack1.getItem())) {
|
||||||
|
+ final org.bukkit.inventory.ItemStack oldItem = CraftItemStack.asBukkitCopy(itemstack);
|
||||||
|
+ final org.bukkit.inventory.ItemStack newItem = CraftItemStack.asBukkitCopy(itemstack1);
|
||||||
|
+ new PlayerArmorChangeEvent((Player) this.getBukkitEntity(), PlayerArmorChangeEvent.SlotType.valueOf(enumitemslot.name()), oldItem, newItem).callEvent();
|
||||||
|
+ }
|
||||||
|
+ // Paper end
|
||||||
|
((WorldServer) this.world).getTracker().a((Entity) this, (Packet) (new PacketPlayOutEntityEquipment(this.getId(), enumitemslot, itemstack1)));
|
||||||
|
if (!itemstack.isEmpty()) {
|
||||||
|
this.getAttributeMap().a(itemstack.a(enumitemslot));
|
||||||
|
--
|
||||||
|
2.14.2
|
||||||
|
|
Loading…
Reference in a new issue