diff --git a/eco-api/src/main/java/com/willfp/eco/core/events/ArmorChangeEvent.java b/eco-api/src/main/java/com/willfp/eco/core/events/ArmorChangeEvent.java new file mode 100644 index 00000000..563f6357 --- /dev/null +++ b/eco-api/src/main/java/com/willfp/eco/core/events/ArmorChangeEvent.java @@ -0,0 +1,70 @@ +package com.willfp.eco.core.events; + +import lombok.Getter; +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.NotNull; + +import java.util.List; + +/** + * The armor change event does contain information about the event. + *

+ * Unlike {@link ArmorEquipEvent}, it is called the next tick and contains previous and current armor contents. + */ +public class ArmorChangeEvent extends PlayerEvent { + /** + * Bukkit parity. + */ + private static final HandlerList HANDLERS = new HandlerList(); + + /** + * The armor contents before. 0 is helmet, 3 is boots. + */ + @Getter + private final List before; + + /** + * The armor contents after. 0 is helmet, 3 is boots. + */ + @Getter + private final List after; + + /** + * Create a new ArmorChangeEvent. + * + * @param player The player. + * @param before The armor contents before. + * @param after The armor contents after. + */ + public ArmorChangeEvent(@NotNull final Player player, + @NotNull final List before, + @NotNull final List after) { + super(player); + this.before = before; + this.after = after; + } + + /** + * Gets a list of handlers handling this event. + * + * @return A list of handlers handling this event. + */ + + @Override + @NotNull + public HandlerList getHandlers() { + return HANDLERS; + } + + /** + * Bukkit parity. + * + * @return The handler list. + */ + public static HandlerList getHandlerList() { + return HANDLERS; + } +} diff --git a/eco-api/src/main/java/com/willfp/eco/core/events/ArmorEquipEvent.java b/eco-api/src/main/java/com/willfp/eco/core/events/ArmorEquipEvent.java index 5b824256..e1d587aa 100644 --- a/eco-api/src/main/java/com/willfp/eco/core/events/ArmorEquipEvent.java +++ b/eco-api/src/main/java/com/willfp/eco/core/events/ArmorEquipEvent.java @@ -15,6 +15,9 @@ import org.jetbrains.annotations.NotNull; * so you can check a tick later to see the new contents. */ public class ArmorEquipEvent extends PlayerEvent { + /** + * Bukkit parity. + */ private static final HandlerList HANDLERS = new HandlerList(); /** diff --git a/eco-core/core-plugin/src/main/java/com/willfp/eco/spigot/EcoSpigotPlugin.java b/eco-core/core-plugin/src/main/java/com/willfp/eco/spigot/EcoSpigotPlugin.java index 5e54ac4c..73e766a1 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/eco/spigot/EcoSpigotPlugin.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/eco/spigot/EcoSpigotPlugin.java @@ -18,6 +18,7 @@ import com.willfp.eco.spigot.display.PacketSetCreativeSlot; import com.willfp.eco.spigot.display.PacketSetSlot; import com.willfp.eco.spigot.display.PacketWindowItems; import com.willfp.eco.spigot.drops.CollatedRunnable; +import com.willfp.eco.spigot.eventlisteners.ArmorChangeEventListeners; import com.willfp.eco.spigot.eventlisteners.ArmorListener; import com.willfp.eco.spigot.eventlisteners.DispenserArmorListener; import com.willfp.eco.spigot.eventlisteners.EntityDeathByEntityListeners; @@ -55,7 +56,7 @@ import java.util.List; public abstract class EcoSpigotPlugin extends EcoPlugin { @Getter private static EcoSpigotPlugin instance; - + public EcoSpigotPlugin() { super(87955, 10043, "com.willfp.eco.proxy", "&a"); instance = this; @@ -153,7 +154,8 @@ public abstract class EcoSpigotPlugin extends EcoPlugin { new ShapedRecipeListener(this), new PlayerJumpListeners(), new GUIListener(this), - new ArrowDataListener(this) + new ArrowDataListener(this), + new ArmorChangeEventListeners(this) ); } } diff --git a/eco-core/core-plugin/src/main/java/com/willfp/eco/spigot/eventlisteners/ArmorChangeEventListeners.java b/eco-core/core-plugin/src/main/java/com/willfp/eco/spigot/eventlisteners/ArmorChangeEventListeners.java new file mode 100644 index 00000000..f7636a28 --- /dev/null +++ b/eco-core/core-plugin/src/main/java/com/willfp/eco/spigot/eventlisteners/ArmorChangeEventListeners.java @@ -0,0 +1,41 @@ +package com.willfp.eco.spigot.eventlisteners; + +import com.willfp.eco.core.EcoPlugin; +import com.willfp.eco.core.PluginDependent; +import com.willfp.eco.core.events.ArmorChangeEvent; +import com.willfp.eco.core.events.ArmorEquipEvent; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class ArmorChangeEventListeners extends PluginDependent implements Listener { + /** + * Pass an {@link EcoPlugin} in order to interface with it. + * + * @param plugin The plugin to manage. + */ + public ArmorChangeEventListeners(@NotNull final EcoPlugin plugin) { + super(plugin); + } + + @EventHandler + public void onArmorChange(@NotNull final ArmorEquipEvent event) { + Player player = event.getPlayer(); + + List before = new ArrayList<>(Arrays.asList(player.getInventory().getArmorContents())); + + this.getPlugin().getScheduler().runLater(() -> { + List after = new ArrayList<>(Arrays.asList(player.getInventory().getArmorContents())); + + ArmorChangeEvent armorChangeEvent = new ArmorChangeEvent(player, before, after); + Bukkit.getPluginManager().callEvent(armorChangeEvent); + }, 1); + } +}