diff --git a/leaf-server/minecraft-patches/features/0116-Leaves-Replay-Mod-API.patch b/leaf-server/minecraft-patches/features/0116-Leaves-Replay-Mod-API.patch index ee3a6070..d84ccea7 100644 --- a/leaf-server/minecraft-patches/features/0116-Leaves-Replay-Mod-API.patch +++ b/leaf-server/minecraft-patches/features/0116-Leaves-Replay-Mod-API.patch @@ -24,7 +24,7 @@ index 4d06587cd55af988eecdda5186577ab72ca3d533..6d1096d6cdf0ae23ab4cacabe4dbe531 @Override diff --git a/net/minecraft/commands/arguments/selector/EntitySelector.java b/net/minecraft/commands/arguments/selector/EntitySelector.java -index b305ba9bab617bf4e52d0e6ddf160bacc5751a94..853933618e67d7597c23b3099ea7a7a105c0483e 100644 +index b305ba9bab617bf4e52d0e6ddf160bacc5751a94..bbaf1a29f86a9bfc13795249d545b6f7f1bb53eb 100644 --- a/net/minecraft/commands/arguments/selector/EntitySelector.java +++ b/net/minecraft/commands/arguments/selector/EntitySelector.java @@ -128,11 +128,12 @@ public class EntitySelector { @@ -37,7 +37,7 @@ index b305ba9bab617bf4e52d0e6ddf160bacc5751a94..853933618e67d7597c23b3099ea7a7a1 for (ServerLevel serverLevel : source.getServer().getAllLevels()) { Entity entity = serverLevel.getEntity(this.entityUUID); - if (entity != null) { -+ if (entity != null && !(entity instanceof org.leavesmc.leaves.replay.ServerPhotographer)) { ++ if (entity != null && !(entity instanceof org.leavesmc.leaves.replay.ServerPhotographer)) { // Leaves - skip photographer if (entity.getType().isEnabled(source.enabledFeatures())) { return List.of(entity); } @@ -58,7 +58,7 @@ index b305ba9bab617bf4e52d0e6ddf160bacc5751a94..853933618e67d7597c23b3099ea7a7a1 return this.sortAndLimit(vec3, list); } -@@ -192,9 +194,11 @@ public class EntitySelector { +@@ -192,27 +194,29 @@ public class EntitySelector { this.checkPermissions(source); if (this.playerName != null) { ServerPlayer playerByName = source.getServer().getPlayerList().getPlayerByName(this.playerName); @@ -70,7 +70,12 @@ index b305ba9bab617bf4e52d0e6ddf160bacc5751a94..853933618e67d7597c23b3099ea7a7a1 return playerByName == null || !canSee(source, playerByName) ? List.of() : List.of(playerByName); // Purpur - Hide hidden players from entity selector } else { Vec3 vec3 = this.position.apply(source.getPosition()); -@@ -206,13 +210,13 @@ public class EntitySelector { + AABB absoluteAabb = this.getAbsoluteAabb(vec3); + Predicate predicate = this.getPredicate(vec3, absoluteAabb, null); + if (this.currentEntity) { +- return source.getEntity() instanceof ServerPlayer serverPlayer && predicate.test(serverPlayer) && canSee(source, serverPlayer) ? List.of(serverPlayer) : List.of(); // Purpur - Hide hidden players from entity selector ++ return source.getEntity() instanceof ServerPlayer serverPlayer && !(serverPlayer instanceof org.leavesmc.leaves.replay.ServerPhotographer) && predicate.test(serverPlayer) && canSee(source, serverPlayer) ? List.of(serverPlayer) : List.of(); // Purpur - Hide hidden players from entity selector // Leaves - skip photographer + } else { int resultLimit = this.getResultLimit(); List players; if (this.isWorldLimited()) { diff --git a/leaf-server/minecraft-patches/features/0164-Do-not-place-player-if-the-server-is-full.patch b/leaf-server/minecraft-patches/features/0164-Do-not-place-player-if-the-server-is-full.patch index a2c7b685..c16a4e0f 100644 --- a/leaf-server/minecraft-patches/features/0164-Do-not-place-player-if-the-server-is-full.patch +++ b/leaf-server/minecraft-patches/features/0164-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 8b7b60e2f143dcbb44f3084c3c4d2306b9708f0d..411ccee65f5658347839ca7d0fffeedc1f2814ce 100644 +index 8b7b60e2f143dcbb44f3084c3c4d2306b9708f0d..75393b9cdd564e55ba173828c2f7b40498e8ecd7 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java @@ -342,6 +342,13 @@ public abstract class PlayerList { @@ -14,7 +14,7 @@ index 8b7b60e2f143dcbb44f3084c3c4d2306b9708f0d..411ccee65f5658347839ca7d0fffeedc } // Gale end - MultiPaper - do not place player in world if kicked before being spawned in + // Leaf start - Do not place player if the server is full - copied from canPlayerLogin -+ if (org.dreeam.leaf.config.modules.fixes.DontPlacePlayerIfFull.enabled && this.realPlayers.size() >= this.maxPlayers && !(player.getBukkitEntity().hasPermission("purpur.joinfullserver") || this.canBypassPlayerLimit(gameProfile))) { // Purpur - Allow player join full server by permission ++ if (org.dreeam.leaf.config.modules.fixes.DontPlacePlayerIfFull.enabled && this.realPlayers.size() >= this.maxPlayers && !(player.getBukkitEntity().hasPermission("purpur.joinfullserver") || this.canBypassPlayerLimit(gameProfile))) { // Purpur - Allow player join full server by permission // Leaves - only real player + connection.disconnect(io.papermc.paper.adventure.PaperAdventure.asVanilla(net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(org.spigotmc.SpigotConfig.serverFullMessage))); + //playerconnection.disconnect(io.papermc.paper.adventure.PaperAdventure.asVanilla(net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(org.spigotmc.SpigotConfig.serverFullMessage)), org.bukkit.event.player.PlayerKickEvent.Cause.TIMEOUT); + return; diff --git a/leaf-server/src/main/java/org/leavesmc/leaves/protocol/core/LeavesProtocolManager.java b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/core/LeavesProtocolManager.java index 2787f546..9e0be44d 100644 --- a/leaf-server/src/main/java/org/leavesmc/leaves/protocol/core/LeavesProtocolManager.java +++ b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/core/LeavesProtocolManager.java @@ -99,6 +99,18 @@ public class LeavesProtocolManager { return; } + // Leaf start - optimize leaves protocol manager + boolean active = true; + try { + Method isActiveMethod = clazz.getDeclaredMethod("isActive"); + isActiveMethod.setAccessible(true); + active = (Boolean) isActiveMethod.invoke(protocol); + } catch (Throwable e) { + LOGGER.warning("Failed to check isActive for " + clazz.getName() + ": " + e); + continue; + } + // Leaf end - optimize leaves protocol manager + for (final Method method : clazz.getDeclaredMethods()) { if (method.isBridge() || method.isSynthetic()) { continue; @@ -116,6 +128,22 @@ public class LeavesProtocolManager { continue; } + if (!active) continue; // Leaf - optimize leaves protocol manager + + // Leaf start - optimize leaves protocol manager - move up + final ProtocolHandler.ReloadServer reloadServer = method.getAnnotation(ProtocolHandler.ReloadServer.class); + if (reloadServer != null) { + RELOAD_SERVER.add(new EmptyInvokerHolder<>(protocol, method, reloadServer)); + continue; + } + + final ProtocolHandler.ReloadDataPack reloadDataPack = method.getAnnotation(ProtocolHandler.ReloadDataPack.class); + if (reloadDataPack != null) { + RELOAD_DATAPACK.add(new EmptyInvokerHolder<>(protocol, method, reloadDataPack)); + continue; + } + // Leaf end - optimize leaves protocol manager - move up + final ProtocolHandler.PayloadReceiver payloadReceiver = method.getAnnotation(ProtocolHandler.PayloadReceiver.class); if (payloadReceiver != null) { PAYLOAD_RECEIVERS.put(payloadReceiver.payload(), new PayloadReceiverInvokerHolder(protocol, method, payloadReceiver)); @@ -160,18 +188,6 @@ public class LeavesProtocolManager { continue; } - final ProtocolHandler.ReloadServer reloadServer = method.getAnnotation(ProtocolHandler.ReloadServer.class); - if (reloadServer != null) { - RELOAD_SERVER.add(new EmptyInvokerHolder<>(protocol, method, reloadServer)); - continue; - } - - final ProtocolHandler.ReloadDataPack reloadDataPack = method.getAnnotation(ProtocolHandler.ReloadDataPack.class); - if (reloadDataPack != null) { - RELOAD_DATAPACK.add(new EmptyInvokerHolder<>(protocol, method, reloadDataPack)); - continue; - } - final ProtocolHandler.MinecraftRegister minecraftRegister = method.getAnnotation(ProtocolHandler.MinecraftRegister.class); if (minecraftRegister != null) { String key = minecraftRegister.key(); @@ -300,16 +316,11 @@ public class LeavesProtocolManager { private static void sendKnownId(ServerPlayer player) { Set set = new HashSet<>(); - PAYLOAD_RECEIVERS.forEach((clazz, holder) -> { - if (holder.owner().isActive()) { - set.add(IDS.get(clazz).toString()); - } - }); - STRICT_BYTEBUF_RECEIVERS.forEach((key, holder) -> { - if (holder.owner().isActive()) { - set.add(key); - } - }); + // Leaf start - optimize leaves protocol manager + PAYLOAD_RECEIVERS.forEach((clazz, holder) -> set.add(IDS.get(clazz).toString())); + STRICT_BYTEBUF_RECEIVERS.forEach((key, holder) -> set.add(key)); + if (set.isEmpty()) return; + // Leaf end - optimize leaves protocol manager ProtocolUtils.sendBytebufPacket(player, ResourceLocation.fromNamespaceAndPath("minecraft", "register"), buf -> { ResourceLocation channel; for (Iterator var3 = set.iterator(); var3.hasNext(); buf.writeBytes(channel.toString().getBytes(StandardCharsets.US_ASCII))) { @@ -394,4 +405,4 @@ public class LeavesProtocolManager { } } } -} \ No newline at end of file +}