diff --git a/eco-core/core-plugin/src/main/java/com/willfp/talismans/TalismansPlugin.java b/eco-core/core-plugin/src/main/java/com/willfp/talismans/TalismansPlugin.java index fd34fea..5ad0b57 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/talismans/TalismansPlugin.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/talismans/TalismansPlugin.java @@ -29,6 +29,13 @@ import java.util.List; @SuppressWarnings("unused") public class TalismansPlugin extends AbstractEcoPlugin { + /** + * Listeners to call {@link com.willfp.talismans.talismans.util.equipevent.TalismanEquipEvent}. + *

+ * Instance stored to reschedule timer. + */ + private final TalismanEquipEventListeners talismanEquipEventListeners = new TalismanEquipEventListeners(this); + /** * Internal constructor called by bukkit on plugin load. */ @@ -87,6 +94,8 @@ public class TalismansPlugin extends AbstractEcoPlugin { } }, 1); }); + + talismanEquipEventListeners.scheduleAutocheck(); } /** @@ -149,7 +158,7 @@ public class TalismansPlugin extends AbstractEcoPlugin { new WatcherTriggers(this), new BlockPlaceListener(), new TalismanCraftListener(), - new TalismanEquipEventListeners(this) + talismanEquipEventListeners ); } diff --git a/eco-core/core-plugin/src/main/java/com/willfp/talismans/talismans/util/equipevent/TalismanEquipEventListeners.java b/eco-core/core-plugin/src/main/java/com/willfp/talismans/talismans/util/equipevent/TalismanEquipEventListeners.java index 8e7b50f..1230a39 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/talismans/talismans/util/equipevent/TalismanEquipEventListeners.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/talismans/talismans/util/equipevent/TalismanEquipEventListeners.java @@ -18,9 +18,16 @@ import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; import java.util.Set; +import java.util.UUID; public class TalismanEquipEventListeners extends PluginDependent implements Listener { + private final Map> syncCache = Collections.synchronizedMap(new HashMap<>()); + /** * Initialize new listeners and link them to a plugin. * @@ -123,4 +130,34 @@ public class TalismanEquipEventListeners extends PluginDependent implements List } }, 1); } + + /** + * Schedule sync repeating updater task. + */ + public void scheduleAutocheck() { + this.getPlugin().getScheduler().syncRepeating(() -> { + for (Player player : this.getPlugin().getServer().getOnlinePlayers()) { + UUID uuid = player.getUniqueId(); + + Set before = syncCache.get(uuid); + if (before == null) { + before = new HashSet<>(); + } + + Set after = TalismanChecks.getTalismansOnPlayer(player); + + syncCache.put(uuid, after); + + after.removeAll(before); + for (Talisman talisman : after) { + Bukkit.getPluginManager().callEvent(new TalismanEquipEvent(player, talisman, EquipType.EQUIP)); + } + + before.removeAll(after); + for (Talisman talisman : before) { + Bukkit.getPluginManager().callEvent(new TalismanEquipEvent(player, talisman, EquipType.UNEQUIP)); + } + } + }, 80, 80); + } }