9
0
mirror of https://github.com/BX-Team/DivineMC.git synced 2025-12-19 14:59:25 +00:00
Files
DivineMC/divinemc-server/minecraft-patches/features/0064-Do-not-send-spectator-change-packet.patch
2025-10-11 23:20:49 +03:00

144 lines
7.6 KiB
Diff

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 f290b3291ee20c77a301adc57c933788ebc6d56d..57577a81888203f1e19dc8a804ca9f1ee764c49e 100644
--- a/net/minecraft/server/players/PlayerList.java
+++ b/net/minecraft/server/players/PlayerList.java
@@ -258,6 +258,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<ServerPlayer> 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) {
@@ -267,7 +268,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));
@@ -283,7 +284,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;
@@ -1403,4 +1407,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<ServerPlayer> onlinePlayers, ServerPlayer joiningPlayer) {
+ ClientboundPlayerInfoUpdatePacket updatePacket = ClientboundPlayerInfoUpdatePacket.createPlayerInitializing(onlinePlayers, joiningPlayer);
+
+ if (org.bxteam.divinemc.config.DivineConfig.NetworkCategory.sendSpectatorChangePacket) {
+ return updatePacket;
+ }
+
+ List<ClientboundPlayerInfoUpdatePacket.Entry> 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
}