HolographicDisplays/core/src/main/java/me/filoghost/holographicdisplays/core/tick/TickingTask.java

94 lines
3.0 KiB
Java

/*
* Copyright (C) filoghost and contributors
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package me.filoghost.holographicdisplays.core.tick;
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.entity.Player;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class TickingTask implements Runnable {
private final TickClock tickClock;
private final ActivePlaceholderTracker placeholderTracker;
private final LineTrackerManager lineTrackerManager;
private final LineClickListener lineClickListener;
private final List<CachedPlayer> onlinePlayers;
private long lastErrorLogTick;
public TickingTask(
TickClock tickClock,
ActivePlaceholderTracker placeholderTracker,
LineTrackerManager lineTrackerManager,
LineClickListener lineClickListener) {
this.tickClock = tickClock;
this.placeholderTracker = placeholderTracker;
this.lineTrackerManager = lineTrackerManager;
this.lineClickListener = lineClickListener;
this.onlinePlayers = new ArrayList<>();
}
public void onPlayerJoin(Player player) {
onlinePlayers.add(new CachedPlayer(player));
}
public void onPlayerQuit(Player player) {
Iterator<CachedPlayer> iterator = onlinePlayers.iterator();
while (iterator.hasNext()) {
if (iterator.next().getBukkitPlayer() == player) {
iterator.remove();
break;
}
}
lineTrackerManager.removeViewer(player);
}
public void onPlayerRespawn(Player player) {
lineTrackerManager.removeViewer(player);
}
@Override
public void run() {
tickClock.incrementTick();
// Remove outdated entries before using them from line trackers
placeholderTracker.clearOutdatedEntries();
List<CachedPlayer> movedPlayers = new ArrayList<>();
for (CachedPlayer onlinePlayer : onlinePlayers) {
boolean moved = onlinePlayer.onTick();
if (moved) {
movedPlayers.add(onlinePlayer);
}
}
try {
lineTrackerManager.update(onlinePlayers, movedPlayers);
} catch (Throwable t) {
// Catch all types of Throwable because we're using NMS code
if (tickClock.getCurrentTick() - lastErrorLogTick >= 20) {
// Avoid spamming the console, log the error at most once every 20 ticks
lastErrorLogTick = tickClock.getCurrentTick();
Log.severe("Error while ticking holograms", t);
}
}
// Remove placeholders which were not used by line trackers
placeholderTracker.clearInactivePlaceholders();
lineClickListener.processQueuedClickEvents();
}
}