diff --git a/core/src/main/java/me/filoghost/holographicdisplays/core/tick/TickingTask.java b/core/src/main/java/me/filoghost/holographicdisplays/core/tick/TickingTask.java index 7dd30858..13213770 100644 --- a/core/src/main/java/me/filoghost/holographicdisplays/core/tick/TickingTask.java +++ b/core/src/main/java/me/filoghost/holographicdisplays/core/tick/TickingTask.java @@ -9,6 +9,7 @@ import me.filoghost.fcommons.logging.Log; import me.filoghost.holographicdisplays.core.tracking.LineTrackerManager; import me.filoghost.holographicdisplays.core.listener.LineClickListener; import me.filoghost.holographicdisplays.core.placeholder.tracking.ActivePlaceholderTracker; +import org.bukkit.Bukkit; import org.bukkit.entity.Player; import java.util.ArrayList; @@ -73,8 +74,11 @@ public class TickingTask implements Runnable { } } + // Holograms need to disappear before chunks (code taken from Bukkit) + int maxViewRange = (Bukkit.getViewDistance() - 1) * 16; + try { - lineTrackerManager.update(onlinePlayers, movedPlayers); + lineTrackerManager.update(onlinePlayers, movedPlayers, maxViewRange); } catch (Throwable t) { // Catch all types of Throwable because we're using NMS code if (tickClock.getCurrentTick() - lastErrorLogTick >= 20) { diff --git a/core/src/main/java/me/filoghost/holographicdisplays/core/tracking/ItemLineTracker.java b/core/src/main/java/me/filoghost/holographicdisplays/core/tracking/ItemLineTracker.java index d9594a21..e4585f63 100644 --- a/core/src/main/java/me/filoghost/holographicdisplays/core/tracking/ItemLineTracker.java +++ b/core/src/main/java/me/filoghost/holographicdisplays/core/tracking/ItemLineTracker.java @@ -43,8 +43,8 @@ public class ItemLineTracker extends ClickableLineTracker { @MustBeInvokedByOverriders @Override - protected void update(List onlinePlayers, List movedPlayers) { - super.update(onlinePlayers, movedPlayers); + protected void update(List onlinePlayers, List movedPlayers, int maxViewRange) { + super.update(onlinePlayers, movedPlayers, maxViewRange); if (spawnItemEntity && hasViewers() && line.hasPickupCallback()) { for (Viewer viewer : getViewers()) { diff --git a/core/src/main/java/me/filoghost/holographicdisplays/core/tracking/LineTracker.java b/core/src/main/java/me/filoghost/holographicdisplays/core/tracking/LineTracker.java index 9891365a..569f1a85 100644 --- a/core/src/main/java/me/filoghost/holographicdisplays/core/tracking/LineTracker.java +++ b/core/src/main/java/me/filoghost/holographicdisplays/core/tracking/LineTracker.java @@ -54,7 +54,7 @@ public abstract class LineTracker { } @MustBeInvokedByOverriders - protected void update(List onlinePlayers, List movedPlayers) { + protected void update(List onlinePlayers, List movedPlayers, int maxViewRange) { boolean sendChangesPackets = false; // First, detect the changes if the flag is on and set it off @@ -77,7 +77,7 @@ public abstract class LineTracker { } // Finally, add/remove viewers sending them the full spawn/destroy packets - modifyViewersAndSendPackets(onlinePlayers, movedPlayers); + modifyViewersAndSendPackets(onlinePlayers, movedPlayers, maxViewRange); if (sendChangesPackets) { clearDetectedChanges(); @@ -86,7 +86,7 @@ public abstract class LineTracker { protected abstract boolean updatePlaceholders(); - private void modifyViewersAndSendPackets(List onlinePlayers, List movedPlayers) { + private void modifyViewersAndSendPackets(List onlinePlayers, List movedPlayers, int maxViewRange) { if (!getLine().isInLoadedChunk()) { resetViewersAndSendDestroyPackets(); return; @@ -120,7 +120,7 @@ public abstract class LineTracker { for (int i = 0; i < size; i++) { CachedPlayer player = playersToCheck.get(i); Player bukkitPlayer = player.getBukkitPlayer(); - if (shouldTrackPlayer(player)) { + if (shouldTrackPlayer(player, maxViewRange)) { if (!viewers.containsKey(bukkitPlayer)) { T viewer = createViewer(player); viewers.put(bukkitPlayer, viewer); @@ -148,17 +148,22 @@ public abstract class LineTracker { } } - private boolean shouldTrackPlayer(CachedPlayer player) { + private boolean shouldTrackPlayer(CachedPlayer player, int maxViewRange) { Location playerLocation = player.getLocation(); if (playerLocation.getWorld() != getLine().getWorldIfLoaded()) { return false; } + double viewRange = getViewRange(); + if (viewRange > maxViewRange) { + viewRange = maxViewRange; + } + double diffX = Math.abs(playerLocation.getX() - positionCoordinates.getX()); double diffZ = Math.abs(playerLocation.getZ() - positionCoordinates.getZ()); - return diffX <= getViewRange() - && diffZ <= getViewRange() + return diffX <= viewRange + && diffZ <= viewRange && getLine().isVisibleTo(player.getBukkitPlayer()); } diff --git a/core/src/main/java/me/filoghost/holographicdisplays/core/tracking/LineTrackerManager.java b/core/src/main/java/me/filoghost/holographicdisplays/core/tracking/LineTrackerManager.java index a6158c8e..ee81fe5f 100644 --- a/core/src/main/java/me/filoghost/holographicdisplays/core/tracking/LineTrackerManager.java +++ b/core/src/main/java/me/filoghost/holographicdisplays/core/tracking/LineTrackerManager.java @@ -47,7 +47,7 @@ public class LineTrackerManager { return tracker; } - public void update(List onlinePlayers, List movedPlayers) { + public void update(List onlinePlayers, List movedPlayers, int maxViewRange) { Iterator> iterator = lineTrackers.iterator(); while (iterator.hasNext()) { LineTracker lineTracker = iterator.next(); @@ -59,7 +59,7 @@ public class LineTrackerManager { continue; } - lineTracker.update(onlinePlayers, movedPlayers); + lineTracker.update(onlinePlayers, movedPlayers, maxViewRange); } }