aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/api/0071-Add-PlayerArmorChangeEvent.patch
blob: 9b30ad2abc481f492b6f7ea7392d206456db7f60 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
From 0000000000000000000000000000000000000000 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 0000000000000000000000000000000000000000..c7cc612ec81b0c7da6ee6676167e047e69347966
--- /dev/null
+++ b/src/main/java/com/destroystokyo/paper/event/player/PlayerArmorChangeEvent.java
@@ -0,0 +1,120 @@
+package com.destroystokyo.paper.event.player;
+
+import java.util.Set;
+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 org.jetbrains.annotations.ApiStatus;
+import org.jspecify.annotations.NullMarked;
+import org.jspecify.annotations.Nullable;
+
+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>
+ */
+@NullMarked
+public class PlayerArmorChangeEvent extends PlayerEvent {
+
+    private static final HandlerList HANDLER_LIST = new HandlerList();
+
+    private final SlotType slotType;
+    private final ItemStack oldItem;
+    private final ItemStack newItem;
+
+    @ApiStatus.Internal
+    public PlayerArmorChangeEvent(final Player player, final SlotType slotType, final ItemStack oldItem, final 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
+     */
+    public SlotType getSlotType() {
+        return this.slotType;
+    }
+
+    /**
+     * Gets the existing item that's being replaced
+     *
+     * @return old item
+     */
+    public ItemStack getOldItem() {
+        return this.oldItem;
+    }
+
+    /**
+     * Gets the new item that's replacing the old
+     *
+     * @return new item
+     */
+    public ItemStack getNewItem() {
+        return this.newItem;
+    }
+
+    @Override
+    public HandlerList getHandlers() {
+        return HANDLER_LIST;
+    }
+
+    public static HandlerList getHandlerList() {
+        return HANDLER_LIST;
+    }
+
+    public enum SlotType {
+        HEAD(NETHERITE_HELMET, DIAMOND_HELMET, GOLDEN_HELMET, IRON_HELMET, CHAINMAIL_HELMET, LEATHER_HELMET, CARVED_PUMPKIN, PLAYER_HEAD, SKELETON_SKULL, ZOMBIE_HEAD, CREEPER_HEAD, WITHER_SKELETON_SKULL, TURTLE_HELMET, DRAGON_HEAD, PIGLIN_HEAD),
+        CHEST(NETHERITE_CHESTPLATE, DIAMOND_CHESTPLATE, GOLDEN_CHESTPLATE, IRON_CHESTPLATE, CHAINMAIL_CHESTPLATE, LEATHER_CHESTPLATE, ELYTRA),
+        LEGS(NETHERITE_LEGGINGS, DIAMOND_LEGGINGS, GOLDEN_LEGGINGS, IRON_LEGGINGS, CHAINMAIL_LEGGINGS, LEATHER_LEGGINGS),
+        FEET(NETHERITE_BOOTS, DIAMOND_BOOTS, GOLDEN_BOOTS, IRON_BOOTS, CHAINMAIL_BOOTS, LEATHER_BOOTS);
+
+        private final Set<Material> types;
+
+        SlotType(final Material... types) {
+            this.types = Set.of(types);
+        }
+
+        /**
+         * Gets an immutable set of all allowed material types that can be placed in an
+         * armor slot.
+         *
+         * @return immutable set of material types
+         */
+        public Set<Material> getTypes() {
+            return this.types;
+        }
+
+        /**
+         * 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 {@code null} if it won't
+         */
+        public static @Nullable SlotType getByMaterial(final Material material) {
+            for (final SlotType slotType : values()) {
+                if (slotType.getTypes().contains(material)) {
+                    return slotType;
+                }
+            }
+            return null;
+        }
+
+        /**
+         * Gets whether this material can be equipped to a slot
+         *
+         * @param material material to check
+         * @return whether this material can be equipped
+         */
+        public static boolean isEquipable(final Material material) {
+            return getByMaterial(material) != null;
+        }
+    }
+}