From d9fd427eb04ec2bef728f4571dd2a5f43d8aa113 Mon Sep 17 00:00:00 2001 From: Dreeam <61569423+Dreeam-qwq@users.noreply.github.com> Date: Sat, 20 Jan 2024 00:34:23 -0500 Subject: [PATCH] Fix patches --- ...-Purpur-Configurable-server-mod-name.patch | 2 + ...ves-Disable-moved-wrongly-threshold.patch} | 56 ++++---- ...-Fix-vehicle-teleport-by-end-gateway.patch | 35 +++++ ...og4j-compatible-with-future-release.patch} | 0 ...Optimize-villager-data-storage.patc.patch} | 0 ...tch => 0036-Petal-Async-Pathfinding.patch} | 15 +- ...r-NPE.patch => 0037-Fix-tracker-NPE.patch} | 0 ...-minecart-vehicle-collision-results.patch} | 6 +- ...rk.patch => 0039-Reduce-canSee-work.patch} | 33 ++--- ...tch => 0040-Faster-Natural-Spawning.patch} | 2 +- ...dom-for-xaeroMapServerID-generation.patch} | 4 +- ...-Fix-casting-in-Purpur-world-config.patch} | 0 ...tch.patch => 0043-Fix-sprint-glitch.patch} | 2 +- ...h => 0044-Fix-keepalive-kicked-name.patch} | 0 ...ble-movement-speed-of-more-entities.patch} | 0 ...leAppender-NPE-error-on-server-clos.patch} | 0 ...-PandaSpigot-Configurable-knockback.patch} | 18 +-- ...-of-futures-for-chunk-structure-gen.patch} | 0 .../0049-Leaves-be-vanilla-end-gateway.patch | 45 ------ ...e-items-finding-hopper-nearby-check.patch} | 6 +- ...port.patch => 0050-AddLinearSupport.patch} | 0 ...urpur-and-Pufferfish-missing-config.patch} | 0 ... => 0052-Skip-event-if-no-listeners.patch} | 0 ...-Rewrite-framed-map-tracker-ticking.patch} | 131 ++++++++++-------- ...p-MapItem-update-if-the-map-does-not.patch | 62 ++++----- ...e-coordinate-key-used-for-nearby-pl.patch} | 46 +++--- ...SparklyPaper-Optimize-canSee-checks.patch} | 47 ++++--- ...egg-and-snowball-can-knockback-play.patch} | 22 +-- 28 files changed, 267 insertions(+), 265 deletions(-) rename patches/server/{0048-Leaves-Disable-Moved-Wrongly-Threshold.patch => 0032-Leaves-Disable-moved-wrongly-threshold.patch} (57%) create mode 100644 patches/server/0033-Leaves-Fix-vehicle-teleport-by-end-gateway.patch rename patches/server/{0032-Fix-Make-log4j-compatible-with-future-release.patch => 0034-Fix-Make-log4j-compatible-with-future-release.patch} (100%) rename patches/server/{0033-sync-with-Gale-s-Optimize-villager-data-storage.patc.patch => 0035-sync-with-Gale-s-Optimize-villager-data-storage.patc.patch} (100%) rename patches/server/{0034-Petal-Async-Pathfinding.patch => 0036-Petal-Async-Pathfinding.patch} (99%) rename patches/server/{0035-Fix-tracker-NPE.patch => 0037-Fix-tracker-NPE.patch} (100%) rename patches/server/{0036-Cache-minecart-vehicle-collision-results.patch => 0038-Cache-minecart-vehicle-collision-results.patch} (96%) rename patches/server/{0037-Reduce-canSee-work.patch => 0039-Reduce-canSee-work.patch} (67%) rename patches/server/{0038-Faster-Natural-Spawning.patch => 0040-Faster-Natural-Spawning.patch} (98%) rename patches/server/{0039-Faster-Random-for-xaeroMapServerID-generation.patch => 0041-Faster-Random-for-xaeroMapServerID-generation.patch} (89%) rename patches/server/{0040-Fix-casting-in-Purpur-world-config.patch => 0042-Fix-casting-in-Purpur-world-config.patch} (100%) rename patches/server/{0041-Fix-sprint-glitch.patch => 0043-Fix-sprint-glitch.patch} (90%) rename patches/server/{0042-Fix-keepalive-kicked-name.patch => 0044-Fix-keepalive-kicked-name.patch} (100%) rename patches/server/{0043-Configurable-movement-speed-of-more-entities.patch => 0045-Configurable-movement-speed-of-more-entities.patch} (100%) rename patches/server/{0044-Fix-TerminalConsoleAppender-NPE-error-on-server-clos.patch => 0046-Fix-TerminalConsoleAppender-NPE-error-on-server-clos.patch} (100%) rename patches/server/{0046-PandaSpigot-Configurable-knockback.patch => 0047-PandaSpigot-Configurable-knockback.patch} (94%) rename patches/server/{0047-Faster-sequencing-of-futures-for-chunk-structure-gen.patch => 0048-Faster-sequencing-of-futures-for-chunk-structure-gen.patch} (100%) delete mode 100644 patches/server/0049-Leaves-be-vanilla-end-gateway.patch rename patches/server/{0042-Reduce-items-finding-hopper-nearby-check.patch => 0049-Reduce-items-finding-hopper-nearby-check.patch} (95%) rename patches/server/{0045-AddLinearSupport.patch => 0050-AddLinearSupport.patch} (100%) rename patches/server/{0050-Add-Purpur-and-Pufferfish-missing-config.patch => 0051-Add-Purpur-and-Pufferfish-missing-config.patch} (100%) rename patches/server/{0051-Skip-event-if-no-listeners.patch => 0052-Skip-event-if-no-listeners.patch} (100%) rename patches/server/{0053-SparklyPaper-Rewrite-framed-map-tracker-ticking.patch => 0053-PaperPR-Rewrite-framed-map-tracker-ticking.patch} (74%) rename patches/server/{0055-Polpot-Cache-coordinate-key-used-for-nearby-players.patch => 0055-SparklyPaper-Cache-coordinate-key-used-for-nearby-pl.patch} (64%) rename patches/server/{0052-Optimize-canSee-checks.patch => 0056-SparklyPaper-Optimize-canSee-checks.patch} (61%) rename patches/server/{0056-Polpot-make-make-egg-and-snowball-can-knockback-play.patch => 0057-Polpot-make-make-egg-and-snowball-can-knockback-play.patch} (81%) diff --git a/patches/server/0010-Purpur-Configurable-server-mod-name.patch b/patches/server/0010-Purpur-Configurable-server-mod-name.patch index d165e42d..fed18fcd 100644 --- a/patches/server/0010-Purpur-Configurable-server-mod-name.patch +++ b/patches/server/0010-Purpur-Configurable-server-mod-name.patch @@ -3,6 +3,8 @@ From: Dreeam <61569423+Dreeam-qwq@users.noreply.github.com> Date: Mon, 17 Jul 2023 08:31:51 +0800 Subject: [PATCH] Purpur: Configurable server mod name +Original license: MIT +Original project: https://github.com/PurpurMC/Purpur diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java index fe3ad5d2acec094e9f363acb418233a2756fd0c3..a58b37b576888f865259e647fb30624fa99361bd 100644 diff --git a/patches/server/0048-Leaves-Disable-Moved-Wrongly-Threshold.patch b/patches/server/0032-Leaves-Disable-moved-wrongly-threshold.patch similarity index 57% rename from patches/server/0048-Leaves-Disable-Moved-Wrongly-Threshold.patch rename to patches/server/0032-Leaves-Disable-moved-wrongly-threshold.patch index 111e9dfc..78ae9590 100644 --- a/patches/server/0048-Leaves-Disable-Moved-Wrongly-Threshold.patch +++ b/patches/server/0032-Leaves-Disable-moved-wrongly-threshold.patch @@ -1,70 +1,76 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: lilingfengdev <145678359+lilingfengdev@users.noreply.github.com> -Date: Wed, 17 Jan 2024 13:46:16 +0800 -Subject: [PATCH] Leaves Disable Moved Wrongly Threshold +From: violetc <58360096+s-yh-china@users.noreply.github.com> +Date: Thu, 28 Sep 2023 20:30:46 +0800 +Subject: [PATCH] Leaves: Disable moved wrongly threshold +Original license: GPLv3 +Original project: https://github.com/LeavesMC/Leaves diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 5736cb60316da784590ef03d5808376254aae20b..06c716715b29fa4d2481bb8716ac25e8ba3c4209 100644 +index 5736cb60316da784590ef03d5808376254aae20b..6d03d8818afb81fa9b5bd92c32a0fde63a4367e9 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -247,7 +247,9 @@ import org.bukkit.inventory.EquipmentSlot; +@@ -247,7 +247,6 @@ import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.InventoryView; import org.bukkit.inventory.SmithingInventory; // CraftBukkit end - -+// Leaf start -+import org.dreeam.leaf.LeafConfig; -+// Leaf end public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl implements ServerGamePacketListener, ServerPlayerConnection, TickablePacketListener { static final Logger LOGGER = LogUtils.getLogger(); -@@ -583,7 +585,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -583,7 +582,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl } // Paper end - if (d10 - d9 > Math.max(100.0D, Math.pow((double) (org.spigotmc.SpigotConfig.movedTooQuicklyMultiplier * (float) i * speed), 2)) && !this.isSingleplayerOwner()) { -+ if (!LeafConfig.disableMovedWronglyThreshold && d10 - d9 > Math.max(100.0D, Math.pow((double) (org.spigotmc.SpigotConfig.movedTooQuicklyMultiplier * (float) i * speed), 2)) && !this.isSingleplayerOwner()) { // Leaves - disable can ++ if (!org.dreeam.leaf.LeafConfig.disableMovedWronglyThreshold && d10 - d9 > Math.max(100.0D, Math.pow((double) (org.spigotmc.SpigotConfig.movedTooQuicklyMultiplier * (float) i * speed), 2)) && !this.isSingleplayerOwner()) { // Leaves - disable can // CraftBukkit end ServerGamePacketListenerImpl.LOGGER.warn("{} (vehicle of {}) moved too quickly! {},{},{}", new Object[]{entity.getName().getString(), this.player.getName().getString(), d6, d7, d8}); this.send(new ClientboundMoveVehiclePacket(entity)); -@@ -619,7 +621,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -619,7 +618,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl d10 = d6 * d6 + d7 * d7 + d8 * d8; boolean flag2 = false; - if (d10 > org.spigotmc.SpigotConfig.movedWronglyThreshold) { // Spigot -+ if (!LeafConfig.disableMovedWronglyThreshold && d10 > org.spigotmc.SpigotConfig.movedWronglyThreshold) { // Spigot // Leaves - disable can ++ if (!org.dreeam.leaf.LeafConfig.disableMovedWronglyThreshold && d10 > org.spigotmc.SpigotConfig.movedWronglyThreshold) { // Spigot // Leaves - disable can flag2 = true; // Paper - diff on change, this should be moved wrongly ServerGamePacketListenerImpl.LOGGER.warn("{} (vehicle of {}) moved wrongly! {}", new Object[]{entity.getName().getString(), this.player.getName().getString(), Math.sqrt(d10)}); } -@@ -1487,7 +1489,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1487,7 +1486,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl io.papermc.paper.event.player.PlayerFailMoveEvent event = fireFailMove(io.papermc.paper.event.player.PlayerFailMoveEvent.FailReason.MOVED_TOO_QUICKLY, toX, toY, toZ, toYaw, toPitch, true); if (!event.isAllowed()) { - if (event.getLogWarning()) -+ if (!LeafConfig.disableMovedWronglyThreshold && event.getLogWarning()) // Leaves - disable can ++ if (!org.dreeam.leaf.LeafConfig.disableMovedWronglyThreshold && event.getLogWarning()) // Leaves - disable can ServerGamePacketListenerImpl.LOGGER.warn("{} moved too quickly! {},{},{}", new Object[]{this.player.getName().getString(), d6, d7, d8}); this.teleport(this.player.getX(), this.player.getY(), this.player.getZ(), this.player.getYRot(), this.player.getXRot()); return; -@@ -1557,7 +1559,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1557,7 +1556,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl d10 = d6 * d6 + d7 * d7 + d8 * d8; boolean flag2 = false; - if (!this.player.isChangingDimension() && d10 > org.spigotmc.SpigotConfig.movedWronglyThreshold && !this.player.isSleeping() && !this.player.gameMode.isCreative() && this.player.gameMode.getGameModeForPlayer() != GameType.SPECTATOR) { // Spigot -+ if (!LeafConfig.disableMovedWronglyThreshold && !this.player.isChangingDimension() && d10 > org.spigotmc.SpigotConfig.movedWronglyThreshold && !this.player.isSleeping() && !this.player.gameMode.isCreative() && this.player.gameMode.getGameModeForPlayer() != GameType.SPECTATOR) { // Spigot // Leaves - disable can ++ if (!org.dreeam.leaf.LeafConfig.disableMovedWronglyThreshold && !this.player.isChangingDimension() && d10 > org.spigotmc.SpigotConfig.movedWronglyThreshold && !this.player.isSleeping() && !this.player.gameMode.isCreative() && this.player.gameMode.getGameModeForPlayer() != GameType.SPECTATOR) { // Spigot // Leaves - disable can // Paper start - Add fail move event io.papermc.paper.event.player.PlayerFailMoveEvent event = fireFailMove(io.papermc.paper.event.player.PlayerFailMoveEvent.FailReason.MOVED_WRONGLY, toX, toY, toZ, toYaw, toPitch, true); diff --git a/src/main/java/org/dreeam/leaf/LeafConfig.java b/src/main/java/org/dreeam/leaf/LeafConfig.java -index c51b54bcb96d06197d6265055e2e9e44858cd224..156765eeee6ab46f18e34cf62dde1a7d878932cc 100644 +index 49fc8b6e0be0e1d5bdc283cef91ab0834dc387f1..c16913bda424c060d0abd83fcfaa93f52f4f8891 100644 --- a/src/main/java/org/dreeam/leaf/LeafConfig.java +++ b/src/main/java/org/dreeam/leaf/LeafConfig.java -@@ -313,4 +313,8 @@ public class LeafConfig { - extraHorizontal = getDouble("playerKnockback.extraHorizontal", extraHorizontal); - extraVertical = getDouble("playerKnockback.extraVertical", extraVertical); - } +@@ -176,6 +176,7 @@ public class LeafConfig { + public static boolean removeSpigotCheckBungeeConfig = true; + public static boolean removeUseItemOnPacketTooFar = false; + public static double maxUseItemDistance = 1.0000001D; + public static boolean disableMovedWronglyThreshold = false; -+ private static void getDisableMovedWronglyThreshold() { -+ disableMovedWronglyThreshold = getBoolean("disableMovedWronglyThreshold",disableMovedWronglyThreshold,:"Disable Moved Wrongly Threshold") -+ } - } + private static void removal() { + removeMojangUsernameCheck = getBoolean("remove-Mojang-username-check", removeMojangUsernameCheck, + "Remove username check of Mojang", +@@ -186,6 +187,7 @@ public class LeafConfig { + removeUseItemOnPacketTooFar = getBoolean("remove-UseItemOnPacket-too-far-check", removeUseItemOnPacketTooFar, + "To enable this, players can use some packet modules with hack clients and the NoCom Exploit!!"); + maxUseItemDistance = getDouble("max-UseItem-distance", maxUseItemDistance, "The max distance of UseItem for players"); ++ disableMovedWronglyThreshold = getBoolean("disable-MovedWronglyThreshold", disableMovedWronglyThreshold, "Disable moved quickly/wrongly checks"); + } + + public static boolean enableAsyncMobSpawning = true; diff --git a/patches/server/0033-Leaves-Fix-vehicle-teleport-by-end-gateway.patch b/patches/server/0033-Leaves-Fix-vehicle-teleport-by-end-gateway.patch new file mode 100644 index 00000000..a4ab916c --- /dev/null +++ b/patches/server/0033-Leaves-Fix-vehicle-teleport-by-end-gateway.patch @@ -0,0 +1,35 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: violetc <58360096+s-yh-china@users.noreply.github.com> +Date: Tue, 15 Aug 2023 22:40:42 +0800 +Subject: [PATCH] Leaves: Fix vehicle teleport by end gateway + +Original license: GPLv3 +Original project: https://github.com/LeavesMC/Leaves + +diff --git a/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java +index 5d9f25da1bd502b0047abc64ef7602968ee3cb20..9f84d53f82e430e92568aef0bb7ec5bd7ffc46a0 100644 +--- a/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java ++++ b/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java +@@ -107,7 +107,7 @@ public class TheEndGatewayBlockEntity extends TheEndPortalBlockEntity { + if (!list.isEmpty()) { + // Paper start + for (Entity entity : list) { +- if (entity.canChangeDimensions()) { ++ if (org.dreeam.leaf.LeafConfig.useVanillaEndTeleport || entity.canChangeDimensions()) { // Leaf - be vanilla + TheEndGatewayBlockEntity.teleportEntity(world, pos, state, entity, blockEntity); + break; + } +diff --git a/src/main/java/org/dreeam/leaf/LeafConfig.java b/src/main/java/org/dreeam/leaf/LeafConfig.java +index c16913bda424c060d0abd83fcfaa93f52f4f8891..41009a22116ef4a81e9e550af186f5c0d9d43fa7 100644 +--- a/src/main/java/org/dreeam/leaf/LeafConfig.java ++++ b/src/main/java/org/dreeam/leaf/LeafConfig.java +@@ -280,4 +280,9 @@ public class LeafConfig { + gg.pufferfish.pufferfish.sentry.SentryManager.init(); + } + } ++ ++ public static boolean useVanillaEndTeleport = false; ++ private static void vanillaEndTeleport() { ++ useVanillaEndTeleport = getBoolean("use-vanilla-end-teleport", useVanillaEndTeleport, "Vanilla End Gateway Teleport"); ++ } + } diff --git a/patches/server/0032-Fix-Make-log4j-compatible-with-future-release.patch b/patches/server/0034-Fix-Make-log4j-compatible-with-future-release.patch similarity index 100% rename from patches/server/0032-Fix-Make-log4j-compatible-with-future-release.patch rename to patches/server/0034-Fix-Make-log4j-compatible-with-future-release.patch diff --git a/patches/server/0033-sync-with-Gale-s-Optimize-villager-data-storage.patc.patch b/patches/server/0035-sync-with-Gale-s-Optimize-villager-data-storage.patc.patch similarity index 100% rename from patches/server/0033-sync-with-Gale-s-Optimize-villager-data-storage.patc.patch rename to patches/server/0035-sync-with-Gale-s-Optimize-villager-data-storage.patc.patch diff --git a/patches/server/0034-Petal-Async-Pathfinding.patch b/patches/server/0036-Petal-Async-Pathfinding.patch similarity index 99% rename from patches/server/0034-Petal-Async-Pathfinding.patch rename to patches/server/0036-Petal-Async-Pathfinding.patch index 3dc4373c..710dbcac 100644 --- a/patches/server/0034-Petal-Async-Pathfinding.patch +++ b/patches/server/0036-Petal-Async-Pathfinding.patch @@ -3,11 +3,12 @@ From: peaches94 Date: Sun, 26 Jun 2022 16:51:37 -0500 Subject: [PATCH] Petal: Async Pathfinding -Fixed & Updated by KaiijuMC , licensed under GPL v3 -You can find the original code on https://github.com/KaiijuMC/Kaiiju +Fixed & Updated by KaiijuMC +Original license: GPLv3 +Original project: https://github.com/KaiijuMC/Kaiiju -Original code by Bloom-host, licensed under GPL v3 -You can find the original code on https://github.com/Bloom-host/Petal +Original license: GPLv3 +Original project: https://github.com/Bloom-host/Petal This patch was ported downstream from the Petal fork. @@ -935,7 +936,7 @@ index 0e2b14e7dfedf209d63279c81723fd7955122d78..079b278e2e262af433bb5bd0c12b3d8d public SwimNodeEvaluator(boolean canJumpOutOfWater) { diff --git a/src/main/java/org/dreeam/leaf/LeafConfig.java b/src/main/java/org/dreeam/leaf/LeafConfig.java -index 49fc8b6e0be0e1d5bdc283cef91ab0834dc387f1..bf0a146b34b227dff392340fc0f53017d0691bdb 100644 +index 41009a22116ef4a81e9e550af186f5c0d9d43fa7..d6646f4db522aa4a5404acf17fb34bfe01a5763a 100644 --- a/src/main/java/org/dreeam/leaf/LeafConfig.java +++ b/src/main/java/org/dreeam/leaf/LeafConfig.java @@ -5,6 +5,7 @@ import net.minecraft.core.registries.BuiltInRegistries; @@ -954,7 +955,7 @@ index 49fc8b6e0be0e1d5bdc283cef91ab0834dc387f1..bf0a146b34b227dff392340fc0f53017 public class LeafConfig { -@@ -198,6 +200,9 @@ public class LeafConfig { +@@ -200,6 +202,9 @@ public class LeafConfig { public static boolean throttleInactiveGoalSelectorTick = true; public static Map projectileTimeouts; public static boolean useSpigotItemMergingMechanism = true; @@ -964,7 +965,7 @@ index 49fc8b6e0be0e1d5bdc283cef91ab0834dc387f1..bf0a146b34b227dff392340fc0f53017 private static void performance() { boolean asyncMobSpawning = getBoolean("performance.enable-async-mob-spawning", enableAsyncMobSpawning, "Whether or not asynchronous mob spawning should be enabled.", -@@ -247,6 +252,17 @@ public class LeafConfig { +@@ -249,6 +254,17 @@ public class LeafConfig { entityType.ttl = config.getInt("entity_timeouts." + type, -1); } useSpigotItemMergingMechanism = getBoolean("performance.use-spigot-item-merging-mechanism", useSpigotItemMergingMechanism); diff --git a/patches/server/0035-Fix-tracker-NPE.patch b/patches/server/0037-Fix-tracker-NPE.patch similarity index 100% rename from patches/server/0035-Fix-tracker-NPE.patch rename to patches/server/0037-Fix-tracker-NPE.patch diff --git a/patches/server/0036-Cache-minecart-vehicle-collision-results.patch b/patches/server/0038-Cache-minecart-vehicle-collision-results.patch similarity index 96% rename from patches/server/0036-Cache-minecart-vehicle-collision-results.patch rename to patches/server/0038-Cache-minecart-vehicle-collision-results.patch index 3076ce89..59ea4997 100644 --- a/patches/server/0036-Cache-minecart-vehicle-collision-results.patch +++ b/patches/server/0038-Cache-minecart-vehicle-collision-results.patch @@ -64,10 +64,10 @@ index c809e370ab61811c7e2fa3d6f207ae04fcb6749b..30db428ade01213ccd9956cd739747b5 while (iterator1.hasNext()) { Entity entity1 = (Entity) iterator1.next(); diff --git a/src/main/java/org/dreeam/leaf/LeafConfig.java b/src/main/java/org/dreeam/leaf/LeafConfig.java -index bf0a146b34b227dff392340fc0f53017d0691bdb..0d7ffc85fba9bc7586a68f09c1636f81198aa19f 100644 +index d6646f4db522aa4a5404acf17fb34bfe01a5763a..475d53b5b5ef82f982f3619eb161e76db095b73f 100644 --- a/src/main/java/org/dreeam/leaf/LeafConfig.java +++ b/src/main/java/org/dreeam/leaf/LeafConfig.java -@@ -203,6 +203,7 @@ public class LeafConfig { +@@ -205,6 +205,7 @@ public class LeafConfig { public static boolean asyncPathfinding = false; public static int asyncPathfindingMaxThreads = 0; public static int asyncPathfindingKeepalive = 60; @@ -75,7 +75,7 @@ index bf0a146b34b227dff392340fc0f53017d0691bdb..0d7ffc85fba9bc7586a68f09c1636f81 private static void performance() { boolean asyncMobSpawning = getBoolean("performance.enable-async-mob-spawning", enableAsyncMobSpawning, "Whether or not asynchronous mob spawning should be enabled.", -@@ -263,6 +264,9 @@ public class LeafConfig { +@@ -265,6 +266,9 @@ public class LeafConfig { asyncPathfindingMaxThreads = 0; else Bukkit.getLogger().log(Level.INFO, "Using " + asyncPathfindingMaxThreads + " threads for Async Pathfinding"); diff --git a/patches/server/0037-Reduce-canSee-work.patch b/patches/server/0039-Reduce-canSee-work.patch similarity index 67% rename from patches/server/0037-Reduce-canSee-work.patch rename to patches/server/0039-Reduce-canSee-work.patch index cdbf2373..82dd5a40 100644 --- a/patches/server/0037-Reduce-canSee-work.patch +++ b/patches/server/0039-Reduce-canSee-work.patch @@ -6,10 +6,10 @@ Subject: [PATCH] Reduce canSee work Credit by: Martijn Muijsers , MachineBreaker diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index 2c5c84c028d1298bb145fa1149752db3f83d5de2..202805185a61316c559c22be7c0d880d77abc503 100644 +index 2c5c84c028d1298bb145fa1149752db3f83d5de2..86d535c704d174da9b75bd599a7b302ba5fe5e56 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java -@@ -386,11 +386,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -386,17 +386,19 @@ public abstract class Level implements LevelAccessor, AutoCloseable { for (int i = 0, len = entities.size(); i < len; ++i) { Entity entity = entities.get(i); @@ -22,42 +22,27 @@ index 2c5c84c028d1298bb145fa1149752db3f83d5de2..202805185a61316c559c22be7c0d880d // !entity1.dead && entity1.i && (entity == null || !entity1.x(entity)); // elide the last check since vanilla calls with entity = null // only we care about the source for the canSee check -@@ -398,6 +394,11 @@ public abstract class Level implements LevelAccessor, AutoCloseable { + if (entity.isRemoved() || !entity.blocksBuilding) { continue; } - ++ // Leaf end ++ + if (checkCanSee && source instanceof net.minecraft.server.level.ServerPlayer && entity instanceof net.minecraft.server.level.ServerPlayer + && !((net.minecraft.server.level.ServerPlayer) source).getBukkitEntity().canSee(((net.minecraft.server.level.ServerPlayer) entity).getBukkitEntity())) { + continue; + } -+ + if (net.minecraft.world.phys.shapes.Shapes.joinIsNotEmpty(voxelshape, net.minecraft.world.phys.shapes.Shapes.create(entity.getBoundingBox()), net.minecraft.world.phys.shapes.BooleanOp.AND)) { return false; - } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 7e13ffee8e650cd5fe63fddf636321830e6ffb6d..b1442a099fa38fe20e9421f9183d66cf1ec54c2f 100644 +index 7e13ffee8e650cd5fe63fddf636321830e6ffb6d..f0da7fb7b09c8a5483b5d741810ab99985df64b6 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -585,12 +585,14 @@ public class CraftPlayer extends CraftHumanEntity implements Player { - this.getHandle().connection.send(packet); - } - -+ // Leaf - TODO - @Override - public boolean equals(Object obj) { - if (!(obj instanceof OfflinePlayer)) { +@@ -591,6 +591,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { return false; } OfflinePlayer other = (OfflinePlayer) obj; -+ if (this == obj) return true; // Leaf ++ if (this == obj) return true; // Leaf - reduce canSee work if ((this.getUniqueId() == null) || (other.getUniqueId() == null)) { return false; } -@@ -2160,6 +2162,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { - return this.canSee((org.bukkit.entity.Entity) player); - } - -+ // Leaf - TODO - @Override - public boolean canSee(org.bukkit.entity.Entity entity) { - return this.equals(entity) || entity.isVisibleByDefault() ^ this.invertedVisibilityEntities.containsKey(entity.getUniqueId()); // SPIGOT-7312: Can always see self diff --git a/patches/server/0038-Faster-Natural-Spawning.patch b/patches/server/0040-Faster-Natural-Spawning.patch similarity index 98% rename from patches/server/0038-Faster-Natural-Spawning.patch rename to patches/server/0040-Faster-Natural-Spawning.patch index 72b729d7..88ccf49f 100644 --- a/patches/server/0038-Faster-Natural-Spawning.patch +++ b/patches/server/0040-Faster-Natural-Spawning.patch @@ -22,7 +22,7 @@ index ff1ad1024419182f7f3de578442c1c033d4c9ebb..5e51a1c79811291a740ad4d5e79a7d67 @Deprecated static RandomSource createThreadSafe() { diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index 202805185a61316c559c22be7c0d880d77abc503..0e33e62761b0cc12925f238226cca35c253914ae 100644 +index 86d535c704d174da9b75bd599a7b302ba5fe5e56..8658ba808791901cf45b3aeb6317b3ec80387609 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java @@ -128,6 +128,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { diff --git a/patches/server/0039-Faster-Random-for-xaeroMapServerID-generation.patch b/patches/server/0041-Faster-Random-for-xaeroMapServerID-generation.patch similarity index 89% rename from patches/server/0039-Faster-Random-for-xaeroMapServerID-generation.patch rename to patches/server/0041-Faster-Random-for-xaeroMapServerID-generation.patch index b3f40293..f13ed954 100644 --- a/patches/server/0039-Faster-Random-for-xaeroMapServerID-generation.patch +++ b/patches/server/0041-Faster-Random-for-xaeroMapServerID-generation.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Faster Random for xaeroMapServerID generation diff --git a/src/main/java/org/dreeam/leaf/LeafConfig.java b/src/main/java/org/dreeam/leaf/LeafConfig.java -index 0d7ffc85fba9bc7586a68f09c1636f81198aa19f..2b2b87deb9a8d7df23cc5598c975da201bc8ee48 100644 +index 475d53b5b5ef82f982f3619eb161e76db095b73f..c871d3c03b384a3f7e4c8c919b9d565ebe4e8a77 100644 --- a/src/main/java/org/dreeam/leaf/LeafConfig.java +++ b/src/main/java/org/dreeam/leaf/LeafConfig.java @@ -2,7 +2,7 @@ package org.dreeam.leaf; @@ -17,7 +17,7 @@ index 0d7ffc85fba9bc7586a68f09c1636f81198aa19f..2b2b87deb9a8d7df23cc5598c975da20 import net.minecraft.server.MinecraftServer; import net.minecraft.world.entity.EntityType; import org.bukkit.Bukkit; -@@ -272,7 +272,7 @@ public class LeafConfig { +@@ -274,7 +274,7 @@ public class LeafConfig { public static boolean jadeProtocol = false; public static boolean appleskinProtocol = false; public static boolean xaeroMapProtocol = false; diff --git a/patches/server/0040-Fix-casting-in-Purpur-world-config.patch b/patches/server/0042-Fix-casting-in-Purpur-world-config.patch similarity index 100% rename from patches/server/0040-Fix-casting-in-Purpur-world-config.patch rename to patches/server/0042-Fix-casting-in-Purpur-world-config.patch diff --git a/patches/server/0041-Fix-sprint-glitch.patch b/patches/server/0043-Fix-sprint-glitch.patch similarity index 90% rename from patches/server/0041-Fix-sprint-glitch.patch rename to patches/server/0043-Fix-sprint-glitch.patch index 42086ffb..031a0b60 100644 --- a/patches/server/0041-Fix-sprint-glitch.patch +++ b/patches/server/0043-Fix-sprint-glitch.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Fix sprint glitch diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 6ca39830ead96eb18e9b5e637d1ea33c93e30198..0a8e22a7aabca12b3d6391b21d6e431398c01ba9 100644 +index 6ca39830ead96eb18e9b5e637d1ea33c93e30198..0c7c73fcc5f5c2f2b5362409e185f0c38ab85b6c 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java @@ -1429,7 +1429,8 @@ public abstract class LivingEntity extends Entity implements Attackable { diff --git a/patches/server/0042-Fix-keepalive-kicked-name.patch b/patches/server/0044-Fix-keepalive-kicked-name.patch similarity index 100% rename from patches/server/0042-Fix-keepalive-kicked-name.patch rename to patches/server/0044-Fix-keepalive-kicked-name.patch diff --git a/patches/server/0043-Configurable-movement-speed-of-more-entities.patch b/patches/server/0045-Configurable-movement-speed-of-more-entities.patch similarity index 100% rename from patches/server/0043-Configurable-movement-speed-of-more-entities.patch rename to patches/server/0045-Configurable-movement-speed-of-more-entities.patch diff --git a/patches/server/0044-Fix-TerminalConsoleAppender-NPE-error-on-server-clos.patch b/patches/server/0046-Fix-TerminalConsoleAppender-NPE-error-on-server-clos.patch similarity index 100% rename from patches/server/0044-Fix-TerminalConsoleAppender-NPE-error-on-server-clos.patch rename to patches/server/0046-Fix-TerminalConsoleAppender-NPE-error-on-server-clos.patch diff --git a/patches/server/0046-PandaSpigot-Configurable-knockback.patch b/patches/server/0047-PandaSpigot-Configurable-knockback.patch similarity index 94% rename from patches/server/0046-PandaSpigot-Configurable-knockback.patch rename to patches/server/0047-PandaSpigot-Configurable-knockback.patch index aa3c8b9b..eeed37ad 100644 --- a/patches/server/0046-PandaSpigot-Configurable-knockback.patch +++ b/patches/server/0047-PandaSpigot-Configurable-knockback.patch @@ -3,15 +3,15 @@ From: hpfxd Date: Tue, 2 Jan 2024 01:47:36 -0500 Subject: [PATCH] PandaSpigot: Configurable knockback -Original code by hpfxd, licensed under GPL v3 -You can find the original code on https://github.com/hpfxd/PandaSpigot +Original license: GPLv3 +Original project: https://github.com/hpfxd/PandaSpigot This patch allows velocity applied when a player is hit to be modified in the configuration. Reference: https://gist.github.com/YoungOG/e3265d98661957abece71594b70d6a01 diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 0a8e22a7aabca12b3d6391b21d6e431398c01ba9..62e4fa9b5cb4043990c6642df43c8ef5c61caa17 100644 +index 0c7c73fcc5f5c2f2b5362409e185f0c38ab85b6c..424779ac48351f79e64522e954b0b20778ca8a3a 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java @@ -1965,7 +1965,13 @@ public abstract class LivingEntity extends Entity implements Attackable { @@ -104,7 +104,7 @@ index b0aa6482936338b5102efaaae682e8b26dc4ede6..040231a7c6388b30d9aa1e0287f34801 if (flag2) { diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index b1442a099fa38fe20e9421f9183d66cf1ec54c2f..468ac1525c97043b53b16440fec6bb784e1e9c25 100644 +index f0da7fb7b09c8a5483b5d741810ab99985df64b6..56da11efc3be1da40dcbb7080f64bd9719517153 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -67,6 +67,7 @@ import net.minecraft.network.protocol.game.ClientboundSetBorderSizePacket; @@ -115,7 +115,7 @@ index b1442a099fa38fe20e9421f9183d66cf1ec54c2f..468ac1525c97043b53b16440fec6bb78 import net.minecraft.network.protocol.game.ClientboundSetEquipmentPacket; import net.minecraft.network.protocol.game.ClientboundSetExperiencePacket; import net.minecraft.network.protocol.game.ClientboundSetHealthPacket; -@@ -3271,6 +3272,40 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -3269,6 +3270,40 @@ public class CraftPlayer extends CraftHumanEntity implements Player { getHandle().resetAttackStrengthTicker(); } // Paper end @@ -157,12 +157,12 @@ index b1442a099fa38fe20e9421f9183d66cf1ec54c2f..468ac1525c97043b53b16440fec6bb78 private final Player.Spigot spigot = new Player.Spigot() { diff --git a/src/main/java/org/dreeam/leaf/LeafConfig.java b/src/main/java/org/dreeam/leaf/LeafConfig.java -index 2b2b87deb9a8d7df23cc5598c975da201bc8ee48..c51b54bcb96d06197d6265055e2e9e44858cd224 100644 +index c871d3c03b384a3f7e4c8c919b9d565ebe4e8a77..635f09b234c723b79d35686105c2c3335f868e6a 100644 --- a/src/main/java/org/dreeam/leaf/LeafConfig.java +++ b/src/main/java/org/dreeam/leaf/LeafConfig.java -@@ -298,4 +298,19 @@ public class LeafConfig { - gg.pufferfish.pufferfish.sentry.SentryManager.init(); - } +@@ -305,4 +305,19 @@ public class LeafConfig { + private static void vanillaEndTeleport() { + useVanillaEndTeleport = getBoolean("use-vanilla-end-teleport", useVanillaEndTeleport, "Vanilla End Gateway Teleport"); } + + public static double friction = 2.0D; diff --git a/patches/server/0047-Faster-sequencing-of-futures-for-chunk-structure-gen.patch b/patches/server/0048-Faster-sequencing-of-futures-for-chunk-structure-gen.patch similarity index 100% rename from patches/server/0047-Faster-sequencing-of-futures-for-chunk-structure-gen.patch rename to patches/server/0048-Faster-sequencing-of-futures-for-chunk-structure-gen.patch diff --git a/patches/server/0049-Leaves-be-vanilla-end-gateway.patch b/patches/server/0049-Leaves-be-vanilla-end-gateway.patch deleted file mode 100644 index ddd87db6..00000000 --- a/patches/server/0049-Leaves-be-vanilla-end-gateway.patch +++ /dev/null @@ -1,45 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: lilingfengdev <145678359+lilingfengdev@users.noreply.github.com> -Date: Wed, 17 Jan 2024 14:29:37 +0800 -Subject: [PATCH] Leaves be vanilla end gateway - - -diff --git a/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java -index 5d9f25da1bd502b0047abc64ef7602968ee3cb20..2ca123ecd7cac2c7fdaafcc2c58c8c126adcf94a 100644 ---- a/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java -+++ b/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java -@@ -38,6 +38,9 @@ import org.bukkit.craftbukkit.entity.CraftPlayer; - import org.bukkit.craftbukkit.util.CraftLocation; - import org.bukkit.event.player.PlayerTeleportEvent; - // CraftBukkit end -+// Leaf start -+import org.dreeam.leaf.LeafConfig; -+// Leaf end - - public class TheEndGatewayBlockEntity extends TheEndPortalBlockEntity { - -@@ -107,7 +110,7 @@ public class TheEndGatewayBlockEntity extends TheEndPortalBlockEntity { - if (!list.isEmpty()) { - // Paper start - for (Entity entity : list) { -- if (entity.canChangeDimensions()) { -+ if (LeafConfig.vanillaEndTeleport || entity.canChangeDimensions()) { // Leaf - be vanilla - TheEndGatewayBlockEntity.teleportEntity(world, pos, state, entity, blockEntity); - break; - } -diff --git a/src/main/java/org/dreeam/leaf/LeafConfig.java b/src/main/java/org/dreeam/leaf/LeafConfig.java -index 156765eeee6ab46f18e34cf62dde1a7d878932cc..728082120af5a7afe20078b3fa6d80605f5ff6c7 100644 ---- a/src/main/java/org/dreeam/leaf/LeafConfig.java -+++ b/src/main/java/org/dreeam/leaf/LeafConfig.java -@@ -315,6 +315,10 @@ public class LeafConfig { - } - public static boolean disableMovedWronglyThreshold = false; - private static void getDisableMovedWronglyThreshold() { -- disableMovedWronglyThreshold = getBoolean("disableMovedWronglyThreshold",disableMovedWronglyThreshold,:"Disable Moved Wrongly Threshold") -+ disableMovedWronglyThreshold = getBoolean("disableMovedWronglyThreshold",disableMovedWronglyThreshold,"Disable Moved Wrongly Threshold"); -+ } -+ public static boolean vanillaEndTeleport = false; -+ private static void getVanillaTeleport() { -+ vanillaEndTeleport = getBoolean("vanillaEndTeleport",vanillaEndTeleport,"Vanilla End Gateway Teleport"); - } - } diff --git a/patches/server/0042-Reduce-items-finding-hopper-nearby-check.patch b/patches/server/0049-Reduce-items-finding-hopper-nearby-check.patch similarity index 95% rename from patches/server/0042-Reduce-items-finding-hopper-nearby-check.patch rename to patches/server/0049-Reduce-items-finding-hopper-nearby-check.patch index aaf9e8fd..ea033e8b 100644 --- a/patches/server/0042-Reduce-items-finding-hopper-nearby-check.patch +++ b/patches/server/0049-Reduce-items-finding-hopper-nearby-check.patch @@ -10,7 +10,7 @@ But still recommend to turn-off `checkForMinecartNearItemWhileActive` Since `Reduce-hopper-item-checks.patch` will cause lag under massive dropped items diff --git a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java -index 0fe02df86483809cef22fca2e2ce0af7b4a5c6d5..7fce419490b39409f876914ce306f77d11e659b7 100644 +index 1f61dc925624c493ae458748e8422383104b022f..4ba2285e9d5ec3444c73419f8fab040a96a03c0e 100644 --- a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java +++ b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java @@ -1,7 +1,9 @@ @@ -23,7 +23,7 @@ index 0fe02df86483809cef22fca2e2ce0af7b4a5c6d5..7fce419490b39409f876914ce306f77d import java.util.Objects; import java.util.UUID; import javax.annotation.Nullable; -@@ -219,7 +221,9 @@ public class ItemEntity extends Entity implements TraceableEntity { +@@ -237,7 +239,9 @@ public class ItemEntity extends Entity implements TraceableEntity { this.discard(); return; // Gale - EMC - reduce hopper item checks } @@ -34,7 +34,7 @@ index 0fe02df86483809cef22fca2e2ce0af7b4a5c6d5..7fce419490b39409f876914ce306f77d } } -@@ -231,17 +235,53 @@ public class ItemEntity extends Entity implements TraceableEntity { +@@ -249,17 +253,53 @@ public class ItemEntity extends Entity implements TraceableEntity { if (config.interval <= 1) { return; } diff --git a/patches/server/0045-AddLinearSupport.patch b/patches/server/0050-AddLinearSupport.patch similarity index 100% rename from patches/server/0045-AddLinearSupport.patch rename to patches/server/0050-AddLinearSupport.patch diff --git a/patches/server/0050-Add-Purpur-and-Pufferfish-missing-config.patch b/patches/server/0051-Add-Purpur-and-Pufferfish-missing-config.patch similarity index 100% rename from patches/server/0050-Add-Purpur-and-Pufferfish-missing-config.patch rename to patches/server/0051-Add-Purpur-and-Pufferfish-missing-config.patch diff --git a/patches/server/0051-Skip-event-if-no-listeners.patch b/patches/server/0052-Skip-event-if-no-listeners.patch similarity index 100% rename from patches/server/0051-Skip-event-if-no-listeners.patch rename to patches/server/0052-Skip-event-if-no-listeners.patch diff --git a/patches/server/0053-SparklyPaper-Rewrite-framed-map-tracker-ticking.patch b/patches/server/0053-PaperPR-Rewrite-framed-map-tracker-ticking.patch similarity index 74% rename from patches/server/0053-SparklyPaper-Rewrite-framed-map-tracker-ticking.patch rename to patches/server/0053-PaperPR-Rewrite-framed-map-tracker-ticking.patch index b91da0b4..fb11370d 100644 --- a/patches/server/0053-SparklyPaper-Rewrite-framed-map-tracker-ticking.patch +++ b/patches/server/0053-PaperPR-Rewrite-framed-map-tracker-ticking.patch @@ -1,108 +1,122 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: lilingfengdev <145678359+lilingfengdev@users.noreply.github.com> -Date: Wed, 17 Jan 2024 19:40:17 +0800 -Subject: [PATCH] SparklyPaper Rewrite-framed-map-tracker-ticking +From: Warrior <50800980+Warriorrrr@users.noreply.github.com> +Date: Mon, 14 Aug 2023 17:34:53 +0200 +Subject: [PATCH] PaperPR: Rewrite framed map tracker ticking +Original license: GPLv3 +Original project: +- https://github.com/PaperMC/Paper/pull/9605 +- https://github.com/SparklyPower/SparklyPaper + +Rewrites the tracking code for framed maps to remove the use of the tickCarriedBy method and the HoldingPlayer class. +The tickCarriedBy method contained a lot of code that did not apply to framed maps at all, and by moving the parts +that did elsewhere, we can essentially skip it. The only logic that's ran inside the ServerEntity#sendChanges for maps +now is just updating dirty map/decoration data. + +When no bukkit renderers are added to the map, we also re-use the same packet for all players who are tracking it which avoids a lot of work. diff --git a/src/main/java/net/minecraft/server/level/ServerEntity.java b/src/main/java/net/minecraft/server/level/ServerEntity.java -index 068dd1194016b65227ec44747b065860a48e7f1d..26a68dd4e7373291c645053990e63eb27ac41dbf 100644 +index 068dd1194016b65227ec44747b065860a48e7f1d..3c0d5fe3a5b3f77fc102e4c09645c96abca4f7e9 100644 --- a/src/main/java/net/minecraft/server/level/ServerEntity.java +++ b/src/main/java/net/minecraft/server/level/ServerEntity.java -@@ -115,23 +115,35 @@ public class ServerEntity { +@@ -111,29 +111,42 @@ public class ServerEntity { + + Entity entity = this.entity; + +- if (!this.trackedPlayers.isEmpty() && entity instanceof ItemFrame) { // Paper - Only tick item frames if players can see it ++ if (!this.trackedPlayers.isEmpty() && entity instanceof ItemFrame frame && frame.cachedMapId != null) { // Paper - Only tick item frames if players can see it // Paper ItemFrame entityitemframe = (ItemFrame) entity; if (true || this.tickCount % 10 == 0) { // CraftBukkit - Moved below, should always enter this block - ItemStack itemstack = entityitemframe.getItem(); -+ //ItemStack itemstack = entityitemframe.getItem(); // SparklyPaper ++ //ItemStack itemstack = entityitemframe.getItem(); // Paper - skip redundant getItem - if (this.level.paperConfig().maps.itemFrameCursorUpdateInterval > 0 && this.tickCount % this.level.paperConfig().maps.itemFrameCursorUpdateInterval == 0 && itemstack.getItem() instanceof MapItem) { // CraftBukkit - Moved this.tickCounter % 10 logic here so item frames do not enter the other blocks // Paper - Make item frame map cursor update interval configurable -+ if (this.level.paperConfig().maps.itemFrameCursorUpdateInterval > 0 && this.tickCount % this.level.paperConfig().maps.itemFrameCursorUpdateInterval == 0 /*&&itemstack.getItem() instanceof MapItem*/) { // CraftBukkit - Moved this.tickCounter % 10 logic here so item frames do not enter the other blocks // SparklyPaper - Make item frame map cursor update interval configurable ++ if (this.level.paperConfig().maps.itemFrameCursorUpdateInterval > 0 && this.tickCount % this.level.paperConfig().maps.itemFrameCursorUpdateInterval == 0 /*&& itemstack.getItem() instanceof MapItem*/) { // CraftBukkit - Moved this.tickCounter % 10 logic here so item frames do not enter the other blocks // Paper - Make item frame map cursor update interval configurable // Paper - skip redundant getItem Integer integer = entityitemframe.cachedMapId; // Paper MapItemSavedData worldmap = MapItem.getSavedData(integer, this.level); if (worldmap != null) { -- Iterator iterator = this.trackedPlayers.iterator(); // CraftBukkit -+ // SparklyPaper start - re-use the same update packet when possible ++ // Paper start - re-use the same update packet when possible + if (!worldmap.hasContextualRenderer) { + // Pass in a "random" player when a non-contextual plugin renderer is added to make sure its called + final Packet updatePacket = worldmap.framedUpdatePacket(integer, worldmap.hasPluginRenderer ? com.google.common.collect.Iterables.getFirst(this.trackedPlayers, null).getPlayer() : null); ++ + if (updatePacket != null) { -+ for (ServerPlayerConnection connection : this.trackedPlayers) { ++ for (ServerPlayerConnection connection : this.trackedPlayers) { + connection.send(updatePacket); ++ } + } -+ } + } else { -+ // SparklyPaper end -+ Iterator iterator = this.trackedPlayers.iterator(); // CraftBukkit ++ // Paper end + Iterator iterator = this.trackedPlayers.iterator(); // CraftBukkit -- while (iterator.hasNext()) { -- ServerPlayer entityplayer = iterator.next().getPlayer(); // CraftBukkit -+ while (iterator.hasNext()) { -+ ServerPlayer entityplayer = iterator.next().getPlayer(); // CraftBukkit + while (iterator.hasNext()) { + ServerPlayer entityplayer = iterator.next().getPlayer(); // CraftBukkit - worldmap.tickCarriedBy(entityplayer, itemstack); - Packet packet = worldmap.getUpdatePacket(integer, entityplayer); -+ //worldmap.tickCarriedBy(entityplayer, itemstack); // SparklyPaper -+ Packet packet = worldmap.framedUpdatePacket(integer, entityplayer); // SparklyPaper ++ //worldmap.tickCarriedBy(entityplayer, itemstack); // Paper ++ Packet packet = worldmap.framedUpdatePacket(integer, entityplayer); // Paper -- if (packet != null) { -- entityplayer.connection.send(packet); -+ if (packet != null) { -+ entityplayer.connection.send(packet); -+ } + if (packet != null) { + entityplayer.connection.send(packet); } } ++ } // Paper } -@@ -367,7 +379,19 @@ public class ServerEntity { - sender.accept(new ClientboundSetEntityLinkPacket(entityinsentient, entityinsentient.getLeashHolder())); + } + +@@ -368,6 +381,19 @@ public class ServerEntity { } } -+ // SparklyPaper start + ++ // Paper start - send full map when tracked + if (this.entity instanceof ItemFrame frame && frame.cachedMapId != null) { + MapItemSavedData mapData = MapItem.getSavedData(frame.cachedMapId, this.level); + + if (mapData != null) { + mapData.addFrameDecoration(frame); - ++ + final Packet mapPacket = mapData.fullUpdatePacket(frame.cachedMapId, mapData.hasPluginRenderer ? player : null); + if (mapPacket != null) + sender.accept((Packet) mapPacket); + } + } -+ // SparklyPaper end ++ // Paper end } private void sendDirtyEntityData() { diff --git a/src/main/java/net/minecraft/world/entity/decoration/ItemFrame.java b/src/main/java/net/minecraft/world/entity/decoration/ItemFrame.java -index d728dc8a9b5fa2de0a824aaf132ee15db090b02e..37d83ae140ee07dc448a18d0061fc091785da063 100644 +index d728dc8a9b5fa2de0a824aaf132ee15db090b02e..61532177b24311cbc91d52fd460d818eedea66b0 100644 --- a/src/main/java/net/minecraft/world/entity/decoration/ItemFrame.java +++ b/src/main/java/net/minecraft/world/entity/decoration/ItemFrame.java @@ -489,6 +489,16 @@ public class ItemFrame extends HangingEntity { } this.setItem(ItemStack.fromBukkitCopy(event.getItemStack())); // Paper end -+ // SparklyPaper start - add decoration and mark everything dirty for other players who are already tracking this frame ++ // Paper start - add decoration and mark everything dirty for other players who are already tracking this frame + final ItemStack item = this.getItem(); + if (item.is(Items.FILLED_MAP)) { + final MapItemSavedData data = MapItem.getSavedData(item, this.level()); + if (data != null) { + data.addFrameDecoration(this); + data.markAllDirty(); -+ } + } -+ // SparklyPaper end ++ } ++ // Paper end this.gameEvent(GameEvent.BLOCK_CHANGE, player); if (!player.getAbilities().instabuild) { itemstack.shrink(1); diff --git a/src/main/java/net/minecraft/world/level/saveddata/maps/MapItemSavedData.java b/src/main/java/net/minecraft/world/level/saveddata/maps/MapItemSavedData.java -index 804c342783baccdc12e8ca49a362770e31596f6a..a0b760388407469adbd9569edfccadcb1b3d37a1 100644 +index 804c342783baccdc12e8ca49a362770e31596f6a..e1a251490bf18ff60e0ef9e7c7a692afa329c7f7 100644 --- a/src/main/java/net/minecraft/world/level/saveddata/maps/MapItemSavedData.java +++ b/src/main/java/net/minecraft/world/level/saveddata/maps/MapItemSavedData.java @@ -67,6 +67,16 @@ public class MapItemSavedData extends SavedData { private final Map frameMarkers = Maps.newHashMap(); private int trackedDecorationCount; private org.bukkit.craftbukkit.map.RenderData vanillaRender = new org.bukkit.craftbukkit.map.RenderData(); // Paper -+ // SparklyPaper start - shared between all players tracking this map inside an item frame ++ // Paper start - shared between all players tracking this map inside an item frame + public boolean dirtyColorData; + public int minDirtyX; + public int minDirtyY; @@ -111,7 +125,7 @@ index 804c342783baccdc12e8ca49a362770e31596f6a..a0b760388407469adbd9569edfccadcb + public boolean dirtyFrameDecorations; + public boolean hasPluginRenderer; + public boolean hasContextualRenderer; -+ // SparklyPaper end ++ // Paper end public boolean isExplorerMap; // Purpur // CraftBukkit start @@ -119,7 +133,7 @@ index 804c342783baccdc12e8ca49a362770e31596f6a..a0b760388407469adbd9569edfccadcb } this.setDecorationsDirty(); -+ if (mapicon != null && mapicon.renderOnFrame()) this.dirtyFrameDecorations = true; // SparklyPaper ++ if (mapicon != null && mapicon.renderOnFrame()) this.dirtyFrameDecorations = true; // Paper } public static void addTargetDecoration(ItemStack stack, BlockPos pos, String id, MapDecoration.Type type) { @@ -127,7 +141,7 @@ index 804c342783baccdc12e8ca49a362770e31596f6a..a0b760388407469adbd9569edfccadcb } this.setDecorationsDirty(); -+ if (type.isRenderedOnFrame() || (mapicon1 != null && mapicon.type().isRenderedOnFrame())) this.dirtyFrameDecorations = true; // SparklyPaper ++ if (type.isRenderedOnFrame() || (mapicon1 != null && mapicon.type().isRenderedOnFrame())) this.dirtyFrameDecorations = true; // Paper } } @@ -135,20 +149,20 @@ index 804c342783baccdc12e8ca49a362770e31596f6a..a0b760388407469adbd9569edfccadcb public void setColorsDirty(int x, int z) { this.setDirty(); -+ // SparklyPaper start ++ // Paper start + if (this.dirtyColorData) { + this.minDirtyX = Math.min(this.minDirtyX, x); + this.minDirtyY = Math.min(this.minDirtyY, z); + this.maxDirtyX = Math.max(this.maxDirtyX, x); + this.maxDirtyY = Math.max(this.maxDirtyY, z); -+ } else { ++ } else { + this.dirtyColorData = true; + this.minDirtyX = x; + this.minDirtyY = z; + this.maxDirtyX = x; + this.maxDirtyY = z; + } -+ // SparklyPaper end ++ // Paper end Iterator iterator = this.carriedBy.iterator(); while (iterator.hasNext()) { @@ -156,15 +170,15 @@ index 804c342783baccdc12e8ca49a362770e31596f6a..a0b760388407469adbd9569edfccadcb public void removedFromFrame(BlockPos pos, int id) { this.removeDecoration("frame-" + id); this.frameMarkers.remove(MapFrame.frameId(pos)); -+ this.dirtyFrameDecorations = true; // SparklyPaper ++ this.dirtyFrameDecorations = true; // Paper } public boolean updateColor(int x, int z, byte color) { -@@ -579,7 +606,90 @@ public class MapItemSavedData extends SavedData { - public boolean isTrackedCountOverLimit(int iconCount) { +@@ -580,6 +607,93 @@ public class MapItemSavedData extends SavedData { return this.trackedDecorationCount >= iconCount; } -+ // SparklyPaper start + ++ // Paper start + public final @Nullable Packet framedUpdatePacket(int id, @Nullable Player player) { + return createUpdatePacket(id, player, false); + } @@ -174,9 +188,8 @@ index 804c342783baccdc12e8ca49a362770e31596f6a..a0b760388407469adbd9569edfccadcb + } + + public final @Nullable Packet createUpdatePacket(int id, @Nullable Player player, boolean full) { -+ if (!dirtyColorData && !dirtyFrameDecorations && (player == null || server.getCurrentTick() % 5 != 0) && !full) { ++ if (!dirtyColorData && !dirtyFrameDecorations && (player == null || server.getCurrentTick() % 5 != 0) && !full) // Periodically send update packets if a renderer is added + return null; -+ } + + final org.bukkit.craftbukkit.map.RenderData render = player != null ? this.mapView.render((org.bukkit.craftbukkit.entity.CraftPlayer) player.getBukkitEntity()) : this.vanillaRender; + @@ -191,18 +204,22 @@ index 804c342783baccdc12e8ca49a362770e31596f6a..a0b760388407469adbd9569edfccadcb + } + + Collection decorations = null; -+ if (dirtyFrameDecorations || full || hasPluginRenderer) { ++ if (dirtyFrameDecorations || full || hasPluginRenderer) { // Always add decorations when a plugin renderer is added + dirtyFrameDecorations = false; + decorations = new java.util.ArrayList<>(); + + if (player == null) { ++ // We're using the vanilla renderer, add in vanilla decorations + for (MapDecoration decoration : this.decorations.values()) { ++ // Skip sending decorations that aren't rendered, i.e. player decorations. ++ // Skipping player decorations also allows us to send the same update packet to all tracking players, the only caveat ++ // being that it causes a slight flicker of the player decoration for anyone holding & looking at the map. + if (decoration.renderOnFrame()) { + decorations.add(decoration); + } + } + } - ++ + for (final org.bukkit.map.MapCursor cursor : render.cursors) { + if (cursor.isVisible()) { + decorations.add(new MapDecoration(MapDecoration.Type.byIcon(cursor.getRawType()), cursor.getX(), cursor.getY(), cursor.getDirection(), PaperAdventure.asVanilla(cursor.caption()))); // Paper - Adventure @@ -230,9 +247,8 @@ index 804c342783baccdc12e8ca49a362770e31596f6a..a0b760388407469adbd9569edfccadcb + } + + public void addFrameDecoration(net.minecraft.world.entity.decoration.ItemFrame frame) { -+ if (this.trackedDecorationCount >= frame.level().paperConfig().maps.itemFrameCursorLimit || this.frameMarkers.containsKey(MapFrame.frameId(frame.getPos()))) { ++ if (this.trackedDecorationCount >= frame.level().paperConfig().maps.itemFrameCursorLimit || this.frameMarkers.containsKey(MapFrame.frameId(frame.getPos()))) + return; -+ } + + MapFrame mapFrame = new MapFrame(frame.getPos(), frame.getDirection().get2DDataValue() * 90, frame.getId()); + this.addDecoration(MapDecoration.Type.FRAME, frame.level(), "frame-" + frame.getId(), frame.getPos().getX(), frame.getPos().getZ(), mapFrame.getRotation(), (Component) null); @@ -247,22 +263,23 @@ index 804c342783baccdc12e8ca49a362770e31596f6a..a0b760388407469adbd9569edfccadcb + this.maxDirtyY = 127; + this.dirtyFrameDecorations = true; + } -+ // SparklyPaper end ++ // Paper end ++ public class HoldingPlayer { // Paper start diff --git a/src/main/java/org/bukkit/craftbukkit/map/CraftMapView.java b/src/main/java/org/bukkit/craftbukkit/map/CraftMapView.java -index c3266c43a073cb7d7eff10d1a1b15f0a2265b859..ff3b0f8ebea13f52a1d86085e32489db86969dd1 100644 +index c3266c43a073cb7d7eff10d1a1b15f0a2265b859..4d69e345117556bac2126edc5169ab01eed97377 100644 --- a/src/main/java/org/bukkit/craftbukkit/map/CraftMapView.java +++ b/src/main/java/org/bukkit/craftbukkit/map/CraftMapView.java @@ -108,6 +108,10 @@ public final class CraftMapView implements MapView { this.renderers.add(renderer); this.canvases.put(renderer, new HashMap()); renderer.initialize(this); -+ // SparklyPaper start ++ // Paper start + this.worldMap.hasPluginRenderer |= !(renderer instanceof CraftMapRenderer); + this.worldMap.hasContextualRenderer |= renderer.isContextual(); -+ // SparklyPaper end ++ // Paper end } } @@ -270,7 +287,7 @@ index c3266c43a073cb7d7eff10d1a1b15f0a2265b859..ff3b0f8ebea13f52a1d86085e32489db } } this.canvases.remove(renderer); -+ // SparklyPaper start ++ // Paper start + this.worldMap.hasPluginRenderer = !(this.renderers.size() == 1 && this.renderers.get(0) instanceof CraftMapRenderer); + if (renderer.isContextual()) { + // Re-check all renderers @@ -280,7 +297,7 @@ index c3266c43a073cb7d7eff10d1a1b15f0a2265b859..ff3b0f8ebea13f52a1d86085e32489db + } + this.worldMap.hasContextualRenderer = contextualFound; + } -+ // SparklyPaper end ++ // Paper end return true; } else { return false; diff --git a/patches/server/0054-SparklyPaper-Skip-MapItem-update-if-the-map-does-not.patch b/patches/server/0054-SparklyPaper-Skip-MapItem-update-if-the-map-does-not.patch index 43be7ef5..eddc57b0 100644 --- a/patches/server/0054-SparklyPaper-Skip-MapItem-update-if-the-map-does-not.patch +++ b/patches/server/0054-SparklyPaper-Skip-MapItem-update-if-the-map-does-not.patch @@ -1,51 +1,45 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: lilingfengdev <145678359+lilingfengdev@users.noreply.github.com> -Date: Wed, 17 Jan 2024 19:57:53 +0800 -Subject: [PATCH] - SparklyPaper-Skip-MapItem-update-if-the-map-does-not-have-the-Cra +From: MrPowerGamerBR +Date: Fri, 17 Nov 2023 14:22:41 -0300 +Subject: [PATCH] SparklyPaper: Skip "MapItem#update()" if the map does not + have the CraftMapRenderer present +Original project: https://github.com/SparklyPower/SparklyPaper + +Optimizes "image in map" maps, without requiring the map to be locked, which some old map plugins may not do + +This has the disadvantage that the vanilla map data will never be updated while the CraftMapRenderer is not present, but that's not a huuuge problem for u diff --git a/src/main/java/net/minecraft/world/item/MapItem.java b/src/main/java/net/minecraft/world/item/MapItem.java -index 6cfd169c2c32b644d70907358c2d4a2087c00a68..62aa1717eee90032c2ddf848424e903cc952a913 100644 +index 6cfd169c2c32b644d70907358c2d4a2087c00a68..c065ee1e68b5274d30f252d296b0c16a2adbf3c8 100644 --- a/src/main/java/net/minecraft/world/item/MapItem.java +++ b/src/main/java/net/minecraft/world/item/MapItem.java -@@ -32,6 +32,9 @@ import net.minecraft.world.level.levelgen.Heightmap; - import net.minecraft.world.level.material.FluidState; - import net.minecraft.world.level.material.MapColor; - import net.minecraft.world.level.saveddata.maps.MapItemSavedData; -+// Leaf Start -+import org.dreeam.leaf.LeafConfig; -+// Leaf end - - public class MapItem extends ComplexItem { - -@@ -314,6 +317,7 @@ public class MapItem extends ComplexItem { - } - - @Override -+ - public void inventoryTick(ItemStack stack, Level world, Entity entity, int slot, boolean selected) { - if (!world.isClientSide) { - MapItemSavedData worldmap = MapItem.getSavedData(stack, world); -@@ -325,7 +329,7 @@ public class MapItem extends ComplexItem { +@@ -325,7 +325,7 @@ public class MapItem extends ComplexItem { worldmap.tickCarriedBy(entityhuman, stack); } - if (!worldmap.locked && (selected || entity instanceof Player && ((Player) entity).getOffhandItem() == stack)) { -+ if (!worldmap.locked && (!LeafConfig.skipMapItemDataUpdatesIfMapDoesNotHaveCraftMapRenderer || worldmap.mapView.getRenderers().stream().anyMatch(mapRenderer -> mapRenderer.getClass() == org.bukkit.craftbukkit.map.CraftMapRenderer.class)) && (selected || entity instanceof Player && ((Player) entity).getOffhandItem() == stack)) { // SparklyPaper - don't update maps if they don't have the CraftMapRenderer in the render list ++ if (!worldmap.locked && (!org.dreeam.leaf.LeafConfig.skipMapItemDataUpdatesIfMapDoesNotHaveCraftMapRenderer || worldmap.mapView.getRenderers().stream().anyMatch(mapRenderer -> mapRenderer.getClass() == org.bukkit.craftbukkit.map.CraftMapRenderer.class)) && (selected || entity instanceof Player && ((Player) entity).getOffhandItem() == stack)) { // SparklyPaper - don't update maps if they don't have the CraftMapRenderer in the render list this.update(world, entity, worldmap); } diff --git a/src/main/java/org/dreeam/leaf/LeafConfig.java b/src/main/java/org/dreeam/leaf/LeafConfig.java -index 728082120af5a7afe20078b3fa6d80605f5ff6c7..db12eb7e81307cc3fd4fe0602697e32e71289f7e 100644 +index 635f09b234c723b79d35686105c2c3335f868e6a..3368e4d398132c64969b018e4fe8b7bbe8f2f364 100644 --- a/src/main/java/org/dreeam/leaf/LeafConfig.java +++ b/src/main/java/org/dreeam/leaf/LeafConfig.java -@@ -321,4 +321,8 @@ public class LeafConfig { - private static void getVanillaTeleport() { - vanillaEndTeleport = getBoolean("vanillaEndTeleport",vanillaEndTeleport,"Vanilla End Gateway Teleport"); +@@ -206,6 +206,7 @@ public class LeafConfig { + public static int asyncPathfindingMaxThreads = 0; + public static int asyncPathfindingKeepalive = 60; + public static boolean cacheMinecartCollision = false; ++ public static boolean skipMapItemDataUpdatesIfMapDoesNotHaveCraftMapRenderer = true; + private static void performance() { + boolean asyncMobSpawning = getBoolean("performance.enable-async-mob-spawning", enableAsyncMobSpawning, + "Whether or not asynchronous mob spawning should be enabled.", +@@ -269,6 +270,7 @@ public class LeafConfig { + cacheMinecartCollision = getBoolean("performance.cache-minecart-collision", cacheMinecartCollision, + "Cache the minecart collision result to prevent massive stacked minecart lag the server.", + "The known issue: entity can't enter the minecart after enabling this!"); ++ skipMapItemDataUpdatesIfMapDoesNotHaveCraftMapRenderer = getBoolean("performance.skip-map-item-data-updates-if-map-does-not-have-craftmaprenderer", skipMapItemDataUpdatesIfMapDoesNotHaveCraftMapRenderer); } -+ public static boolean skipMapItemDataUpdatesIfMapDoesNotHaveCraftMapRenderer=true; -+ private static void getSkipMapItemDataUpdatesIfMapDoesNotHaveCraftMapRenderer() { -+ skipMapItemDataUpdatesIfMapDoesNotHaveCraftMapRenderer = getBoolean("skipMapItemDataUpdatesIfMapDoesNotHaveCraftMapRenderer",skipMapItemDataUpdatesIfMapDoesNotHaveCraftMapRenderer); -+ } - } + + public static boolean jadeProtocol = false; diff --git a/patches/server/0055-Polpot-Cache-coordinate-key-used-for-nearby-players.patch b/patches/server/0055-SparklyPaper-Cache-coordinate-key-used-for-nearby-pl.patch similarity index 64% rename from patches/server/0055-Polpot-Cache-coordinate-key-used-for-nearby-players.patch rename to patches/server/0055-SparklyPaper-Cache-coordinate-key-used-for-nearby-pl.patch index 88dec429..dbdb85ee 100644 --- a/patches/server/0055-Polpot-Cache-coordinate-key-used-for-nearby-players.patch +++ b/patches/server/0055-SparklyPaper-Cache-coordinate-key-used-for-nearby-pl.patch @@ -1,42 +1,38 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: lilingfengdev <145678359+lilingfengdev@users.noreply.github.com> -Date: Thu, 18 Jan 2024 13:14:57 +0800 -Subject: [PATCH] Polpot Cache-coordinate-key-used-for-nearby-players +From: MrPowerGamerBR +Date: Wed, 22 Nov 2023 11:07:07 -0300 +Subject: [PATCH] SparklyPaper: Cache coordinate key used for nearby players + when ticking chunks +Original project: https://github.com/SparklyPower/SparklyPaper + +The "getChunkKey(...)" call is a bit expensive, using 0.24% of CPU time with 19k chunks loaded + +So instead of paying the price on each tick, we pay the price when the chunk is loaded + +Which, if you think about it, is actually better, since we tick chunks more than we load chunks diff --git a/src/main/java/io/papermc/paper/util/player/NearbyPlayers.java b/src/main/java/io/papermc/paper/util/player/NearbyPlayers.java -index 17ba07cbd4792f63d88ce29d00da280f30c4abff..98ae712c78d500e8c463aa671909a931a001407e 100644 +index 17ba07cbd4792f63d88ce29d00da280f30c4abff..8e8aad958c96fa1df3d906ec120a89adecae38c4 100644 --- a/src/main/java/io/papermc/paper/util/player/NearbyPlayers.java +++ b/src/main/java/io/papermc/paper/util/player/NearbyPlayers.java -@@ -106,6 +106,13 @@ public final class NearbyPlayers { +@@ -106,6 +106,14 @@ public final class NearbyPlayers { return chunk == null ? null : chunk.players[type.ordinal()]; } -+ // Polpot start - cache coordinate key used for nearby players ++ // SparklyPaper start - cache coordinate key used for nearby players + public ReferenceList getPlayers(final long nearbyPlayersCoordinateKey, final NearbyMapType type) { + final TrackedChunk chunk = this.byChunk.get(nearbyPlayersCoordinateKey); ++ + return chunk == null ? null : chunk.players[type.ordinal()]; + } -+ // Polpot end ++ // SparklyPaper end + public ReferenceList getPlayersByChunk(final int chunkX, final int chunkZ, final NearbyMapType type) { final TrackedChunk chunk = this.byChunk.get(CoordinateUtils.getChunkKey(chunkX, chunkZ)); -diff --git a/src/main/java/net/minecraft/server/Eula.java b/src/main/java/net/minecraft/server/Eula.java -index b9403a3eafc1b30b33ac654f253d0849cacadd03..a6190f14cb9463ee75e8890f191a7ec88e59b37f 100644 ---- a/src/main/java/net/minecraft/server/Eula.java -+++ b/src/main/java/net/minecraft/server/Eula.java -@@ -47,7 +47,7 @@ public class Eula { - return var3; - } catch (Exception var6) { - if (file == this.file) { // Gale - YAPFA - global EULA file -- LOGGER.warn("Failed to load {}", (Object)this.file); -+ LOGGER.warn("Failed to load {}", this.file); // Leaf - remove convert - this.saveDefaults(); - } // Gale - YAPFA - global EULA file - return false; diff --git a/src/main/java/net/minecraft/server/level/ServerChunkCache.java b/src/main/java/net/minecraft/server/level/ServerChunkCache.java -index 02b517288ef0794ccfd46802bf76fa56af21c524..e7fe8e2a7f5cb0c36679142f3743467efbed9c31 100644 +index 02b517288ef0794ccfd46802bf76fa56af21c524..e75ebf0bbb9da6e294d52e8c99607ed590c123a5 100644 --- a/src/main/java/net/minecraft/server/level/ServerChunkCache.java +++ b/src/main/java/net/minecraft/server/level/ServerChunkCache.java @@ -602,7 +602,7 @@ public class ServerChunkCache extends ChunkSource { @@ -44,12 +40,12 @@ index 02b517288ef0794ccfd46802bf76fa56af21c524..e7fe8e2a7f5cb0c36679142f3743467e // Paper start - optimise chunk tick iteration com.destroystokyo.paper.util.maplist.ReferenceList playersNearby - = nearbyPlayers.getPlayers(chunkcoordintpair, io.papermc.paper.util.player.NearbyPlayers.NearbyMapType.SPAWN_RANGE); -+ = nearbyPlayers.getPlayers(chunk1.nearbyPlayersCoordinateKey, io.papermc.paper.util.player.NearbyPlayers.NearbyMapType.SPAWN_RANGE); // nearbyPlayers.getPlayers(chunkcoordintpair, io.papermc.paper.util.player.NearbyPlayers.NearbyMapType.SPAWN_RANGE); // Polpot - cache coordinate key used for nearby players ++ = nearbyPlayers.getPlayers(chunk1.nearbyPlayersCoordinateKey, io.papermc.paper.util.player.NearbyPlayers.NearbyMapType.SPAWN_RANGE); // nearbyPlayers.getPlayers(chunkcoordintpair, io.papermc.paper.util.player.NearbyPlayers.NearbyMapType.SPAWN_RANGE); // SparklyPaper - cache coordinate key used for nearby players if (playersNearby == null) { continue; } diff --git a/src/main/java/net/minecraft/world/level/chunk/ChunkAccess.java b/src/main/java/net/minecraft/world/level/chunk/ChunkAccess.java -index f7e5e016a7028a9196e689e950805b0d5b31fe38..29d5848dec547245a1bafc5674b62b54ff7cd287 100644 +index f7e5e016a7028a9196e689e950805b0d5b31fe38..d0285843920f78e05ce07b1b0b2d8ce97ec8041e 100644 --- a/src/main/java/net/minecraft/world/level/chunk/ChunkAccess.java +++ b/src/main/java/net/minecraft/world/level/chunk/ChunkAccess.java @@ -62,7 +62,7 @@ public abstract class ChunkAccess implements BlockGetter, BiomeManager.NoiseBiom @@ -57,7 +53,7 @@ index f7e5e016a7028a9196e689e950805b0d5b31fe38..29d5848dec547245a1bafc5674b62b54 protected volatile boolean unsaved; private volatile boolean isLightCorrect; - protected final ChunkPos chunkPos; public final long coordinateKey; public final int locX; public final int locZ; // Paper - cache coordinate key -+ protected final ChunkPos chunkPos; public final long coordinateKey; public final long nearbyPlayersCoordinateKey; public final int locX; public final int locZ; // Paper - cache coordinate key // Polpot - cache coordinate key used for nearby players ++ protected final ChunkPos chunkPos; public final long coordinateKey; public final long nearbyPlayersCoordinateKey; public final int locX; public final int locZ; // Paper - cache coordinate key // SparklyPaper - cache coordinate key used for nearby players private long inhabitedTime; /** @deprecated */ @Nullable @@ -66,7 +62,7 @@ index f7e5e016a7028a9196e689e950805b0d5b31fe38..29d5848dec547245a1bafc5674b62b54 // Paper end - rewrite light engine this.locX = pos.x; this.locZ = pos.z; // Paper - reduce need for field lookups - this.chunkPos = pos; this.coordinateKey = ChunkPos.asLong(locX, locZ); // Paper - cache long key -+ this.chunkPos = pos; this.coordinateKey = ChunkPos.asLong(locX, locZ); this.nearbyPlayersCoordinateKey = io.papermc.paper.util.CoordinateUtils.getChunkKey(locX, locZ); // Paper - cache long key // Polpot - cache coordinate key used for nearby players ++ this.chunkPos = pos; this.coordinateKey = ChunkPos.asLong(locX, locZ); this.nearbyPlayersCoordinateKey = io.papermc.paper.util.CoordinateUtils.getChunkKey(locX, locZ); // Paper - cache long key // SparklyPaper - cache coordinate key used for nearby players this.upgradeData = upgradeData; this.levelHeightAccessor = heightLimitView; this.sections = new LevelChunkSection[heightLimitView.getSectionsCount()]; diff --git a/patches/server/0052-Optimize-canSee-checks.patch b/patches/server/0056-SparklyPaper-Optimize-canSee-checks.patch similarity index 61% rename from patches/server/0052-Optimize-canSee-checks.patch rename to patches/server/0056-SparklyPaper-Optimize-canSee-checks.patch index 5cf4dacc..9192a08b 100644 --- a/patches/server/0052-Optimize-canSee-checks.patch +++ b/patches/server/0056-SparklyPaper-Optimize-canSee-checks.patch @@ -1,11 +1,22 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: lilingfengdev <145678359+lilingfengdev@users.noreply.github.com> -Date: Wed, 17 Jan 2024 18:58:47 +0800 -Subject: [PATCH] Optimize canSee checks +From: MrPowerGamerBR +Date: Thu, 23 Nov 2023 14:36:47 -0300 +Subject: [PATCH] SparklyPaper: Optimize "canSee" checks +Original project: https://github.com/SparklyPower/SparklyPaper + +The "canSee" checks is in a hot path, invoked by each entity for each player on the server if they are in tracking range, so optimizing it is pretty nice + +First, we change the original "HashMap" to fastutil's "Object2ObjectOpenHashMap", because the containsKey throughput is better + +Then, we add a "isEmpty()" check before attempting to check if the map contains something + +This seems stupid, but it does seem that it improves the performance a bit, and it makes sense, "containsKey(...)" does not attempt to check the map size before attempting to check if the map contains the key + +We also create a "canSee" method tailored for "ChunkMap#updatePlayer()", a method without the equals check (the "updatePlayer()" already checks if the entity is the same entity) because the CraftPlayer's `equals()` check is a *bit* expensive compared to only checking the object's identity, and because the identity has already been check, we don't need to check it twice. diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java -index 38ddd6684535f9a4e6e9fb432282e0b6be0ede4c..673f0b1f8ad35559d050cb73f6593dc466d6ac0c 100644 +index 38ddd6684535f9a4e6e9fb432282e0b6be0ede4c..928d5fe7a41206d6160df4190fbaefcb516a910b 100644 --- a/src/main/java/net/minecraft/server/level/ChunkMap.java +++ b/src/main/java/net/minecraft/server/level/ChunkMap.java @@ -1409,7 +1409,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider @@ -13,12 +24,12 @@ index 38ddd6684535f9a4e6e9fb432282e0b6be0ede4c..673f0b1f8ad35559d050cb73f6593dc4 // CraftBukkit start - respect vanish API - if (flag && !player.getBukkitEntity().canSee(this.entity.getBukkitEntity())) { // Paper - only consider hits -+ if (flag && !player.getBukkitEntity().canSeeChunkMapUpdatePlayer(this.entity.getBukkitEntity())) { // Paper - only consider hits // Polpot - Optimize canSee checks ++ if (flag && !player.getBukkitEntity().canSeeChunkMapUpdatePlayer(this.entity.getBukkitEntity())) { // Paper - only consider hits // SparklyPaper - optimize canSee checks flag = false; } // CraftBukkit end diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 468ac1525c97043b53b16440fec6bb784e1e9c25..86a4a62dfb9c81078e630885f43d7bd24826e58a 100644 +index 56da11efc3be1da40dcbb7080f64bd9719517153..0461e04a889000402dce6084898a302f70ca6b67 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -188,7 +188,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @@ -26,31 +37,25 @@ index 468ac1525c97043b53b16440fec6bb784e1e9c25..86a4a62dfb9c81078e630885f43d7bd2 private final ConversationTracker conversationTracker = new ConversationTracker(); private final Set channels = new HashSet(); - private final Map>> invertedVisibilityEntities = new HashMap<>(); -+ private final Map>> invertedVisibilityEntities = new it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap<>(); // Polpot - optimize canSee checks ++ private final Map>> invertedVisibilityEntities = new it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap<>(); // SparklyPaper - optimize canSee checks private final Set unlistedEntities = new HashSet<>(); // Paper private static final WeakHashMap> pluginWeakReferences = new WeakHashMap<>(); private int hash = 0; -@@ -2166,7 +2166,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { - // Leaf - TODO +@@ -2164,9 +2164,16 @@ public class CraftPlayer extends CraftHumanEntity implements Player { + @Override public boolean canSee(org.bukkit.entity.Entity entity) { - return this.equals(entity) || entity.isVisibleByDefault() ^ this.invertedVisibilityEntities.containsKey(entity.getUniqueId()); // SPIGOT-7312: Can always see self -+ return this.equals(entity) || entity.isVisibleByDefault() ^ (!invertedVisibilityEntities.isEmpty() && this.invertedVisibilityEntities.containsKey(entity.getUniqueId())); // SPIGOT-7312: Can always see self // Polpot - optimize canSee checks ++ return this.equals(entity) || entity.isVisibleByDefault() ^ (!invertedVisibilityEntities.isEmpty() && this.invertedVisibilityEntities.containsKey(entity.getUniqueId())); // SPIGOT-7312: Can always see self // SparklyPaper - optimize canSee checks } - public boolean canSee(UUID uuid) { -@@ -2178,7 +2178,14 @@ public class CraftPlayer extends CraftHumanEntity implements Player { - return (entity != null) ? this.canSee(entity) : false; // If we can't find it, we can't see it - } - -+ // Polpot - optimize canSee checks ++ // SparklyPaper - optimize canSee checks + // The check in ChunkMap#updatePlayer already rejects if it is the same entity, so we don't need to check it twice, especially because CraftPlayer's equals check is a bit expensive + public boolean canSeeChunkMapUpdatePlayer(org.bukkit.entity.Entity entity) { + return entity.isVisibleByDefault() ^ (!invertedVisibilityEntities.isEmpty() && this.invertedVisibilityEntities.containsKey(entity.getUniqueId())); // SPIGOT-7312: Can always see self // SparklyPaper - optimize canSee checks + } -+ // Polpot end - // Paper start ++ // SparklyPaper end + - @Override - public boolean isListed(Player other) { - return !this.unlistedEntities.contains(other.getUniqueId()); + public boolean canSee(UUID uuid) { + org.bukkit.entity.Entity entity = this.getServer().getPlayer(uuid); + if (entity == null) { diff --git a/patches/server/0056-Polpot-make-make-egg-and-snowball-can-knockback-play.patch b/patches/server/0057-Polpot-make-make-egg-and-snowball-can-knockback-play.patch similarity index 81% rename from patches/server/0056-Polpot-make-make-egg-and-snowball-can-knockback-play.patch rename to patches/server/0057-Polpot-make-make-egg-and-snowball-can-knockback-play.patch index 2d5d5d44..7b06801e 100644 --- a/patches/server/0056-Polpot-make-make-egg-and-snowball-can-knockback-play.patch +++ b/patches/server/0057-Polpot-make-make-egg-and-snowball-can-knockback-play.patch @@ -69,15 +69,21 @@ index b64ecadae45c2126b92963ac8d118dde76126ddd..8daa0d7ee597f94901948a732df5d5e9 @Override diff --git a/src/main/java/org/dreeam/leaf/LeafConfig.java b/src/main/java/org/dreeam/leaf/LeafConfig.java -index db12eb7e81307cc3fd4fe0602697e32e71289f7e..0439423d1c8b3a9f063595f6df542ce54aa646ab 100644 +index 3368e4d398132c64969b018e4fe8b7bbe8f2f364..bc46626c826c40fa18577c78b5259f6e77f69a2a 100644 --- a/src/main/java/org/dreeam/leaf/LeafConfig.java +++ b/src/main/java/org/dreeam/leaf/LeafConfig.java -@@ -325,4 +325,8 @@ public class LeafConfig { - private static void getSkipMapItemDataUpdatesIfMapDoesNotHaveCraftMapRenderer() { - skipMapItemDataUpdatesIfMapDoesNotHaveCraftMapRenderer = getBoolean("skipMapItemDataUpdatesIfMapDoesNotHaveCraftMapRenderer",skipMapItemDataUpdatesIfMapDoesNotHaveCraftMapRenderer); - } +@@ -314,6 +314,7 @@ public class LeafConfig { + public static double verticalLimit = 0.4000000059604645D; + public static double extraHorizontal = 0.5D; + public static double extraVertical = 0.1D; + public static boolean snowballAndEggCanKnockback = false; -+ private static void SnowballAndEggCanKnockback() { -+ snowballAndEggCanKnockback = getBoolean("settings.snowball-egg-knockback-players", snowballAndEggCanKnockback,"Make snowball and egg can knock back player"); -+ } + private static void knockback() { + friction = getDouble("playerKnockback.friction", friction); + horizontal = getDouble("playerKnockback.horizontal", horizontal); +@@ -321,5 +322,6 @@ public class LeafConfig { + verticalLimit = getDouble("playerKnockback.verticalLimit", verticalLimit); + extraHorizontal = getDouble("playerKnockback.extraHorizontal", extraHorizontal); + extraVertical = getDouble("playerKnockback.extraVertical", extraVertical); ++ snowballAndEggCanKnockback = getBoolean("playerKnockback.snowball-egg-knockback-players", snowballAndEggCanKnockback, "Make snowball and egg can knockback players"); + } }