From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: pkt77 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..2827a100275f8e1316b5d06c14662d41ca1bd5fa --- /dev/null +++ b/src/main/java/com/destroystokyo/paper/event/player/PlayerArmorChangeEvent.java @@ -0,0 +1,137 @@ +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 java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import static org.bukkit.Material.*; + +/** + * Called when the player themselves change their armor items + *

+ * Not currently called for environmental factors though it MAY BE IN THE FUTURE + */ +public class PlayerArmorChangeEvent extends PlayerEvent { + private static final HandlerList HANDLERS = new HandlerList(); + + @NotNull private final SlotType slotType; + @Nullable private final ItemStack oldItem; + @Nullable private final ItemStack newItem; + + public PlayerArmorChangeEvent(@NotNull Player player, @NotNull SlotType slotType, @Nullable ItemStack oldItem, @Nullable 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 + */ + @NotNull + 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 + '}'; + } + + @NotNull + @Override + public HandlerList getHandlers() { + return HANDLERS; + } + + @NotNull + public static HandlerList getHandlerList() { + return HANDLERS; + } + + public enum SlotType { + HEAD(DIAMOND_HELMET, GOLDEN_HELMET, IRON_HELMET, CHAINMAIL_HELMET, LEATHER_HELMET, PUMPKIN, JACK_O_LANTERN), + CHEST(DIAMOND_CHESTPLATE, GOLDEN_CHESTPLATE, IRON_CHESTPLATE, CHAINMAIL_CHESTPLATE, LEATHER_CHESTPLATE, ELYTRA), + LEGS(DIAMOND_LEGGINGS, GOLDEN_LEGGINGS, IRON_LEGGINGS, CHAINMAIL_LEGGINGS, LEATHER_LEGGINGS), + FEET(DIAMOND_BOOTS, GOLDEN_BOOTS, IRON_BOOTS, CHAINMAIL_BOOTS, LEATHER_BOOTS); + + private final Set mutableTypes = new HashSet<>(); + private Set 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 + */ + @NotNull + public Set 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(@NotNull 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(@NotNull Material material) { + return getByMaterial(material) != null; + } + } +}