diff --git a/build-data/divinemc.at b/build-data/divinemc.at index fdbd156..dda3c44 100644 --- a/build-data/divinemc.at +++ b/build-data/divinemc.at @@ -6,7 +6,6 @@ private-f net.minecraft.world.level.levelgen.NoiseChunk$FlatCache noiseFiller private-f net.minecraft.world.level.levelgen.NoiseChunk$NoiseInterpolator noiseFiller private-f net.minecraft.world.level.levelgen.RandomState router private-f net.minecraft.world.level.levelgen.RandomState sampler -public net.minecraft.server.level.ServerPlayerGameMode gameModeForPlayer public net.minecraft.util.Mth SIN public net.minecraft.world.entity.ai.Brain sensors public net.minecraft.world.entity.ai.memory.NearestVisibleLivingEntities lineOfSightTest diff --git a/divinemc-server/minecraft-patches/features/0066-Do-not-send-spectator-change-packet.patch b/divinemc-server/minecraft-patches/features/0066-Do-not-send-spectator-change-packet.patch index 6d27a4d..b589241 100644 --- a/divinemc-server/minecraft-patches/features/0066-Do-not-send-spectator-change-packet.patch +++ b/divinemc-server/minecraft-patches/features/0066-Do-not-send-spectator-change-packet.patch @@ -5,10 +5,10 @@ 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 6e7ed7451a45f4525946563617ccf0a55851449b..6a2f8a798f46b337d611c14556ab5ecc1f2584cd 100644 +index 6e7ed7451a45f4525946563617ccf0a55851449b..518d670d2f8535679d5d22cb1f15cb85e5bb50f0 100644 --- a/net/minecraft/server/level/ServerPlayerGameMode.java +++ b/net/minecraft/server/level/ServerPlayerGameMode.java -@@ -75,10 +75,18 @@ public class ServerPlayerGameMode { +@@ -75,10 +75,7 @@ public class ServerPlayerGameMode { // CraftBukkit end this.setGameModeForPlayer(gameModeForPlayer, this.gameModeForPlayer); // Paper - Fix MC-259571 this.player.onUpdateAbilities(); @@ -16,55 +16,129 @@ index 6e7ed7451a45f4525946563617ccf0a55851449b..6a2f8a798f46b337d611c14556ab5ecc - .getServer() - .getPlayerList() - .broadcastAll(new ClientboundPlayerInfoUpdatePacket(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_GAME_MODE, this.player), this.player); // CraftBukkit -+ -+ // DivineMC start - Do not send spectator change packet -+ if (!org.bxteam.divinemc.config.DivineConfig.NetworkCategory.sendSpectatorChangePacket) { -+ this.level.getServer().getPlayerList().broadcastPlayerInfoWithoutSpectatorName(this.player); -+ } else { -+ this.level -+ .getServer() -+ .getPlayerList() -+ .broadcastAll(new ClientboundPlayerInfoUpdatePacket(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_GAME_MODE, this.player), this.player); -+ } -+ // DivineMC end - Do not send spectator change packet -+ ++ this.sendGameModeUpdatePacket(gameModeForPlayer); // DivineMC - Do not send spectator change packet this.level.updateSleepingPlayerList(); if (gameModeForPlayer == GameType.CREATIVE) { this.player.resetCurrentImpulseContext(); +@@ -571,4 +568,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 96af2c75b526c59510965665da0b2ca00bf657b3..b59078273bb6214295a448d5607538557d7eb1ee 100644 +index 96af2c75b526c59510965665da0b2ca00bf657b3..baa682c9ba48427edb10f5610a5a0a9e21da0581 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java -@@ -1473,4 +1473,32 @@ public abstract class PlayerList { +@@ -359,6 +359,8 @@ 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) { + ServerPlayer entityplayer1 = (ServerPlayer) this.players.get(i); +@@ -367,7 +369,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)); +@@ -383,7 +385,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; +@@ -1473,4 +1478,69 @@ public abstract class PlayerList { public boolean isAllowCommandsForAllPlayers() { return this.allowCommandsForAllPlayers; } + + // DivineMC start - Do not send spectator change packet -+ public void broadcastPlayerInfoWithoutSpectatorName(ServerPlayer player) { -+ net.minecraft.world.level.GameType displayMode = player.gameMode.getGameModeForPlayer() == net.minecraft.world.level.GameType.SPECTATOR ? net.minecraft.world.level.GameType.SURVIVAL : player.gameMode.getGameModeForPlayer(); ++ @Nullable ++ private ClientboundPlayerInfoUpdatePacket createSpectatorFilteredPacket(ClientboundPlayerInfoUpdatePacket originalPacket) { ++ if (org.bxteam.divinemc.config.DivineConfig.NetworkCategory.sendSpectatorChangePacket) { ++ return null; ++ } + -+ for (ServerPlayer otherPlayer : this.players) { -+ if (otherPlayer != player && otherPlayer.getBukkitEntity().canSee(player.getBukkitEntity())) { -+ ClientboundPlayerInfoUpdatePacket packet = createPlayerInfoPacketWithoutSpectatorName(player, displayMode); -+ otherPlayer.connection.send(packet); -+ } ++ 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 createPlayerInfoPacketWithoutSpectatorName(ServerPlayer player, net.minecraft.world.level.GameType displayMode) { -+ net.minecraft.world.level.GameType originalMode = player.gameMode.gameModeForPlayer; ++ private ClientboundPlayerInfoUpdatePacket createFilteredPlayerListPacket(List onlinePlayers, ServerPlayer joiningPlayer) { ++ ClientboundPlayerInfoUpdatePacket updatePacket = ClientboundPlayerInfoUpdatePacket.createPlayerInitializing(onlinePlayers, joiningPlayer); + -+ player.gameMode.gameModeForPlayer = displayMode; ++ if (org.bxteam.divinemc.config.DivineConfig.NetworkCategory.sendSpectatorChangePacket) { ++ return updatePacket; ++ } + -+ ClientboundPlayerInfoUpdatePacket packet = new ClientboundPlayerInfoUpdatePacket( -+ ClientboundPlayerInfoUpdatePacket.Action.UPDATE_GAME_MODE, -+ player -+ ); ++ 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); ++ } + -+ player.gameMode.gameModeForPlayer = originalMode; -+ -+ return packet; ++ return new ClientboundPlayerInfoUpdatePacket(updatePacket.actions(), newEntries); + } + // DivineMC end - Do not send spectator change packet }