From 4b6f8e059e8417c14fc5e93a6bda55526986f646 Mon Sep 17 00:00:00 2001 From: syeyoung Date: Sun, 22 Jan 2023 16:31:36 +0900 Subject: - parallel universe (process stuff based on packets) => Now there wouldn't be mod conflicts on tablist, scoreboard, and teams - Fixes Bettermap Incompatibility #79 Signed-off-by: syeyoung --- .../syeyoung/dungeonsguide/mod/DungeonsGuide.java | 9 +- .../syeyoung/dungeonsguide/mod/SkyblockStatus.java | 25 +- .../dungeonsguide/mod/chat/ChatTransmitter.java | 2 +- .../dungeonsguide/mod/commands/CommandDgDebug.java | 26 +- .../mod/cosmetics/CustomPacketPlayerListItem.java | 39 --- .../mod/events/impl/PacketProcessedEvent.java | 39 +++ .../mod/events/impl/RawPacketReceivedEvent.java | 29 ++ .../mod/events/listener/DungeonListener.java | 7 + .../mod/events/listener/PacketInjector.java | 92 +++++++ .../mod/events/listener/PacketListener.java | 306 +++++++++++---------- .../mod/events/listener/WrappedPacket.java | 63 +++++ .../features/impl/advanced/FeatureTestPepole.java | 25 +- .../impl/dungeon/FeatureDungeonDeaths.java | 6 +- .../features/impl/dungeon/FeatureDungeonMap.java | 43 ++- .../impl/dungeon/FeatureDungeonMilestone.java | 6 +- .../features/impl/dungeon/FeatureDungeonScore.java | 10 +- .../impl/dungeon/FeatureDungeonSecrets.java | 10 +- .../features/impl/dungeon/FeatureDungeonTombs.java | 6 +- .../impl/dungeon/FeatureWarnLowHealth.java | 13 +- .../features/impl/etc/FeatureEpicCountdown.java | 22 +- .../dungeonsguide/mod/parallelUniverse/README.md | 1 + .../mod/parallelUniverse/scoreboard/Objective.java | 62 +++++ .../mod/parallelUniverse/scoreboard/Score.java | 44 +++ .../scoreboard/ScoreboardManager.java | 71 +++++ .../mod/parallelUniverse/tab/TabList.java | 86 ++++++ .../mod/parallelUniverse/tab/TabListEntry.java | 135 +++++++++ .../parallelUniverse/teams/NameTagVisibility.java | 33 +++ .../mod/parallelUniverse/teams/Team.java | 56 ++++ .../mod/parallelUniverse/teams/TeamManager.java | 89 ++++++ .../dungeonsguide/mod/utils/ScoreBoardUtils.java | 76 ----- .../dungeonsguide/mod/utils/TabListUtil.java | 31 +-- 31 files changed, 1084 insertions(+), 378 deletions(-) delete mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/cosmetics/CustomPacketPlayerListItem.java create mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/events/impl/PacketProcessedEvent.java create mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/events/impl/RawPacketReceivedEvent.java create mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/events/listener/PacketInjector.java create mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/events/listener/WrappedPacket.java create mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/parallelUniverse/README.md create mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/parallelUniverse/scoreboard/Objective.java create mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/parallelUniverse/scoreboard/Score.java create mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/parallelUniverse/scoreboard/ScoreboardManager.java create mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/parallelUniverse/tab/TabList.java create mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/parallelUniverse/tab/TabListEntry.java create mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/parallelUniverse/teams/NameTagVisibility.java create mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/parallelUniverse/teams/Team.java create mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/parallelUniverse/teams/TeamManager.java delete mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/utils/ScoreBoardUtils.java (limited to 'mod/src/main/java/kr') diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/DungeonsGuide.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/DungeonsGuide.java index cc380f0a..9cd0af73 100755 --- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/DungeonsGuide.java +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/DungeonsGuide.java @@ -33,6 +33,7 @@ import kr.syeyoung.dungeonsguide.mod.discord.DiscordIntegrationManager; import kr.syeyoung.dungeonsguide.mod.dungeon.DungeonFacade; import kr.syeyoung.dungeonsguide.mod.events.annotations.EventHandlerRegistry; import kr.syeyoung.dungeonsguide.mod.events.listener.DungeonListener; +import kr.syeyoung.dungeonsguide.mod.events.listener.PacketInjector; import kr.syeyoung.dungeonsguide.mod.events.listener.PacketListener; import kr.syeyoung.dungeonsguide.mod.features.FeatureRegistry; import kr.syeyoung.dungeonsguide.mod.guiv2.elements.richtext.fonts.DefaultFontRenderer; @@ -156,7 +157,7 @@ public class DungeonsGuide implements DGInterface { } - private PacketListener packetListener; + private PacketInjector packetInjector; public void init(File f) { ProgressManager.ProgressBar progressbar = ProgressManager.push("DungeonsGuide", 4); @@ -220,8 +221,8 @@ public class DungeonsGuide implements DGInterface { registerEventsForge(commandReparty = new CommandReparty()); -// registerEventsForge(new FeatureListener()); - registerEventsForge(packetListener = new PacketListener()); + registerEventsForge(packetInjector = new PacketInjector()); + registerEventsForge(new PacketListener()); registerEventsForge(new Keybinds()); registerEventsForge(PartyManager.INSTANCE); @@ -317,7 +318,7 @@ public class DungeonsGuide implements DGInterface { commands.remove(registeredCommand); } - if (packetListener != null) packetListener.cleanup(); + if (packetInjector != null) packetInjector.cleanup(); try { EntityPlayerSP ep = (EntityPlayerSP) Minecraft.getMinecraft().getRenderManager().livingPlayer; diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/SkyblockStatus.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/SkyblockStatus.java index 960c927a..dc48415f 100755 --- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/SkyblockStatus.java +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/SkyblockStatus.java @@ -24,14 +24,13 @@ import kr.syeyoung.dungeonsguide.mod.events.impl.DungeonLeftEvent; import kr.syeyoung.dungeonsguide.mod.events.impl.HypixelJoinedEvent; import kr.syeyoung.dungeonsguide.mod.events.impl.SkyblockJoinedEvent; import kr.syeyoung.dungeonsguide.mod.events.impl.SkyblockLeftEvent; +import kr.syeyoung.dungeonsguide.mod.parallelUniverse.scoreboard.Objective; +import kr.syeyoung.dungeonsguide.mod.parallelUniverse.scoreboard.Score; +import kr.syeyoung.dungeonsguide.mod.parallelUniverse.scoreboard.ScoreboardManager; import kr.syeyoung.dungeonsguide.mod.utils.TextUtils; import lombok.Getter; import lombok.Setter; import net.minecraft.client.Minecraft; -import net.minecraft.scoreboard.Score; -import net.minecraft.scoreboard.ScoreObjective; -import net.minecraft.scoreboard.ScorePlayerTeam; -import net.minecraft.scoreboard.Scoreboard; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.TickEvent; @@ -111,11 +110,10 @@ public class SkyblockStatus { return; } - Scoreboard scoreboard = Minecraft.getMinecraft().thePlayer.getWorldScoreboard(); - ScoreObjective scoreObjective = scoreboard.getObjectiveInDisplaySlot(1); - if (scoreObjective == null) return; + Objective objective = ScoreboardManager.INSTANCE.getSidebarObjective(); + if (objective == null) return; - String objectiveName = TextUtils.stripColor(scoreObjective.getDisplayName()); + String objectiveName = TextUtils.stripColor(objective.getDisplayName()); boolean skyblockFound = false; for (String skyblock : SKYBLOCK_IN_ALL_LANGUAGES) { if (objectiveName.startsWith(skyblock)) { @@ -131,20 +129,21 @@ public class SkyblockStatus { return; } - Collection scores = scoreboard.getSortedScores(scoreObjective); + Collection scores = objective.getScores(); boolean foundDungeon = false; for (Score sc : scores) { - ScorePlayerTeam scorePlayerTeam = scoreboard.getPlayersTeam(sc.getPlayerName()); - String strippedLine = TextUtils.keepScoreboardCharacters(TextUtils.stripColor(ScorePlayerTeam.formatPlayerName(scorePlayerTeam, sc.getPlayerName()))).trim(); + String strippedLine = TextUtils.keepScoreboardCharacters( + TextUtils.stripColor(sc.getJustTeam())).trim(); if (strippedLine.contains("Cleared: ")) { foundDungeon = true; DungeonContext context = DungeonsGuide.getDungeonsGuide().getDungeonFacade().getContext(); if(context != null){ - context.setPercentage(Integer.parseInt(strippedLine.substring(9).split(" ")[0])); + context.setPercentage(Integer.parseInt( + strippedLine.substring(9).split(" ")[0])); } } - if (ScorePlayerTeam.formatPlayerName(scorePlayerTeam, sc.getPlayerName()).startsWith(" §7⏣")) { + if (sc.getJustTeam().startsWith(" §7⏣")) { DungeonContext.setDungeonName(strippedLine.trim()); } } diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/chat/ChatTransmitter.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/chat/ChatTransmitter.java index 69518af8..7fefe9d7 100644 --- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/chat/ChatTransmitter.java +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/chat/ChatTransmitter.java @@ -71,7 +71,7 @@ public class ChatTransmitter { public void onTick(TickEvent.ClientTickEvent clientTickEvent) { if(clientTickEvent.phase != TickEvent.Phase.START && Minecraft.getMinecraft().thePlayer == null) return; - if (!receiveQueue.isEmpty()) { + while (!receiveQueue.isEmpty() && Minecraft.getMinecraft().thePlayer != null) { ClientChatReceivedEvent event = new ClientChatReceivedEvent((byte) 1, receiveQueue.poll()); MinecraftForge.EVENT_BUS.post(event); if (!event.isCanceled()) { diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/commands/CommandDgDebug.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/commands/CommandDgDebug.java index 620f4e75..45eb7dd2 100644 --- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/commands/CommandDgDebug.java +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/commands/CommandDgDebug.java @@ -40,23 +40,30 @@ import kr.syeyoung.dungeonsguide.mod.dungeon.roomprocessor.bossfight.BossfightPr import kr.syeyoung.dungeonsguide.mod.events.impl.DungeonLeftEvent; import kr.syeyoung.dungeonsguide.mod.features.AbstractFeature; import kr.syeyoung.dungeonsguide.mod.features.FeatureRegistry; +import kr.syeyoung.dungeonsguide.mod.features.impl.dungeon.FeatureDungeonMap; import kr.syeyoung.dungeonsguide.mod.guiv2.GuiScreenAdapter; import kr.syeyoung.dungeonsguide.mod.guiv2.view.TestView; +import kr.syeyoung.dungeonsguide.mod.parallelUniverse.scoreboard.Score; +import kr.syeyoung.dungeonsguide.mod.parallelUniverse.scoreboard.ScoreboardManager; +import kr.syeyoung.dungeonsguide.mod.parallelUniverse.tab.TabList; +import kr.syeyoung.dungeonsguide.mod.parallelUniverse.tab.TabListEntry; import kr.syeyoung.dungeonsguide.mod.party.PartyContext; import kr.syeyoung.dungeonsguide.mod.party.PartyManager; import kr.syeyoung.dungeonsguide.mod.utils.AhUtils; import kr.syeyoung.dungeonsguide.mod.utils.MapUtils; -import kr.syeyoung.dungeonsguide.mod.utils.ScoreBoardUtils; import kr.syeyoung.dungeonsguide.mod.utils.ShortUtils; +import kr.syeyoung.dungeonsguide.mod.utils.TabListUtil; import kr.syeyoung.dungeonsguide.mod.wsresource.StaticResourceCache; import net.minecraft.block.Block; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.EntityPlayerSP; +import net.minecraft.client.network.NetworkPlayerInfo; import net.minecraft.command.CommandBase; import net.minecraft.command.CommandException; import net.minecraft.command.ICommandSender; import net.minecraft.nbt.CompressedStreamTools; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.scoreboard.ScorePlayerTeam; import net.minecraft.server.MinecraftServer; import net.minecraft.util.BlockPos; import net.minecraft.util.ChatComponentText; @@ -96,13 +103,18 @@ public class CommandDgDebug extends CommandBase { if ("scoreboard".equals(arg)) { - ScoreBoardUtils.forEachLine(l -> { - ChatTransmitter.addToQueue("LINE: " + l, false); - }); + for (Score score : ScoreboardManager.INSTANCE.getSidebarObjective().getScores()) { + ChatTransmitter.addToQueue("LINE: " + score.getVisibleName()+": "+score.getScore()); + } } else if ("scoreboardclean".equals(arg)) { - ScoreBoardUtils.forEachLineClean(l -> { - ChatTransmitter.addToQueue("LINE: " + l, false); - }); + for (Score score : ScoreboardManager.INSTANCE.getSidebarObjective().getScores()) { + ChatTransmitter.addToQueue("LINE: " + score.getJustTeam()+": "+score.getScore()); + } + }else if ("tablist".equals(arg)) { + for (TabListEntry entry : TabList.INSTANCE.getTabListEntries()) { + ChatTransmitter.addToQueue(entry.getFormatted()+" "+entry.getEffectiveName()+"("+entry.getPing()+")" + entry.getGamemode()); + } + ChatTransmitter.addToQueue("VS"); } else if ("mockdungeonstart".equals(arg)) { if (!Minecraft.getMinecraft().isSingleplayer()) { ChatTransmitter.addToQueue("This only works in singlepauer", false); diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/cosmetics/CustomPacketPlayerListItem.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/cosmetics/CustomPacketPlayerListItem.java deleted file mode 100644 index 7cf0b6cf..00000000 --- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/cosmetics/CustomPacketPlayerListItem.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Dungeons Guide - The most intelligent Hypixel Skyblock Dungeons Mod - * Copyright (C) 2021 cyoung06 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package kr.syeyoung.dungeonsguide.mod.cosmetics; - - -import kr.syeyoung.dungeonsguide.mod.events.impl.PlayerListItemPacketEvent; -import net.minecraft.network.play.INetHandlerPlayClient; -import net.minecraft.network.play.server.S38PacketPlayerListItem; -import net.minecraftforge.common.MinecraftForge; - -public class CustomPacketPlayerListItem extends S38PacketPlayerListItem { - public CustomPacketPlayerListItem(S38PacketPlayerListItem packet) { - super(packet.getAction()); - getEntries().addAll(packet.getEntries()); - } - - @Override - public void processPacket(INetHandlerPlayClient handler) { - super.processPacket(handler); - - MinecraftForge.EVENT_BUS.post(new PlayerListItemPacketEvent(this)); - } -} diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/events/impl/PacketProcessedEvent.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/events/impl/PacketProcessedEvent.java new file mode 100644 index 00000000..2178fc03 --- /dev/null +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/events/impl/PacketProcessedEvent.java @@ -0,0 +1,39 @@ +/* + * Dungeons Guide - The most intelligent Hypixel Skyblock Dungeons Mod + * Copyright (C) 2023 cyoung06 (syeyoung) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package kr.syeyoung.dungeonsguide.mod.events.impl; + +import lombok.AllArgsConstructor; +import net.minecraft.network.Packet; +import net.minecraft.network.play.INetHandlerPlayClient; +import net.minecraftforge.fml.common.eventhandler.Event; + +@AllArgsConstructor +public abstract class PacketProcessedEvent extends Event { + public Packet packet; + public static class Pre extends PacketProcessedEvent { + public Pre(Packet packet) { + super(packet); + } + }; + public static class Post extends PacketProcessedEvent { + public Post(Packet packet) { + super(packet); + } + }; +} diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/events/impl/RawPacketReceivedEvent.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/events/impl/RawPacketReceivedEvent.java new file mode 100644 index 00000000..efeb8eeb --- /dev/null +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/events/impl/RawPacketReceivedEvent.java @@ -0,0 +1,29 @@ +/* + * Dungeons Guide - The most intelligent Hypixel Skyblock Dungeons Mod + * Copyright (C) 2023 cyoung06 (syeyoung) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package kr.syeyoung.dungeonsguide.mod.events.impl; + +import lombok.AllArgsConstructor; +import net.minecraft.network.Packet; +import net.minecraft.network.play.INetHandlerPlayClient; +import net.minecraftforge.fml.common.eventhandler.Event; + +@AllArgsConstructor +public class RawPacketReceivedEvent extends Event { + public Packet packet; +} diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/events/listener/DungeonListener.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/events/listener/DungeonListener.java index c36fac6d..d29f1084 100755 --- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/events/listener/DungeonListener.java +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/events/listener/DungeonListener.java @@ -35,6 +35,9 @@ import kr.syeyoung.dungeonsguide.mod.dungeon.roomfinder.DungeonRoom; import kr.syeyoung.dungeonsguide.mod.dungeon.roomprocessor.RoomProcessor; import kr.syeyoung.dungeonsguide.mod.events.impl.*; import kr.syeyoung.dungeonsguide.mod.features.FeatureRegistry; +import kr.syeyoung.dungeonsguide.mod.parallelUniverse.scoreboard.ScoreboardManager; +import kr.syeyoung.dungeonsguide.mod.parallelUniverse.tab.TabList; +import kr.syeyoung.dungeonsguide.mod.parallelUniverse.teams.TeamManager; import kr.syeyoung.dungeonsguide.mod.utils.MapUtils; import kr.syeyoung.dungeonsguide.mod.utils.RenderUtils; import lombok.Getter; @@ -43,6 +46,7 @@ import net.minecraft.client.entity.EntityPlayerSP; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.entity.passive.EntityBat; +import net.minecraft.scoreboard.Scoreboard; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.BlockPos; import net.minecraft.util.ChatComponentText; @@ -74,6 +78,9 @@ public class DungeonListener { @SubscribeEvent public void onWorldLoad(WorldEvent.Unload event) { + TabList.INSTANCE.clear(); + TeamManager.INSTANCE.clear(); + ScoreboardManager.INSTANCE.clear(); try { Config.saveConfig(); } catch (IOException e) { diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/events/listener/PacketInjector.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/events/listener/PacketInjector.java new file mode 100644 index 00000000..a18a3641 --- /dev/null +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/events/listener/PacketInjector.java @@ -0,0 +1,92 @@ +/* + * Dungeons Guide - The most intelligent Hypixel Skyblock Dungeons Mod + * Copyright (C) 2021 cyoung06 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package kr.syeyoung.dungeonsguide.mod.events.listener; + +import io.netty.channel.*; +import kr.syeyoung.dungeonsguide.mod.events.impl.*; +import net.minecraft.client.Minecraft; +import net.minecraft.network.Packet; +import net.minecraft.network.play.client.C02PacketUseEntity; +import net.minecraft.network.play.server.*; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.network.FMLNetworkEvent; + +import java.util.HashSet; +import java.util.Set; + +@ChannelHandler.Sharable +public class PacketInjector extends ChannelDuplexHandler { + + private static Set targettedPackets = new HashSet<>(); + static { + targettedPackets.add(S04PacketEntityEquipment.class); + targettedPackets.add(S45PacketTitle.class); + targettedPackets.add(S38PacketPlayerListItem.class); + targettedPackets.add(S30PacketWindowItems.class); + targettedPackets.add(S2FPacketSetSlot.class); + targettedPackets.add(S23PacketBlockChange.class); + targettedPackets.add(S22PacketMultiBlockChange.class); + targettedPackets.add(S3BPacketScoreboardObjective.class); + targettedPackets.add(S3CPacketUpdateScore.class); + targettedPackets.add(S3DPacketDisplayScoreboard.class); + targettedPackets.add(S3EPacketTeams.class); + } + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + Packet packet = (Packet) msg; + if (targettedPackets.contains(msg.getClass())) { + RawPacketReceivedEvent receivedEvent = new RawPacketReceivedEvent(packet); + MinecraftForge.EVENT_BUS.post(receivedEvent); + packet = new WrappedPacket(receivedEvent.packet); + } + super.channelRead(ctx, packet); + } + + @Override + public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception { + Packet packet = (Packet) msg; + if (packet instanceof C02PacketUseEntity) { + C02PacketUseEntity packet2 = (C02PacketUseEntity) packet; + PlayerInteractEntityEvent piee; + if (packet2.getAction() == C02PacketUseEntity.Action.ATTACK) + piee = new PlayerInteractEntityEvent(true, packet2.getEntityFromWorld(Minecraft.getMinecraft().theWorld)); + else + piee = new PlayerInteractEntityEvent(false, ((C02PacketUseEntity) packet).getEntityFromWorld(Minecraft.getMinecraft().theWorld)); + + if (MinecraftForge.EVENT_BUS.post(piee)) return; + } + super.write(ctx, msg, promise); + } + + private ChannelPipeline thePipeline; + @SubscribeEvent + public void onServerConnect(FMLNetworkEvent.ClientConnectedToServerEvent event) { + (thePipeline =event.manager.channel().pipeline()).addBefore("packet_handler", "dg_packet_handler", this); + } + + public void cleanup() { + try { + if (thePipeline != null) + thePipeline.remove("dg_packet_handler"); + } catch (Exception e) { + + } + } +} diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/events/listener/PacketListener.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/events/listener/PacketListener.java index dcdc2c53..2012f129 100644 --- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/events/listener/PacketListener.java +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/events/listener/PacketListener.java @@ -1,6 +1,6 @@ /* * Dungeons Guide - The most intelligent Hypixel Skyblock Dungeons Mod - * Copyright (C) 2021 cyoung06 + * Copyright (C) 2023 cyoung06 (syeyoung) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published @@ -18,181 +18,193 @@ package kr.syeyoung.dungeonsguide.mod.events.listener; -import io.netty.channel.*; import kr.syeyoung.dungeonsguide.mod.DungeonsGuide; import kr.syeyoung.dungeonsguide.mod.SkyblockStatus; -import kr.syeyoung.dungeonsguide.mod.cosmetics.CustomPacketPlayerListItem; -import kr.syeyoung.dungeonsguide.mod.events.impl.BlockUpdateEvent; -import kr.syeyoung.dungeonsguide.mod.events.impl.PlayerInteractEntityEvent; -import kr.syeyoung.dungeonsguide.mod.events.impl.TitleEvent; -import kr.syeyoung.dungeonsguide.mod.events.impl.WindowUpdateEvent; +import kr.syeyoung.dungeonsguide.mod.events.impl.*; import kr.syeyoung.dungeonsguide.mod.features.FeatureRegistry; -import net.minecraft.block.state.IBlockState; +import kr.syeyoung.dungeonsguide.mod.parallelUniverse.scoreboard.Objective; +import kr.syeyoung.dungeonsguide.mod.parallelUniverse.scoreboard.ScoreboardManager; +import kr.syeyoung.dungeonsguide.mod.parallelUniverse.tab.TabList; +import kr.syeyoung.dungeonsguide.mod.parallelUniverse.tab.TabListEntry; +import kr.syeyoung.dungeonsguide.mod.parallelUniverse.teams.NameTagVisibility; +import kr.syeyoung.dungeonsguide.mod.parallelUniverse.teams.Team; +import kr.syeyoung.dungeonsguide.mod.parallelUniverse.teams.TeamManager; import net.minecraft.client.Minecraft; import net.minecraft.network.Packet; -import net.minecraft.network.play.INetHandlerPlayClient; -import net.minecraft.network.play.client.C02PacketUseEntity; import net.minecraft.network.play.server.*; -import net.minecraft.util.BlockPos; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.Tuple; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.fml.common.network.FMLNetworkEvent; -import java.util.Arrays; - -@ChannelHandler.Sharable -public class PacketListener extends ChannelDuplexHandler { +public class PacketListener { private final SkyblockStatus skyblockStatus = DungeonsGuide.getDungeonsGuide().getSkyblockStatus(); - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - Packet packet = (Packet) msg; + @SubscribeEvent + public void onPacketReceive(RawPacketReceivedEvent event) { + Packet packet = event.packet; if (skyblockStatus.isOnSkyblock() - && msg instanceof S04PacketEntityEquipment - && FeatureRegistry.FIX_SPIRIT_BOOTS.isEnabled()) { // Inventory packet name - S04PacketEntityEquipment packet2 = (S04PacketEntityEquipment) msg; + && packet instanceof S04PacketEntityEquipment + && FeatureRegistry.FIX_SPIRIT_BOOTS.isEnabled()) { // Inventory packet name + S04PacketEntityEquipment packet2 = (S04PacketEntityEquipment) packet; if (packet2.getEntityID() == Minecraft.getMinecraft().thePlayer.getEntityId()) { packet2 = new S04PacketEntityEquipment(packet2.getEntityID(), packet2.getEquipmentSlot() + 1, packet2.getItemStack()); packet = packet2; } } - if (packet instanceof S45PacketTitle) { - MinecraftForge.EVENT_BUS.post(new TitleEvent((S45PacketTitle) packet)); - } - if (packet instanceof S38PacketPlayerListItem) { - packet = new CustomPacketPlayerListItem((S38PacketPlayerListItem) packet); - } - if (packet instanceof S30PacketWindowItems) { - packet = new CustomWindowItems((S30PacketWindowItems) packet); - } - if (packet instanceof S2FPacketSetSlot) { - packet = new CustomSetSlot((S2FPacketSetSlot) packet); - } - if (packet instanceof S23PacketBlockChange) { - packet = new SingleBlockChange((S23PacketBlockChange) packet); - } else if (packet instanceof S22PacketMultiBlockChange) { - packet = new MultiBlockChange((S22PacketMultiBlockChange) packet); - } - super.channelRead(ctx, packet); + event.packet = packet; } - private static class CustomWindowItems extends S30PacketWindowItems { - public CustomWindowItems(S30PacketWindowItems parent) { - super(parent.func_148911_c(), Arrays.asList(parent.getItemStacks())); - } - - @Override - public void processPacket(INetHandlerPlayClient handler) { - super.processPacket(handler); - MinecraftForge.EVENT_BUS.post(new WindowUpdateEvent(this, null)); - } - } - private static class CustomSetSlot extends S2FPacketSetSlot { - public CustomSetSlot(S2FPacketSetSlot parent) { - super(parent.func_149175_c(), parent.func_149173_d(), parent.func_149174_e()); - } - @Override - public void processPacket(INetHandlerPlayClient handler) { - super.processPacket(handler); - MinecraftForge.EVENT_BUS.post(new WindowUpdateEvent(null, this)); + @SubscribeEvent + public void packetProcessPost(PacketProcessedEvent.Post post) { + Packet packet = post.packet; + if (packet instanceof S30PacketWindowItems) { + MinecraftForge.EVENT_BUS.post(new WindowUpdateEvent((S30PacketWindowItems) packet, null)); + } else if (packet instanceof S2FPacketSetSlot) { + MinecraftForge.EVENT_BUS.post(new WindowUpdateEvent( null, (S2FPacketSetSlot) packet)); + } else if (packet instanceof S23PacketBlockChange) { + BlockUpdateEvent blockUpdateEvent = new BlockUpdateEvent.Post(); + blockUpdateEvent.getUpdatedBlocks().add(new Tuple<>( + ((S23PacketBlockChange) packet).getBlockPosition(), ((S23PacketBlockChange) packet).getBlockState())); + MinecraftForge.EVENT_BUS.post(blockUpdateEvent); + } else if (packet instanceof S22PacketMultiBlockChange) { + BlockUpdateEvent blockUpdateEvent = new BlockUpdateEvent.Post(); + for (S22PacketMultiBlockChange.BlockUpdateData changedBlock : ((S22PacketMultiBlockChange) packet).getChangedBlocks()) { + blockUpdateEvent.getUpdatedBlocks().add(new Tuple<>(changedBlock.getPos(), changedBlock.getBlockState())); + } + MinecraftForge.EVENT_BUS.post(blockUpdateEvent); + }else if (packet instanceof S45PacketTitle) { + MinecraftForge.EVENT_BUS.post(new TitleEvent((S45PacketTitle) packet)); + } else if (packet instanceof S38PacketPlayerListItem) { + MinecraftForge.EVENT_BUS.post(new PlayerListItemPacketEvent((S38PacketPlayerListItem) packet)); } } - private static class SingleBlockChange extends S23PacketBlockChange { - private S23PacketBlockChange old; - public SingleBlockChange(S23PacketBlockChange blockChange) { - this.old = blockChange; - } - - @Override - public void processPacket(INetHandlerPlayClient handler) { - + @SubscribeEvent + public void onPrePacketProcess(PacketProcessedEvent.Pre event) { + Packet packet =event.packet; + if (event.packet instanceof S23PacketBlockChange) { BlockUpdateEvent blockUpdateEvent = new BlockUpdateEvent.Pre(); - blockUpdateEvent.getUpdatedBlocks().add(new Tuple<>(getBlockPosition(),getBlockState())); - - - MinecraftForge.EVENT_BUS.post(blockUpdateEvent); - super.processPacket(handler); - blockUpdateEvent = new BlockUpdateEvent.Post(); - blockUpdateEvent.getUpdatedBlocks().add(new Tuple<>(getBlockPosition(), getBlockState())); - MinecraftForge.EVENT_BUS.post(blockUpdateEvent); - - - - - } - - @Override - public BlockPos getBlockPosition() { - return old.getBlockPosition(); - } - - @Override - public IBlockState getBlockState() { - return old.getBlockState(); - } - } - - - private static class MultiBlockChange extends S22PacketMultiBlockChange { - private S22PacketMultiBlockChange old; - public MultiBlockChange(S22PacketMultiBlockChange blockChange) { - this.old = blockChange; - } - @Override - public void processPacket(INetHandlerPlayClient handler) { - - + blockUpdateEvent.getUpdatedBlocks().add(new Tuple<>( + ((S23PacketBlockChange) event.packet).getBlockPosition(), + ((S23PacketBlockChange) event.packet).getBlockState())); + MinecraftForge.EVENT_BUS.post(blockUpdateEvent); + } else if (event.packet instanceof S22PacketMultiBlockChange) { BlockUpdateEvent blockUpdateEvent = new BlockUpdateEvent.Pre(); - for (S22PacketMultiBlockChange.BlockUpdateData changedBlock : getChangedBlocks()) { + for (S22PacketMultiBlockChange.BlockUpdateData changedBlock : ((S22PacketMultiBlockChange) event.packet).getChangedBlocks()) { blockUpdateEvent.getUpdatedBlocks().add(new Tuple<>(changedBlock.getPos(), changedBlock.getBlockState())); } - MinecraftForge.EVENT_BUS.post(blockUpdateEvent); - super.processPacket(handler); - blockUpdateEvent = new BlockUpdateEvent.Post(); - for (S22PacketMultiBlockChange.BlockUpdateData changedBlock : getChangedBlocks()) { - blockUpdateEvent.getUpdatedBlocks().add(new Tuple<>(changedBlock.getPos(), changedBlock.getBlockState())); + MinecraftForge.EVENT_BUS.post(blockUpdateEvent); + } else if (packet instanceof S3BPacketScoreboardObjective) { + S3BPacketScoreboardObjective objectivePkt = (S3BPacketScoreboardObjective) packet; + if (objectivePkt.func_149338_e() == 2) { + Objective objective = ScoreboardManager.INSTANCE.getObjective(objectivePkt.func_149339_c()); + if (objective != null) { + objective.setDisplayName(objectivePkt.func_149337_d()); + objective.setDisplayType(objectivePkt.func_179817_d()); + } + } else if (objectivePkt.func_149338_e() == 1) { + ScoreboardManager.INSTANCE.removeObjective(objectivePkt.func_149339_c()); + } else if (objectivePkt.func_149338_e() == 0) { + Objective objective = new Objective(objectivePkt.func_149339_c()); + objective.setDisplayName(objectivePkt.func_149337_d()); + objective.setDisplayType(objectivePkt.func_179817_d()); + ScoreboardManager.INSTANCE.addObjective(objective); + } + } else if (packet instanceof S3CPacketUpdateScore) { + S3CPacketUpdateScore score = (S3CPacketUpdateScore) packet; + Objective objective = ScoreboardManager.INSTANCE.getObjective(score.getObjectiveName()); + if (objective != null) { + if (score.getScoreAction() == S3CPacketUpdateScore.Action.CHANGE) { + objective.updateScore(score.getPlayerName(), score.getScoreValue()); + } else if (score.getScoreAction() == S3CPacketUpdateScore.Action.REMOVE) { + objective.removeScore(score.getPlayerName()); + } + } + } else if (packet instanceof S3DPacketDisplayScoreboard) { + S3DPacketDisplayScoreboard board = (S3DPacketDisplayScoreboard) packet; + ScoreboardManager.INSTANCE.displayScoreboard(board.func_149371_c(), board.func_149370_d()); + } else if (packet instanceof S3EPacketTeams) { + S3EPacketTeams pkt = (S3EPacketTeams) packet; + if (pkt.getAction() == 0) { + // CREATE + Team team = new Team(pkt.getName()); + team.setDisplayName(pkt.getDisplayName()); + team.setPrefix(pkt.getPrefix()); + team.setSuffix(pkt.getSuffix()); + team.setNameTagVisibility(NameTagVisibility.of(pkt.getNameTagVisibility())); + team.setColor(EnumChatFormatting.func_175744_a(pkt.getColor())); + + for (String player : pkt.getPlayers()) { + team.addTeamMember(player); + } + + TeamManager.INSTANCE.createTeam(team); + } else if (pkt.getAction() == 1) { + // REMOVE + TeamManager.INSTANCE.removeTeam(pkt.getName()); + } else if (pkt.getAction() == 2) { + // UPDATE + Team team = TeamManager.INSTANCE.getTeamByName(pkt.getName()); + if (team != null) { + team.setDisplayName(pkt.getDisplayName()); + team.setPrefix(pkt.getPrefix()); + team.setSuffix(pkt.getSuffix()); + team.setNameTagVisibility(NameTagVisibility.of(pkt.getNameTagVisibility())); + team.setColor(EnumChatFormatting.func_175744_a(pkt.getColor())); + } + } else if (pkt.getAction() == 3) { + // PLAYER UPDATE + Team team = TeamManager.INSTANCE.getTeamByName(pkt.getName()); + if (team != null) { + for (String player : pkt.getPlayers()) { + team.addTeamMember(player); + } + } + } else if (pkt.getAction() == 4) { + // PLAYER REMOVE + Team team = TeamManager.INSTANCE.getTeamByName(pkt.getName()); + if (team != null) { + for (String player : pkt.getPlayers()) { + team.removeTeamMember(player); + } + } + } + } else if (packet instanceof S38PacketPlayerListItem) { + S38PacketPlayerListItem pkt = (S38PacketPlayerListItem) packet; + S38PacketPlayerListItem.Action action = pkt.getAction(); + if (action == S38PacketPlayerListItem.Action.ADD_PLAYER) { + for (S38PacketPlayerListItem.AddPlayerData entry : pkt.getEntries()) { + TabListEntry tabListEntry = new TabListEntry(entry.getProfile(), entry.getGameMode()); + tabListEntry.setPing(entry.getPing()); + tabListEntry.setDisplayName(entry.getDisplayName()); + TabList.INSTANCE.updateEntry(tabListEntry); + } + } else if (action == S38PacketPlayerListItem.Action.REMOVE_PLAYER) { + for (S38PacketPlayerListItem.AddPlayerData entry : pkt.getEntries()) { + TabList.INSTANCE.removeEntry(entry.getProfile().getId()); + } + } else if (action == S38PacketPlayerListItem.Action.UPDATE_LATENCY) { + for (S38PacketPlayerListItem.AddPlayerData entry : pkt.getEntries()) { + TabListEntry entry1 = TabList.INSTANCE.getEntry(entry.getProfile().getId()); + if (entry1 != null) entry1.setPing(entry.getPing()); + } + } else if (action == S38PacketPlayerListItem.Action.UPDATE_DISPLAY_NAME) { + for (S38PacketPlayerListItem.AddPlayerData entry : pkt.getEntries()) { + TabListEntry entry1 = TabList.INSTANCE.getEntry(entry.getProfile().getId()); + if (entry1 != null) entry1.setDisplayName(entry.getDisplayName()); + } + } else if (action == S38PacketPlayerListItem.Action.UPDATE_GAME_MODE) { + for (S38PacketPlayerListItem.AddPlayerData entry : pkt.getEntries()) { + TabListEntry entry1 = TabList.INSTANCE.getEntry(entry.getProfile().getId()); + TabListEntry neu = new TabListEntry(entry1.getGameProfile(), entry.getGameMode()); + neu.setPing(entry1.getPing()); + neu.setDisplayName(entry1.getDisplayName()); + + TabList.INSTANCE.updateEntry(neu); + } } - MinecraftForge.EVENT_BUS.post(blockUpdateEvent); - - - } - - @Override - public BlockUpdateData[] getChangedBlocks() { - return old.getChangedBlocks(); - } - } - - @Override - public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception { - Packet packet = (Packet) msg; - if (packet instanceof C02PacketUseEntity) { - C02PacketUseEntity packet2 = (C02PacketUseEntity) packet; - PlayerInteractEntityEvent piee; - if (packet2.getAction() == C02PacketUseEntity.Action.ATTACK) - piee = new PlayerInteractEntityEvent(true, packet2.getEntityFromWorld(Minecraft.getMinecraft().theWorld)); - else - piee = new PlayerInteractEntityEvent(false, ((C02PacketUseEntity) packet).getEntityFromWorld(Minecraft.getMinecraft().theWorld)); - - if (MinecraftForge.EVENT_BUS.post(piee)) return; } - super.write(ctx, msg, promise); - } - - private ChannelPipeline thePipeline; - @SubscribeEvent - public void onServerConnect(FMLNetworkEvent.ClientConnectedToServerEvent event) { - (thePipeline =event.manager.channel().pipeline()).addBefore("packet_handler", "dg_packet_handler", this); } - public void cleanup() { - try { - if (thePipeline != null) - thePipeline.remove("dg_packet_handler"); - } catch (Exception e) { - - } - } } diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/events/listener/WrappedPacket.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/events/listener/WrappedPacket.java new file mode 100644 index 00000000..5b2548b8 --- /dev/null +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/events/listener/WrappedPacket.java @@ -0,0 +1,63 @@ +/* + * Dungeons Guide - The most intelligent Hypixel Skyblock Dungeons Mod + * Copyright (C) 2023 cyoung06 (syeyoung) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package kr.syeyoung.dungeonsguide.mod.events.listener; + +import kr.syeyoung.dungeonsguide.mod.events.impl.PacketProcessedEvent; +import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; +import net.minecraft.client.Minecraft; +import net.minecraft.network.Packet; +import net.minecraft.network.PacketBuffer; +import net.minecraft.network.play.INetHandlerPlayClient; +import net.minecraftforge.common.MinecraftForge; + +import java.io.IOException; + +@RequiredArgsConstructor +public class WrappedPacket implements Packet { + private final Packet delegate; + @Override + public void readPacketData(PacketBuffer buf) throws IOException { + delegate.readPacketData(buf); + } + + @Override + public void writePacketData(PacketBuffer buf) throws IOException { + delegate.writePacketData(buf); + } + + private INetHandlerPlayClient iNetHandlerPlayClient; + private boolean processed = false; + @Override + public void processPacket(INetHandlerPlayClient handler) { + if (processed) { + delegate.processPacket(handler); + } + this.iNetHandlerPlayClient = handler; + processed =true; + // lmao + Minecraft.getMinecraft().addScheduledTask(this::legitProcessPacket); + } + + private void legitProcessPacket() { + MinecraftForge.EVENT_BUS.post(new PacketProcessedEvent.Pre(delegate)); + delegate.processPacket(iNetHandlerPlayClient); + MinecraftForge.EVENT_BUS.post(new PacketProcessedEvent.Post(delegate)); + } +} diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/advanced/FeatureTestPepole.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/advanced/FeatureTestPepole.java index 235093de..ab939091 100644 --- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/advanced/FeatureTestPepole.java +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/advanced/FeatureTestPepole.java @@ -25,6 +25,8 @@ import kr.syeyoung.dungeonsguide.mod.events.annotations.DGEventHandler; import kr.syeyoung.dungeonsguide.mod.events.impl.DungeonStartedEvent; import kr.syeyoung.dungeonsguide.mod.features.FeatureParameter; import kr.syeyoung.dungeonsguide.mod.features.RawRenderingGuiFeature; +import kr.syeyoung.dungeonsguide.mod.parallelUniverse.tab.TabList; +import kr.syeyoung.dungeonsguide.mod.parallelUniverse.tab.TabListEntry; import kr.syeyoung.dungeonsguide.mod.party.PartyManager; import kr.syeyoung.dungeonsguide.mod.stomp.StompManager; import kr.syeyoung.dungeonsguide.mod.stomp.StompPayload; @@ -283,16 +285,8 @@ public class FeatureTestPepole extends RawRenderingGuiFeature { * @param networkPlayerInfo the network player info of player * @return the username of player */ - private String getPlayerNameWithChecks(NetworkPlayerInfo networkPlayerInfo) { - String name; - if (networkPlayerInfo.getDisplayName() != null) { - name = networkPlayerInfo.getDisplayName().getFormattedText(); - } else { - name = ScorePlayerTeam.formatPlayerName( - networkPlayerInfo.getPlayerTeam(), - networkPlayerInfo.getGameProfile().getName() - ); - } + private String getPlayerNameWithChecks(TabListEntry networkPlayerInfo) { + String name = networkPlayerInfo.getEffectiveName(); if (name.trim().equals("§r") || name.startsWith("§r ")) return null; @@ -303,14 +297,11 @@ public class FeatureTestPepole extends RawRenderingGuiFeature { boolean isPlayerInDungeon(String username) { - List list = new ArrayList<>(Minecraft.getMinecraft().thePlayer.sendQueue.getPlayerInfoMap()); - // 19 iterations bc we only want to scan the player part of tab list - for (int i = 1; i < 20; i++) { - if(list.size() < i) break; - NetworkPlayerInfo networkPlayerInfo = list.get(i); - - String name = getPlayerNameWithChecks(networkPlayerInfo); + int i = 0; + for (TabListEntry tabListEntry : TabList.INSTANCE.getTabListEntries()) { + if (++i >= 20) break; + String name = getPlayerNameWithChecks(tabListEntry); if (name == null) continue; EntityPlayer entityplayer = Minecraft.getMinecraft().theWorld.getPlayerEntityByName(name); diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/dungeon/FeatureDungeonDeaths.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/dungeon/FeatureDungeonDeaths.java index 21e44ed3..5534fffb 100644 --- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/dungeon/FeatureDungeonDeaths.java +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/dungeon/FeatureDungeonDeaths.java @@ -29,6 +29,8 @@ import kr.syeyoung.dungeonsguide.mod.events.annotations.DGEventHandler; import kr.syeyoung.dungeonsguide.mod.features.text.StyledText; import kr.syeyoung.dungeonsguide.mod.features.text.TextHUDFeature; import kr.syeyoung.dungeonsguide.mod.features.text.TextStyle; +import kr.syeyoung.dungeonsguide.mod.parallelUniverse.tab.TabList; +import kr.syeyoung.dungeonsguide.mod.parallelUniverse.tab.TabListEntry; import kr.syeyoung.dungeonsguide.mod.utils.TextUtils; import net.minecraft.client.Minecraft; import net.minecraft.client.network.NetworkPlayerInfo; @@ -123,8 +125,8 @@ public class FeatureDungeonDeaths extends TextHUDFeature { public int getTotalDeaths() { if (!skyblockStatus.isOnDungeon()) return 0; - for (NetworkPlayerInfo networkPlayerInfoIn : Minecraft.getMinecraft().thePlayer.sendQueue.getPlayerInfoMap()) { - String name = networkPlayerInfoIn.getDisplayName() != null ? networkPlayerInfoIn.getDisplayName().getFormattedText() : ScorePlayerTeam.formatPlayerName(networkPlayerInfoIn.getPlayerTeam(), networkPlayerInfoIn.getGameProfile().getName()); + for (TabListEntry tabListEntry : TabList.INSTANCE.getTabListEntries()) { + String name = tabListEntry.getEffectiveName(); if (name.contains("Deaths")) { String whatever = TextUtils.keepIntegerCharactersOnly(TextUtils.keepScoreboardCharacters(TextUtils.stripColor(name))); if (whatever.isEmpty()) break; diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/dungeon/FeatureDungeonMap.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/dungeon/FeatureDungeonMap.java index afffbcb8..36e0afaf 100644 --- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/dungeon/FeatureDungeonMap.java +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/dungeon/FeatureDungeonMap.java @@ -32,6 +32,8 @@ import kr.syeyoung.dungeonsguide.mod.events.impl.DungeonEndedEvent; import kr.syeyoung.dungeonsguide.mod.events.impl.DungeonStartedEvent; import kr.syeyoung.dungeonsguide.mod.features.FeatureParameter; import kr.syeyoung.dungeonsguide.mod.features.RawRenderingGuiFeature; +import kr.syeyoung.dungeonsguide.mod.parallelUniverse.tab.TabList; +import kr.syeyoung.dungeonsguide.mod.parallelUniverse.tab.TabListEntry; import kr.syeyoung.dungeonsguide.mod.utils.RenderUtils; import kr.syeyoung.dungeonsguide.mod.utils.TabListUtil; import net.minecraft.block.material.MapColor; @@ -61,6 +63,7 @@ import org.lwjgl.opengl.GL14; import javax.vecmath.Vector2d; import java.awt.*; import java.util.List; +import java.util.Set; //TODO: reduce gl drawcalls somehow @@ -336,28 +339,15 @@ public class FeatureDungeonMap extends RawRenderingGuiFeature { return false; } - @Nullable - public Tuple> loadPlayerList() { - String[] names = new String[21]; - - List networkList = sorter.sortedCopy(Minecraft.getMinecraft().thePlayer.sendQueue.getPlayerInfoMap()); - if (networkList.size() < 40) return null; - - for (int i = 0; i < 20; i++) { - names[i] = TabListUtil.getPlayerNameWithChecks(networkList.get(i)); - } - - return new Tuple<>(names, networkList); - } long nextRefresh; - Tuple> playerListCached; + Set playerListCached; - public Tuple> getPlayerListCached(){ + public Set getPlayerListCached(){ if(playerListCached == null || nextRefresh <= System.currentTimeMillis()){ ChatTransmitter.sendDebugChat("Refreshing players on map"); - playerListCached = loadPlayerList(); + playerListCached = TabList.INSTANCE.getTabListEntries(); nextRefresh = System.currentTimeMillis() + 10000; } return playerListCached; @@ -367,18 +357,15 @@ public class FeatureDungeonMap extends RawRenderingGuiFeature { private void renderHeads(MapProcessor mapProcessor, MapData mapData, float scale, float postScale, float partialTicks) { EntityPlayerSP thePlayer = Minecraft.getMinecraft().thePlayer; - Tuple> playerList = getPlayerListCached(); - - List networkList = playerList.getSecond(); - String[] names = playerList.getFirst(); - + Set playerList = getPlayerListCached(); // 21 iterations bc we only want to scan the player part of tab list - for (int i = 1; i < 20; i++) { - NetworkPlayerInfo networkPlayerInfo = networkList.get(i); + int i = 0; + for (TabListEntry playerInfo : playerList) { + if (++i >= 20) break; - String name = names[i]; + String name = TabListUtil.getPlayerNameWithChecks(playerInfo); if (name == null) continue; @@ -413,7 +400,7 @@ public class FeatureDungeonMap extends RawRenderingGuiFeature { if(pt2 == null) return; if (entityplayer == thePlayer || shouldShowOtherPlayers) { - drawHead(scale, postScale, networkPlayerInfo, entityplayer, pt2, (float) yaw2); + drawHead(scale, postScale, playerInfo, entityplayer, pt2, (float) yaw2); } } @@ -427,11 +414,13 @@ public class FeatureDungeonMap extends RawRenderingGuiFeature { * @param pt2 * @param yaw2 */ - private void drawHead(float scale, float postScale, NetworkPlayerInfo networkPlayerInfo, EntityPlayer entityplayer, Vector2d pt2, float yaw2) { + private void drawHead(float scale, float postScale, TabListEntry networkPlayerInfo, EntityPlayer entityplayer, Vector2d pt2, float yaw2) { GlStateManager.pushMatrix(); boolean flag1 = entityplayer != null && entityplayer.isWearing(EnumPlayerModelParts.CAPE); GlStateManager.enableTexture2D(); - Minecraft.getMinecraft().getTextureManager().bindTexture(networkPlayerInfo.getLocationSkin()); + Minecraft.getMinecraft().getTextureManager().bindTexture( + networkPlayerInfo.getLocationSkin() + ); int l2 = 8 + (flag1 ? 8 : 0); int i3 = 8 * (flag1 ? -1 : 1); diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/dungeon/FeatureDungeonMilestone.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/dungeon/FeatureDungeonMilestone.java index aa9689d1..7331b34c 100644 --- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/dungeon/FeatureDungeonMilestone.java +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/dungeon/FeatureDungeonMilestone.java @@ -29,6 +29,8 @@ import kr.syeyoung.dungeonsguide.mod.features.FeatureRegistry; import kr.syeyoung.dungeonsguide.mod.features.text.StyledText; import kr.syeyoung.dungeonsguide.mod.features.text.TextHUDFeature; import kr.syeyoung.dungeonsguide.mod.features.text.TextStyle; +import kr.syeyoung.dungeonsguide.mod.parallelUniverse.tab.TabList; +import kr.syeyoung.dungeonsguide.mod.parallelUniverse.tab.TabListEntry; import kr.syeyoung.dungeonsguide.mod.utils.TextUtils; import net.minecraft.client.Minecraft; import net.minecraft.client.network.NetworkPlayerInfo; @@ -79,8 +81,8 @@ public class FeatureDungeonMilestone extends TextHUDFeature { List actualBit = new ArrayList(); actualBit.add(new StyledText("Milestone","title")); actualBit.add(new StyledText(": ","separator")); - for (NetworkPlayerInfo networkPlayerInfoIn : Minecraft.getMinecraft().thePlayer.sendQueue.getPlayerInfoMap()) { - String name = networkPlayerInfoIn.getDisplayName() != null ? networkPlayerInfoIn.getDisplayName().getFormattedText() : ScorePlayerTeam.formatPlayerName(networkPlayerInfoIn.getPlayerTeam(), networkPlayerInfoIn.getGameProfile().getName()); + for (TabListEntry tabListEntry : TabList.INSTANCE.getTabListEntries()) { + String name = tabListEntry.getEffectiveName(); if (name.startsWith("§r Milestone: §r")) { String milestone = TextUtils.stripColor(name).substring(13); actualBit.add(new StyledText(milestone+"","number")); diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/dungeon/FeatureDungeonScore.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/dungeon/FeatureDungeonScore.java index 1e3b7f1a..e06d4c3c 100644 --- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/dungeon/FeatureDungeonScore.java +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/dungeon/FeatureDungeonScore.java @@ -29,6 +29,8 @@ import kr.syeyoung.dungeonsguide.mod.features.FeatureRegistry; import kr.syeyoung.dungeonsguide.mod.features.text.StyledText; import kr.syeyoung.dungeonsguide.mod.features.text.TextHUDFeature; import kr.syeyoung.dungeonsguide.mod.features.text.TextStyle; +import kr.syeyoung.dungeonsguide.mod.parallelUniverse.tab.TabList; +import kr.syeyoung.dungeonsguide.mod.parallelUniverse.tab.TabListEntry; import kr.syeyoung.dungeonsguide.mod.utils.TextUtils; import kr.syeyoung.dungeonsguide.mod.utils.TimeScoreUtil; import kr.syeyoung.dungeonsguide.mod.wsresource.StaticResource; @@ -177,8 +179,8 @@ public class FeatureDungeonScore extends TextHUDFeature { } public int getCompleteRooms() { - for (NetworkPlayerInfo networkPlayerInfoIn : Minecraft.getMinecraft().thePlayer.sendQueue.getPlayerInfoMap()) { - String name = networkPlayerInfoIn.getDisplayName() != null ? networkPlayerInfoIn.getDisplayName().getFormattedText() : ScorePlayerTeam.formatPlayerName(networkPlayerInfoIn.getPlayerTeam(), networkPlayerInfoIn.getGameProfile().getName()); + for (TabListEntry tabListEntry : TabList.INSTANCE.getTabListEntries()) { + String name = tabListEntry.getEffectiveName(); if (name.startsWith("§r Completed Rooms: §r")) { String milestone = TextUtils.stripColor(name).substring(18); return Integer.parseInt(milestone); @@ -193,8 +195,8 @@ public class FeatureDungeonScore extends TextHUDFeature { } public int getUndiscoveredPuzzles() { int cnt = 0; - for (NetworkPlayerInfo networkPlayerInfoIn : Minecraft.getMinecraft().thePlayer.sendQueue.getPlayerInfoMap()) { - String name = networkPlayerInfoIn.getDisplayName() != null ? networkPlayerInfoIn.getDisplayName().getFormattedText() : ScorePlayerTeam.formatPlayerName(networkPlayerInfoIn.getPlayerTeam(), networkPlayerInfoIn.getGameProfile().getName()); + for (TabListEntry tabListEntry : TabList.INSTANCE.getTabListEntries()) { + String name = tabListEntry.getEffectiveName(); if (name.startsWith("§r ???: ")) { cnt ++; } diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/dungeon/FeatureDungeonSecrets.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/dungeon/FeatureDungeonSecrets.java index 1483f7e9..bcc5d168 100644 --- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/dungeon/FeatureDungeonSecrets.java +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/dungeon/FeatureDungeonSecrets.java @@ -27,6 +27,8 @@ import kr.syeyoung.dungeonsguide.mod.dungeon.roomfinder.DungeonRoom; import kr.syeyoung.dungeonsguide.mod.features.text.StyledText; import kr.syeyoung.dungeonsguide.mod.features.text.TextHUDFeature; import kr.syeyoung.dungeonsguide.mod.features.text.TextStyle; +import kr.syeyoung.dungeonsguide.mod.parallelUniverse.tab.TabList; +import kr.syeyoung.dungeonsguide.mod.parallelUniverse.tab.TabListEntry; import kr.syeyoung.dungeonsguide.mod.utils.TextUtils; import net.minecraft.client.Minecraft; import net.minecraft.client.network.NetworkPlayerInfo; @@ -50,8 +52,8 @@ public class FeatureDungeonSecrets extends TextHUDFeature { SkyblockStatus skyblockStatus = DungeonsGuide.getDungeonsGuide().getSkyblockStatus(); public int getSecretsFound() { - for (NetworkPlayerInfo networkPlayerInfoIn : Minecraft.getMinecraft().thePlayer.sendQueue.getPlayerInfoMap()) { - String name = networkPlayerInfoIn.getDisplayName() != null ? networkPlayerInfoIn.getDisplayName().getFormattedText() : ScorePlayerTeam.formatPlayerName(networkPlayerInfoIn.getPlayerTeam(), networkPlayerInfoIn.getGameProfile().getName()); + for (TabListEntry tabListEntry : TabList.INSTANCE.getTabListEntries()) { + String name = tabListEntry.getEffectiveName(); if (name.startsWith("§r Secrets Found: §r§b") && !name.contains("%")) { String noColor = TextUtils.stripColor(name); return Integer.parseInt(noColor.substring(16)); @@ -60,8 +62,8 @@ public class FeatureDungeonSecrets extends TextHUDFeature { return 0; } public double getSecretPercentage() { - for (NetworkPlayerInfo networkPlayerInfoIn : Minecraft.getMinecraft().thePlayer.sendQueue.getPlayerInfoMap()) { - String name = networkPlayerInfoIn.getDisplayName() != null ? networkPlayerInfoIn.getDisplayName().getFormattedText() : ScorePlayerTeam.formatPlayerName(networkPlayerInfoIn.getPlayerTeam(), networkPlayerInfoIn.getGameProfile().getName()); + for (TabListEntry tabListEntry : TabList.INSTANCE.getTabListEntries()) { + String name = tabListEntry.getEffectiveName(); if (name.startsWith("§r Secrets Found: §r") && name.contains("%")) { String noColor = TextUtils.stripColor(name); return Double.parseDouble(noColor.substring(16).replace("%", "")); diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/dungeon/FeatureDungeonTombs.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/dungeon/FeatureDungeonTombs.java index e0de09db..72a09dd7 100644 --- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/dungeon/FeatureDungeonTombs.java +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/dungeon/FeatureDungeonTombs.java @@ -25,6 +25,8 @@ import kr.syeyoung.dungeonsguide.mod.config.types.AColor; import kr.syeyoung.dungeonsguide.mod.features.text.StyledText; import kr.syeyoung.dungeonsguide.mod.features.text.TextHUDFeature; import kr.syeyoung.dungeonsguide.mod.features.text.TextStyle; +import kr.syeyoung.dungeonsguide.mod.parallelUniverse.tab.TabList; +import kr.syeyoung.dungeonsguide.mod.parallelUniverse.tab.TabListEntry; import kr.syeyoung.dungeonsguide.mod.utils.TextUtils; import net.minecraft.client.Minecraft; import net.minecraft.client.network.NetworkPlayerInfo; @@ -46,8 +48,8 @@ public class FeatureDungeonTombs extends TextHUDFeature { SkyblockStatus skyblockStatus = DungeonsGuide.getDungeonsGuide().getSkyblockStatus(); public int getTombsFound() { - for (NetworkPlayerInfo networkPlayerInfoIn : Minecraft.getMinecraft().thePlayer.sendQueue.getPlayerInfoMap()) { - String name = networkPlayerInfoIn.getDisplayName() != null ? networkPlayerInfoIn.getDisplayName().getFormattedText() : ScorePlayerTeam.formatPl