diff --git a/plugin/src/main/java/me/filoghost/holographicdisplays/plugin/placeholder/tracking/ActivePlaceholder.java b/plugin/src/main/java/me/filoghost/holographicdisplays/plugin/placeholder/tracking/ActivePlaceholder.java index f2b29813..4e590cd4 100644 --- a/plugin/src/main/java/me/filoghost/holographicdisplays/plugin/placeholder/tracking/ActivePlaceholder.java +++ b/plugin/src/main/java/me/filoghost/holographicdisplays/plugin/placeholder/tracking/ActivePlaceholder.java @@ -13,17 +13,28 @@ import org.jetbrains.annotations.Nullable; abstract class ActivePlaceholder { private final @Nullable PlaceholderExpansion source; + private long lastRequestTick; ActivePlaceholder(@Nullable PlaceholderExpansion source) { this.source = source; + this.lastRequestTick = -1; } final @Nullable PlaceholderExpansion getSource() { return source; } + final long getLastRequestTick() { + return lastRequestTick; + } + + final @Nullable String updateAndGetReplacement(Player player, long currentTick) throws PlaceholderException { + this.lastRequestTick = currentTick; + return doUpdateAndGetReplacement(player, currentTick); + } + abstract boolean isIndividual(); - abstract @Nullable String updateAndGetReplacement(Player player, long currentTick) throws PlaceholderException; + abstract @Nullable String doUpdateAndGetReplacement(Player player, long currentTick) throws PlaceholderException; } diff --git a/plugin/src/main/java/me/filoghost/holographicdisplays/plugin/placeholder/tracking/ActivePlaceholderTracker.java b/plugin/src/main/java/me/filoghost/holographicdisplays/plugin/placeholder/tracking/ActivePlaceholderTracker.java index b46403c7..8dcf19bf 100644 --- a/plugin/src/main/java/me/filoghost/holographicdisplays/plugin/placeholder/tracking/ActivePlaceholderTracker.java +++ b/plugin/src/main/java/me/filoghost/holographicdisplays/plugin/placeholder/tracking/ActivePlaceholderTracker.java @@ -7,27 +7,25 @@ package me.filoghost.holographicdisplays.plugin.placeholder.tracking; import me.filoghost.holographicdisplays.plugin.placeholder.PlaceholderException; import me.filoghost.holographicdisplays.plugin.placeholder.StandardPlaceholder; -import me.filoghost.holographicdisplays.plugin.tick.TickClock; import me.filoghost.holographicdisplays.plugin.placeholder.parsing.PlaceholderOccurrence; import me.filoghost.holographicdisplays.plugin.placeholder.parsing.StringWithPlaceholders; import me.filoghost.holographicdisplays.plugin.placeholder.registry.PlaceholderExpansion; import me.filoghost.holographicdisplays.plugin.placeholder.registry.PlaceholderRegistry; +import me.filoghost.holographicdisplays.plugin.tick.TickClock; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.HashMap; +import java.util.Map; import java.util.Objects; -import java.util.WeakHashMap; public class ActivePlaceholderTracker { private final PlaceholderRegistry registry; private final TickClock tickClock; private final PlaceholderExceptionHandler exceptionHandler; - - // Use WeakHashMap to ensure that when a PlaceholderOccurrence is no longer referenced in other objects - // the corresponding entry is removed from the map automatically. - private final WeakHashMap activePlaceholders; + private final Map activePlaceholders; private long lastRegistryVersion; @@ -35,10 +33,10 @@ public class ActivePlaceholderTracker { this.registry = registry; this.tickClock = tickClock; this.exceptionHandler = new PlaceholderExceptionHandler(tickClock); - this.activePlaceholders = new WeakHashMap<>(); + this.activePlaceholders = new HashMap<>(); } - public void update() { + public void clearOutdatedEntries() { long currentRegistryVersion = registry.getVersion(); if (lastRegistryVersion == currentRegistryVersion) { return; @@ -55,6 +53,12 @@ public class ActivePlaceholderTracker { }); } + public void clearUnusedEntries() { + long currentTick = tickClock.getCurrentTick(); + activePlaceholders.values().removeIf( + activePlaceholder -> currentTick - activePlaceholder.getLastRequestTick() >= 1); + } + public @Nullable String updateAndGetGlobalReplacement(PlaceholderOccurrence placeholderOccurrence) { try { ActivePlaceholder activePlaceholder = trackAndGetPlaceholder(placeholderOccurrence); diff --git a/plugin/src/main/java/me/filoghost/holographicdisplays/plugin/placeholder/tracking/GlobalActivePlaceholder.java b/plugin/src/main/java/me/filoghost/holographicdisplays/plugin/placeholder/tracking/GlobalActivePlaceholder.java index 53ebd728..92d9a1a5 100644 --- a/plugin/src/main/java/me/filoghost/holographicdisplays/plugin/placeholder/tracking/GlobalActivePlaceholder.java +++ b/plugin/src/main/java/me/filoghost/holographicdisplays/plugin/placeholder/tracking/GlobalActivePlaceholder.java @@ -27,7 +27,7 @@ class GlobalActivePlaceholder extends ActivePlaceholder { } @Override - @Nullable String updateAndGetReplacement(Player player, long currentTick) throws PlaceholderException { + @Nullable String doUpdateAndGetReplacement(Player player, long currentTick) throws PlaceholderException { return replacementHolder.updateAndGet(player, currentTick); } diff --git a/plugin/src/main/java/me/filoghost/holographicdisplays/plugin/placeholder/tracking/IndividualActivePlaceholder.java b/plugin/src/main/java/me/filoghost/holographicdisplays/plugin/placeholder/tracking/IndividualActivePlaceholder.java index 7e5d0712..855e4ee3 100644 --- a/plugin/src/main/java/me/filoghost/holographicdisplays/plugin/placeholder/tracking/IndividualActivePlaceholder.java +++ b/plugin/src/main/java/me/filoghost/holographicdisplays/plugin/placeholder/tracking/IndividualActivePlaceholder.java @@ -33,7 +33,7 @@ class IndividualActivePlaceholder extends ActivePlaceholder { } @Override - @Nullable String updateAndGetReplacement(Player player, long currentTick) throws PlaceholderException { + @Nullable String doUpdateAndGetReplacement(Player player, long currentTick) throws PlaceholderException { return replacementHolderByPlayer .computeIfAbsent(player, key -> new ReplacementHolder(placeholder, placeholderOccurrence)) .updateAndGet(player, currentTick); diff --git a/plugin/src/main/java/me/filoghost/holographicdisplays/plugin/placeholder/tracking/NullActivePlaceholder.java b/plugin/src/main/java/me/filoghost/holographicdisplays/plugin/placeholder/tracking/NullActivePlaceholder.java index 15a9efd4..8f47c1b4 100644 --- a/plugin/src/main/java/me/filoghost/holographicdisplays/plugin/placeholder/tracking/NullActivePlaceholder.java +++ b/plugin/src/main/java/me/filoghost/holographicdisplays/plugin/placeholder/tracking/NullActivePlaceholder.java @@ -16,7 +16,7 @@ class NullActivePlaceholder extends ActivePlaceholder { } @Override - @Nullable String updateAndGetReplacement(Player player, long currentTick) { + @Nullable String doUpdateAndGetReplacement(Player player, long currentTick) { return null; } diff --git a/plugin/src/main/java/me/filoghost/holographicdisplays/plugin/tick/TickingTask.java b/plugin/src/main/java/me/filoghost/holographicdisplays/plugin/tick/TickingTask.java index 7bf6f7a6..fac9a93d 100644 --- a/plugin/src/main/java/me/filoghost/holographicdisplays/plugin/tick/TickingTask.java +++ b/plugin/src/main/java/me/filoghost/holographicdisplays/plugin/tick/TickingTask.java @@ -34,8 +34,8 @@ public class TickingTask implements Runnable { public void run() { tickClock.incrementTick(); - // Update placeholder tracker before updating hologram lines - placeholderTracker.update(); + // Remove outdated entries before using them from line trackers + placeholderTracker.clearOutdatedEntries(); try { lineTrackerManager.update(); @@ -48,6 +48,9 @@ public class TickingTask implements Runnable { } } + // Remove entries which were not used by line trackers + placeholderTracker.clearUnusedEntries(); + lineClickListener.processQueuedClickEvents(); }