diff --git a/leaf-server/minecraft-patches/features/0107-Leaves-Protocol-Core.patch b/leaf-server/minecraft-patches/features/0107-Leaves-Protocol-Core.patch index 57a7877c..a4e45aa5 100644 --- a/leaf-server/minecraft-patches/features/0107-Leaves-Protocol-Core.patch +++ b/leaf-server/minecraft-patches/features/0107-Leaves-Protocol-Core.patch @@ -6,7 +6,7 @@ Subject: [PATCH] Leaves: Protocol Core Original license: GPLv3 Original project: https://github.com/LeavesMC/Leaves -Commit: c581f1311edc4787b08fe31c5a9996ab9b369a7c +Commit: f0de3ecd91c89fc7da1230eb5633eac76982fd06 diff --git a/net/minecraft/network/protocol/common/custom/CustomPacketPayload.java b/net/minecraft/network/protocol/common/custom/CustomPacketPayload.java index fb263fa1f30a7dfcb7ec2656abfb38e5fe88eac9..56fd1ed7ccaf96e7eedea60fbdbf7f934939d563 100644 diff --git a/leaf-server/minecraft-patches/features/0111-Leaves-Replay-Mod-API.patch b/leaf-server/minecraft-patches/features/0111-Leaves-Replay-Mod-API.patch index e7615fcb..9186eab9 100644 --- a/leaf-server/minecraft-patches/features/0111-Leaves-Replay-Mod-API.patch +++ b/leaf-server/minecraft-patches/features/0111-Leaves-Replay-Mod-API.patch @@ -24,7 +24,7 @@ index 51caf352e77df49fc04bf84f1fab29b6f4f4fc14..3fb3afb4171e6ff57c73cd228c2b41b2 @Override diff --git a/net/minecraft/commands/arguments/selector/EntitySelector.java b/net/minecraft/commands/arguments/selector/EntitySelector.java -index b305ba9bab617bf4e52d0e6ddf160bacc5751a94..bbaf1a29f86a9bfc13795249d545b6f7f1bb53eb 100644 +index b305ba9bab617bf4e52d0e6ddf160bacc5751a94..6fb844999589ac17c8586c9b3f202345aa80d7fb 100644 --- a/net/minecraft/commands/arguments/selector/EntitySelector.java +++ b/net/minecraft/commands/arguments/selector/EntitySelector.java @@ -128,11 +128,12 @@ public class EntitySelector { @@ -58,7 +58,7 @@ index b305ba9bab617bf4e52d0e6ddf160bacc5751a94..bbaf1a29f86a9bfc13795249d545b6f7 return this.sortAndLimit(vec3, list); } -@@ -192,27 +194,29 @@ public class EntitySelector { +@@ -192,26 +194,28 @@ public class EntitySelector { this.checkPermissions(source); if (this.playerName != null) { ServerPlayer playerByName = source.getServer().getPlayerList().getPlayerByName(this.playerName); @@ -79,20 +79,19 @@ index b305ba9bab617bf4e52d0e6ddf160bacc5751a94..bbaf1a29f86a9bfc13795249d545b6f7 int resultLimit = this.getResultLimit(); List players; if (this.isWorldLimited()) { -- players = source.getLevel().getPlayers(predicate, resultLimit); -+ players = source.getLevel().getPlayers((player -> !(player instanceof org.leavesmc.leaves.replay.ServerPhotographer) && predicate.test(player)), resultLimit); // Leaves - skip photographer - players.removeIf(entityplayer3 -> !canSee(source, entityplayer3)); // Purpur - Hide hidden players from entity selector + players = source.getLevel().getPlayers(predicate, resultLimit); +- players.removeIf(entityplayer3 -> !canSee(source, entityplayer3)); // Purpur - Hide hidden players from entity selector ++ players.removeIf(entityplayer3 -> entityplayer3 instanceof org.leavesmc.leaves.replay.ServerPhotographer || !canSee(source, entityplayer3)); // Purpur - Hide hidden players from entity selector // Leaves - skip photographer } else { players = new ObjectArrayList<>(); - for (ServerPlayer serverPlayer1 : source.getServer().getPlayerList().getPlayers()) { -- if (predicate.test(serverPlayer1) && canSee(source, serverPlayer1)) { // Purpur - Hide hidden players from entity selector -+ if (predicate.test(serverPlayer1) && canSee(source, serverPlayer1) && !(serverPlayer1 instanceof org.leavesmc.leaves.replay.ServerPhotographer)) { // Purpur - Hide hidden players from entity selector // Leaves - skip photographer +- for (ServerPlayer serverPlayer1 : source.getServer().getPlayerList().getPlayers()) { ++ for (ServerPlayer serverPlayer1 : source.getServer().getPlayerList().realPlayers) { // Leaves - only real players + if (predicate.test(serverPlayer1) && canSee(source, serverPlayer1)) { // Purpur - Hide hidden players from entity selector players.add(serverPlayer1); if (players.size() >= resultLimit) { - return players; diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java -index 73c63330b67b3d16ceebc644ce177980af25266b..68b72a7461a89ba7bd29fc9bc98171fb7f990df8 100644 +index 73c63330b67b3d16ceebc644ce177980af25266b..688e6684f6e0890dda8124b85b24a3da8c5b3292 100644 --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java @@ -1642,7 +1642,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop> startTrackingPackets = this.getStartTrackingPackets(objective); + +- for (ServerPlayer serverPlayer : this.server.getPlayerList().getPlayers()) { ++ for (ServerPlayer serverPlayer : this.server.getPlayerList().realPlayers) { // Leaves - only real players + if (serverPlayer.getBukkitEntity().getScoreboard().getHandle() != this) continue; // CraftBukkit - Only players on this board + for (Packet packet : startTrackingPackets) { + serverPlayer.connection.send(packet); +@@ -268,7 +268,7 @@ public class ServerScoreboard extends Scoreboard { + public void stopTrackingObjective(Objective objective) { + List> stopTrackingPackets = this.getStopTrackingPackets(objective); + +- for (ServerPlayer serverPlayer : this.server.getPlayerList().getPlayers()) { ++ for (ServerPlayer serverPlayer : this.server.getPlayerList().realPlayers) { // Leaves - only real players + if (serverPlayer.getBukkitEntity().getScoreboard().getHandle() != this) continue; // CraftBukkit - Only players on this board + for (Packet packet : stopTrackingPackets) { + serverPlayer.connection.send(packet); +diff --git a/net/minecraft/server/commands/DefaultGameModeCommands.java b/net/minecraft/server/commands/DefaultGameModeCommands.java +index 84baf29ad8af6a8af0cd00ce3921b3c5b8b89451..17f5543b802d88811c3e373e579a6e8b4c9f263a 100644 +--- a/net/minecraft/server/commands/DefaultGameModeCommands.java ++++ b/net/minecraft/server/commands/DefaultGameModeCommands.java +@@ -27,7 +27,7 @@ public class DefaultGameModeCommands { + server.setDefaultGameType(gamemode); + GameType forcedGameType = server.getForcedGameType(); + if (forcedGameType != null) { +- for (ServerPlayer serverPlayer : server.getPlayerList().getPlayers()) { ++ for (ServerPlayer serverPlayer : server.getPlayerList().realPlayers) { // Leaves - only real players + // Paper start - Expand PlayerGameModeChangeEvent + org.bukkit.event.player.PlayerGameModeChangeEvent event = serverPlayer.setGameMode(gamemode, org.bukkit.event.player.PlayerGameModeChangeEvent.Cause.DEFAULT_GAMEMODE, net.kyori.adventure.text.Component.empty()); + if (event != null && event.isCancelled()) { +diff --git a/net/minecraft/server/commands/ListPlayersCommand.java b/net/minecraft/server/commands/ListPlayersCommand.java +index c6ae34f91b3629990294fc5e69237a1e600ef038..712d7b66f1b701acf2f411e811648e5c18112ee9 100644 +--- a/net/minecraft/server/commands/ListPlayersCommand.java ++++ b/net/minecraft/server/commands/ListPlayersCommand.java +@@ -33,7 +33,7 @@ public class ListPlayersCommand { + private static int format(CommandSourceStack source, Function nameExtractor) { + PlayerList playerList = source.getServer().getPlayerList(); + // CraftBukkit start +- List playersTemp = playerList.getPlayers(); ++ List playersTemp = playerList.realPlayers; // Leaves - only real players + if (source.getBukkitSender() instanceof org.bukkit.entity.Player) { + org.bukkit.entity.Player sender = (org.bukkit.entity.Player) source.getBukkitSender(); + playersTemp = playersTemp.stream().filter((ep) -> sender.canSee(ep.getBukkitEntity())).collect(java.util.stream.Collectors.toList()); diff --git a/net/minecraft/server/commands/OpCommand.java b/net/minecraft/server/commands/OpCommand.java index f2286b96b8f40b4588f817913c42ae7b4a92340f..dbe6c37642d35ac6ee8b428cf1e45878a5dfa9da 100644 --- a/net/minecraft/server/commands/OpCommand.java @@ -133,8 +207,98 @@ index f2286b96b8f40b4588f817913c42ae7b4a92340f..dbe6c37642d35ac6ee8b428cf1e45878 .stream() .filter(serverPlayer -> !playerList.isOp(serverPlayer.getGameProfile())) .map(serverPlayer -> serverPlayer.getGameProfile().getName()), +diff --git a/net/minecraft/server/commands/ParticleCommand.java b/net/minecraft/server/commands/ParticleCommand.java +index 33d96239f4b72a5587dc70f9602847a870d6d6a5..a83ce2cd112fca02cf3545f8c38e5cafae2c7c0e 100644 +--- a/net/minecraft/server/commands/ParticleCommand.java ++++ b/net/minecraft/server/commands/ParticleCommand.java +@@ -36,7 +36,7 @@ public class ParticleCommand { + 0.0F, + 0, + false, +- commandContext.getSource().getServer().getPlayerList().getPlayers() ++ commandContext.getSource().getServer().getPlayerList().realPlayers // Leaves - only real player + ) + ) + .then( +@@ -50,7 +50,7 @@ public class ParticleCommand { + 0.0F, + 0, + false, +- context1.getSource().getServer().getPlayerList().getPlayers() ++ context1.getSource().getServer().getPlayerList().realPlayers // Leaves - only real player + ) + ) + .then( +@@ -68,7 +68,7 @@ public class ParticleCommand { + FloatArgumentType.getFloat(context1, "speed"), + IntegerArgumentType.getInteger(context1, "count"), + false, +- context1.getSource().getServer().getPlayerList().getPlayers() ++ context1.getSource().getServer().getPlayerList().realPlayers // Leaves - only real player + ) + ) + .then( +@@ -82,7 +82,7 @@ public class ParticleCommand { + FloatArgumentType.getFloat(context1, "speed"), + IntegerArgumentType.getInteger(context1, "count"), + true, +- context1.getSource().getServer().getPlayerList().getPlayers() ++ context1.getSource().getServer().getPlayerList().realPlayers // Leaves - only real player + ) + ) + .then( +@@ -112,7 +112,7 @@ public class ParticleCommand { + FloatArgumentType.getFloat(context1, "speed"), + IntegerArgumentType.getInteger(context1, "count"), + false, +- context1.getSource().getServer().getPlayerList().getPlayers() ++ context1.getSource().getServer().getPlayerList().realPlayers // Leaves - only real player + ) + ) + .then( +diff --git a/net/minecraft/server/commands/TeamMsgCommand.java b/net/minecraft/server/commands/TeamMsgCommand.java +index 134d7b1a9d5a5a47ebf4aabff110dde914cd6fe1..894dd1d048904b8a775416ea6cb3112215c567bc 100644 +--- a/net/minecraft/server/commands/TeamMsgCommand.java ++++ b/net/minecraft/server/commands/TeamMsgCommand.java +@@ -40,7 +40,7 @@ public class TeamMsgCommand { + } else { + List list = commandSourceStack.getServer() + .getPlayerList() +- .getPlayers() ++ .realPlayers // Leaves - only real players + .stream() + .filter(player -> player == entityOrException || player.getTeam() == team) + .toList(); +diff --git a/net/minecraft/server/commands/WhitelistCommand.java b/net/minecraft/server/commands/WhitelistCommand.java +index 763a51d9a0859296eb4ea52b6879d6c7703db673..25b4fcf79dbf3e227451b3321d8fd38bab55ffe9 100644 +--- a/net/minecraft/server/commands/WhitelistCommand.java ++++ b/net/minecraft/server/commands/WhitelistCommand.java +@@ -43,7 +43,7 @@ public class WhitelistCommand { + (commandContext, suggestionsBuilder) -> { + PlayerList playerList = commandContext.getSource().getServer().getPlayerList(); + return SharedSuggestionProvider.suggest( +- playerList.getPlayers() ++ playerList.realPlayers // Leaves - only real player + .stream() + .filter(serverPlayer -> !playerList.getWhiteList().isWhiteListed(serverPlayer.getGameProfile())) + .map(serverPlayer -> serverPlayer.getGameProfile().getName()), +diff --git a/net/minecraft/server/gui/PlayerListComponent.java b/net/minecraft/server/gui/PlayerListComponent.java +index f5ba0c9a4c3f9eaa38eeb689de915c25c7165433..24bbc32bc17802edbd9cc14310fe8141c0ad85b0 100644 +--- a/net/minecraft/server/gui/PlayerListComponent.java ++++ b/net/minecraft/server/gui/PlayerListComponent.java +@@ -17,8 +17,8 @@ public class PlayerListComponent extends JList { + if (this.tickCount++ % 20 == 0) { + Vector list = new Vector<>(); + +- for (int i = 0; i < this.server.getPlayerList().getPlayers().size(); i++) { +- list.add(this.server.getPlayerList().getPlayers().get(i).getGameProfile().getName()); ++ for (int i = 0; i < this.server.getPlayerList().realPlayers.size(); i++) { // Leaves - only real players ++ list.add(this.server.getPlayerList().realPlayers.get(i).getGameProfile().getName()); // Leaves - only real players + } + + this.setListData(list); diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java -index 95c128f028c3cce7d0b37821a6e75208323fb4e9..2cf0fa70ae3d7675cac3cf7a0002097b4e773fe1 100644 +index 95c128f028c3cce7d0b37821a6e75208323fb4e9..66b7205ea7da8b452e6e66676d75d2b29ed6b6d5 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java @@ -215,6 +215,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe @@ -158,7 +322,7 @@ index 95c128f028c3cce7d0b37821a6e75208323fb4e9..2cf0fa70ae3d7675cac3cf7a0002097b if (entity instanceof ServerPlayer serverPlayer) { ServerLevel.this.players.add(serverPlayer); + // Leaves start - skip -+ if (!(serverPlayer instanceof org.leavesmc.leaves.replay.ServerPhotographer)) { ++ if (!(serverPlayer instanceof org.leavesmc.leaves.replay.ServerPhotographer)) { // and photographer + ServerLevel.this.realPlayers.add(serverPlayer); + } + // Leaves end - skip @@ -170,28 +334,15 @@ index 95c128f028c3cce7d0b37821a6e75208323fb4e9..2cf0fa70ae3d7675cac3cf7a0002097b if (entity instanceof ServerPlayer serverPlayer) { ServerLevel.this.players.remove(serverPlayer); + // Leaves start - skip -+ if (!(serverPlayer instanceof org.leavesmc.leaves.replay.ServerPhotographer)) { ++ if (!(serverPlayer instanceof org.leavesmc.leaves.replay.ServerPhotographer)) { // and photographer + ServerLevel.this.realPlayers.remove(serverPlayer); + } + // Leaves end - skip ServerLevel.this.getWaypointManager().removePlayer(serverPlayer); ServerLevel.this.updateSleepingPlayerList(); } -diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index 880bf83929e636872eeb53c5c3ec9357972267db..47d9495ea2cf347f268bd84bf731c5b5ec63ead1 100644 ---- a/net/minecraft/server/level/ServerPlayer.java -+++ b/net/minecraft/server/level/ServerPlayer.java -@@ -216,7 +216,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc - private static final boolean DEFAULT_SEEN_CREDITS = false; - private static final boolean DEFAULT_SPAWN_EXTRA_PARTICLES_ON_FALL = false; - public ServerGamePacketListenerImpl connection; -- private final MinecraftServer server; -+ public final MinecraftServer server; // Leaves - private -> public - public ServerPlayerGameMode gameMode; - private final PlayerAdvancements advancements; - private final ServerStatsCounter stats; diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index a2d5b58eef4b6def8032d2421f8f3d34e64cb70e..10502ed26662f13fafcafc644aecd98828ef4aec 100644 +index a2d5b58eef4b6def8032d2421f8f3d34e64cb70e..5812f425870c8db5a48d3717bba40ff6ace2f0c6 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java @@ -131,6 +131,7 @@ public abstract class PlayerList { @@ -323,7 +474,15 @@ index a2d5b58eef4b6def8032d2421f8f3d34e64cb70e..10502ed26662f13fafcafc644aecd988 this.playersByName.put(player.getScoreboardName().toLowerCase(java.util.Locale.ROOT), player); // Spigot this.playersByUUID.put(player.getUUID(), player); this.addToSendAllPlayerInfoBuckets(player); // Gale - Purpur - spread out sending all player info -@@ -522,6 +630,43 @@ public abstract class PlayerList { +@@ -508,6 +616,7 @@ public abstract class PlayerList { + } + + protected void save(ServerPlayer player) { ++ if (player instanceof org.leavesmc.leaves.replay.ServerPhotographer) return; // Leaves - skip photographer + if (!player.getBukkitEntity().isPersistent()) return; // CraftBukkit + player.lastSave = MinecraftServer.currentTick; // Paper - Incremental chunk and player saving + this.playerIo.save(player); +@@ -522,6 +631,43 @@ public abstract class PlayerList { } } @@ -367,7 +526,7 @@ index a2d5b58eef4b6def8032d2421f8f3d34e64cb70e..10502ed26662f13fafcafc644aecd988 public @Nullable net.kyori.adventure.text.Component remove(ServerPlayer player) { // CraftBukkit - return string // Paper - return Component // Paper start - Fix kick event leave message not being sent return this.remove(player, net.kyori.adventure.text.Component.translatable("multiplayer.player.left", net.kyori.adventure.text.format.NamedTextColor.YELLOW, io.papermc.paper.configuration.GlobalConfiguration.get().messages.useDisplayNameInQuitMessage ? player.getBukkitEntity().displayName() : io.papermc.paper.adventure.PaperAdventure.asAdventure(player.getDisplayName()))); -@@ -596,6 +741,7 @@ public abstract class PlayerList { +@@ -596,6 +742,7 @@ public abstract class PlayerList { player.retireScheduler(); // Paper - Folia schedulers player.getAdvancements().stopListening(); this.players.remove(player); @@ -375,7 +534,21 @@ index a2d5b58eef4b6def8032d2421f8f3d34e64cb70e..10502ed26662f13fafcafc644aecd988 this.playersByName.remove(player.getScoreboardName().toLowerCase(java.util.Locale.ROOT)); // Spigot this.removeFromSendAllPlayerInfoBuckets(player); // Gale - Purpur - spread out sending all player info this.server.getCustomBossEvents().onPlayerDisconnect(player); -@@ -1092,7 +1238,7 @@ public abstract class PlayerList { +@@ -1009,10 +1156,10 @@ public abstract class PlayerList { + } + + public String[] getPlayerNamesArray() { +- String[] strings = new String[this.players.size()]; ++ String[] strings = new String[this.realPlayers.size()]; // Leaves - fakeplayer support, and skip photographer + +- for (int i = 0; i < this.players.size(); i++) { +- strings[i] = this.players.get(i).getGameProfile().getName(); ++ for (int i = 0; i < this.realPlayers.size(); i++) { // Leaves - only real players ++ strings[i] = this.realPlayers.get(i).getGameProfile().getName(); // Leaves - only real players + } + + return strings; +@@ -1092,7 +1239,7 @@ public abstract class PlayerList { // Paper start - whitelist verify event / login event public LoginResult canBypassFullServerLogin(final GameProfile profile, final LoginResult currentResult) { diff --git a/leaf-server/minecraft-patches/features/0127-Remove-useless-creating-stats-json-bases-on-player-n.patch b/leaf-server/minecraft-patches/features/0127-Remove-useless-creating-stats-json-bases-on-player-n.patch index 37fb3bd2..168d2b0f 100644 --- a/leaf-server/minecraft-patches/features/0127-Remove-useless-creating-stats-json-bases-on-player-n.patch +++ b/leaf-server/minecraft-patches/features/0127-Remove-useless-creating-stats-json-bases-on-player-n.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Remove useless creating stats json bases on player name logic diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index 10502ed26662f13fafcafc644aecd98828ef4aec..cedc4531e9a072e953943596311b9695b45cb548 100644 +index 5812f425870c8db5a48d3717bba40ff6ace2f0c6..f86560200a8625c82961683198541e52c02d7e7f 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java -@@ -1545,6 +1545,8 @@ public abstract class PlayerList { +@@ -1546,6 +1546,8 @@ public abstract class PlayerList { if (serverStatsCounter == null) { File file = this.server.getWorldPath(LevelResource.PLAYER_STATS_DIR).toFile(); File file1 = new File(file, uuid + ".json"); @@ -17,7 +17,7 @@ index 10502ed26662f13fafcafc644aecd98828ef4aec..cedc4531e9a072e953943596311b9695 if (!file1.exists()) { File file2 = new File(file, displayName + ".json"); // CraftBukkit Path path = file2.toPath(); -@@ -1552,6 +1554,8 @@ public abstract class PlayerList { +@@ -1553,6 +1555,8 @@ public abstract class PlayerList { file2.renameTo(file1); } } diff --git a/leaf-server/minecraft-patches/features/0128-Improve-Purpur-AFK-system.patch b/leaf-server/minecraft-patches/features/0128-Improve-Purpur-AFK-system.patch index 3bb7c425..bacf3e07 100644 --- a/leaf-server/minecraft-patches/features/0128-Improve-Purpur-AFK-system.patch +++ b/leaf-server/minecraft-patches/features/0128-Improve-Purpur-AFK-system.patch @@ -19,7 +19,7 @@ index 287c0936930ff4f3ca6dc2a4cbfc796a120fe4c0..3f32da75ee0a8a993b54e4156f7e4be9 org.purpurmc.purpur.command.DemoCommand.register(this.dispatcher); // Purpur - Add demo command org.purpurmc.purpur.command.PingCommand.register(this.dispatcher); // Purpur - Add ping command diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index 47d9495ea2cf347f268bd84bf731c5b5ec63ead1..15fdcc84a72c272428115eb08b07fafc0c17fded 100644 +index 880bf83929e636872eeb53c5c3ec9357972267db..37fe4bbc117c434293689c0a4a1e79e07cff7fd6 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java @@ -2434,6 +2434,10 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc @@ -152,10 +152,10 @@ index 2e504082ba5d68874b2d56baa8676b840caf1abe..e61ff0c5051a855e10310d4e6f76d79e synchronized (this.lastSeenMessages) { Optional var10000; diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index cedc4531e9a072e953943596311b9695b45cb548..a332253d11564818a24d78e4dff262e55d7cc450 100644 +index f86560200a8625c82961683198541e52c02d7e7f..cd7e2e7bdfff90b7147de20dd44fdf2709c4c28f 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java -@@ -675,6 +675,7 @@ public abstract class PlayerList { +@@ -676,6 +676,7 @@ public abstract class PlayerList { org.leavesmc.leaves.protocol.core.LeavesProtocolManager.handlePlayerLeave(player); // Leaves - protocol // Paper end - Fix kick event leave message not being sent org.purpurmc.purpur.task.BossBarTask.removeFromAll(player.getBukkitEntity()); // Purpur - Implement TPSBar diff --git a/leaf-server/minecraft-patches/features/0131-Mirai-Configurable-chat-message-signatures.patch b/leaf-server/minecraft-patches/features/0131-Mirai-Configurable-chat-message-signatures.patch index 9503931d..40b747a2 100644 --- a/leaf-server/minecraft-patches/features/0131-Mirai-Configurable-chat-message-signatures.patch +++ b/leaf-server/minecraft-patches/features/0131-Mirai-Configurable-chat-message-signatures.patch @@ -138,10 +138,10 @@ index 82c22ca54cc7c8371b744c93f133dfc2b798195b..6b73679351f786362daf988b02b2a226 if (packet == null || this.processedDisconnect) { // Spigot return; diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index a332253d11564818a24d78e4dff262e55d7cc450..47d0af92cb0d744f4188597ad3f4b096aca84a9e 100644 +index cd7e2e7bdfff90b7147de20dd44fdf2709c4c28f..f09c1472d465de94b16e958ec7051f34aae7402f 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java -@@ -1505,7 +1505,7 @@ public abstract class PlayerList { +@@ -1506,7 +1506,7 @@ public abstract class PlayerList { public void broadcastChatMessage(PlayerChatMessage message, Predicate shouldFilterMessageTo, @Nullable ServerPlayer sender, ChatType.Bound boundChatType, @Nullable Function unsignedFunction) { // Paper end boolean flag = this.verifyChatTrusted(message); @@ -150,7 +150,7 @@ index a332253d11564818a24d78e4dff262e55d7cc450..47d0af92cb0d744f4188597ad3f4b096 OutgoingChatMessage outgoingChatMessage = OutgoingChatMessage.create(message); boolean flag1 = false; -@@ -1530,6 +1530,7 @@ public abstract class PlayerList { +@@ -1531,6 +1531,7 @@ public abstract class PlayerList { } public boolean verifyChatTrusted(PlayerChatMessage message) { diff --git a/leaf-server/minecraft-patches/features/0137-Configurable-connection-message.patch b/leaf-server/minecraft-patches/features/0137-Configurable-connection-message.patch index ec395da4..d954171b 100644 --- a/leaf-server/minecraft-patches/features/0137-Configurable-connection-message.patch +++ b/leaf-server/minecraft-patches/features/0137-Configurable-connection-message.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Configurable connection message diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index 47d0af92cb0d744f4188597ad3f4b096aca84a9e..ab79b6c3978e7a1b3935e18353841dfa44c9af29 100644 +index f09c1472d465de94b16e958ec7051f34aae7402f..b24e03e941da6e90b1b8419c7f33973aebec7818 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java @@ -445,7 +445,7 @@ public abstract class PlayerList { @@ -26,7 +26,7 @@ index 47d0af92cb0d744f4188597ad3f4b096aca84a9e..ab79b6c3978e7a1b3935e18353841dfa joinMessage = io.papermc.paper.adventure.PaperAdventure.asVanilla(jm); // Paper - Adventure this.server.getPlayerList().broadcastSystemMessage(joinMessage, false); // Paper - Adventure } -@@ -684,7 +684,7 @@ public abstract class PlayerList { +@@ -685,7 +685,7 @@ public abstract class PlayerList { player.closeContainer(org.bukkit.event.inventory.InventoryCloseEvent.Reason.DISCONNECT); // Paper - Inventory close reason } @@ -35,7 +35,7 @@ index 47d0af92cb0d744f4188597ad3f4b096aca84a9e..ab79b6c3978e7a1b3935e18353841dfa this.cserver.getPluginManager().callEvent(playerQuitEvent); player.getBukkitEntity().disconnect(playerQuitEvent.getQuitMessage()); -@@ -1658,4 +1658,40 @@ public abstract class PlayerList { +@@ -1659,4 +1659,40 @@ public abstract class PlayerList { public boolean isAllowCommandsForAllPlayers() { return this.allowCommandsForAllPlayers; } diff --git a/leaf-server/minecraft-patches/features/0156-Do-not-place-player-if-the-server-is-full.patch b/leaf-server/minecraft-patches/features/0156-Do-not-place-player-if-the-server-is-full.patch index 3226e6f0..96920b3b 100644 --- a/leaf-server/minecraft-patches/features/0156-Do-not-place-player-if-the-server-is-full.patch +++ b/leaf-server/minecraft-patches/features/0156-Do-not-place-player-if-the-server-is-full.patch @@ -6,7 +6,7 @@ Subject: [PATCH] Do not place player if the server is full Fix https://github.com/PaperMC/Paper/issues/10668 diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index ab79b6c3978e7a1b3935e18353841dfa44c9af29..92b37775282ca1f35edfc51305b98af5a9adc5cb 100644 +index b24e03e941da6e90b1b8419c7f33973aebec7818..9a2e11ff1ed5b8d07b1d6c66ba1a6109c290ff8b 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java @@ -349,6 +349,13 @@ public abstract class PlayerList { @@ -23,7 +23,7 @@ index ab79b6c3978e7a1b3935e18353841dfa44c9af29..92b37775282ca1f35edfc51305b98af5 org.bukkit.Location loc = ev.getSpawnLocation(); serverLevel = ((org.bukkit.craftbukkit.CraftWorld) loc.getWorld()).getHandle(); -@@ -1239,7 +1246,7 @@ public abstract class PlayerList { +@@ -1240,7 +1247,7 @@ public abstract class PlayerList { // Paper start - whitelist verify event / login event public LoginResult canBypassFullServerLogin(final GameProfile profile, final LoginResult currentResult) { diff --git a/leaf-server/minecraft-patches/features/0205-SparklyPaper-Parallel-world-ticking.patch b/leaf-server/minecraft-patches/features/0205-SparklyPaper-Parallel-world-ticking.patch index 5e967672..20d0cd64 100644 --- a/leaf-server/minecraft-patches/features/0205-SparklyPaper-Parallel-world-ticking.patch +++ b/leaf-server/minecraft-patches/features/0205-SparklyPaper-Parallel-world-ticking.patch @@ -95,7 +95,7 @@ index 582e012222123e5001c34153f2ee1ab1d08935fd..c0bce2293d07ca58cc5bc9e036ab8dca List states = new java.util.ArrayList<>(level.capturedBlockStates.values()); level.capturedBlockStates.clear(); diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java -index a780cba7e2e95412226d9e80b892ab0126f50666..20e3c60ccf069ce491df8c5c9ea6ffec7b0920da 100644 +index 88829d89434e7688c274937604b0568096e2bde1..29933ba4ac17bd190f423b8bd4b2dc47fcc40688 100644 --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java @@ -290,6 +290,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop { ++ net.minecraft.server.MinecraftServer.getServer().getPlayerList().realPlayers.forEach(player -> { // Leaves - only real players + player.getAdvancements().reload(MinecraftServer.getServer().getAdvancements()); + player.getAdvancements().flushDirty(player, false); + }); +diff --git a/src/main/java/org/bukkit/craftbukkit/util/LazyPlayerSet.java b/src/main/java/org/bukkit/craftbukkit/util/LazyPlayerSet.java +index 25aae550dcdcef2df268d0dd99bdcc9bbd49fcf8..83af50de50a03e164d572f3c3466b6d0b42ed138 100644 +--- a/src/main/java/org/bukkit/craftbukkit/util/LazyPlayerSet.java ++++ b/src/main/java/org/bukkit/craftbukkit/util/LazyPlayerSet.java +@@ -23,7 +23,7 @@ public class LazyPlayerSet extends LazyHashSet { + } + + public static Set makePlayerSet(final MinecraftServer server) { +- List players = server.getPlayerList().players; ++ List players = server.getPlayerList().realPlayers; // Leaves - only real players + Set reference = new HashSet<>(players.size()); + for (ServerPlayer player : players) { + reference.add(player.getBukkitEntity()); diff --git a/leaf-server/src/main/java/org/leavesmc/leaves/plugin/MinecraftInternalPlugin.java b/leaf-server/src/main/java/org/leavesmc/leaves/plugin/MinecraftInternalPlugin.java index de06c854..ab55857f 100644 --- a/leaf-server/src/main/java/org/leavesmc/leaves/plugin/MinecraftInternalPlugin.java +++ b/leaf-server/src/main/java/org/leavesmc/leaves/plugin/MinecraftInternalPlugin.java @@ -1,11 +1,15 @@ package org.leavesmc.leaves.plugin; +import io.papermc.paper.plugin.configuration.PluginMeta; +import io.papermc.paper.plugin.lifecycle.event.LifecycleEventManager; +import org.bukkit.Bukkit; import org.bukkit.Server; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.generator.BiomeProvider; import org.bukkit.generator.ChunkGenerator; +import org.bukkit.plugin.Plugin; import org.bukkit.plugin.PluginBase; import org.bukkit.plugin.PluginDescriptionFile; import org.bukkit.plugin.PluginLoader; @@ -24,10 +28,12 @@ public class MinecraftInternalPlugin extends PluginBase { private boolean enabled = true; private final PluginDescriptionFile pdf; + private final PluginLogger logger; public MinecraftInternalPlugin() { String pluginName = "Minecraft"; pdf = new PluginDescriptionFile(pluginName, "1.0", "nms"); + logger = new PluginLogger(this); } public void setEnabled(boolean enabled) { @@ -35,27 +41,47 @@ public class MinecraftInternalPlugin extends PluginBase { } @Override - public File getDataFolder() { - throw new UnsupportedOperationException("Not supported."); - } - - @Override - public PluginDescriptionFile getDescription() { + public @NotNull PluginDescriptionFile getDescription() { return pdf; } @Override - public io.papermc.paper.plugin.configuration.PluginMeta getPluginMeta() { + public @NotNull PluginMeta getPluginMeta() { return pdf; } @Override - public FileConfiguration getConfig() { + public @NotNull PluginLogger getLogger() { + return logger; + } + + @Override + public @NotNull Server getServer() { + return Bukkit.getServer(); + } + + @Override + public boolean isEnabled() { + return enabled; + } + + @Override + public @NotNull PluginLoader getPluginLoader() { throw new UnsupportedOperationException("Not supported."); } @Override - public InputStream getResource(String filename) { + public @NotNull File getDataFolder() { + throw new UnsupportedOperationException("Not supported."); + } + + @Override + public @NotNull FileConfiguration getConfig() { + throw new UnsupportedOperationException("Not supported."); + } + + @Override + public InputStream getResource(@NotNull String filename) { throw new UnsupportedOperationException("Not supported."); } @@ -70,7 +96,7 @@ public class MinecraftInternalPlugin extends PluginBase { } @Override - public void saveResource(String resourcePath, boolean replace) { + public void saveResource(@NotNull String resourcePath, boolean replace) { throw new UnsupportedOperationException("Not supported."); } @@ -79,26 +105,6 @@ public class MinecraftInternalPlugin extends PluginBase { throw new UnsupportedOperationException("Not supported."); } - @Override - public PluginLogger getLogger() { - throw new UnsupportedOperationException("Not supported."); - } - - @Override - public PluginLoader getPluginLoader() { - throw new UnsupportedOperationException("Not supported."); - } - - @Override - public Server getServer() { - throw new UnsupportedOperationException("Not supported."); - } - - @Override - public boolean isEnabled() { - return enabled; - } - @Override public void onDisable() { throw new UnsupportedOperationException("Not supported."); @@ -125,7 +131,7 @@ public class MinecraftInternalPlugin extends PluginBase { } @Override - public ChunkGenerator getDefaultWorldGenerator(String worldName, String id) { + public ChunkGenerator getDefaultWorldGenerator(@NotNull String worldName, String id) { throw new UnsupportedOperationException("Not supported."); } @@ -135,17 +141,17 @@ public class MinecraftInternalPlugin extends PluginBase { } @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String @NotNull [] args) { throw new UnsupportedOperationException("Not supported."); } @Override - public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { + public List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String @NotNull [] args) { throw new UnsupportedOperationException("Not supported."); } @Override - public @NotNull io.papermc.paper.plugin.lifecycle.event.LifecycleEventManager getLifecycleManager() { + public @NotNull LifecycleEventManager<@NotNull Plugin> getLifecycleManager() { throw new UnsupportedOperationException("Not supported."); } } diff --git a/leaf-server/src/main/java/org/leavesmc/leaves/replay/Recorder.java b/leaf-server/src/main/java/org/leavesmc/leaves/replay/Recorder.java index 629c5a86..14b04062 100644 --- a/leaf-server/src/main/java/org/leavesmc/leaves/replay/Recorder.java +++ b/leaf-server/src/main/java/org/leavesmc/leaves/replay/Recorder.java @@ -224,7 +224,7 @@ public class Recorder extends Connection { try { replayFile.saveMetaData(metaData); } catch (IOException e) { - e.printStackTrace(); + LOGGER.severe("Error saving metadata", e); } }); } @@ -234,13 +234,8 @@ public class Recorder extends Connection { } private void savePacket(Packet packet, final ConnectionProtocol protocol) { - try { - final long timestamp = getCurrentTimeAndUpdate(); - replayFile.savePacket(timestamp, packet, protocol); - } catch (Exception e) { - LOGGER.severe("Error saving packet"); - e.printStackTrace(); - } + final long timestamp = getCurrentTimeAndUpdate(); + replayFile.savePacket(timestamp, packet, protocol); } public boolean isSaved() { diff --git a/leaf-server/src/main/java/org/leavesmc/leaves/replay/ReplayFile.java b/leaf-server/src/main/java/org/leavesmc/leaves/replay/ReplayFile.java index 7d27c7da..5d3f9351 100644 --- a/leaf-server/src/main/java/org/leavesmc/leaves/replay/ReplayFile.java +++ b/leaf-server/src/main/java/org/leavesmc/leaves/replay/ReplayFile.java @@ -121,7 +121,7 @@ public class ReplayFile { } } - public void savePacket(long timestamp, Packet packet, ConnectionProtocol protocol) throws Exception { + public void savePacket(long timestamp, Packet packet, ConnectionProtocol protocol) { byte[] data = getPacketBytes(packet, protocol); saveService.execute(() -> { try { @@ -129,8 +129,7 @@ public class ReplayFile { packetStream.writeInt(data.length); packetStream.write(data); } catch (Exception e) { - LOGGER.severe("Error saving packet"); - e.printStackTrace(); + LOGGER.severe("Error saving packet", e); } }); } diff --git a/leaf-server/src/main/java/org/leavesmc/leaves/replay/ServerPhotographer.java b/leaf-server/src/main/java/org/leavesmc/leaves/replay/ServerPhotographer.java index a1845ecc..23c7e5c5 100644 --- a/leaf-server/src/main/java/org/leavesmc/leaves/replay/ServerPhotographer.java +++ b/leaf-server/src/main/java/org/leavesmc/leaves/replay/ServerPhotographer.java @@ -77,7 +77,6 @@ public class ServerPhotographer extends ServerPlayer { @Override public void tick() { super.tick(); - super.doTick(); if (this.getServer().getTickCount() % 10 == 0) { connection.resetPosition();