From 83cc3a38e9e653090fb36a4a149f9062ff3b8aa1 Mon Sep 17 00:00:00 2001 From: AlwaysHAK Date: Tue, 25 Mar 2025 21:17:12 +0100 Subject: [PATCH] Added back the tablist dimension indicator --- README.md | 1 + gradle.properties | 2 +- .../commands/SpectatorCommand.java | 12 +- .../mixin/PlayerManagerMixin.java | 13 +-- .../mixin/ServerPlayNetworkHandlerMixin.java | 1 + .../mixin/ServerPlayerEntityMixin.java | 34 ++++++ .../mixin/ServerWorldMixin.java | 9 +- .../survivalfabric/utils/DimensionTeams.java | 108 ------------------ .../hak/survivalfabric/utils/Messages.java | 12 -- .../wtf/hak/survivalfabric/utils/Utils.java | 15 +++ src/main/resources/survivalfabric.mixins.json | 21 ++-- 11 files changed, 73 insertions(+), 155 deletions(-) create mode 100644 src/main/java/wtf/hak/survivalfabric/mixin/ServerPlayerEntityMixin.java delete mode 100644 src/main/java/wtf/hak/survivalfabric/utils/DimensionTeams.java create mode 100644 src/main/java/wtf/hak/survivalfabric/utils/Utils.java diff --git a/README.md b/README.md index 2fe1eac..a138d40 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ As a challenge I'm trying to make it as user-friendly as possible. (It ain't the - Custom join message - Custom quit message - Custom chat message +- Tablist dimension indicator ### Commands - /spectator | Essentially server-side freecam, you get put in spectator and are able to fly around, once you use the command again you get put back to where you were. diff --git a/gradle.properties b/gradle.properties index ebcc34a..29aec8f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,7 +9,7 @@ yarn_mappings=1.21.4+build.8 loader_version=0.16.10 # Mod Properties -mod_version=1.1.1 +mod_version=1.1.2 maven_group=wtf.hak.survivalfabric archives_base_name=survivalfabric diff --git a/src/main/java/wtf/hak/survivalfabric/commands/SpectatorCommand.java b/src/main/java/wtf/hak/survivalfabric/commands/SpectatorCommand.java index f6fbcdb..0fc1b4e 100644 --- a/src/main/java/wtf/hak/survivalfabric/commands/SpectatorCommand.java +++ b/src/main/java/wtf/hak/survivalfabric/commands/SpectatorCommand.java @@ -8,7 +8,7 @@ import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ServerWorld; import net.minecraft.text.Text; import net.minecraft.world.GameMode; -import wtf.hak.survivalfabric.utils.DimensionTeams; +import wtf.hak.survivalfabric.utils.Utils; import java.util.HashMap; import java.util.Map; @@ -20,23 +20,23 @@ public class SpectatorCommand { public static void register(CommandDispatcher dispatcher, String... aliases) { for (String str : aliases) - dispatcher.register(CommandManager.literal(str) // Ensure correct method name + dispatcher.register(CommandManager.literal(str) .executes(SpectatorCommand::execute)); } private static int execute(CommandContext context) { ServerCommandSource source = context.getSource(); - if (source.getEntity() == null) { // Ensure correct method name + if (source.getEntity() == null) { source.sendMessage(Text.literal("Console cannot go into spectator mode!")); return 0; } - ServerPlayerEntity player = (ServerPlayerEntity) source.getEntity(); // Ensure correct method name + ServerPlayerEntity player = (ServerPlayerEntity) source.getEntity(); if (spectating.containsKey(player)) { LocationData data = spectating.get(player); player.teleport(data.world, data.x, data.y, data.z, Set.of(), data.yaw, data.pitch, false); player.changeGameMode(GameMode.SURVIVAL); spectating.remove(player); - //DimensionTeams.assignCorrectTeam(player, data.world.getRegistryKey().getValue().toTranslationKey()); + Utils.updateListNames(player); } else { spectating.put(player, new LocationData(player @@ -47,7 +47,7 @@ public class SpectatorCommand { .getPitch(), player .getServerWorld())); player.changeGameMode(GameMode.SPECTATOR); - //DimensionTeams.assignCorrectTeam(player, ""); + Utils.updateListNames(player); } return 1; } diff --git a/src/main/java/wtf/hak/survivalfabric/mixin/PlayerManagerMixin.java b/src/main/java/wtf/hak/survivalfabric/mixin/PlayerManagerMixin.java index a240655..5afdc20 100644 --- a/src/main/java/wtf/hak/survivalfabric/mixin/PlayerManagerMixin.java +++ b/src/main/java/wtf/hak/survivalfabric/mixin/PlayerManagerMixin.java @@ -3,14 +3,10 @@ package wtf.hak.survivalfabric.mixin; import net.minecraft.network.ClientConnection; import net.minecraft.network.message.MessageType; import net.minecraft.network.message.SignedMessage; -import net.minecraft.network.packet.s2c.play.PlayerListS2CPacket; -import net.minecraft.server.MinecraftServer; import net.minecraft.server.PlayerManager; import net.minecraft.server.network.ConnectedClientData; import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.text.MutableText; import net.minecraft.text.Text; -import net.minecraft.text.TextContent; import net.minecraft.world.GameMode; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -18,9 +14,9 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.ModifyArg; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import wtf.hak.survivalfabric.commands.SpectatorCommand; -import wtf.hak.survivalfabric.utils.DimensionTeams; import wtf.hak.survivalfabric.utils.Messages; +import java.util.Objects; import java.util.Set; @Mixin(PlayerManager.class) @@ -32,11 +28,6 @@ public abstract class PlayerManagerMixin { player.sendMessage(text, false); } - @Inject(method = {"onPlayerConnect"}, at = {@At(value = "HEAD")}) - public void onPlayerConnectHead(ClientConnection connection, ServerPlayerEntity player, ConnectedClientData clientData, CallbackInfo ci) { - //DimensionTeams.assignCorrectTeam(player, player.getServerWorld().getRegistryKey().getValue().toTranslationKey()); - } - @ModifyArg(method = {"onPlayerConnect"}, at = @At(value = "INVOKE", target = "Lnet/minecraft/server/PlayerManager;broadcast(Lnet/minecraft/text/Text;Z)V")) private Text onPlayerConnect(Text text) { String name = text.getString().split(" ")[0]; @@ -56,7 +47,7 @@ public abstract class PlayerManagerMixin { private void onBroadcast(SignedMessage message, ServerPlayerEntity sender, MessageType.Parameters parameters, CallbackInfo ci) { if(sender != null) { Text text = Text.literal(String.format(Messages.CHAT_FORMAT, sender.getName().getString(), message.getContent().getString())); - sender.getServer().getPlayerManager().broadcast(text, false); + Objects.requireNonNull(sender.getServer()).getPlayerManager().broadcast(text, false); ci.cancel(); } } diff --git a/src/main/java/wtf/hak/survivalfabric/mixin/ServerPlayNetworkHandlerMixin.java b/src/main/java/wtf/hak/survivalfabric/mixin/ServerPlayNetworkHandlerMixin.java index 2c97b99..076c7ad 100644 --- a/src/main/java/wtf/hak/survivalfabric/mixin/ServerPlayNetworkHandlerMixin.java +++ b/src/main/java/wtf/hak/survivalfabric/mixin/ServerPlayNetworkHandlerMixin.java @@ -15,4 +15,5 @@ public abstract class ServerPlayNetworkHandlerMixin { String name = text.getString().split(" ")[0]; return Text.literal(String.format(Messages.QUIT_MESSAGE, name)); } + } diff --git a/src/main/java/wtf/hak/survivalfabric/mixin/ServerPlayerEntityMixin.java b/src/main/java/wtf/hak/survivalfabric/mixin/ServerPlayerEntityMixin.java new file mode 100644 index 0000000..c59cb2e --- /dev/null +++ b/src/main/java/wtf/hak/survivalfabric/mixin/ServerPlayerEntityMixin.java @@ -0,0 +1,34 @@ +package wtf.hak.survivalfabric.mixin; + +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.text.Text; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import wtf.hak.survivalfabric.commands.SpectatorCommand; +import wtf.hak.survivalfabric.utils.Messages; + +@Mixin(ServerPlayerEntity.class) +public abstract class ServerPlayerEntityMixin { + + @Inject(method = "getPlayerListName", at = @At("HEAD"), cancellable = true) + private void changePlayerListName(CallbackInfoReturnable cir) { + ServerPlayerEntity p = (ServerPlayerEntity) (Object) this; + String world = p.getServerWorld().getRegistryKey().getValue().toTranslationKey(); + String finalName; + if(!SpectatorCommand.spectating.containsKey(p)) { + finalName = switch (world) { + case "minecraft.overworld" -> Messages.OVERWORLD_PREFIX; + case "minecraft.the_nether" -> Messages.NETHER_PREFIX; + case "minecraft.the_end" -> Messages.END_PREFIX; + default -> Messages.UNKNOWN_PREFIX; + }; + } else + finalName = Messages.SPECTATOR_PREFIX; + + finalName += "§7" + p.getName().getString(); + + cir.setReturnValue(Text.of(finalName)); + } +} diff --git a/src/main/java/wtf/hak/survivalfabric/mixin/ServerWorldMixin.java b/src/main/java/wtf/hak/survivalfabric/mixin/ServerWorldMixin.java index b140733..adc620a 100644 --- a/src/main/java/wtf/hak/survivalfabric/mixin/ServerWorldMixin.java +++ b/src/main/java/wtf/hak/survivalfabric/mixin/ServerWorldMixin.java @@ -3,13 +3,11 @@ package wtf.hak.survivalfabric.mixin; import net.minecraft.entity.Entity; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ServerWorld; -import net.minecraft.text.Text; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import wtf.hak.survivalfabric.utils.DimensionTeams; -import wtf.hak.survivalfabric.utils.Messages; +import wtf.hak.survivalfabric.utils.Utils; @Mixin(ServerWorld.class) public class ServerWorldMixin { @@ -17,10 +15,7 @@ public class ServerWorldMixin { @Inject(method = "onDimensionChanged", at = {@At("HEAD")}) public void onDimensionChange(Entity entity, CallbackInfo ci) { if(entity instanceof ServerPlayerEntity) { - ServerPlayerEntity player = (ServerPlayerEntity)entity; - String dimension = Messages.getDimensionFormatted(player.getServerWorld().getRegistryKey().getValue().toTranslationKey()); - //player.sendMessage(Text.literal(dimension), false); - //DimensionTeams.assignCorrectTeam(player, player.getServerWorld().getRegistryKey().getValue().toTranslationKey()); + Utils.updateListNames((ServerPlayerEntity)entity); } } } diff --git a/src/main/java/wtf/hak/survivalfabric/utils/DimensionTeams.java b/src/main/java/wtf/hak/survivalfabric/utils/DimensionTeams.java deleted file mode 100644 index bbe3ac3..0000000 --- a/src/main/java/wtf/hak/survivalfabric/utils/DimensionTeams.java +++ /dev/null @@ -1,108 +0,0 @@ -package wtf.hak.survivalfabric.utils; - -import net.minecraft.scoreboard.ServerScoreboard; -import net.minecraft.scoreboard.Team; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; -import wtf.hak.survivalfabric.commands.SpectatorCommand; - -public class DimensionTeams { - - public static DimensionTeams INSTANCE; - - public Team overworldTeam; - public Team netherTeam; - public Team endTeam; - public Team spectatorTeam; - public Team unknownTeam; - - public DimensionTeams(ServerPlayerEntity player) { - ServerScoreboard scoreboard = player.getServer().getScoreboard(); - for(Team team : scoreboard.getTeams()) { - if(team.getName().equals("survivalfabric_overworld")) { - player.getServer().getPlayerManager().broadcast(Text.literal("found old"), false); - overworldTeam = team; - } else if(team.getName().equals("survivalfabric_nether")) { - player.getServer().getPlayerManager().broadcast(Text.literal("found old"), false); - netherTeam = team; - } else if(team.getName().equals("survivalfabric_end")) { - player.getServer().getPlayerManager().broadcast(Text.literal("found old"), false); - endTeam = team; - } else if(team.getName().equals("survivalfabric_spectator")) { - player.getServer().getPlayerManager().broadcast(Text.literal("found old"), false); - spectatorTeam = team; - } else if(team.getName().equals("survivalfabric_unknown")) { - player.getServer().getPlayerManager().broadcast(Text.literal("found old"), false); - unknownTeam = team; - } - } - if(overworldTeam == null) { - overworldTeam = scoreboard.addTeam("survivalfabric_overworld"); - player.getServer().getPlayerManager().broadcast(Text.literal("added new"), false); - } else if (netherTeam == null) { - netherTeam = scoreboard.addTeam("survivalfabric_nether"); - player.getServer().getPlayerManager().broadcast(Text.literal("added new"), false); - - } else if (endTeam == null) { - endTeam = scoreboard.addTeam("survivalfabric_end"); - player.getServer().getPlayerManager().broadcast(Text.literal("added new"), false); - - } else if (spectatorTeam == null) { - spectatorTeam = scoreboard.addTeam("survivalfabric_spectator"); - player.getServer().getPlayerManager().broadcast(Text.literal("added new"), false); - - } else if (unknownTeam == null) { - unknownTeam = scoreboard.addTeam("survivalfabric_unknown"); - player.getServer().getPlayerManager().broadcast(Text.literal("added new"), false); - - } - - overworldTeam.setPrefix(Text.literal(Messages.OVERWORLD_PREFIX)); - overworldTeam.setColor(Formatting.GRAY); - netherTeam.setPrefix(Text.literal(Messages.NETHER_PREFIX)); - netherTeam.setColor(Formatting.GRAY); - endTeam.setPrefix(Text.literal(Messages.END_PREFIX)); - endTeam.setColor(Formatting.GRAY); - spectatorTeam.setPrefix(Text.literal(Messages.SPECTATOR_PREFIX)); - spectatorTeam.setColor(Formatting.GRAY); - unknownTeam.setPrefix(Text.literal(Messages.UNKNOWN_PREFIX)); - unknownTeam.setColor(Formatting.GRAY); - } - - public static Team assignCorrectTeam(ServerPlayerEntity player, String translationKey) { - if (INSTANCE == null) { - INSTANCE = new DimensionTeams(player); - } - - ServerScoreboard scoreboard = player.getServer().getScoreboard(); - String name = player.getNameForScoreboard(); - - for(Team team : player.getServer().getScoreboard().getTeams()) { - if(team.getName().startsWith("survivalfabric")) { - if(team.getPlayerList().contains(name)) - scoreboard.removeScoreHolderFromTeam(name, team); - } - } - - if(!SpectatorCommand.spectating.containsKey(player)) { - switch (translationKey) { - case "minecraft.overworld": - scoreboard.addScoreHolderToTeam(name, INSTANCE.overworldTeam); - return INSTANCE.overworldTeam; - case "minecraft.the_nether": - scoreboard.addScoreHolderToTeam(name, INSTANCE.netherTeam); - return INSTANCE.netherTeam; - case "minecraft.the_end": - scoreboard.addScoreHolderToTeam(name, INSTANCE.endTeam); - return INSTANCE.endTeam; - default: - scoreboard.addScoreHolderToTeam(name, INSTANCE.unknownTeam); - return INSTANCE.unknownTeam; - } - } else { - scoreboard.addScoreHolderToTeam(name, INSTANCE.spectatorTeam); - return INSTANCE.spectatorTeam; - } - } -} diff --git a/src/main/java/wtf/hak/survivalfabric/utils/Messages.java b/src/main/java/wtf/hak/survivalfabric/utils/Messages.java index d117f35..52a7cfe 100644 --- a/src/main/java/wtf/hak/survivalfabric/utils/Messages.java +++ b/src/main/java/wtf/hak/survivalfabric/utils/Messages.java @@ -13,16 +13,4 @@ public class Messages { public static final String SPECTATOR_PREFIX = "§8[§eSpectator§8] "; public static final String UNKNOWN_PREFIX = "§8[§7Unknown§8] "; - public static String getDimensionFormatted(String translationKey) { - switch(translationKey) { - case "minecraft.overworld": - return "Overworld"; - case "minecraft.the_nether": - return "Nether"; - case "minecraft.the_end": - return "End"; - default: - return "Unknown"; - } - } } \ No newline at end of file diff --git a/src/main/java/wtf/hak/survivalfabric/utils/Utils.java b/src/main/java/wtf/hak/survivalfabric/utils/Utils.java new file mode 100644 index 0000000..c7cbb0e --- /dev/null +++ b/src/main/java/wtf/hak/survivalfabric/utils/Utils.java @@ -0,0 +1,15 @@ +package wtf.hak.survivalfabric.utils; + +import net.minecraft.network.packet.s2c.play.PlayerListS2CPacket; +import net.minecraft.server.network.ServerPlayerEntity; + +import java.util.Objects; + +public class Utils { + + public static void updateListNames(ServerPlayerEntity p) { + for(ServerPlayerEntity sp : Objects.requireNonNull(p.getServer()).getPlayerManager().getPlayerList()) { + sp.networkHandler.sendPacket(new PlayerListS2CPacket(PlayerListS2CPacket.Action.UPDATE_DISPLAY_NAME, p)); + } + } +} diff --git a/src/main/resources/survivalfabric.mixins.json b/src/main/resources/survivalfabric.mixins.json index 389e5df..521879b 100644 --- a/src/main/resources/survivalfabric.mixins.json +++ b/src/main/resources/survivalfabric.mixins.json @@ -1,13 +1,14 @@ { - "required": true, - "package": "wtf.hak.survivalfabric.mixin", - "compatibilityLevel": "JAVA_21", - "mixins": [ - "PlayerManagerMixin", - "ServerPlayNetworkHandlerMixin", - "ServerWorldMixin" - ], - "injectors": { - "defaultRequire": 1 + "required": true, + "package": "wtf.hak.survivalfabric.mixin", + "compatibilityLevel": "JAVA_21", + "mixins": [ + "PlayerManagerMixin", + "ServerPlayerEntityMixin", + "ServerPlayNetworkHandlerMixin", + "ServerWorldMixin" + ], + "injectors": { + "defaultRequire": 1 } } \ No newline at end of file