package com.thatgravyboat.skyblockhud; import com.google.common.collect.ComparisonChain; import com.google.common.collect.Ordering; import com.thatgravyboat.skyblockhud.dungeons.DungeonHandler; import com.thatgravyboat.skyblockhud.location.*; import com.thatgravyboat.skyblockhud.seasons.SeasonDateHandler; import java.util.Comparator; import java.util.List; import java.util.regex.Pattern; import net.minecraft.client.Minecraft; import net.minecraft.client.network.NetworkPlayerInfo; import net.minecraft.scoreboard.ScorePlayerTeam; import net.minecraft.world.WorldSettings; import net.minecraftforge.client.GuiIngameForge; import net.minecraftforge.client.event.ClientChatReceivedEvent; import net.minecraftforge.fml.common.eventhandler.EventPriority; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.TickEvent; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; public class ComponentHandler { public static final Pattern SCOREBOARD_CHARACTERS = Pattern.compile("[^]\\[a-z A-Z:0-9/'.()+\\d-ยง?]"); private static final Ordering sortingList = Ordering.from(new PlayerComparator()); private static int ticksExisted = 0; @SubscribeEvent public void onClientTick(TickEvent.ClientTickEvent event) { Minecraft mc = Minecraft.getMinecraft(); ticksExisted++; boolean eventPass = false; if (mc.theWorld != null) { List players = sortingList.sortedCopy(mc.thePlayer.sendQueue.getPlayerInfoMap()); GuiIngameForge.renderObjective = !SkyblockHud.hasSkyblockScoreboard() || !SkyblockHud.config.misc.hideScoreboard; if (players != null && SkyblockHud.hasSkyblockScoreboard()) { if (ticksExisted % 60 == 0) { for (NetworkPlayerInfo player : players) { if (player.getDisplayName() != null) { String formattedTabListPlayer = SCOREBOARD_CHARACTERS .matcher(Utils.removeColor(player.getDisplayName().getFormattedText())) .replaceAll(""); if (LocationHandler.getCurrentLocation().equals(Locations.CATACOMBS)) { if ( formattedTabListPlayer.toLowerCase().contains("secrets found:") ) DungeonHandler.parseTotalSecrets(formattedTabListPlayer); if ( formattedTabListPlayer.toLowerCase().contains("deaths:") ) DungeonHandler.parseDeaths(formattedTabListPlayer); if ( formattedTabListPlayer.toLowerCase().contains("crypts:") ) DungeonHandler.parseCrypts(formattedTabListPlayer); } else if ( LocationHandler.getCurrentLocation().getCategory().equals(LocationCategory.DWARVENMINES) ) { if (formattedTabListPlayer.toLowerCase().contains("mithril powder:")) { DwarvenMineHandler.parseMithril(formattedTabListPlayer); } } else if ( LocationHandler .getCurrentLocation() .getCategory() .equals(LocationCategory.MUSHROOMDESERT) ) { if (formattedTabListPlayer.toLowerCase().contains("pelts:")) { try { FarmingIslandHandler.pelts = Integer.parseInt( formattedTabListPlayer.toLowerCase().replace("pelts:", "").trim() ); } catch (Exception ignored) {} } } } } if (players.size() > 80) { for (int i = 61; i <= 80; i++) { if (players.get(i).getDisplayName() != null) { String formattedTabListPlayer = SCOREBOARD_CHARACTERS .matcher(Utils.removeColor(players.get(i).getDisplayName().getFormattedText())) .replaceAll(""); if (formattedTabListPlayer.toLowerCase().contains("event:")) { if (i < 80) { if (players.get(i + 1).getDisplayName() != null) { String secondLine = SCOREBOARD_CHARACTERS .matcher( Utils.removeColor( players.get(i + 1).getDisplayName().getFormattedText() ) ) .replaceAll(""); SeasonDateHandler.setCurrentEvent( formattedTabListPlayer.replace("Event:", ""), secondLine ); eventPass = true; } } } } if (i == 80 && !eventPass) { SeasonDateHandler.setCurrentEvent("", ""); } } } } if (LocationHandler.getCurrentLocation().getCategory().equals(LocationCategory.PARK)) { if (players.size() >= 80) { for (int i = 41; i <= 60; i++) { if (players.get(i).getDisplayName() != null) { String formattedTabListPlayer = SCOREBOARD_CHARACTERS .matcher(Utils.removeColor(players.get(i).getDisplayName().getFormattedText())) .replaceAll(""); if (LocationHandler.getCurrentLocation().getCategory().equals(LocationCategory.PARK)) { if (formattedTabListPlayer.toLowerCase().contains("rain:")) { ParkIslandHandler.parseRain(formattedTabListPlayer.toLowerCase()); } } } } } } else if (ParkIslandHandler.isRaining()) { ParkIslandHandler.parseRain(null); } } } } @SubscribeEvent(priority = EventPriority.HIGHEST) public void onStatusBar(ClientChatReceivedEvent event) { if (event.type == 2) { if (LocationHandler.getCurrentLocation().equals(Locations.CATACOMBS)) DungeonHandler.parseSecrets( event.message.getFormattedText() ); } } @SideOnly(Side.CLIENT) static class PlayerComparator implements Comparator { private PlayerComparator() {} public int compare(NetworkPlayerInfo p_compare_1_, NetworkPlayerInfo p_compare_2_) { ScorePlayerTeam scoreplayerteam = p_compare_1_.getPlayerTeam(); ScorePlayerTeam scoreplayerteam1 = p_compare_2_.getPlayerTeam(); return ComparisonChain .start() .compareTrueFirst( p_compare_1_.getGameType() != WorldSettings.GameType.SPECTATOR, p_compare_2_.getGameType() != WorldSettings.GameType.SPECTATOR ) .compare( scoreplayerteam != null ? scoreplayerteam.getRegisteredName() : "", scoreplayerteam1 != null ? scoreplayerteam1.getRegisteredName() : "" ) .compare(p_compare_1_.getGameProfile().getName(), p_compare_2_.getGameProfile().getName()) .result(); } } }