package io.github.lucaseasedup.logit.tab; import io.github.lucaseasedup.logit.LogItCoreObject; import io.github.lucaseasedup.logit.common.Wrapper; import io.github.lucaseasedup.logit.config.TimeUnit; import io.github.lucaseasedup.logit.craftreflect.CraftPlayer; import io.github.lucaseasedup.logit.craftreflect.CraftReflect; import io.github.lucaseasedup.logit.craftreflect.EntityPlayer; import io.github.lucaseasedup.logit.session.SessionStartEvent; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.scheduler.BukkitRunnable; import org.mcsg.double0negative.tabapi.TabAPI; public final class TabListUpdater extends LogItCoreObject implements Runnable, Listener { public TabListUpdater(Wrapper<TabAPI> tabApiWrapper, CraftReflect craftReflect) { if (tabApiWrapper == null) throw new IllegalArgumentException(); this.tabApiWrapper = tabApiWrapper; this.craftReflect = craftReflect; } @Override public void run() { updateAllTabLists(); } public void updateAllTabLists() { for (Player player : Bukkit.getOnlinePlayers()) { updateTabList(player); } } private void updateTabList(Player player) { if (player == null) throw new IllegalArgumentException(); if (getTabApi() == null) return; getTabApi().clearTab(player); int horizSize = getTabApi().getHorizSize(); int vertSize = getTabApi().getVertSize(); int i = 0; int j = 0; for (Player p : Bukkit.getOnlinePlayers()) { if (!getSessionManager().isSessionAlive(p) && !p.equals(player) && getConfig("config.yml").getBoolean("forceLogin.hideFromTabList")) { continue; } int ping; if (craftReflect == null) { ping = 0; } else { CraftPlayer craftPlayer = craftReflect.getCraftPlayer(p); EntityPlayer entityPlayer = craftPlayer.getHandle(); ping = entityPlayer.getPing(); } getTabApi().setTabString(player, j, i, p.getPlayerListName(), ping); i++; if (i >= horizSize) { i = 0; j++; } if (j >= vertSize) { break; } } getTabApi().updatePlayer(player); getTabApi().setPriority(player, 1); } @EventHandler(priority = EventPriority.NORMAL) private void onPlayerJoin(PlayerJoinEvent event) { new BukkitRunnable() { @Override public void run() { updateAllTabLists(); } }.runTaskLater(getPlugin(), 1L); } @EventHandler(priority = EventPriority.NORMAL) private void onPlayerQuit(PlayerQuitEvent event) { new BukkitRunnable() { @Override public void run() { updateAllTabLists(); } }.runTaskLater(getPlugin(), 1L); } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) private void onSessionStart(SessionStartEvent event) { new BukkitRunnable() { @Override public void run() { updateAllTabLists(); } }.runTaskLater(getPlugin(), 1L); } private TabAPI getTabApi() { return tabApiWrapper.get(); } /** * Recommended task period of {@code TabListUpdater} running as a Bukkit task. */ public static final long TASK_PERIOD = TimeUnit.SECONDS.convertTo(2, TimeUnit.TICKS); private Wrapper<TabAPI> tabApiWrapper; private final CraftReflect craftReflect; }