From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: NONPLAYT <76615486+NONPLAYT@users.noreply.github.com> Date: Sun, 20 Jul 2025 00:09:31 +0300 Subject: [PATCH] Do not send spectator change packet diff --git a/net/minecraft/server/level/ServerPlayerGameMode.java b/net/minecraft/server/level/ServerPlayerGameMode.java index 07dd9b8088e363110ecab24026a20485484710c4..a51d506c4ffe11ac2ad8510a9b35d854b2c0d42c 100644 --- a/net/minecraft/server/level/ServerPlayerGameMode.java +++ b/net/minecraft/server/level/ServerPlayerGameMode.java @@ -86,10 +86,7 @@ public class ServerPlayerGameMode { } this.player.onUpdateAbilities(); - this.level - .getServer() - .getPlayerList() - .broadcastAll(new ClientboundPlayerInfoUpdatePacket(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_GAME_MODE, this.player), this.player); // CraftBukkit + this.sendGameModeUpdatePacket(gameModeForPlayer); // DivineMC - Do not send spectator change packet this.level.updateSleepingPlayerList(); if (gameModeForPlayer == GameType.CREATIVE) { this.player.resetCurrentImpulseContext(); @@ -595,4 +592,17 @@ public class ServerPlayerGameMode { return false; } // Purpur end - Shift right click to use exp for mending + + // DivineMC start - Do not send spectator change packet + private void sendGameModeUpdatePacket(GameType newGameMode) { + ClientboundPlayerInfoUpdatePacket packet = new ClientboundPlayerInfoUpdatePacket( + ClientboundPlayerInfoUpdatePacket.Action.UPDATE_GAME_MODE, this.player); + + if (org.bxteam.divinemc.config.DivineConfig.NetworkCategory.sendSpectatorChangePacket || newGameMode != GameType.SPECTATOR) { + this.level.getServer().getPlayerList().broadcastAll(packet, this.player); + } else { + this.player.connection.send(packet); + } + } + // DivineMC end - Do not send spectator change packet } diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java index 8524060daabd3bc34c938313f30ed247759bdd5a..34b2cee473713d7830537c37100f37b0b38bc067 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java @@ -256,6 +256,7 @@ public abstract class PlayerList { // CraftBukkit start - sendAll above replaced with this loop ClientboundPlayerInfoUpdatePacket packet = ClientboundPlayerInfoUpdatePacket.createPlayerInitializing(List.of(player)); // Paper - Add Listing API for Player + ClientboundPlayerInfoUpdatePacket modifiedPacket = this.createSpectatorFilteredPacket(packet); // DivineMC - Do not send spectator change packet final List onlinePlayers = Lists.newArrayListWithExpectedSize(this.players.size() - 1); // Paper - Use single player info update packet on join for (int i = 0; i < this.players.size(); ++i) { @@ -265,7 +266,7 @@ public abstract class PlayerList { // Paper start - Add Listing API for Player if (entityplayer1.getBukkitEntity().isListed(bukkitPlayer)) { // Paper end - Add Listing API for Player - entityplayer1.connection.send(packet); + this.sendPlayerInfoPacket(entityplayer1, player, packet, modifiedPacket); // DivineMC - Do not send spectator change packet // Paper start - Add Listing API for Player } else { entityplayer1.connection.send(ClientboundPlayerInfoUpdatePacket.createSinglePlayerInitializing(player, false)); @@ -281,7 +282,10 @@ public abstract class PlayerList { } // Paper start - Use single player info update packet on join if (!onlinePlayers.isEmpty()) { - player.connection.send(ClientboundPlayerInfoUpdatePacket.createPlayerInitializing(onlinePlayers, player)); // Paper - Add Listing API for Player + // DivineMC start - Do not send spectator change packet + ClientboundPlayerInfoUpdatePacket updatePacket = this.createFilteredPlayerListPacket(onlinePlayers, player); + player.connection.send(updatePacket); // Paper - Add Listing API for Player + // DivineMC end - Do not send spectator change packet } // Paper end - Use single player info update packet on join player.sentListPacket = true; @@ -1399,4 +1403,69 @@ public abstract class PlayerList { public boolean isAllowCommandsForAllPlayers() { return this.allowCommandsForAllPlayers; } + + // DivineMC start - Do not send spectator change packet + @Nullable + private ClientboundPlayerInfoUpdatePacket createSpectatorFilteredPacket(ClientboundPlayerInfoUpdatePacket originalPacket) { + if (org.bxteam.divinemc.config.DivineConfig.NetworkCategory.sendSpectatorChangePacket) { + return null; + } + + ClientboundPlayerInfoUpdatePacket.Entry entry = originalPacket.entries().getFirst(); + if (entry.gameMode() != net.minecraft.world.level.GameType.SPECTATOR) { + return null; + } + + ClientboundPlayerInfoUpdatePacket.Entry filteredEntry = new ClientboundPlayerInfoUpdatePacket.Entry( + entry.profileId(), + entry.profile(), + entry.listed(), + entry.latency(), + net.minecraft.world.level.GameType.SURVIVAL, + entry.displayName(), + entry.showHat(), + entry.listOrder(), + entry.chatSession()); + + return new ClientboundPlayerInfoUpdatePacket(originalPacket.actions(), List.of(filteredEntry)); + } + + private void sendPlayerInfoPacket(ServerPlayer receiver, ServerPlayer joiningPlayer, + ClientboundPlayerInfoUpdatePacket originalPacket, + @Nullable ClientboundPlayerInfoUpdatePacket filteredPacket) { + if (org.bxteam.divinemc.config.DivineConfig.NetworkCategory.sendSpectatorChangePacket || + receiver == joiningPlayer || + filteredPacket == null) { + receiver.connection.send(originalPacket); + } else { + receiver.connection.send(filteredPacket); + } + } + + private ClientboundPlayerInfoUpdatePacket createFilteredPlayerListPacket(List onlinePlayers, ServerPlayer joiningPlayer) { + ClientboundPlayerInfoUpdatePacket updatePacket = ClientboundPlayerInfoUpdatePacket.createPlayerInitializing(onlinePlayers, joiningPlayer); + + if (org.bxteam.divinemc.config.DivineConfig.NetworkCategory.sendSpectatorChangePacket) { + return updatePacket; + } + + List newEntries = new java.util.ArrayList<>(); + for (ClientboundPlayerInfoUpdatePacket.Entry entry : updatePacket.entries()) { + ClientboundPlayerInfoUpdatePacket.Entry newEntry = new ClientboundPlayerInfoUpdatePacket.Entry( + entry.profileId(), + entry.profile(), + entry.listed(), + entry.latency(), + entry.gameMode() == net.minecraft.world.level.GameType.SPECTATOR ? + net.minecraft.world.level.GameType.SURVIVAL : entry.gameMode(), + entry.displayName(), + entry.showHat(), + entry.listOrder(), + entry.chatSession()); + newEntries.add(newEntry); + } + + return new ClientboundPlayerInfoUpdatePacket(updatePacket.actions(), newEntries); + } + // DivineMC end - Do not send spectator change packet }