diff --git a/paper-api/src/main/java/org/bukkit/entity/Player.java b/paper-api/src/main/java/org/bukkit/entity/Player.java index fe3f4b7552e1..9af405cb4d27 100644 --- a/paper-api/src/main/java/org/bukkit/entity/Player.java +++ b/paper-api/src/main/java/org/bukkit/entity/Player.java @@ -203,6 +203,31 @@ default net.kyori.adventure.identity.Identity identity() { */ public void setPlayerListOrder(int order); + + /** + * Gets the game mode that is shown for this player on the player list. + * @return the player list game mode + */ + public GameMode getPlayerListGameMode(); + + /** + * Sets the game mode that is shown for this player on the in-game player list. + * @param gameMode new player list game mode + */ + public void setPlayerListGameMode(GameMode gameMode); + + /** + * Gets whether the player's game mode should be updated on the player list when it changes. + * @param update true if the player's game mode should be updated on the player list, false if it should not be updated + */ + public void setUpdateGameMode(boolean update); + + /** + * Gets whether the player's game mode should be updated on the player list when it changes. + * @return true if the player's game mode should be updated on the player list, false if it should not be updated + */ + public Boolean shouldUpdateGameMode(); + /** * Gets the currently displayed player list header for this player. * diff --git a/paper-server/patches/features/0001-Moonrise-optimisation-patches.patch b/paper-server/patches/features/0001-Moonrise-optimisation-patches.patch index 2f5fc143544b..06f2752ff5c9 100644 --- a/paper-server/patches/features/0001-Moonrise-optimisation-patches.patch +++ b/paper-server/patches/features/0001-Moonrise-optimisation-patches.patch @@ -27778,7 +27778,7 @@ index f39d48821d728232472ebc5bd6868e6a0d644721..91d27b90a9c9c348d3f93624ff8dbff8 "Server weather", () -> String.format( diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index 2ffb9c7388e15ec3e3afd3fa50cc0149c0c8910d..41816ca8d4ef3d959d2b88cd4b2eedaaa541e612 100644 +index d4ea439b51f4ebfcdcf94a97434742251fbeeaf0..1f8cc81feb8295a8fd8c03a6ae635a0d87558d69 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java @@ -203,7 +203,7 @@ import net.minecraft.world.scores.criteria.ObjectiveCriteria; @@ -27790,7 +27790,7 @@ index 2ffb9c7388e15ec3e3afd3fa50cc0149c0c8910d..41816ca8d4ef3d959d2b88cd4b2eedaa private static final Logger LOGGER = LogUtils.getLogger(); private static final int NEUTRAL_MOB_DEATH_NOTIFICATION_RADII_XZ = 32; private static final int NEUTRAL_MOB_DEATH_NOTIFICATION_RADII_Y = 10; -@@ -449,6 +449,36 @@ public class ServerPlayer extends Player { +@@ -451,6 +451,36 @@ public class ServerPlayer extends Player { public com.destroystokyo.paper.event.entity.@Nullable PlayerNaturallySpawnCreaturesEvent playerNaturallySpawnedEvent; // Paper - PlayerNaturallySpawnCreaturesEvent public org.bukkit.event.player.PlayerQuitEvent.@Nullable QuitReason quitReason = null; // Paper - Add API for quit reason; there are a lot of changes to do if we change all methods leading to the event @@ -27827,7 +27827,7 @@ index 2ffb9c7388e15ec3e3afd3fa50cc0149c0c8910d..41816ca8d4ef3d959d2b88cd4b2eedaa public ServerPlayer(final MinecraftServer server, final ServerLevel level, final GameProfile gameProfile, final ClientInformation clientInformation) { super(level, gameProfile); this.server = server; -@@ -471,7 +501,7 @@ public class ServerPlayer extends Player { +@@ -473,7 +503,7 @@ public class ServerPlayer extends Player { @Override public BlockPos adjustSpawnLocation(final ServerLevel level, final BlockPos spawnSuggestion) { CompletableFuture future = PlayerSpawnFinder.findSpawn(level, spawnSuggestion); @@ -28453,7 +28453,7 @@ index c974b6cafb1f6aa2a57cfdc8a39c887f02f42b1d..ec40f02032f965f548b0c0a29aa9d9bb // Paper start - PlayerChunkLoadEvent if (io.papermc.paper.event.packet.PlayerChunkLoadEvent.getHandlerList().getRegisteredListeners().length > 0) { diff --git a/net/minecraft/server/network/config/PrepareSpawnTask.java b/net/minecraft/server/network/config/PrepareSpawnTask.java -index 83af9ee3ba150da85b9b694cd76a5fabb5b2d8ef..1fb40837bd02672850ec9adc2797190df22b33fc 100644 +index b5d993095aa77bb132c513f73dbf6d2afb2e3943..8b318dd8aa918284c5fa89e990b13bec425102cb 100644 --- a/net/minecraft/server/network/config/PrepareSpawnTask.java +++ b/net/minecraft/server/network/config/PrepareSpawnTask.java @@ -171,7 +171,7 @@ public class PrepareSpawnTask implements ConfigurationTask { diff --git a/paper-server/patches/features/0030-Anti-Xray.patch b/paper-server/patches/features/0030-Anti-Xray.patch index 7ad1ed261c1d..0008117794c3 100644 --- a/paper-server/patches/features/0030-Anti-Xray.patch +++ b/paper-server/patches/features/0030-Anti-Xray.patch @@ -155,7 +155,7 @@ index a94e6ca1d396b6b0781de5d550c4a804274ee003..a1018e9ca9dfb978d6e6633577abd7d5 private ClientboundLevelChunkWithLightPacket(final RegistryFriendlyByteBuf input) { diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java -index 4ac7ef5a1ed1fac04a9fd246212f59919deb498c..e562aec4366d7724f915e3dd5ae440a77e0947c5 100644 +index bbeb0f673f2b23d1748e33364dc12ac16528d4c4..9499f4a859a5af6953c575a2980b77b6d83c22d3 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java @@ -631,7 +631,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet @@ -168,10 +168,10 @@ index 4ac7ef5a1ed1fac04a9fd246212f59919deb498c..e562aec4366d7724f915e3dd5ae440a7 this.weatherData.setLevel(this); this.typeKey = typeKey; diff --git a/net/minecraft/server/level/ServerPlayerGameMode.java b/net/minecraft/server/level/ServerPlayerGameMode.java -index f1faa0439bf5bce583e70ce37ade4b7e66daaaa4..f7390b91fe1866c6a11beb93711d0fcde4293164 100644 +index 427d6327077dd93a890e18fc45c7093d4e4dbba7..8c356700f8372cc442ee3285828af391e6eeee12 100644 --- a/net/minecraft/server/level/ServerPlayerGameMode.java +++ b/net/minecraft/server/level/ServerPlayerGameMode.java -@@ -321,6 +321,7 @@ public class ServerPlayerGameMode { +@@ -324,6 +324,7 @@ public class ServerPlayerGameMode { org.bukkit.craftbukkit.event.CraftEventFactory.callBlockDamageAbortEvent(this.player, pos, this.player.getInventory().getSelectedItem()); // CraftBukkit } } @@ -196,7 +196,7 @@ index ec40f02032f965f548b0c0a29aa9d9bbad6f439b..373da9d604cfb1614a0618d856aefd2b if (io.papermc.paper.event.packet.PlayerChunkLoadEvent.getHandlerList().getRegisteredListeners().length > 0) { new io.papermc.paper.event.packet.PlayerChunkLoadEvent(new org.bukkit.craftbukkit.CraftChunk(chunk), connection.getPlayer().getBukkitEntity()).callEvent(); diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index 5e11abcfd681d86b1c0e282cf901108822766ce2..3020a3208b14bb483b08cf59a796fb83c2403d1c 100644 +index 3d62e4d275f32c8604a1bdaefb6b9b1d4ea6e21f..82748af2479b0f8f15e39d1ad1ccd2a0e583bcdd 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java @@ -331,7 +331,7 @@ public abstract class PlayerList { @@ -209,7 +209,7 @@ index 5e11abcfd681d86b1c0e282cf901108822766ce2..3020a3208b14bb483b08cf59a796fb83 } // Paper end - Send empty chunk diff --git a/net/minecraft/world/level/Level.java b/net/minecraft/world/level/Level.java -index 829bb616e5d72b955248bbc150254c239176ce64..4b228b5c563e40b6f301df22b5c8a7f7988cb072 100644 +index 4522fde3a08637a01130ad39dc8a11a2c4f7f1cb..a920a20008cb906def77dbc50db1bb1731cc1260 100644 --- a/net/minecraft/world/level/Level.java +++ b/net/minecraft/world/level/Level.java @@ -145,6 +145,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl @@ -273,7 +273,7 @@ index c974b1c276d29610cb59566afaad19f5bcf0c602..c73b9871faa87493e081cb54e1bf1dce } } diff --git a/net/minecraft/world/level/chunk/LevelChunk.java b/net/minecraft/world/level/chunk/LevelChunk.java -index b5b514b292f9fdbe410aba5facec1638682c9075..595e97d2772b504eb6a08e84e4f4a138eb7c5f37 100644 +index c0c212fd50cf97ae311035b370e8b4d40d82229e..a4b794781e66e6a054fb437bd0b66712b13320a4 100644 --- a/net/minecraft/world/level/chunk/LevelChunk.java +++ b/net/minecraft/world/level/chunk/LevelChunk.java @@ -152,7 +152,7 @@ public class LevelChunk extends ChunkAccess implements DebugValueSource, ca.spot diff --git a/paper-server/patches/sources/net/minecraft/server/level/ServerPlayer.java.patch b/paper-server/patches/sources/net/minecraft/server/level/ServerPlayer.java.patch index 353b83ed6014..1f247db7f1e1 100644 --- a/paper-server/patches/sources/net/minecraft/server/level/ServerPlayer.java.patch +++ b/paper-server/patches/sources/net/minecraft/server/level/ServerPlayer.java.patch @@ -57,7 +57,7 @@ @Override public void dataChanged(final AbstractContainerMenu container, final int id, final int value) { } -@@ -377,10 +_,43 @@ +@@ -377,10 +_,45 @@ public void sendSystemMessage(final Component message) { ServerPlayer.this.sendSystemMessage(message); } @@ -85,6 +85,8 @@ + public net.kyori.adventure.text.Component adventure$displayName; // Paper + public @Nullable Component listName; + public int listOrder = 0; ++ public org.bukkit.GameMode listGameMode = org.bukkit.GameMode.SURVIVAL; // Paper - add custom player list gamemode and add shouldUpdateGameMode ++ public Boolean shouldUpdateListGameMode = true; // Paper - add custom player list gamemode and add shouldUpdateGameMode + public org.bukkit.Location compassTarget; + public int newExp = 0; + public int newLevel = 0; diff --git a/paper-server/patches/sources/net/minecraft/server/level/ServerPlayerGameMode.java.patch b/paper-server/patches/sources/net/minecraft/server/level/ServerPlayerGameMode.java.patch index e05a0ec589bb..b465e6821ffe 100644 --- a/paper-server/patches/sources/net/minecraft/server/level/ServerPlayerGameMode.java.patch +++ b/paper-server/patches/sources/net/minecraft/server/level/ServerPlayerGameMode.java.patch @@ -39,12 +39,21 @@ Abilities abilities = this.player.getAbilities(); this.setGameModeForPlayer(gameModeForPlayer, this.gameModeForPlayer); if (abilities.flying && gameModeForPlayer != GameType.SPECTATOR && this.isInRangeOfGround()) { -@@ -66,13 +_,13 @@ - this.level - .getServer() - .getPlayerList() +@@ -63,16 +_,19 @@ + } + + this.player.onUpdateAbilities(); +- this.level +- .getServer() +- .getPlayerList() - .broadcastAll(new ClientboundPlayerInfoUpdatePacket(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_GAME_MODE, this.player)); -+ .broadcastAll(new ClientboundPlayerInfoUpdatePacket(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_GAME_MODE, this.player), this.player); // CraftBukkit ++ ++ if(this.player.shouldUpdateListGameMode) { // Paper start - add custom player list gamemode and add shouldUpdateGameMode ++ this.level ++ .getServer() ++ .getPlayerList() ++ .broadcastAll(new ClientboundPlayerInfoUpdatePacket(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_GAME_MODE, this.player), this.player); // CraftBukkit ++ } // Paper end - add custom player list gamemode and add shouldUpdateGameMode this.level.updateSleepingPlayerList(); if (gameModeForPlayer == GameType.CREATIVE) { this.player.resetCurrentImpulseContext(); diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java index 3c7d9075f2d2..b8e61aebff5f 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -138,7 +138,6 @@ import net.minecraft.world.level.storage.ValueOutput; import org.bukkit.BanEntry; import org.bukkit.BanList; -import org.bukkit.Bukkit; import org.bukkit.DyeColor; import org.bukkit.Effect; import org.bukkit.EntityEffect; @@ -188,7 +187,6 @@ import org.bukkit.craftbukkit.conversations.ConversationTracker; import org.bukkit.craftbukkit.event.CraftEventFactory; import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.craftbukkit.inventory.CraftRecipe; import org.bukkit.craftbukkit.map.CraftMapCursor; import org.bukkit.craftbukkit.map.CraftMapView; import org.bukkit.craftbukkit.map.RenderData; @@ -614,6 +612,39 @@ public void setPlayerListOrder(int order) { // Paper end - Send update packet } + // Paper start - add custom player list gamemode and add shouldUpdateGameMode + + @Override + public void setPlayerListGameMode(GameMode gameMode) { + Preconditions.checkNotNull(gameMode, "gameMode cannot be null"); + + this.getHandle().listGameMode = gameMode; + if (getHandle().connection == null) return; + + for (ServerPlayer player : server.getHandle().players) { + if (player.getBukkitEntity().canSee(this)) { + player.connection.send(new ClientboundPlayerInfoUpdatePacket(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_GAME_MODE, getHandle())); + } + } + } + + @Override + public @NonNull GameMode getPlayerListGameMode() {return this.getHandle().listGameMode;} + + // Paper end - add custom player list gamemode and add shouldUpdateGameMode + + + // Paper start - add custom player list gamemode and add shouldUpdateGameMode + @Override + public Boolean shouldUpdateGameMode() {return this.getHandle().shouldUpdateListGameMode;} + + @Override + public void setUpdateGameMode(boolean update) { + this.getHandle().shouldUpdateListGameMode = update; + } + + // Paper end - add custom player list gamemode and add shouldUpdateGameMode + private net.kyori.adventure.text.Component playerListHeader; // Paper - Adventure private net.kyori.adventure.text.Component playerListFooter; // Paper - Adventure