From 325c3ad9e48cc88e46d93de98e9c180bcd43a496 Mon Sep 17 00:00:00 2001 From: Fulminazzo Date: Tue, 5 Mar 2024 17:11:56 +0100 Subject: [PATCH] Added `.item:serializer` module to automatically load and save item objects. Added parsers: - [EnchantmentParser](item/serializer/src/main/java/it/angrybear/serializers/EnchantmentParser.java); - [ItemParser](item/serializer/src/main/java/it/angrybear/serializers/ItemParser.java); - [ShapeParser](item/serializer/src/main/java/it/angrybear/serializers/ShapeParser.java); - [ShapedRecipeParser](item/serializer/src/main/java/it/angrybear/serializers/ShapedRecipeParser.java); - [ShapelessRecipeParser](item/serializer/src/main/java/it/angrybear/serializers/ShapelessRecipeParser.java); - [FurnaceRecipeParser](item/serializer/src/main/java/it/angrybear/serializers/FurnaceRecipeParser.java). Added [YAGLParser](item/serializer/src/main/java/it/angrybear/serializers/YAGLParser.java) to automatically load parsers. Moved everything to package `it.angrybear.yagl`. Reworked `Item#copy()` method: it will try to get a default empty constructor from the current class. If it fails, it defaults to `ItemImpl`. Fixed `Item#copy(Class)` with automatic resolution of interfaces: passing `Item` or `BukkitItem` will convert them into `ItemImpl` and `BukkitItemImpl`. Fixed `Item#copy(Class)` not checking if current item has field of receiving class. Fixed various bugs in **ShapedRecipe**. Fixed recipes not copying items in their most default state (Item). Fixed invalid casts to `BukkitItem` in `ItemUtils`. Fixed `ItemUtils`: now it will apply model data only for values higher than 0. Fixed visibility issues in `PersistentListener`: every event method is now protected. Fixed PersistentListener not checking for main hand upon interacting. Updated FulmiCollection to version 1.4.1. --- .../yagl/listeners/PersistentListener.java | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/item/bukkit/src/main/java/it/angrybear/yagl/listeners/PersistentListener.java b/item/bukkit/src/main/java/it/angrybear/yagl/listeners/PersistentListener.java index 7b707b2d..a6b0eed7 100644 --- a/item/bukkit/src/main/java/it/angrybear/yagl/listeners/PersistentListener.java +++ b/item/bukkit/src/main/java/it/angrybear/yagl/listeners/PersistentListener.java @@ -22,9 +22,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; +import java.util.*; import java.util.function.Consumer; /** @@ -32,11 +30,18 @@ */ public class PersistentListener implements Listener { private static boolean INITIALIZED = false; + /** + * Timeout, in milliseconds, to check before calling {@link #on(PlayerInteractEvent)}. + * This is used to prevent double calls. + */ + private static long INTERACT_TIMEOUT = 10; + private final Map lastUsed; /** * Instantiates a new Persistent listener. */ - public PersistentListener() { + public PersistentListener(Map lastUsed) { + this.lastUsed = lastUsed; INITIALIZED = true; } @@ -67,6 +72,10 @@ protected void on(PlayerDeathEvent event) { protected void on(PlayerInteractEvent event) { if (event.getHand() != EquipmentSlot.HAND) return; Player player = event.getPlayer(); + long lastUsed = this.lastUsed.getOrDefault(player.getUniqueId(), 0L); + long now = new Date().getTime(); + if (now < lastUsed + INTERACT_TIMEOUT) return; + this.lastUsed.put(player.getUniqueId(), now); interactPersistentItem(event.getItem(), player, event.getAction(), cancelled(event)); }