diff --git a/gradle.properties b/gradle.properties index 9f1025f..b22b227 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.0.0 +mod_version=1.1.0 maven_group=wtf.hak.survivalfabric archives_base_name=survivalfabric diff --git a/src/main/java/wtf/hak/survivalfabric/SurvivalFabric.java b/src/main/java/wtf/hak/survivalfabric/SurvivalFabric.java index 5fa917b..46541d8 100644 --- a/src/main/java/wtf/hak/survivalfabric/SurvivalFabric.java +++ b/src/main/java/wtf/hak/survivalfabric/SurvivalFabric.java @@ -3,11 +3,14 @@ package wtf.hak.survivalfabric; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; +import net.fabricmc.fabric.api.entity.event.v1.ServerPlayerEvents; +import net.minecraft.scoreboard.Team; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import wtf.hak.survivalfabric.commands.SpectatorCommand; public class SurvivalFabric implements ModInitializer { + public static final String MOD_ID = "survivalfabric"; public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID); @@ -15,5 +18,6 @@ public class SurvivalFabric implements ModInitializer { @Override public void onInitialize() { CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> SpectatorCommand.register(dispatcher, new String[] { "spectator", "s", "S", "camera", "c", "C", })); + } } \ No newline at end of file diff --git a/src/main/java/wtf/hak/survivalfabric/commands/SpectatorCommand.java b/src/main/java/wtf/hak/survivalfabric/commands/SpectatorCommand.java index 85d45b7..49bd81a 100644 --- a/src/main/java/wtf/hak/survivalfabric/commands/SpectatorCommand.java +++ b/src/main/java/wtf/hak/survivalfabric/commands/SpectatorCommand.java @@ -8,6 +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 java.util.HashMap; import java.util.Map; @@ -35,6 +36,7 @@ public class SpectatorCommand { 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()); } else { spectating.put(player, new LocationData(player @@ -45,6 +47,7 @@ public class SpectatorCommand { .getPitch(), player .getServerWorld())); player.changeGameMode(GameMode.SPECTATOR); + DimensionTeams.assignCorrectTeam(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 c454e62..3a1a84c 100644 --- a/src/main/java/wtf/hak/survivalfabric/mixin/PlayerManagerMixin.java +++ b/src/main/java/wtf/hak/survivalfabric/mixin/PlayerManagerMixin.java @@ -3,6 +3,8 @@ 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; @@ -16,6 +18,7 @@ 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.Set; @@ -29,6 +32,11 @@ 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]; diff --git a/src/main/java/wtf/hak/survivalfabric/mixin/ServerWorldMixin.java b/src/main/java/wtf/hak/survivalfabric/mixin/ServerWorldMixin.java new file mode 100644 index 0000000..2a44db4 --- /dev/null +++ b/src/main/java/wtf/hak/survivalfabric/mixin/ServerWorldMixin.java @@ -0,0 +1,26 @@ +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; + +@Mixin(ServerWorld.class) +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()); + } + } +} diff --git a/src/main/java/wtf/hak/survivalfabric/utils/DimensionTeams.java b/src/main/java/wtf/hak/survivalfabric/utils/DimensionTeams.java new file mode 100644 index 0000000..bbe3ac3 --- /dev/null +++ b/src/main/java/wtf/hak/survivalfabric/utils/DimensionTeams.java @@ -0,0 +1,108 @@ +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 80f26f8..d117f35 100644 --- a/src/main/java/wtf/hak/survivalfabric/utils/Messages.java +++ b/src/main/java/wtf/hak/survivalfabric/utils/Messages.java @@ -6,4 +6,23 @@ public class Messages { public static final String QUIT_MESSAGE = "§8[§c-§8] §7%s"; public static final String CHAT_FORMAT = "§7%s§8:§f %s"; + + public static final String OVERWORLD_PREFIX = "§8[§aOverworld§8] "; + public static final String NETHER_PREFIX = "§8[§cNether§8] "; + public static final String END_PREFIX = "§8[§dEnd§8] "; + 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/resources/survivalfabric.mixins.json b/src/main/resources/survivalfabric.mixins.json index 57d04b9..389e5df 100644 --- a/src/main/resources/survivalfabric.mixins.json +++ b/src/main/resources/survivalfabric.mixins.json @@ -4,7 +4,8 @@ "compatibilityLevel": "JAVA_21", "mixins": [ "PlayerManagerMixin", - "ServerPlayNetworkHandlerMixin" + "ServerPlayNetworkHandlerMixin", + "ServerWorldMixin" ], "injectors": { "defaultRequire": 1