diff --git a/plugin/src/main/java/me/filoghost/holographicdisplays/plugin/HolographicDisplays.java b/plugin/src/main/java/me/filoghost/holographicdisplays/plugin/HolographicDisplays.java index 2ebec423..2546705c 100644 --- a/plugin/src/main/java/me/filoghost/holographicdisplays/plugin/HolographicDisplays.java +++ b/plugin/src/main/java/me/filoghost/holographicdisplays/plugin/HolographicDisplays.java @@ -107,7 +107,7 @@ public class HolographicDisplays extends FCommonsPlugin { TickClock tickClock = new TickClock(); ActivePlaceholderTracker placeholderTracker = new ActivePlaceholderTracker(placeholderRegistry, tickClock); LineClickListener lineClickListener = new LineClickListener(); - lineTrackerManager = new LineTrackerManager(nmsManager, placeholderTracker, lineClickListener); + lineTrackerManager = new LineTrackerManager(nmsManager, placeholderTracker, lineClickListener, tickClock); internalHologramManager = new InternalHologramManager(lineTrackerManager); apiHologramManager = new APIHologramManager(lineTrackerManager); v2HologramManager = new V2HologramManager(lineTrackerManager); diff --git a/plugin/src/main/java/me/filoghost/holographicdisplays/plugin/hologram/tracking/ClickableLineTracker.java b/plugin/src/main/java/me/filoghost/holographicdisplays/plugin/hologram/tracking/ClickableLineTracker.java index 5175b23b..0f2a7105 100644 --- a/plugin/src/main/java/me/filoghost/holographicdisplays/plugin/hologram/tracking/ClickableLineTracker.java +++ b/plugin/src/main/java/me/filoghost/holographicdisplays/plugin/hologram/tracking/ClickableLineTracker.java @@ -10,6 +10,7 @@ import me.filoghost.holographicdisplays.nms.common.NMSManager; import me.filoghost.holographicdisplays.nms.common.entity.ClickableNMSPacketEntity; import me.filoghost.holographicdisplays.plugin.hologram.base.BaseClickableHologramLine; import me.filoghost.holographicdisplays.plugin.listener.LineClickListener; +import me.filoghost.holographicdisplays.plugin.tick.TickClock; import org.jetbrains.annotations.MustBeInvokedByOverriders; public abstract class ClickableLineTracker extends PositionBasedLineTracker { @@ -21,7 +22,8 @@ public abstract class ClickableLineTracker extends PositionBas private boolean spawnClickableEntity; private boolean spawnClickableEntityChanged; - public ClickableLineTracker(BaseClickableHologramLine line, NMSManager nmsManager, LineClickListener lineClickListener) { + public ClickableLineTracker(BaseClickableHologramLine line, NMSManager nmsManager, LineClickListener lineClickListener, TickClock tickClock) { + super(tickClock); this.clickableEntity = nmsManager.newClickablePacketEntity(); this.positionOffsetY = (line.getHeight() - ClickableNMSPacketEntity.SLIME_HEIGHT) / 2; this.lineClickListener = lineClickListener; diff --git a/plugin/src/main/java/me/filoghost/holographicdisplays/plugin/hologram/tracking/ItemLineTracker.java b/plugin/src/main/java/me/filoghost/holographicdisplays/plugin/hologram/tracking/ItemLineTracker.java index be2439d2..76c75bfa 100644 --- a/plugin/src/main/java/me/filoghost/holographicdisplays/plugin/hologram/tracking/ItemLineTracker.java +++ b/plugin/src/main/java/me/filoghost/holographicdisplays/plugin/hologram/tracking/ItemLineTracker.java @@ -10,6 +10,7 @@ import me.filoghost.holographicdisplays.nms.common.entity.ItemNMSPacketEntity; import me.filoghost.holographicdisplays.plugin.hologram.base.BaseItemHologramLine; import me.filoghost.holographicdisplays.plugin.listener.LineClickListener; import me.filoghost.holographicdisplays.plugin.tick.CachedPlayer; +import me.filoghost.holographicdisplays.plugin.tick.TickClock; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.MustBeInvokedByOverriders; @@ -27,8 +28,12 @@ public class ItemLineTracker extends ClickableLineTracker { private boolean spawnItemEntity; private boolean spawnItemEntityChanged; - public ItemLineTracker(BaseItemHologramLine line, NMSManager nmsManager, LineClickListener lineClickListener) { - super(line, nmsManager, lineClickListener); + public ItemLineTracker( + BaseItemHologramLine line, + NMSManager nmsManager, + LineClickListener lineClickListener, + TickClock tickClock) { + super(line, nmsManager, lineClickListener, tickClock); this.line = line; this.itemEntity = nmsManager.newItemPacketEntity(); } diff --git a/plugin/src/main/java/me/filoghost/holographicdisplays/plugin/hologram/tracking/LineTracker.java b/plugin/src/main/java/me/filoghost/holographicdisplays/plugin/hologram/tracking/LineTracker.java index 5475d6df..fb61decb 100644 --- a/plugin/src/main/java/me/filoghost/holographicdisplays/plugin/hologram/tracking/LineTracker.java +++ b/plugin/src/main/java/me/filoghost/holographicdisplays/plugin/hologram/tracking/LineTracker.java @@ -7,6 +7,7 @@ package me.filoghost.holographicdisplays.plugin.hologram.tracking; import me.filoghost.holographicdisplays.plugin.hologram.base.BaseHologramLine; import me.filoghost.holographicdisplays.plugin.tick.CachedPlayer; +import me.filoghost.holographicdisplays.plugin.tick.TickClock; import org.bukkit.entity.Player; import org.jetbrains.annotations.MustBeInvokedByOverriders; @@ -17,6 +18,9 @@ import java.util.Map; public abstract class LineTracker { + private static final int MODIFY_VIEWERS_INTERVAL_TICKS = 5; + + private final TickClock tickClock; private final Map viewers; private final Viewers iterableViewers; @@ -25,7 +29,8 @@ public abstract class LineTracker { */ private boolean lineChanged; - protected LineTracker() { + protected LineTracker(TickClock tickClock) { + this.tickClock = tickClock; this.viewers = new HashMap<>(); this.iterableViewers = new DelegateViewers<>(viewers.values()); } @@ -84,6 +89,11 @@ public abstract class LineTracker { return; } + // Add the identity hash code to avoid updating all the lines at the same time + if ((tickClock.getCurrentTick() + hashCode()) % MODIFY_VIEWERS_INTERVAL_TICKS != 0) { + return; + } + // Lazy initialization MutableViewers addedPlayers = null; MutableViewers removedPlayers = null; diff --git a/plugin/src/main/java/me/filoghost/holographicdisplays/plugin/hologram/tracking/LineTrackerManager.java b/plugin/src/main/java/me/filoghost/holographicdisplays/plugin/hologram/tracking/LineTrackerManager.java index 63cf44a6..def3b82e 100644 --- a/plugin/src/main/java/me/filoghost/holographicdisplays/plugin/hologram/tracking/LineTrackerManager.java +++ b/plugin/src/main/java/me/filoghost/holographicdisplays/plugin/hologram/tracking/LineTrackerManager.java @@ -11,6 +11,7 @@ import me.filoghost.holographicdisplays.plugin.hologram.base.BaseTextHologramLin import me.filoghost.holographicdisplays.plugin.listener.LineClickListener; import me.filoghost.holographicdisplays.plugin.placeholder.tracking.ActivePlaceholderTracker; import me.filoghost.holographicdisplays.plugin.tick.CachedPlayer; +import me.filoghost.holographicdisplays.plugin.tick.TickClock; import org.bukkit.entity.Player; import java.util.Collection; @@ -20,26 +21,32 @@ import java.util.List; public class LineTrackerManager { + private final TickClock tickClock; private final NMSManager nmsManager; private final ActivePlaceholderTracker placeholderTracker; private final LineClickListener lineClickListener; private final Collection> lineTrackers; - public LineTrackerManager(NMSManager nmsManager, ActivePlaceholderTracker placeholderTracker, LineClickListener lineClickListener) { + public LineTrackerManager( + NMSManager nmsManager, + ActivePlaceholderTracker placeholderTracker, + LineClickListener lineClickListener, + TickClock tickClock) { this.nmsManager = nmsManager; this.placeholderTracker = placeholderTracker; this.lineClickListener = lineClickListener; this.lineTrackers = new LinkedList<>(); + this.tickClock = tickClock; } public TextLineTracker startTracking(BaseTextHologramLine line) { - TextLineTracker tracker = new TextLineTracker(line, nmsManager, lineClickListener, placeholderTracker); + TextLineTracker tracker = new TextLineTracker(line, nmsManager, lineClickListener, placeholderTracker, tickClock); lineTrackers.add(tracker); return tracker; } public ItemLineTracker startTracking(BaseItemHologramLine line) { - ItemLineTracker tracker = new ItemLineTracker(line, nmsManager, lineClickListener); + ItemLineTracker tracker = new ItemLineTracker(line, nmsManager, lineClickListener, tickClock); lineTrackers.add(tracker); return tracker; } diff --git a/plugin/src/main/java/me/filoghost/holographicdisplays/plugin/hologram/tracking/PositionBasedLineTracker.java b/plugin/src/main/java/me/filoghost/holographicdisplays/plugin/hologram/tracking/PositionBasedLineTracker.java index 5925932b..9ea9b36b 100644 --- a/plugin/src/main/java/me/filoghost/holographicdisplays/plugin/hologram/tracking/PositionBasedLineTracker.java +++ b/plugin/src/main/java/me/filoghost/holographicdisplays/plugin/hologram/tracking/PositionBasedLineTracker.java @@ -7,6 +7,7 @@ package me.filoghost.holographicdisplays.plugin.hologram.tracking; import me.filoghost.holographicdisplays.common.PositionCoordinates; import me.filoghost.holographicdisplays.plugin.tick.CachedPlayer; +import me.filoghost.holographicdisplays.plugin.tick.TickClock; import org.bukkit.Location; import org.jetbrains.annotations.MustBeInvokedByOverriders; @@ -19,6 +20,10 @@ abstract class PositionBasedLineTracker extends LineTracker protected PositionCoordinates position; private boolean positionChanged; + protected PositionBasedLineTracker(TickClock tickClock) { + super(tickClock); + } + @MustBeInvokedByOverriders @Override protected void detectChanges() { diff --git a/plugin/src/main/java/me/filoghost/holographicdisplays/plugin/hologram/tracking/TextLineTracker.java b/plugin/src/main/java/me/filoghost/holographicdisplays/plugin/hologram/tracking/TextLineTracker.java index 8bd805b3..03cf09db 100644 --- a/plugin/src/main/java/me/filoghost/holographicdisplays/plugin/hologram/tracking/TextLineTracker.java +++ b/plugin/src/main/java/me/filoghost/holographicdisplays/plugin/hologram/tracking/TextLineTracker.java @@ -12,6 +12,7 @@ import me.filoghost.holographicdisplays.plugin.hologram.base.BaseTextHologramLin import me.filoghost.holographicdisplays.plugin.listener.LineClickListener; import me.filoghost.holographicdisplays.plugin.placeholder.tracking.ActivePlaceholderTracker; import me.filoghost.holographicdisplays.plugin.tick.CachedPlayer; +import me.filoghost.holographicdisplays.plugin.tick.TickClock; import org.jetbrains.annotations.MustBeInvokedByOverriders; import java.util.Objects; @@ -28,8 +29,9 @@ public class TextLineTracker extends ClickableLineTracker { BaseTextHologramLine line, NMSManager nmsManager, LineClickListener lineClickListener, - ActivePlaceholderTracker placeholderTracker) { - super(line, nmsManager, lineClickListener); + ActivePlaceholderTracker placeholderTracker, + TickClock tickClock) { + super(line, nmsManager, lineClickListener, tickClock); this.line = line; this.textEntity = nmsManager.newTextPacketEntity(); this.displayText = new DisplayText(placeholderTracker); diff --git a/plugin/src/test/java/me/filoghost/holographicdisplays/plugin/test/TestV2HologramManager.java b/plugin/src/test/java/me/filoghost/holographicdisplays/plugin/test/TestV2HologramManager.java index 64596aa8..590db163 100644 --- a/plugin/src/test/java/me/filoghost/holographicdisplays/plugin/test/TestV2HologramManager.java +++ b/plugin/src/test/java/me/filoghost/holographicdisplays/plugin/test/TestV2HologramManager.java @@ -9,13 +9,18 @@ import me.filoghost.holographicdisplays.plugin.api.v2.V2HologramManager; import me.filoghost.holographicdisplays.plugin.hologram.tracking.LineTrackerManager; import me.filoghost.holographicdisplays.plugin.listener.LineClickListener; import me.filoghost.holographicdisplays.plugin.placeholder.tracking.ActivePlaceholderTracker; +import me.filoghost.holographicdisplays.plugin.tick.TickClock; import static org.mockito.Mockito.*; public class TestV2HologramManager extends V2HologramManager { public TestV2HologramManager() { - super(new LineTrackerManager(new TestNMSManager(), mock(ActivePlaceholderTracker.class), new LineClickListener())); + super(new LineTrackerManager( + new TestNMSManager(), + mock(ActivePlaceholderTracker.class), + new LineClickListener(), + new TickClock())); } }