diff --git a/gradle.properties b/gradle.properties index cb22f607..f961a4eb 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,7 +1,7 @@ group = org.dreeam.leaf version = 1.20.4-R0.1-SNAPSHOT -galeCommit = 469ba1180160d3c9bf3fae917262ab56dfad1cf3 +galeCommit = 58e6ce04758cf150a199628e2b796d7fee01ef07 org.gradle.caching = true org.gradle.parallel = true diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 7f93135c..d64cd491 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 1af9e093..a80b22ce 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew.bat b/gradlew.bat index 93e3f59f..25da30db 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -43,11 +43,11 @@ set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if %ERRORLEVEL% equ 0 goto execute -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -57,11 +57,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail diff --git a/patches/api/0002-Pufferfish-Sentry.patch b/patches/api/0002-Pufferfish-Sentry.patch index 2132173e..61eba89e 100644 --- a/patches/api/0002-Pufferfish-Sentry.patch +++ b/patches/api/0002-Pufferfish-Sentry.patch @@ -7,14 +7,14 @@ Original license: GPL v3 Original project: https://github.com/pufferfish-gg/Pufferfish diff --git a/build.gradle.kts b/build.gradle.kts -index 3f11b99f87eb380daeb1f660f63a8347958e1e0f..0d9531a62d7667b98a57bd6b8e627a3e2f105001 100644 +index f2cbc7a803177a901135cf020239031979292c6c..9a116f72816226aa35c86c1e6ddfbbf8aa4b652d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -51,6 +51,7 @@ dependencies { apiAndDocs("net.kyori:adventure-text-logger-slf4j") api("org.apache.logging.log4j:log4j-api:$log4jVersion") api("org.slf4j:slf4j-api:$slf4jVersion") -+ api("io.sentry:sentry:7.2.0") // Pufferfish ++ api("io.sentry:sentry:7.3.0") // Pufferfish implementation("org.ow2.asm:asm:9.5") implementation("org.ow2.asm:asm-commons:9.5") diff --git a/patches/api/0003-Purpur-API-Changes.patch b/patches/api/0003-Purpur-API-Changes.patch index d5776d10..8da49a30 100644 --- a/patches/api/0003-Purpur-API-Changes.patch +++ b/patches/api/0003-Purpur-API-Changes.patch @@ -6,7 +6,7 @@ Subject: [PATCH] Purpur API Changes Original license: MIT Original project: https://github.com/PurpurMC/Purpur -Commit: 3d52f066c1bf1fc61d86164993fd7cac94ca5dce +Commit: 03a732c8eacd4eac7507d1220eaee381072c5866 Patches below are removed in this patch: Pufferfish-API-Changes.patch @@ -34,7 +34,7 @@ index a736d7bcdc5861a01b66ba36158db1c716339346..22fc165fd9c95f0f3ae1be7a0857e48c @Override diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java -index 097cecdf1a535539b660f2edf4776ba85458ce0a..85dd549064ddcdb51b6d26ba66985e15f23886f4 100644 +index 45afe93b84db8fad37c758427a849609fceeeea9..593a23c43723b40bc14d33929e38ad074d58fc14 100644 --- a/src/main/java/org/bukkit/Bukkit.java +++ b/src/main/java/org/bukkit/Bukkit.java @@ -2909,4 +2909,127 @@ public final class Bukkit { @@ -301,13 +301,13 @@ index f9af60356da4668cec8b24e73f5747ab82e35a91..b304ad1307cdd6785653b1eab9781e07 + // Purpur end } diff --git a/src/main/java/org/bukkit/OfflinePlayer.java b/src/main/java/org/bukkit/OfflinePlayer.java -index bce07d84cafca677bb6fad78c21b82097f06430c..4ef0fa4f1ef72bb784674671473c6a322acadecc 100644 +index abb5109ed08a3a651c2c27d4d17a3d49eb06da1e..98308b759907e03b168f7e06704a91925ffcd3fd 100644 --- a/src/main/java/org/bukkit/OfflinePlayer.java +++ b/src/main/java/org/bukkit/OfflinePlayer.java -@@ -522,4 +522,114 @@ public interface OfflinePlayer extends ServerOperator, AnimalTamer, Configuratio +@@ -545,4 +545,106 @@ public interface OfflinePlayer extends ServerOperator, AnimalTamer, Configuratio */ @Nullable - public Location getLastDeathLocation(); + public Location getLocation(); + + // Purpur start - OfflinePlayer API + /** @@ -375,14 +375,6 @@ index bce07d84cafca677bb6fad78c21b82097f06430c..4ef0fa4f1ef72bb784674671473c6a32 + public float getWalkSpeed(); + + /** -+ * Gets the entity's current position -+ * -+ * @return a new copy of Location containing the position of this offline player -+ */ -+ @Nullable -+ public Location getLocation(); -+ -+ /** + * Sets OfflinePlayer's location. If player is online, it falls back to the Player#teleport implementation. + * + * @param destination @@ -555,7 +547,7 @@ index b39a5ca6f4fa32d76acafd1fdd5b5af8954e34a4..1e7e16d33a57d930276a07096a58be2f + // Purpur end } diff --git a/src/main/java/org/bukkit/World.java b/src/main/java/org/bukkit/World.java -index bf4b94ea2577e9d7e344385209fc0644a4e6bfbb..eea802fbee51e919595f6501161bf2fd58d6a1c1 100644 +index efa2043e044b0e461780e808c347d6ec00f6da0a..3d4481ea5328735357a7c60c99e5b3a073e7aa0f 100644 --- a/src/main/java/org/bukkit/World.java +++ b/src/main/java/org/bukkit/World.java @@ -4172,6 +4172,86 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient @@ -794,7 +786,7 @@ index 138d2530de2410f4a9424dabd3e5ce0cd1c1dcd2..10a8d64ad2da0be2c14f34c3e7d1957c // Paper start /** diff --git a/src/main/java/org/bukkit/entity/Entity.java b/src/main/java/org/bukkit/entity/Entity.java -index 1d0fd7ff8449f815a7d980af0b378181ea8bf8d8..c20f29e1ddfd1d73df19f6d6f730fa23dc23dc7a 100644 +index 6ace3581f8d0c2a1b7e2188d5b6af5c984b74a0e..d3a0df7b895898578a7473c4c4b4f71694fc2bb2 100644 --- a/src/main/java/org/bukkit/entity/Entity.java +++ b/src/main/java/org/bukkit/entity/Entity.java @@ -1107,4 +1107,42 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent @@ -866,7 +858,7 @@ index 655e37cb3a09610a3f3df805d6dcad17d722da62..09fd716c8fc9ea34a1cbf87bcbe22df0 + // Purpur end } diff --git a/src/main/java/org/bukkit/entity/Item.java b/src/main/java/org/bukkit/entity/Item.java -index 58017fce436cdbda255f7172fbdadb726d4b113c..05600fc8bf2a61aca8094029bc4c208a710da952 100644 +index bcc6ba95bd21c7972865838c636a03f50b6c1f1a..c3fcd8dd7dbb1e1a18e17c014c1e641149ea5960 100644 --- a/src/main/java/org/bukkit/entity/Item.java +++ b/src/main/java/org/bukkit/entity/Item.java @@ -153,4 +153,62 @@ public interface Item extends Entity, io.papermc.paper.entity.Frictional { // Pa @@ -933,7 +925,7 @@ index 58017fce436cdbda255f7172fbdadb726d4b113c..05600fc8bf2a61aca8094029bc4c208a + // Purpur end } diff --git a/src/main/java/org/bukkit/entity/LivingEntity.java b/src/main/java/org/bukkit/entity/LivingEntity.java -index 47b0154928b3d36e2602da202df07defbcf82108..7498179f6df47008c4da6ad6d67b2ce16f49e7a6 100644 +index 0f0b965ce48d13a64b5546a0abcfb45c4f5f4722..76c8601c1563c28cfce00f461c99805187db5178 100644 --- a/src/main/java/org/bukkit/entity/LivingEntity.java +++ b/src/main/java/org/bukkit/entity/LivingEntity.java @@ -1276,4 +1276,41 @@ public interface LivingEntity extends Attributable, Damageable, ProjectileSource @@ -1004,10 +996,10 @@ index bc84b892cae5fe7019a3ad481e9da79956efa1fe..48eb5b00c460cccde29d327cef1d63fc + // Purpur end } diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java -index caa24af01ee57c8d1917818c1063d2fa75f1ae4a..5579fe9823d13be13d501cd0e3383b5763e2a4ed 100644 +index 7b751fac9dcfab016f1ad7e799708110dd3c2724..e700243e293312cfee516a870520b23f89e20580 100644 --- a/src/main/java/org/bukkit/entity/Player.java +++ b/src/main/java/org/bukkit/entity/Player.java -@@ -3584,4 +3584,123 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM +@@ -3629,4 +3629,123 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM @Override Spigot spigot(); // Spigot end @@ -1295,7 +1287,7 @@ index f680545b6b59bf8d2ad154b0472dda4cba42a162..3709ff939acdcaec124c2875a37c4a07 + // Purpur end } diff --git a/src/main/java/org/bukkit/inventory/ItemStack.java b/src/main/java/org/bukkit/inventory/ItemStack.java -index 36e3fbc727cd748aa138f52976154ba32954cd87..623bebf9964cff02728bf4270f082b6a89ff1572 100644 +index 7adf54c561d64e6337af8a2d86f6b574b083edb5..5fc2456b9367a902af5e97314f50f8a5cf8f4862 100644 --- a/src/main/java/org/bukkit/inventory/ItemStack.java +++ b/src/main/java/org/bukkit/inventory/ItemStack.java @@ -17,6 +17,18 @@ import org.bukkit.inventory.meta.ItemMeta; @@ -1317,7 +1309,7 @@ index 36e3fbc727cd748aa138f52976154ba32954cd87..623bebf9964cff02728bf4270f082b6a /** * Represents a stack of items. -@@ -1005,4 +1017,636 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat +@@ -1016,4 +1028,636 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat return type.isAir() || amount <= 0; } // Paper end diff --git a/patches/api/0005-Bump-Dependencies.patch b/patches/api/0005-Bump-Dependencies.patch index 865b1c76..2e5bea89 100644 --- a/patches/api/0005-Bump-Dependencies.patch +++ b/patches/api/0005-Bump-Dependencies.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Bump Dependencies diff --git a/build.gradle.kts b/build.gradle.kts -index 0d9531a62d7667b98a57bd6b8e627a3e2f105001..e6d9550e7e1226a75bb44a1cb599625f006f9a4b 100644 +index 9a116f72816226aa35c86c1e6ddfbbf8aa4b652d..0d6b1e7225060cdb027f446acba4d5d2143d4a9a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -9,11 +9,11 @@ java { @@ -13,9 +13,8 @@ index 0d9531a62d7667b98a57bd6b8e627a3e2f105001..e6d9550e7e1226a75bb44a1cb599625f } -val annotationsVersion = "24.0.1" --val bungeeCordChatVersion = "1.20-R0.1" +val annotationsVersion = "24.1.0" // Leaf - Bump Dependencies -+val bungeeCordChatVersion = "1.20-R0.2-deprecated+build.18" // Leaf - Bump Dependencies + val bungeeCordChatVersion = "1.20-R0.2" val adventureVersion = "4.15.0" -val slf4jVersion = "2.0.9" -val log4jVersion = "2.17.1" @@ -24,7 +23,7 @@ index 0d9531a62d7667b98a57bd6b8e627a3e2f105001..e6d9550e7e1226a75bb44a1cb599625f val apiAndDocs: Configuration by configurations.creating { attributes { attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category.DOCUMENTATION)) -@@ -28,10 +28,10 @@ configurations.api { +@@ -28,7 +28,7 @@ configurations.api { dependencies { // api dependencies are listed transitively to API consumers @@ -32,11 +31,7 @@ index 0d9531a62d7667b98a57bd6b8e627a3e2f105001..e6d9550e7e1226a75bb44a1cb599625f + api("com.google.guava:guava:33.0.0-jre") // Leaf - Bump Dependencies api("com.google.code.gson:gson:2.10.1") // Paper start - adventure -- api("net.md-5:bungeecord-chat:$bungeeCordChatVersion-deprecated+build.14") { -+ api("net.md-5:bungeecord-chat:$bungeeCordChatVersion") { // Leaf - Bump Dependencies - exclude("com.google.guava", "guava") - } - // Paper - adventure + api("net.md-5:bungeecord-chat:$bungeeCordChatVersion-deprecated+build.18") { @@ -41,7 +41,7 @@ dependencies { api("com.googlecode.json-simple:json-simple:1.1.1") { isTransitive = false // includes junit @@ -48,7 +43,7 @@ index 0d9531a62d7667b98a57bd6b8e627a3e2f105001..e6d9550e7e1226a75bb44a1cb599625f apiAndDocs("net.kyori:adventure-text-minimessage") @@ -53,11 +53,12 @@ dependencies { api("org.slf4j:slf4j-api:$slf4jVersion") - api("io.sentry:sentry:7.2.0") // Pufferfish + api("io.sentry:sentry:7.3.0") // Pufferfish - implementation("org.ow2.asm:asm:9.5") - implementation("org.ow2.asm:asm-commons:9.5") @@ -79,7 +74,7 @@ index 0d9531a62d7667b98a57bd6b8e627a3e2f105001..e6d9550e7e1226a75bb44a1cb599625f testImplementation("org.hamcrest:hamcrest:2.2") - testImplementation("org.mockito:mockito-core:5.5.0") - testImplementation("org.ow2.asm:asm-tree:9.5") -+ testImplementation("org.mockito:mockito-core:5.9.0") ++ testImplementation("org.mockito:mockito-core:5.10.0") + testImplementation("org.ow2.asm:asm-tree:9.6") + // Leaf end } diff --git a/patches/api/0007-KeYi-Player-Skull-API.patch b/patches/api/0007-KeYi-Player-Skull-API.patch index 16d3815e..3f7d1fac 100644 --- a/patches/api/0007-KeYi-Player-Skull-API.patch +++ b/patches/api/0007-KeYi-Player-Skull-API.patch @@ -7,7 +7,7 @@ Original license: MIT Original project: https://github.com/KeYiMC/KeYi diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java -index 5579fe9823d13be13d501cd0e3383b5763e2a4ed..e13f778a5a44c4eb352779cfca389ccfa570556a 100644 +index e700243e293312cfee516a870520b23f89e20580..7a91e3d6a608c9dfb3727e89013056365184e31e 100644 --- a/src/main/java/org/bukkit/entity/Player.java +++ b/src/main/java/org/bukkit/entity/Player.java @@ -9,6 +9,10 @@ import java.util.Date; @@ -21,7 +21,7 @@ index 5579fe9823d13be13d501cd0e3383b5763e2a4ed..e13f778a5a44c4eb352779cfca389ccf import org.bukkit.DyeColor; import org.bukkit.Effect; import org.bukkit.GameMode; -@@ -3703,4 +3707,22 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM +@@ -3748,4 +3752,22 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM sendDeathScreen(message); } // Purpur end diff --git a/patches/api/0008-Slice-Smooth-Teleports.patch b/patches/api/0008-Slice-Smooth-Teleports.patch index f1e030eb..2bcd367c 100644 --- a/patches/api/0008-Slice-Smooth-Teleports.patch +++ b/patches/api/0008-Slice-Smooth-Teleports.patch @@ -7,10 +7,10 @@ Original license: MIT Original project: https://github.com/Cryptite/Slice diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java -index e13f778a5a44c4eb352779cfca389ccfa570556a..93d6dd81777969df34d1cf55d3c7a4af777a5974 100644 +index 7a91e3d6a608c9dfb3727e89013056365184e31e..92856bebba3f523d9a029c16a77cfe04a144b245 100644 --- a/src/main/java/org/bukkit/entity/Player.java +++ b/src/main/java/org/bukkit/entity/Player.java -@@ -3451,6 +3451,19 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM +@@ -3496,6 +3496,19 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM String getClientBrandName(); // Paper end diff --git a/patches/server/0001-Rebrand.patch b/patches/server/0001-Rebrand.patch index 13e4f6e7..c32fa677 100644 --- a/patches/server/0001-Rebrand.patch +++ b/patches/server/0001-Rebrand.patch @@ -73,10 +73,10 @@ index e45e6b44b2a8f2cdae6e0048a812b92126aa17ca..b5f3f213da8a40d5184098af017c8e26 .completer(new ConsoleCommandCompleter(this.server)) .option(LineReader.Option.COMPLETE_IN_WORD, true); diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index ff6b3392390036ad4caa9da3f519a25bd8373493..2b6e7808b518476903302d4f2214dbd2f09125fb 100644 +index fbdc65a01b04abae4c3770666c6a77e0e85be502..9e7119152664e785e23f08e3a702f0bc60d817a0 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -942,7 +942,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop atomicreference = new AtomicReference(); Thread thread = new io.papermc.paper.util.TickThread(() -> { // Paper - rewrite chunk system diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java -index fc017f554147eaaee5c436ede2595bccd6b8fd7f..5f1d63343b1d7fbcf19b1ef189504e55170dce34 100644 +index 387f367544464c73721219ec55cb42033f4bb9c3..ba5925a229494c530c92b35de1a82d6e0a259a33 100644 --- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java +++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java @@ -350,6 +350,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface @@ -45,7 +45,7 @@ index fc017f554147eaaee5c436ede2595bccd6b8fd7f..5f1d63343b1d7fbcf19b1ef189504e55 } } diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java -index 5838e05d9d5b6a0b3b7d6b775577b11f7f603a56..c9fb6458ed3d3fa48a758c053662f11d83e727c7 100644 +index d8a3b28b38f2ac62fbf0f87f8b5ff811873f8701..42869d35abb8d006fb720ca7190a770ce5cbf778 100644 --- a/src/main/java/net/minecraft/server/level/ChunkMap.java +++ b/src/main/java/net/minecraft/server/level/ChunkMap.java @@ -243,7 +243,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider @@ -58,28 +58,28 @@ index 5838e05d9d5b6a0b3b7d6b775577b11f7f603a56..c9fb6458ed3d3fa48a758c053662f11d public ChunkMap(ServerLevel world, LevelStorageSource.LevelStorageAccess session, DataFixer dataFixer, StructureTemplateManager structureTemplateManager, Executor executor, BlockableEventLoop mainThreadExecutor, LightChunkGetter chunkProvider, ChunkGenerator chunkGenerator, ChunkProgressListener worldGenerationProgressListener, ChunkStatusUpdateListener chunkStatusChangeListener, Supplier persistentStateManagerFactory, int viewDistance, boolean dsync) { diff --git a/src/main/java/net/minecraft/server/level/ServerChunkCache.java b/src/main/java/net/minecraft/server/level/ServerChunkCache.java -index 6dce2cb25a5e8b7c979a3f515e4c6c9cfbacd305..58f3d1f957ec85e69b80c78e533cedc3a7ac1937 100644 +index 68ad7cb06d85c428f3560f95ed46bca32187e729..cd71e1127673e625746bce45174afb619ddebd3e 100644 --- a/src/main/java/net/minecraft/server/level/ServerChunkCache.java +++ b/src/main/java/net/minecraft/server/level/ServerChunkCache.java -@@ -72,6 +72,9 @@ public class ServerChunkCache extends ChunkSource { - final it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap loadedChunkMap = new it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap<>(8192, 0.5f); - +@@ -76,6 +76,9 @@ public class ServerChunkCache extends ChunkSource { private final LevelChunk[] lastLoadedChunks = new LevelChunk[4 * 4]; -+ + // Paper end + + public boolean firstRunSpawnCounts = true; // Pufferfish + public final java.util.concurrent.atomic.AtomicBoolean _pufferfish_spawnCountsReady = new java.util.concurrent.atomic.AtomicBoolean(false); // Pufferfish - optimize countmobs - - private static int getChunkCacheKey(int x, int z) { - return x & 3 | ((z & 3) << 2); -@@ -518,6 +521,7 @@ public class ServerChunkCache extends ChunkSource { - // Paper start - per player mob spawning ++ + public ServerChunkCache(ServerLevel world, LevelStorageSource.LevelStorageAccess session, DataFixer dataFixer, StructureTemplateManager structureTemplateManager, Executor workerExecutor, ChunkGenerator chunkGenerator, int viewDistance, int simulationDistance, boolean dsync, ChunkProgressListener worldGenerationProgressListener, ChunkStatusUpdateListener chunkStatusChangeListener, Supplier persistentStateManagerFactory) { + this.level = world; + this.mainThreadProcessor = new ServerChunkCache.MainThreadExecutor(world); +@@ -510,6 +513,7 @@ public class ServerChunkCache extends ChunkSource { + // Paper start - Optional per player mob spawns int naturalSpawnChunkCount = k; if ((this.spawnFriendlies || this.spawnEnemies) && this.level.paperConfig().entities.spawning.perPlayerMobSpawns) { // don't count mobs when animals and monsters are disabled + if (!org.dreeam.leaf.LeafConfig.enableAsyncMobSpawning) { // Pufferfish - moved down when async processing // re-set mob counts for (ServerPlayer player : this.level.players) { // Paper start - per player mob spawning backoff -@@ -532,17 +536,21 @@ public class ServerChunkCache extends ChunkSource { +@@ -524,17 +528,21 @@ public class ServerChunkCache extends ChunkSource { } // Paper end - per player mob spawning backoff } @@ -93,7 +93,7 @@ index 6dce2cb25a5e8b7c979a3f515e4c6c9cfbacd305..58f3d1f957ec85e69b80c78e533cedc3 + _pufferfish_spawnCountsReady.set(true); + // Pufferfish end } - // Paper end + // Paper end - Optional per player mob spawns this.level.timings.countNaturalMobs.stopTiming(); // Paper - timings - this.lastSpawnState = spawnercreature_d; @@ -105,7 +105,7 @@ index 6dce2cb25a5e8b7c979a3f515e4c6c9cfbacd305..58f3d1f957ec85e69b80c78e533cedc3 } // Gale end - MultiPaper - skip unnecessary mob spawning computations -@@ -632,8 +640,8 @@ public class ServerChunkCache extends ChunkSource { +@@ -624,8 +632,8 @@ public class ServerChunkCache extends ChunkSource { if (tick && chunk1.chunkStatus.isOrAfter(net.minecraft.server.level.FullChunkStatus.ENTITY_TICKING)) { // Paper end - optimise chunk tick iteration chunk1.incrementInhabitedTime(j); @@ -116,7 +116,7 @@ index 6dce2cb25a5e8b7c979a3f515e4c6c9cfbacd305..58f3d1f957ec85e69b80c78e533cedc3 } if (true || this.level.shouldTickBlocksAt(chunkcoordintpair.toLong())) { // Paper - optimise chunk tick iteration -@@ -676,6 +684,40 @@ public class ServerChunkCache extends ChunkSource { +@@ -668,6 +676,40 @@ public class ServerChunkCache extends ChunkSource { this.level.timings.broadcastChunkUpdates.stopTiming(); // Paper - timing // Paper - optimise chunk tick iteration } diff --git a/patches/server/0006-Pufferfish-Dynamic-Activation-of-Brain.patch b/patches/server/0006-Pufferfish-Dynamic-Activation-of-Brain.patch index d79c2d69..cfc7537a 100644 --- a/patches/server/0006-Pufferfish-Dynamic-Activation-of-Brain.patch +++ b/patches/server/0006-Pufferfish-Dynamic-Activation-of-Brain.patch @@ -30,10 +30,10 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index 508d22f505bdc277520900c92fd6d96eb23990e7..997cd2387ea2de9ba081eb0664e5658ac93542fc 100644 +index 1591e201ebca4354d5912d3f803f59759af1ba6e..98e666c69b51f7b4fec040b7abd9667d293c9ccb 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java -@@ -885,6 +885,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -880,6 +880,7 @@ public class ServerLevel extends Level implements WorldGenLevel { org.spigotmc.ActivationRange.activateEntities(this); // Spigot this.timings.entityTick.startTiming(); // Spigot this.entityTickList.forEach((entity) -> { @@ -42,12 +42,12 @@ index 508d22f505bdc277520900c92fd6d96eb23990e7..997cd2387ea2de9ba081eb0664e5658a if (false && this.shouldDiscardEntity(entity)) { // CraftBukkit - We prevent spawning in general, so this butchering is not needed entity.discard(); diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index d5606d5cc2ebe75c21925071663ea013824c7af6..4190ed6911357839386818cd8717dea66d8c95c0 100644 +index 6231a59a22b47b16de0b4186eae70759cab92a7f..be371242518c4027e03e233db1bd0a9192e9edc9 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -442,6 +442,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -503,6 +503,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S } - // Paper end + // Paper end - optimise entity tracking + // Pufferfish start + public boolean activatedPriorityReset = false; // DAB @@ -58,7 +58,7 @@ index d5606d5cc2ebe75c21925071663ea013824c7af6..4190ed6911357839386818cd8717dea6 return this.yRot; } diff --git a/src/main/java/net/minecraft/world/entity/EntityType.java b/src/main/java/net/minecraft/world/entity/EntityType.java -index e52f3da3b63cc3dba59d3e874a8420dd312b5e96..72fdd85426872ac096eabfd273239e112e08826c 100644 +index 09e8445a3f8c6b3ebc852a75a9a25b41a51ba659..d86c34111ede6a1454dde5e7223d7caf2ab39ef3 100644 --- a/src/main/java/net/minecraft/world/entity/EntityType.java +++ b/src/main/java/net/minecraft/world/entity/EntityType.java @@ -305,6 +305,7 @@ public class EntityType implements FeatureElement, EntityTypeT @@ -70,7 +70,7 @@ index e52f3da3b63cc3dba59d3e874a8420dd312b5e96..72fdd85426872ac096eabfd273239e11 private String descriptionId; @Nullable diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java -index 465cfffbbc5db5fb2c95e953db09d3169b52060d..2888eb09566852a2989b6776d74c3a49e8586aac 100644 +index d3a1af49024c7cd2854dc8a715450adc64aa083e..7828db1230d0fea3d6ea43423b4118906890692f 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java @@ -227,10 +227,10 @@ public abstract class Mob extends LivingEntity implements Targeting { @@ -119,7 +119,7 @@ index 646d9a121d908a2fc3e4e302484dd5cd1bfc6804..e546ecdccde352502e26a8668eaaafe0 } diff --git a/src/main/java/net/minecraft/world/entity/ai/goal/GoalSelector.java b/src/main/java/net/minecraft/world/entity/ai/goal/GoalSelector.java -index 86fc528551c2c90c78783d4d46a4a2c52e4efe41..034dfd1a62f97ffa4ca2c466fea609cee18d4798 100644 +index 5e7b978a3019bc31ef94c1c666a3abdf380ced5c..aae8e547996f9a9ce6a3e110b2fc17f94b69ad3c 100644 --- a/src/main/java/net/minecraft/world/entity/ai/goal/GoalSelector.java +++ b/src/main/java/net/minecraft/world/entity/ai/goal/GoalSelector.java @@ -51,9 +51,12 @@ public class GoalSelector { @@ -260,7 +260,7 @@ index b73bccfcb1b94936f500926a06a28a6a134bbc33..5cad15c512919ce6b0cae9f45e9011dd super.customServerAiStep(); if ((this.tickCount + this.getId()) % 120 == 0) { diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java -index 5f585a955a876fe2452a0bf1c7caa0ad7e58d1d6..07fb53a908f8b10b40017f083648fdc47f2d6150 100644 +index 5a9d567fdcaa02cf91dac889949f4428987f6fdd..e6b5b7c58505f021dc042c2c40733addcf286dcd 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java @@ -144,6 +144,8 @@ public class Villager extends AbstractVillager implements ReputationEventHandler @@ -357,7 +357,7 @@ index 5d161351e7517acf57e98203bab8c9f9ab9d4005..634a4e46022f1d63a67c64f19f255538 private static void network() { diff --git a/src/main/java/org/spigotmc/ActivationRange.java b/src/main/java/org/spigotmc/ActivationRange.java -index 9ae73480c06003f7073fc571c61943c64f466616..ece01155a8281fb40ae3696d511fb317d68635aa 100644 +index 1cff8378c4939af4bbe300e5d6428539e75218ae..2833c1ebc3a4d0e268527d1fcf2c74b5b5038c82 100644 --- a/src/main/java/org/spigotmc/ActivationRange.java +++ b/src/main/java/org/spigotmc/ActivationRange.java @@ -40,6 +40,9 @@ import net.minecraft.world.level.Level; @@ -370,7 +370,7 @@ index 9ae73480c06003f7073fc571c61943c64f466616..ece01155a8281fb40ae3696d511fb317 public class ActivationRange { -@@ -237,6 +240,25 @@ public class ActivationRange +@@ -236,6 +239,25 @@ public class ActivationRange } // Paper end - Configurable marker ticking ActivationRange.activateEntity(entity); @@ -396,7 +396,7 @@ index 9ae73480c06003f7073fc571c61943c64f466616..ece01155a8281fb40ae3696d511fb317 } // Paper end } -@@ -253,12 +275,12 @@ public class ActivationRange +@@ -252,12 +274,12 @@ public class ActivationRange if ( MinecraftServer.currentTick > entity.activatedTick ) { if ( entity.defaultActivationState ) diff --git a/patches/server/0008-Pufferfish-Entity-TTL.patch b/patches/server/0008-Pufferfish-Entity-TTL.patch index 87670122..15494291 100644 --- a/patches/server/0008-Pufferfish-Entity-TTL.patch +++ b/patches/server/0008-Pufferfish-Entity-TTL.patch @@ -7,10 +7,10 @@ Original license: GPL v3 Original project: https://github.com/pufferfish-gg/Pufferfish diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 4190ed6911357839386818cd8717dea66d8c95c0..293ed3942268c4ae915c0331e3988ce9dcd83306 100644 +index be371242518c4027e03e233db1bd0a9192e9edc9..7eff987694d03ccfa687114ee4f2650a7f83a1ea 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -815,6 +815,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -814,6 +814,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S } public void tick() { @@ -24,7 +24,7 @@ index 4190ed6911357839386818cd8717dea66d8c95c0..293ed3942268c4ae915c0331e3988ce9 } diff --git a/src/main/java/net/minecraft/world/entity/EntityType.java b/src/main/java/net/minecraft/world/entity/EntityType.java -index 72fdd85426872ac096eabfd273239e112e08826c..f772f7c4cd41ec52bea53d619b5b953971825df0 100644 +index d86c34111ede6a1454dde5e7223d7caf2ab39ef3..dc11683ee4d8a6b7a1c42bcae36dc6e8105cd994 100644 --- a/src/main/java/net/minecraft/world/entity/EntityType.java +++ b/src/main/java/net/minecraft/world/entity/EntityType.java @@ -306,6 +306,7 @@ public class EntityType implements FeatureElement, EntityTypeT diff --git a/patches/server/0009-Purpur-Server-Changes.patch b/patches/server/0009-Purpur-Server-Changes.patch index df536178..5b461a9a 100644 --- a/patches/server/0009-Purpur-Server-Changes.patch +++ b/patches/server/0009-Purpur-Server-Changes.patch @@ -6,11 +6,12 @@ Subject: [PATCH] Purpur Server Changes Original license: MIT Original project: https://github.com/PurpurMC/Purpur -Commit: 3d52f066c1bf1fc61d86164993fd7cac94ca5dce +Commit: 03a732c8eacd4eac7507d1220eaee381072c5866 Patches below are removed in this patch: Metrics change in Purpur-config-files.patch Brand change in Rebrand.patch +Fix-pufferfish-issues.patch Fix-decompile-errors.patch Alternative-Keepalive-Handling.patch Logger-settings-suppressing-pointless-logs.patch @@ -144,7 +145,7 @@ index 0000000000000000000000000000000000000000..15a226e3854d731f7724025ea3459c8a + } +} diff --git a/src/main/java/com/destroystokyo/paper/entity/ai/MobGoalHelper.java b/src/main/java/com/destroystokyo/paper/entity/ai/MobGoalHelper.java -index cfe6a6f6bcfd7a3b29ab25f5a6745d31c18f338d..c168658d4d4ec1ddd80425e786d4435fd6576637 100644 +index 59699c59fdfc611177fdb3136f84ab539b17d9c9..4819c043e193603581598c91d44d407a08ecd5fb 100644 --- a/src/main/java/com/destroystokyo/paper/entity/ai/MobGoalHelper.java +++ b/src/main/java/com/destroystokyo/paper/entity/ai/MobGoalHelper.java @@ -137,6 +137,10 @@ public class MobGoalHelper { @@ -298,12 +299,12 @@ index a8e813ca89b033f061e695288b3383bdcf128531..1ab65af9359d19530bba7f985a604d2a } if (SysoutCatcher.NAG_INTERVAL > 0 || SysoutCatcher.NAG_TIMEOUT > 0) { diff --git a/src/main/java/io/papermc/paper/plugin/PluginInitializerManager.java b/src/main/java/io/papermc/paper/plugin/PluginInitializerManager.java -index 89bf48fd581ee6580b91e2eb31dd532cb622df5e..e35da199be67e04c34df6bc09afd8d8122cb0487 100644 +index 708e5bb9bbf0476fcc2c4b92c6830b094703b43e..6141f716b15ad47ac2ac4c9ce92a3897b3ad8807 100644 --- a/src/main/java/io/papermc/paper/plugin/PluginInitializerManager.java +++ b/src/main/java/io/papermc/paper/plugin/PluginInitializerManager.java -@@ -102,6 +102,7 @@ public class PluginInitializerManager { - java.util.List files = (java.util.List) optionSet.valuesOf("add-plugin"); - // Register plugins from the flag +@@ -104,6 +104,7 @@ public class PluginInitializerManager { + @SuppressWarnings("unchecked") + java.util.List files = ((java.util.List) optionSet.valuesOf("add-plugin")).stream().map(File::toPath).toList(); io.papermc.paper.plugin.util.EntrypointUtil.registerProvidersFromSource(io.papermc.paper.plugin.provider.source.PluginFlagProviderSource.INSTANCE, files); + io.papermc.paper.plugin.util.EntrypointUtil.registerProvidersFromSource(io.papermc.paper.plugin.provider.source.SparkProviderSource.INSTANCE, new File("cache", "spark.jar").toPath()); // Purpur } @@ -418,7 +419,7 @@ index 0000000000000000000000000000000000000000..a7d1ae53eac94bc2dcf8bc78ef1da0d3 + } +} diff --git a/src/main/java/net/minecraft/commands/CommandSourceStack.java b/src/main/java/net/minecraft/commands/CommandSourceStack.java -index 6978d0a9abc9cc5870ac5ee6308f2e9949b42fde..75b7547fae06500330def131c05968662ae186c7 100644 +index f341813e9713e39bfe142ca34b751de3d8efd25b..546ff84046856ecfe0f2a07d3ba3f886f8df4dca 100644 --- a/src/main/java/net/minecraft/commands/CommandSourceStack.java +++ b/src/main/java/net/minecraft/commands/CommandSourceStack.java @@ -230,6 +230,19 @@ public class CommandSourceStack implements ExecutionCommandSource> { - private static final int MAX_PER_TICK = io.papermc.paper.configuration.GlobalConfiguration.get().misc.maxJoinsPerTick; // Paper - private static int joinAttemptsThisTick; // Paper - private static int currTick; // Paper + private static final int MAX_PER_TICK = io.papermc.paper.configuration.GlobalConfiguration.get().misc.maxJoinsPerTick; // Paper - Buffer joins to world + private static int joinAttemptsThisTick; // Paper - Buffer joins to world + private static int currTick; // Paper - Buffer joins to world + private static int tickSecond; // Purpur public void tick() { this.flushQueue(); - // Paper start + // Paper start - Buffer joins to world if (Connection.currTick != net.minecraft.server.MinecraftServer.currentTick) { Connection.currTick = net.minecraft.server.MinecraftServer.currentTick; + // Purpur start @@ -657,7 +658,7 @@ index 9fc2b83c4e99da8bd9e0fdd6bb1d5ff8520f1e57..4f3a9fa63a8df54225c96a27df87c984 + // Purpur end Connection.joinAttemptsThisTick = 0; } - // Paper end + // Paper end - Buffer joins to world diff --git a/src/main/java/net/minecraft/network/FriendlyByteBuf.java b/src/main/java/net/minecraft/network/FriendlyByteBuf.java index b863249ff7e13cf4939c8961601f0564c62fd661..bdcfd80f937c34956911373905d66424bbff8e1d 100644 --- a/src/main/java/net/minecraft/network/FriendlyByteBuf.java @@ -703,35 +704,36 @@ index 9ec6145fe04ec64bbee8ec6a837719caebdbc6f5..358d610ad020cada1bb83e393deeeaae public ClientboundSetTimePacket(long time, long timeOfDay, boolean doDaylightCycle) { this.gameTime = time; diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 147fe0adb40dbdada6eb95d0ff18910eb19e6886..2e8c390a0b1a4342bfdfca5bee3a2eeef2ac9beb 100644 +index a001fd51a7eb4ff97a84965679170f2da6619a9b..330f0f66ab16c88b2a827f09f99c42671a53a410 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -277,6 +277,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop processQueue = new java.util.concurrent.ConcurrentLinkedQueue(); public int autosavePeriod; public Commands vanillaCommandDispatcher; -@@ -286,11 +287,13 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0; // Paper - net.minecraft.world.level.block.entity.HopperBlockEntity.skipHopperEvents = worldserver.paperConfig().hopper.disableMoveEvent || org.bukkit.event.inventory.InventoryMoveItemEvent.getHandlerList().getRegisteredListeners().length == 0; // Paper - Perf: Optimize Hoppers - worldserver.hasEntityMoveEvent = io.papermc.paper.event.entity.EntityMoveEvent.getHandlerList().getRegisteredListeners().length > 0; // Paper + worldserver.hasPhysicsEvent = org.bukkit.event.block.BlockPhysicsEvent.getHandlerList().getRegisteredListeners().length > 0; // Paper - BlockPhysicsEvent + worldserver.hasEntityMoveEvent = io.papermc.paper.event.entity.EntityMoveEvent.getHandlerList().getRegisteredListeners().length > 0; // Paper - Add EntityMoveEvent + worldserver.hasRidableMoveEvent = org.purpurmc.purpur.event.entity.RidableMoveEvent.getHandlerList().getRegisteredListeners().length > 0; // Purpur + net.minecraft.world.level.block.entity.HopperBlockEntity.skipHopperEvents = worldserver.paperConfig().hopper.disableMoveEvent || org.bukkit.event.inventory.InventoryMoveItemEvent.getHandlerList().getRegisteredListeners().length == 0; // Paper - Perf: Optimize Hoppers + worldserver.updateLagCompensationTick(); // Paper - lag compensation - /* Drop global time updates - if (this.tickCount % 20 == 0) { -@@ -2707,6 +2733,15 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop { final io.papermc.paper.adventure.ChatDecorationProcessor processor = new io.papermc.paper.adventure.ChatDecorationProcessor(this, sender, commandSourceStack, message); diff --git a/src/main/java/net/minecraft/server/PlayerAdvancements.java b/src/main/java/net/minecraft/server/PlayerAdvancements.java -index e15409231e56f5bbbfbcd19cea2c7e3fbc612886..c218d2b00c937ba2b3adb4314719b4f7d049ddd6 100644 +index b954c85f4aaf58f36fbeee67691a18b03c398767..b7c6717efcefe4efae3fd69ebaa3697bfd3dc9c8 100644 --- a/src/main/java/net/minecraft/server/PlayerAdvancements.java +++ b/src/main/java/net/minecraft/server/PlayerAdvancements.java @@ -250,6 +250,7 @@ public class PlayerAdvancements { @@ -898,7 +897,7 @@ index 1b459a8ee8a6bc039e742d65796bc76660a1c765..599172b994d75484f7c7e0ce6d3d3d77 itemstack1.setCount(1); entityitem = entityplayer.drop(itemstack1, false, false, false); // CraftBukkit - SPIGOT-2942: Add boolean to call event diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java -index 67c44f8fbf291aa177aeba55a15f6434ed5b4c07..0a59c30f84e2b7b77ec1ebc9bf307524408999e0 100644 +index ba5925a229494c530c92b35de1a82d6e0a259a33..246d991a9da75ceeba2404bbd57d3025c83ea35e 100644 --- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java +++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java @@ -98,6 +98,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface @@ -966,7 +965,7 @@ index 67c44f8fbf291aa177aeba55a15f6434ed5b4c07..0a59c30f84e2b7b77ec1ebc9bf307524 } } diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServerProperties.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServerProperties.java -index 96c79afbdc824257b4225a85ff9b2fe2d8310f57..7f1fae294f141bccab387788a1c5cc51905645c6 100644 +index aa46e6e22998c62c89a56fbcabc13fdf58dd7dba..ee22ca05dccba4914d32125586299c1b7433a532 100644 --- a/src/main/java/net/minecraft/server/dedicated/DedicatedServerProperties.java +++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServerProperties.java @@ -57,6 +57,7 @@ public class DedicatedServerProperties extends Settings> trackedDataValues; // CraftBukkit start -- final Set trackedPlayers; // Paper - private -> package -+ public final Set trackedPlayers; // Paper - private -> package // Purpur - package -> public +- private final Set trackedPlayers; ++ public final Set trackedPlayers; // Purpur - package -> public public ServerEntity(ServerLevel worldserver, Entity entity, int i, boolean flag, Consumer> consumer, Set trackedPlayers) { this.trackedPlayers = trackedPlayers; diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index 997cd2387ea2de9ba081eb0664e5658ac93542fc..d4d86b650dd305187b69820923d66003d9e46b24 100644 +index 98e666c69b51f7b4fec040b7abd9667d293c9ccb..a6a9a425aecdd58a65a926a22cd44f7a5c711007 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java @@ -214,6 +214,8 @@ public class ServerLevel extends Level implements WorldGenLevel { @@ -1141,14 +1140,14 @@ index 997cd2387ea2de9ba081eb0664e5658ac93542fc..d4d86b650dd305187b69820923d66003 public long lastMidTickExecuteFailure; // Paper - execute chunk tasks mid tick @@ -223,6 +225,7 @@ public class ServerLevel extends Level implements WorldGenLevel { - public boolean hasPhysicsEvent = true; // Paper - public boolean hasEntityMoveEvent = false; // Paper + public boolean hasPhysicsEvent = true; // Paper - BlockPhysicsEvent + public boolean hasEntityMoveEvent; // Paper - Add EntityMoveEvent private final alternate.current.wire.WireHandler wireHandler = new alternate.current.wire.WireHandler(this); // Paper - optimize redstone (Alternate Current) + public boolean hasRidableMoveEvent = false; // Purpur - public static Throwable getAddToWorldStackTrace(Entity entity) { - final Throwable thr = new Throwable(entity + " Added to world at " + new java.util.Date()); - io.papermc.paper.util.StacktraceDeobfuscator.INSTANCE.deobfuscateThrowable(thr); -@@ -713,7 +716,24 @@ public class ServerLevel extends Level implements WorldGenLevel { + + public LevelChunk getChunkIfLoaded(int x, int z) { + return this.chunkSource.getChunkAtIfLoadedImmediately(x, z); // Paper - Use getChunkIfLoadedImmediately +@@ -708,7 +711,24 @@ public class ServerLevel extends Level implements WorldGenLevel { this.dragonParts = new Int2ObjectOpenHashMap(); this.tickTime = flag1; this.server = minecraftserver; @@ -1174,7 +1173,7 @@ index 997cd2387ea2de9ba081eb0664e5658ac93542fc..d4d86b650dd305187b69820923d66003 this.serverLevelData = iworlddataserver; ChunkGenerator chunkgenerator = worlddimension.generator(); // CraftBukkit start -@@ -775,6 +795,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -770,6 +790,7 @@ public class ServerLevel extends Level implements WorldGenLevel { this.chunkTaskScheduler = new io.papermc.paper.chunk.system.scheduling.ChunkTaskScheduler(this, io.papermc.paper.chunk.system.scheduling.ChunkTaskScheduler.workerThreads); // Paper - rewrite chunk system this.entityLookup = new io.papermc.paper.chunk.system.entity.EntityLookup(this, new EntityCallbacks()); // Paper - rewrite chunk system @@ -1182,7 +1181,7 @@ index 997cd2387ea2de9ba081eb0664e5658ac93542fc..d4d86b650dd305187b69820923d66003 } // Paper start -@@ -821,7 +842,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -816,7 +837,7 @@ public class ServerLevel extends Level implements WorldGenLevel { int i = this.getGameRules().getInt(GameRules.RULE_PLAYERS_SLEEPING_PERCENTAGE); long j; @@ -1191,7 +1190,7 @@ index 997cd2387ea2de9ba081eb0664e5658ac93542fc..d4d86b650dd305187b69820923d66003 // CraftBukkit start j = this.levelData.getDayTime() + 24000L; TimeSkipEvent event = new TimeSkipEvent(this.getWorld(), TimeSkipEvent.SkipReason.NIGHT_SKIP, (j - j % 24000L) - this.getDayTime()); -@@ -943,6 +964,13 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -938,6 +959,13 @@ public class ServerLevel extends Level implements WorldGenLevel { this.serverLevelData.setGameTime(i); this.serverLevelData.getScheduledEvents().tick(this.server, i); if (this.levelData.getGameRules().getBoolean(GameRules.RULE_DAYLIGHT)) { @@ -1205,7 +1204,7 @@ index 997cd2387ea2de9ba081eb0664e5658ac93542fc..d4d86b650dd305187b69820923d66003 this.setDayTime(this.levelData.getDayTime() + 1L); } -@@ -951,8 +979,22 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -946,8 +974,22 @@ public class ServerLevel extends Level implements WorldGenLevel { public void setDayTime(long timeOfDay) { this.serverLevelData.setDayTime(timeOfDay); @@ -1228,8 +1227,8 @@ index 997cd2387ea2de9ba081eb0664e5658ac93542fc..d4d86b650dd305187b69820923d66003 public void tickCustomSpawners(boolean spawnMonsters, boolean spawnAnimals) { Iterator iterator = this.customSpawners.iterator(); -@@ -995,10 +1037,18 @@ public class ServerLevel extends Level implements WorldGenLevel { - boolean flag1 = this.getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING) && this.random.nextDouble() < (double) difficultydamagescaler.getEffectiveDifficulty() * this.paperConfig().entities.spawning.skeletonHorseThunderSpawnChance.or(0.01D) && !this.getBlockState(blockposition.below()).is(Blocks.LIGHTNING_ROD); // Paper +@@ -990,10 +1032,18 @@ public class ServerLevel extends Level implements WorldGenLevel { + boolean flag1 = this.getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING) && this.random.nextDouble() < (double) difficultydamagescaler.getEffectiveDifficulty() * this.paperConfig().entities.spawning.skeletonHorseThunderSpawnChance.or(0.01D) && !this.getBlockState(blockposition.below()).is(Blocks.LIGHTNING_ROD); // Paper - Configurable spawn chances for skeleton horses if (flag1) { - SkeletonHorse entityhorseskeleton = (SkeletonHorse) EntityType.SKELETON_HORSE.create(this); @@ -1249,7 +1248,7 @@ index 997cd2387ea2de9ba081eb0664e5658ac93542fc..d4d86b650dd305187b69820923d66003 entityhorseskeleton.setAge(0); entityhorseskeleton.setPos((double) blockposition.getX(), (double) blockposition.getY(), (double) blockposition.getZ()); this.addFreshEntity(entityhorseskeleton, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.LIGHTNING); // CraftBukkit -@@ -1118,7 +1168,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1113,7 +1163,7 @@ public class ServerLevel extends Level implements WorldGenLevel { return holder.is(PoiTypes.LIGHTNING_ROD); }, (blockposition1) -> { return blockposition1.getY() == this.getHeight(Heightmap.Types.WORLD_SURFACE, blockposition1.getX(), blockposition1.getZ()) - 1; @@ -1258,7 +1257,7 @@ index 997cd2387ea2de9ba081eb0664e5658ac93542fc..d4d86b650dd305187b69820923d66003 return optional.map((blockposition1) -> { return blockposition1.above(1); -@@ -1167,11 +1217,27 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1162,11 +1212,27 @@ public class ServerLevel extends Level implements WorldGenLevel { if (this.canSleepThroughNights()) { if (!this.getServer().isSingleplayer() || this.getServer().isPublished()) { int i = this.getGameRules().getInt(GameRules.RULE_PLAYERS_SLEEPING_PERCENTAGE); @@ -1287,7 +1286,7 @@ index 997cd2387ea2de9ba081eb0664e5658ac93542fc..d4d86b650dd305187b69820923d66003 ichatmutablecomponent = Component.translatable("sleep.players_sleeping", this.sleepStatus.amountSleeping(), this.sleepStatus.sleepersNeeded(i)); } -@@ -1311,6 +1377,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1306,6 +1372,7 @@ public class ServerLevel extends Level implements WorldGenLevel { @VisibleForTesting public void resetWeatherCycle() { // CraftBukkit start @@ -1295,7 +1294,7 @@ index 997cd2387ea2de9ba081eb0664e5658ac93542fc..d4d86b650dd305187b69820923d66003 this.serverLevelData.setRaining(false, org.bukkit.event.weather.WeatherChangeEvent.Cause.SLEEP); // Paper - Add cause to Weather/ThunderChangeEvents // If we stop due to everyone sleeping we should reset the weather duration to some other random value. // Not that everyone ever manages to get the whole server to sleep at the same time.... -@@ -1318,6 +1385,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1313,6 +1380,7 @@ public class ServerLevel extends Level implements WorldGenLevel { this.serverLevelData.setRainTime(0); } // CraftBukkit end @@ -1303,7 +1302,7 @@ index 997cd2387ea2de9ba081eb0664e5658ac93542fc..d4d86b650dd305187b69820923d66003 this.serverLevelData.setThundering(false, org.bukkit.event.weather.ThunderChangeEvent.Cause.SLEEP); // Paper - Add cause to Weather/ThunderChangeEvents // CraftBukkit start // If we stop due to everyone sleeping we should reset the weather duration to some other random value. -@@ -2829,7 +2897,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -2809,7 +2877,7 @@ public class ServerLevel extends Level implements WorldGenLevel { // Spigot Start if (entity.getBukkitEntity() instanceof org.bukkit.inventory.InventoryHolder && (!(entity instanceof ServerPlayer) || entity.getRemovalReason() != Entity.RemovalReason.KILLED)) { // SPIGOT-6876: closeInventory clears death message // Paper start - Fix merchant inventory not closing on entity removal @@ -1313,13 +1312,13 @@ index 997cd2387ea2de9ba081eb0664e5658ac93542fc..d4d86b650dd305187b69820923d66003 } // Paper end - Fix merchant inventory not closing on entity removal diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index 0a0106d9192e6913f7579a4fdd77a9c0fc8366ba..3b7e0a6ef1183103a858fc0f25c3202f8bc49ecc 100644 +index caf8b19251d7fe317f45d76ea33c8d37694729ba..98c488e5e8cfc0947d80b5d11aa40f7ca801a67b 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java @@ -282,6 +282,10 @@ public class ServerPlayer extends Player { - public com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent playerNaturallySpawnedEvent; // Paper - public @Nullable String clientBrandName = null; // Paper - Brand name - public org.bukkit.event.player.PlayerQuitEvent.QuitReason quitReason = null; // Paper - there are a lot of changes to do if we change all methods leading to the event + public com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent playerNaturallySpawnedEvent; // Paper - PlayerNaturallySpawnCreaturesEvent + public @Nullable String clientBrandName = null; // Paper - Brand support + public org.bukkit.event.player.PlayerQuitEvent.QuitReason quitReason = null; // Paper - Add API for quit reason; there are a lot of changes to do if we change all methods leading to the event + public boolean purpurClient = false; // Purpur + private boolean tpsBar = false; // Purpur + private boolean compassBar = false; // Purpur @@ -1582,7 +1581,7 @@ index 0a0106d9192e6913f7579a4fdd77a9c0fc8366ba..3b7e0a6ef1183103a858fc0f25c3202f + // Purpur end } diff --git a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java -index cea5bef4e50ffaa4015f9224625aa6216c65f3b1..cc8493ffd692ab568b8715750d7e2de081e6ff2e 100644 +index 840dc3c57dd60d5f16155fc0c6f8c9fea49685c9..8e87d799586103b8a743ebc0cfb8da7fca3c856a 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java @@ -397,6 +397,7 @@ public class ServerPlayerGameMode { @@ -1601,7 +1600,7 @@ index cea5bef4e50ffaa4015f9224625aa6216c65f3b1..cc8493ffd692ab568b8715750d7e2de0 BlockPos blockposition = hitResult.getBlockPos(); BlockState iblockdata = world.getBlockState(blockposition); InteractionResult enuminteractionresult = InteractionResult.PASS; -@@ -579,7 +581,7 @@ public class ServerPlayerGameMode { +@@ -577,7 +579,7 @@ public class ServerPlayerGameMode { boolean flag1 = player.isSecondaryUseActive() && flag; ItemStack itemstack1 = stack.copy(); @@ -1610,7 +1609,7 @@ index cea5bef4e50ffaa4015f9224625aa6216c65f3b1..cc8493ffd692ab568b8715750d7e2de0 enuminteractionresult = iblockdata.use(world, player, hand, hitResult); if (enuminteractionresult.consumesAction()) { -@@ -620,4 +622,18 @@ public class ServerPlayerGameMode { +@@ -618,4 +620,18 @@ public class ServerPlayerGameMode { public void setLevel(ServerLevel world) { this.level = world; } @@ -1630,7 +1629,7 @@ index cea5bef4e50ffaa4015f9224625aa6216c65f3b1..cc8493ffd692ab568b8715750d7e2de0 + // Purpur end } diff --git a/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java -index bd08b6f29177cdfc165416790cac3093499b1871..a90569dbdf9122866d57e2876d9940f4ef4b8a45 100644 +index d791c2f2facfc46d8664225c8b28f95f92df3413..61cd58a5bb3d228b29b9cc4db11be03d4c833223 100644 --- a/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java @@ -64,6 +64,7 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack @@ -1656,10 +1655,10 @@ index bd08b6f29177cdfc165416790cac3093499b1871..a90569dbdf9122866d57e2876d9940f4 try { String channels = payload.toString(com.google.common.base.Charsets.UTF_8); diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index ea8a136e2ca0aebc668391e15becd48f7d0e586f..03b9416aa19a4fac28a1499f15cc097ef71a657e 100644 +index 42b1188e236dd0facf5207ce2f1644a95b26da84..32c04eac5936719eeb1fdd41b729e87eadbbd47f 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -336,6 +336,20 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -335,6 +335,20 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl } // Gale end - make max interaction distance configurable @@ -1680,7 +1679,7 @@ index ea8a136e2ca0aebc668391e15becd48f7d0e586f..03b9416aa19a4fac28a1499f15cc097e @Override public void tick() { if (this.ackBlockChangesUpTo > -1) { -@@ -403,6 +417,12 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -402,6 +416,12 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl } if (this.player.getLastActionTime() > 0L && this.server.getPlayerIdleTimeout() > 0 && Util.getMillis() - this.player.getLastActionTime() > (long) this.server.getPlayerIdleTimeout() * 1000L * 60L && !this.player.wonGame) { // Paper - Prevent AFK kick while watching end credits @@ -1693,7 +1692,7 @@ index ea8a136e2ca0aebc668391e15becd48f7d0e586f..03b9416aa19a4fac28a1499f15cc097e this.player.resetLastActionTime(); // CraftBukkit - SPIGOT-854 this.disconnect(Component.translatable("multiplayer.disconnect.idling"), org.bukkit.event.player.PlayerKickEvent.Cause.IDLING); // Paper - kick event cause } -@@ -653,10 +673,11 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -649,10 +669,11 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl this.lastYaw = to.getYaw(); this.lastPitch = to.getPitch(); @@ -1706,7 +1705,7 @@ index ea8a136e2ca0aebc668391e15becd48f7d0e586f..03b9416aa19a4fac28a1499f15cc097e // If the event is cancelled we move the player back to their old location. if (event.isCancelled()) { this.teleport(from); -@@ -726,6 +747,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -722,6 +743,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl if (packet.getId() == this.awaitingTeleport) { if (this.awaitingPositionFromClient == null) { this.disconnect(Component.translatable("multiplayer.disconnect.invalid_player_movement"), org.bukkit.event.player.PlayerKickEvent.Cause.INVALID_PLAYER_MOVEMENT); // Paper - kick event cause @@ -1714,7 +1713,7 @@ index ea8a136e2ca0aebc668391e15becd48f7d0e586f..03b9416aa19a4fac28a1499f15cc097e return; } -@@ -1147,10 +1169,15 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1143,10 +1165,15 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl int maxBookPageSize = io.papermc.paper.configuration.GlobalConfiguration.get().itemValidation.bookSize.pageMax; double multiplier = Math.max(0.3D, Math.min(1D, io.papermc.paper.configuration.GlobalConfiguration.get().itemValidation.bookSize.totalMultiplier)); long byteAllowed = maxBookPageSize; @@ -1730,7 +1729,7 @@ index ea8a136e2ca0aebc668391e15becd48f7d0e586f..03b9416aa19a4fac28a1499f15cc097e server.scheduleOnMain(() -> this.disconnect("Book too large!", org.bukkit.event.player.PlayerKickEvent.Cause.ILLEGAL_ACTION)); // Paper - kick event cause return; } -@@ -1174,6 +1201,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1170,6 +1197,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl if (byteTotal > byteAllowed) { ServerGamePacketListenerImpl.LOGGER.warn(this.player.getScoreboardName() + " tried to send too large of a book. Book Size: " + byteTotal + " - Allowed: "+ byteAllowed + " - Pages: " + pageList.size()); @@ -1738,7 +1737,7 @@ index ea8a136e2ca0aebc668391e15becd48f7d0e586f..03b9416aa19a4fac28a1499f15cc097e server.scheduleOnMain(() -> this.disconnect("Book too large!", org.bukkit.event.player.PlayerKickEvent.Cause.ILLEGAL_ACTION)); // Paper - kick event cause return; } -@@ -1227,13 +1255,16 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1223,13 +1251,16 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl itemstack1.setTag(nbttagcompound.copy()); } @@ -1758,7 +1757,7 @@ index ea8a136e2ca0aebc668391e15becd48f7d0e586f..03b9416aa19a4fac28a1499f15cc097e this.updateBookPages(pages, (s) -> { return Component.Serializer.toJson(Component.literal(s)); -@@ -1245,10 +1276,13 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1241,10 +1272,13 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl private void updateBookPages(List list, UnaryOperator unaryoperator, ItemStack itemstack, int slot, ItemStack handItem) { // CraftBukkit ListTag nbttaglist = new ListTag(); @@ -1774,7 +1773,7 @@ index ea8a136e2ca0aebc668391e15becd48f7d0e586f..03b9416aa19a4fac28a1499f15cc097e Objects.requireNonNull(nbttaglist); stream.forEach(nbttaglist::add); -@@ -1258,11 +1292,11 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1254,11 +1288,11 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl for (int j = list.size(); i < j; ++i) { FilteredText filteredtext = (FilteredText) list.get(i); @@ -1788,7 +1787,7 @@ index ea8a136e2ca0aebc668391e15becd48f7d0e586f..03b9416aa19a4fac28a1499f15cc097e } } -@@ -1275,6 +1309,16 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1271,6 +1305,16 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl this.player.getInventory().setItem(slot, CraftEventFactory.handleEditBookEvent(this.player, slot, handItem, itemstack)); // CraftBukkit // Paper - Don't ignore result (see other callsite for handleEditBookEvent) } @@ -1805,7 +1804,7 @@ index ea8a136e2ca0aebc668391e15becd48f7d0e586f..03b9416aa19a4fac28a1499f15cc097e @Override public void handleEntityTagQuery(ServerboundEntityTagQuery packet) { PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel()); -@@ -1324,8 +1368,16 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1320,8 +1364,16 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl @Override public void handleMovePlayer(ServerboundMovePlayerPacket packet) { PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel()); @@ -1823,16 +1822,16 @@ index ea8a136e2ca0aebc668391e15becd48f7d0e586f..03b9416aa19a4fac28a1499f15cc097e } else { ServerLevel worldserver = this.player.serverLevel(); -@@ -1511,7 +1563,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1505,7 +1557,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl if (!event.isAllowed()) { - flag2 = true; // Paper - diff on change, this should be moved wrongly + movedWrongly = true; if (event.getLogWarning()) - ServerGamePacketListenerImpl.LOGGER.warn("{} moved wrongly!", this.player.getName().getString()); -+ ServerGamePacketListenerImpl.LOGGER.warn("{} moved wrongly!, ({})", this.player.getName().getString(), d11); // Purpur ++ ServerGamePacketListenerImpl.LOGGER.warn("{} moved wrongly!, ({})", this.player.getName().getString(), d11); // Purpur } - // Paper end - Add fail move event } -@@ -1581,6 +1633,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl + +@@ -1572,6 +1624,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl this.lastYaw = to.getYaw(); this.lastPitch = to.getPitch(); @@ -1841,7 +1840,7 @@ index ea8a136e2ca0aebc668391e15becd48f7d0e586f..03b9416aa19a4fac28a1499f15cc097e Location oldTo = to.clone(); PlayerMoveEvent event = new PlayerMoveEvent(player, from, to); this.cserver.getPluginManager().callEvent(event); -@@ -1616,6 +1670,13 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1607,6 +1661,13 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl this.player.resetFallDistance(); } @@ -1855,7 +1854,7 @@ index ea8a136e2ca0aebc668391e15becd48f7d0e586f..03b9416aa19a4fac28a1499f15cc097e this.player.checkMovementStatistics(this.player.getX() - d3, this.player.getY() - d4, this.player.getZ() - d5); this.lastGoodX = this.player.getX(); this.lastGoodY = this.player.getY(); -@@ -1667,6 +1728,13 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1646,6 +1707,13 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl return false; } // Paper end - optimise out extra getCubes @@ -1869,7 +1868,7 @@ index ea8a136e2ca0aebc668391e15becd48f7d0e586f..03b9416aa19a4fac28a1499f15cc097e private boolean isPlayerCollidingWithAnythingNew(LevelReader world, AABB box, double newX, double newY, double newZ) { AABB axisalignedbb1 = this.player.getBoundingBox().move(newX - this.player.getX(), newY - this.player.getY(), newZ - this.player.getZ()); Iterable iterable = world.getCollisions(this.player, axisalignedbb1.deflate(9.999999747378752E-6D)); -@@ -1677,7 +1745,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1656,7 +1724,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl do { if (!iterator.hasNext()) { @@ -1878,7 +1877,7 @@ index ea8a136e2ca0aebc668391e15becd48f7d0e586f..03b9416aa19a4fac28a1499f15cc097e } voxelshape1 = (VoxelShape) iterator.next(); -@@ -2012,6 +2080,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1991,6 +2059,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl boolean cancelled; if (movingobjectposition == null || movingobjectposition.getType() != HitResult.Type.BLOCK) { @@ -1886,7 +1885,7 @@ index ea8a136e2ca0aebc668391e15becd48f7d0e586f..03b9416aa19a4fac28a1499f15cc097e org.bukkit.event.player.PlayerInteractEvent event = CraftEventFactory.callPlayerInteractEvent(this.player, Action.RIGHT_CLICK_AIR, itemstack, enumhand); cancelled = event.useItemInHand() == Event.Result.DENY; } else { -@@ -2730,6 +2799,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2709,6 +2778,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl AABB axisalignedbb = entity.getBoundingBox(); if (axisalignedbb.distanceToSqr(this.player.getEyePosition()) < ServerGamePacketListenerImpl.getMaxInteractionDistanceSquared(this.player.level())) { // Gale - make max interaction distance configurable @@ -1894,7 +1893,7 @@ index ea8a136e2ca0aebc668391e15becd48f7d0e586f..03b9416aa19a4fac28a1499f15cc097e packet.dispatch(new ServerboundInteractPacket.Handler() { private void performInteraction(InteractionHand enumhand, ServerGamePacketListenerImpl.EntityInteraction playerconnection_a, PlayerInteractEntityEvent event) { // CraftBukkit ItemStack itemstack = ServerGamePacketListenerImpl.this.player.getItemInHand(enumhand); -@@ -2743,6 +2813,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2722,6 +2792,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl ServerGamePacketListenerImpl.this.cserver.getPluginManager().callEvent(event); @@ -1903,7 +1902,7 @@ index ea8a136e2ca0aebc668391e15becd48f7d0e586f..03b9416aa19a4fac28a1499f15cc097e // Entity in bucket - SPIGOT-4048 and SPIGOT-6859a if ((entity instanceof Bucketable && entity instanceof LivingEntity && origItem != null && origItem.asItem() == Items.WATER_BUCKET) && (event.isCancelled() || ServerGamePacketListenerImpl.this.player.getInventory().getSelected() == null || ServerGamePacketListenerImpl.this.player.getInventory().getSelected().getItem() != origItem)) { entity.getEntityData().resendPossiblyDesyncedEntity(player); // Paper - The entire mob gets deleted, so resend it. -@@ -3328,6 +3400,12 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -3296,6 +3368,12 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl } } } @@ -1917,7 +1916,7 @@ index ea8a136e2ca0aebc668391e15becd48f7d0e586f..03b9416aa19a4fac28a1499f15cc097e boolean flag1 = packet.getSlotNum() >= 1 && packet.getSlotNum() <= 45; boolean flag2 = itemstack.isEmpty() || itemstack.getDamageValue() >= 0 && itemstack.getCount() <= 64 && !itemstack.isEmpty(); diff --git a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java -index b156158e3d73635c08229ae46c4ecd52b8ee2e6e..7386fa13db5127df6756fb92d377e1ba722cc74a 100644 +index e072edfb1f51f3e219e6deb10b19b4b2502ea87f..4bd1d7c4328e13ae3e173836ced22125857bcae1 100644 --- a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java @@ -285,7 +285,7 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener, @@ -1930,18 +1929,18 @@ index b156158e3d73635c08229ae46c4ecd52b8ee2e6e..7386fa13db5127df6756fb92d377e1ba } } catch (AuthenticationUnavailableException authenticationunavailableexception) { diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index 28ee7fe94c1c8c4b4726bbd772d33539eda223ed..4652ff409ba93440f249fc2ee504e4fe6e1609de 100644 +index a7949710cf082f8cbbe7ccd3c943ead2fe73e1ea..5748ada42d5039e8f2999f1ca0a74067a1dad08f 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java @@ -502,6 +502,7 @@ public abstract class PlayerList { scoreboard.addPlayerToTeam(player.getScoreboardName(), collideRuleTeam); } - // Paper end + // Paper end - Configurable player collision + org.purpurmc.purpur.task.BossBarTask.addToAll(player); // Purpur - // CraftBukkit - Moved from above, added world if (GaleGlobalConfiguration.get().logToConsole.playerLoginLocations) { // Gale - JettPack - make logging login location configurable PlayerList.LOGGER.info("{}[{}] logged in with entity id {} at ([{}]{}, {}, {})", player.getName().getString(), s1, player.getId(), worldserver1.serverLevelData.getLevelName(), player.getX(), player.getY(), player.getZ()); -@@ -621,6 +622,7 @@ public abstract class PlayerList { + // Gale start - JettPack - make logging login location configurable +@@ -620,6 +621,7 @@ public abstract class PlayerList { } public net.kyori.adventure.text.Component remove(ServerPlayer entityplayer, net.kyori.adventure.text.Component leaveMessage) { // Paper end - Fix kick event leave message not being sent @@ -1949,7 +1948,7 @@ index 28ee7fe94c1c8c4b4726bbd772d33539eda223ed..4652ff409ba93440f249fc2ee504e4fe ServerLevel worldserver = entityplayer.serverLevel(); entityplayer.awardStat(Stats.LEAVE_GAME); -@@ -776,7 +778,7 @@ public abstract class PlayerList { +@@ -775,7 +777,7 @@ public abstract class PlayerList { event.disallow(PlayerLoginEvent.Result.KICK_BANNED, io.papermc.paper.adventure.PaperAdventure.asAdventure(ichatmutablecomponent)); // Paper - Adventure } else { // return this.players.size() >= this.maxPlayers && !this.canBypassPlayerLimit(gameprofile) ? IChatBaseComponent.translatable("multiplayer.disconnect.server_full") : null; @@ -1958,7 +1957,7 @@ index 28ee7fe94c1c8c4b4726bbd772d33539eda223ed..4652ff409ba93440f249fc2ee504e4fe event.disallow(PlayerLoginEvent.Result.KICK_FULL, net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(org.spigotmc.SpigotConfig.serverFullMessage)); // Spigot // Paper - Adventure } } -@@ -1128,6 +1130,20 @@ public abstract class PlayerList { +@@ -1127,6 +1129,20 @@ public abstract class PlayerList { } // CraftBukkit end @@ -1979,7 +1978,7 @@ index 28ee7fe94c1c8c4b4726bbd772d33539eda223ed..4652ff409ba93440f249fc2ee504e4fe public void broadcastAll(Packet packet, ResourceKey dimension) { Iterator iterator = this.players.iterator(); -@@ -1231,6 +1247,7 @@ public abstract class PlayerList { +@@ -1230,6 +1246,7 @@ public abstract class PlayerList { } else { b0 = (byte) (24 + permissionLevel); } @@ -1987,10 +1986,10 @@ index 28ee7fe94c1c8c4b4726bbd772d33539eda223ed..4652ff409ba93440f249fc2ee504e4fe player.connection.send(new ClientboundEntityEventPacket(player, b0)); } -@@ -1239,6 +1256,27 @@ public abstract class PlayerList { +@@ -1238,6 +1255,27 @@ public abstract class PlayerList { player.getBukkitEntity().recalculatePermissions(); // CraftBukkit this.server.getCommands().sendCommands(player); - } // Paper + } // Paper - Add sendOpLevel API + + // Purpur start + if (org.purpurmc.purpur.PurpurConfig.enderChestSixRows && org.purpurmc.purpur.PurpurConfig.enderChestPermissionRows) { @@ -2356,7 +2355,7 @@ index 1f9e0c139988c4c44a26552881647d36965aa4fa..b8d612d22aca74a08b53393c0723a2ae @Override diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 293ed3942268c4ae915c0331e3988ce9dcd83306..4e3d22cc21b50e563416a3f89715078aeb059f40 100644 +index 7eff987694d03ccfa687114ee4f2650a7f83a1ea..c984b9a614690a44f9506de42707edc63d1ecc65 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -159,7 +159,7 @@ import org.bukkit.plugin.PluginManager; @@ -2367,8 +2366,8 @@ index 293ed3942268c4ae915c0331e3988ce9dcd83306..4e3d22cc21b50e563416a3f89715078a + public static javax.script.ScriptEngine scriptEngine = new javax.script.ScriptEngineManager().getEngineByName("rhino"); // Purpur // CraftBukkit start private static final int CURRENT_LEVEL = 2; - public boolean preserveMotion = true; // Paper - keep initial motion on first setPositionRotation -@@ -338,7 +338,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S + public boolean preserveMotion = true; // Paper - Fix Entity Teleportation and cancel velocity if teleported; keep initial motion on first setPositionRotation +@@ -337,7 +337,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S public double xOld; public double yOld; public double zOld; @@ -2377,7 +2376,7 @@ index 293ed3942268c4ae915c0331e3988ce9dcd83306..4e3d22cc21b50e563416a3f89715078a public boolean noPhysics; public final RandomSource random; public int tickCount; -@@ -380,7 +380,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -379,7 +379,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S private final Set tags; private final double[] pistonDeltas; private long pistonDeltasGameTime; @@ -2386,7 +2385,7 @@ index 293ed3942268c4ae915c0331e3988ce9dcd83306..4e3d22cc21b50e563416a3f89715078a private float eyeHeight; public boolean isInPowderSnow; public boolean wasInPowderSnow; -@@ -500,6 +500,25 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -561,6 +561,25 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S return false; } @@ -2412,16 +2411,16 @@ index 293ed3942268c4ae915c0331e3988ce9dcd83306..4e3d22cc21b50e563416a3f89715078a public final boolean hardCollides() { return this.hardCollides; } -@@ -582,7 +601,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -581,7 +600,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S this.bb = Entity.INITIAL_AABB; this.stuckSpeedMultiplier = Vec3.ZERO; this.nextStep = 1.0F; -- this.random = SHARED_RANDOM; // Paper -+ this.random = world == null || world.purpurConfig.entitySharedRandom ? SHARED_RANDOM : RandomSource.create(); // Paper // Purpur +- this.random = SHARED_RANDOM; // Paper - Share random for entities to make them more random ++ this.random = world == null || world.purpurConfig.entitySharedRandom ? SHARED_RANDOM : RandomSource.create(); // Paper - Share random for entities to make them more random // Purpur this.remainingFireTicks = -this.getFireImmuneTicks(); this.fluidHeight = new Object2DoubleArrayMap(2); this.fluidOnEyes = new HashSet(); -@@ -908,10 +927,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -907,10 +926,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S public void checkBelowWorld() { // Paper start - Configurable nether ceiling damage @@ -2429,7 +2428,7 @@ index 293ed3942268c4ae915c0331e3988ce9dcd83306..4e3d22cc21b50e563416a3f89715078a + if (this.getY() < (double) (this.level.getMinBuildHeight() + level().purpurConfig.voidDamageHeight) || (this.level.getWorld().getEnvironment() == org.bukkit.World.Environment.NETHER // Purpur && this.level.paperConfig().environment.netherCeilingVoidDamageHeight.test(v -> this.getY() >= v) && (!(this instanceof Player player) || !player.getAbilities().invulnerable))) { - // Paper end + // Paper end - Configurable nether ceiling damage + if (this.level().purpurConfig.teleportOnNetherCeilingDamage && this.level.getWorld().getEnvironment() == org.bukkit.World.Environment.NETHER && this instanceof ServerPlayer player) player.teleport(io.papermc.paper.util.MCUtil.toLocation(this.level, this.level.getSharedSpawnPos())); else // Purpur this.onBelowWorld(); } @@ -2443,7 +2442,7 @@ index 293ed3942268c4ae915c0331e3988ce9dcd83306..4e3d22cc21b50e563416a3f89715078a Entity entity = this.getVehicle(); if (entity instanceof Boat) { -@@ -3033,6 +3053,13 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -3030,6 +3050,13 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S this.passengers = ImmutableList.copyOf(list); } @@ -2457,7 +2456,7 @@ index 293ed3942268c4ae915c0331e3988ce9dcd83306..4e3d22cc21b50e563416a3f89715078a this.gameEvent(GameEvent.ENTITY_MOUNT, passenger); } } -@@ -3072,6 +3099,14 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -3069,6 +3096,14 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S return false; } // CraftBukkit end @@ -2472,7 +2471,7 @@ index 293ed3942268c4ae915c0331e3988ce9dcd83306..4e3d22cc21b50e563416a3f89715078a if (this.passengers.size() == 1 && this.passengers.get(0) == entity) { this.passengers = ImmutableList.of(); } else { -@@ -3151,12 +3186,15 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -3148,12 +3183,15 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S return Vec3.directionFromRotation(this.getRotationVector()); } @@ -2489,7 +2488,7 @@ index 293ed3942268c4ae915c0331e3988ce9dcd83306..4e3d22cc21b50e563416a3f89715078a } this.isInsidePortal = true; -@@ -3205,7 +3243,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -3202,7 +3240,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S } this.processPortalCooldown(); @@ -2498,7 +2497,7 @@ index 293ed3942268c4ae915c0331e3988ce9dcd83306..4e3d22cc21b50e563416a3f89715078a } } -@@ -3395,7 +3433,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -3392,7 +3430,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S } public int getMaxAirSupply() { @@ -2507,16 +2506,16 @@ index 293ed3942268c4ae915c0331e3988ce9dcd83306..4e3d22cc21b50e563416a3f89715078a } public int getAirSupply() { -@@ -3863,7 +3901,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -3858,7 +3896,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S } public boolean canChangeDimensions() { -- return !this.isPassenger() && !this.isVehicle() && isAlive() && valid; // Paper -+ return !this.isPassenger() && !this.isVehicle() && isAlive() && valid && (level().purpurConfig.entitiesCanUsePortals || this instanceof ServerPlayer); // Paper // Purpur +- return !this.isPassenger() && !this.isVehicle() && isAlive() && valid; // Paper - Fix item duplication and teleport issues ++ return !this.isPassenger() && !this.isVehicle() && isAlive() && valid && (level().purpurConfig.entitiesCanUsePortals || this instanceof ServerPlayer); // Paper - Fix item duplication and teleport issues // Purpur } public float getBlockExplosionResistance(Explosion explosion, BlockGetter world, BlockPos pos, BlockState blockState, FluidState fluidState, float max) { -@@ -4166,6 +4204,20 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -4161,6 +4199,20 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S return SlotAccess.NULL; } @@ -2537,7 +2536,7 @@ index 293ed3942268c4ae915c0331e3988ce9dcd83306..4e3d22cc21b50e563416a3f89715078a @Override public void sendSystemMessage(Component message) {} -@@ -4446,6 +4498,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -4438,6 +4490,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S this.yRotO = this.getYRot(); } @@ -2550,10 +2549,10 @@ index 293ed3942268c4ae915c0331e3988ce9dcd83306..4e3d22cc21b50e563416a3f89715078a public boolean updateFluidHeightAndDoFluidPushing(TagKey tag, double speed) { if (false && this.touchingUnloadedChunk()) { // Gale - Airplane - reduce entity fluid lookups if no fluids - cost of a lookup here is the same cost as below, so skip return false; -@@ -5016,4 +5074,45 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -5008,4 +5066,45 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S return ((net.minecraft.server.level.ServerChunkCache) level.getChunkSource()).isPositionTicking(this); } - // Paper end + // Paper end - Expose entity id counter + + // Purpur start + @Nullable @@ -2597,7 +2596,7 @@ index 293ed3942268c4ae915c0331e3988ce9dcd83306..4e3d22cc21b50e563416a3f89715078a + // Purpur end } diff --git a/src/main/java/net/minecraft/world/entity/EntitySelector.java b/src/main/java/net/minecraft/world/entity/EntitySelector.java -index dbbce471c35849ea7d7ad07e9db9b7d8d85690df..5eb63d857fea0f1c4dc1e6e4c7af8ea653dc7963 100644 +index d8cc5614502db7025349e085381b6b32ad32296a..f1b9e83206cc67e6ef29ebe088351b0aaa5eb349 100644 --- a/src/main/java/net/minecraft/world/entity/EntitySelector.java +++ b/src/main/java/net/minecraft/world/entity/EntitySelector.java @@ -40,6 +40,7 @@ public final class EntitySelector { @@ -2607,9 +2606,9 @@ index dbbce471c35849ea7d7ad07e9db9b7d8d85690df..5eb63d857fea0f1c4dc1e6e4c7af8ea6 + public static Predicate notAfk = (player) -> !player.isAfk(); // Purpur private EntitySelector() {} - // Paper start + // Paper start - Affects Spawning API diff --git a/src/main/java/net/minecraft/world/entity/EntityType.java b/src/main/java/net/minecraft/world/entity/EntityType.java -index f772f7c4cd41ec52bea53d619b5b953971825df0..658c6d27b828e5a1d4538136a74fc49a69b471c0 100644 +index dc11683ee4d8a6b7a1c42bcae36dc6e8105cd994..a9e2a758669550530eb29475ba99fe42e520f6ae 100644 --- a/src/main/java/net/minecraft/world/entity/EntityType.java +++ b/src/main/java/net/minecraft/world/entity/EntityType.java @@ -313,13 +313,24 @@ public class EntityType implements FeatureElement, EntityTypeT @@ -2638,7 +2637,7 @@ index f772f7c4cd41ec52bea53d619b5b953971825df0..658c6d27b828e5a1d4538136a74fc49a public static ResourceLocation getKey(EntityType type) { return BuiltInRegistries.ENTITY_TYPE.getKey(type); } -@@ -535,6 +546,16 @@ public class EntityType implements FeatureElement, EntityTypeT +@@ -531,6 +542,16 @@ public class EntityType implements FeatureElement, EntityTypeT return this.category; } @@ -2655,7 +2654,7 @@ index f772f7c4cd41ec52bea53d619b5b953971825df0..658c6d27b828e5a1d4538136a74fc49a public String getDescriptionId() { if (this.descriptionId == null) { this.descriptionId = Util.makeDescriptionId("entity", BuiltInRegistries.ENTITY_TYPE.getKey(this)); -@@ -602,6 +623,12 @@ public class EntityType implements FeatureElement, EntityTypeT +@@ -598,6 +619,12 @@ public class EntityType implements FeatureElement, EntityTypeT entity.load(nbt); }, () -> { EntityType.LOGGER.warn("Skipping Entity with id {}", nbt.getString("id")); @@ -2669,13 +2668,13 @@ index f772f7c4cd41ec52bea53d619b5b953971825df0..658c6d27b828e5a1d4538136a74fc49a } diff --git a/src/main/java/net/minecraft/world/entity/ExperienceOrb.java b/src/main/java/net/minecraft/world/entity/ExperienceOrb.java -index b37e13c5de1a0a22a3713d04b203afc6c03ccbac..798cd8e0aae377122995155f4031d186ac4e35f7 100644 +index e814b2ef2577f032d6760de2f798d4fe18c67d0c..626a100bf1099a87a76eae72e2105c2ee21d34fe 100644 --- a/src/main/java/net/minecraft/world/entity/ExperienceOrb.java +++ b/src/main/java/net/minecraft/world/entity/ExperienceOrb.java @@ -313,7 +313,7 @@ public class ExperienceOrb extends Entity { public void playerTouch(Player player) { if (!this.level().isClientSide) { - if (player.takeXpDelay == 0 && new com.destroystokyo.paper.event.player.PlayerPickupExperienceEvent(((net.minecraft.server.level.ServerPlayer) player).getBukkitEntity(), (org.bukkit.entity.ExperienceOrb) this.getBukkitEntity()).callEvent()) { // Paper + if (player.takeXpDelay == 0 && new com.destroystokyo.paper.event.player.PlayerPickupExperienceEvent(((net.minecraft.server.level.ServerPlayer) player).getBukkitEntity(), (org.bukkit.entity.ExperienceOrb) this.getBukkitEntity()).callEvent()) { // Paper - PlayerPickupExperienceEvent - player.takeXpDelay = CraftEventFactory.callPlayerXpCooldownEvent(player, 2, PlayerExpCooldownChangeEvent.ChangeReason.PICKUP_ORB).getNewCooldown(); // CraftBukkit - entityhuman.takeXpDelay = 2; + player.takeXpDelay = CraftEventFactory.callPlayerXpCooldownEvent(player, this.level().purpurConfig.playerExpPickupDelay, PlayerExpCooldownChangeEvent.ChangeReason.PICKUP_ORB).getNewCooldown(); // CraftBukkit - entityhuman.takeXpDelay = 2; // Purpur player.take(this, 1); @@ -2753,10 +2752,10 @@ index 1bb8b6e91c44cd13411d96d749fa64835c75a267..b18cbe85330e26de6f6cbfcc3d51a741 protected ParticleOptions getInkParticle() { return ParticleTypes.GLOW_SQUID_INK; diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index a66e4586b7a0d4498ac7b9257fb93608981d6295..46d4e0b239e9c7bd45b052c84ddcdbe545582af3 100644 +index 4434cc08af3df591070d231471951ee87a6f99fa..645fba328cbc2cd28ee1b3968fcb315f92ed22ec 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -217,9 +217,9 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -216,9 +216,9 @@ public abstract class LivingEntity extends Entity implements Attackable { protected int deathScore; public float lastHurt; public boolean jumping; @@ -2769,7 +2768,7 @@ index a66e4586b7a0d4498ac7b9257fb93608981d6295..46d4e0b239e9c7bd45b052c84ddcdbe5 protected int lerpSteps; protected double lerpX; protected double lerpY; -@@ -252,6 +252,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -251,6 +251,7 @@ public abstract class LivingEntity extends Entity implements Attackable { protected boolean skipDropExperience; // CraftBukkit start public int expToDrop; @@ -2777,7 +2776,7 @@ index a66e4586b7a0d4498ac7b9257fb93608981d6295..46d4e0b239e9c7bd45b052c84ddcdbe5 public boolean forceDrops; public ArrayList drops = new ArrayList<>(); // Paper - Restore vanilla drops behavior public final org.bukkit.craftbukkit.attribute.CraftAttributeMap craftAttributes; -@@ -261,6 +262,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -260,6 +261,7 @@ public abstract class LivingEntity extends Entity implements Attackable { public org.bukkit.craftbukkit.entity.CraftLivingEntity getBukkitLivingEntity() { return (org.bukkit.craftbukkit.entity.CraftLivingEntity) super.getBukkitEntity(); } // Paper public boolean silentDeath = false; // Paper - mark entity as dying silently for cancellable death event public net.kyori.adventure.util.TriState frictionState = net.kyori.adventure.util.TriState.NOT_SET; // Paper - Friction API @@ -2785,7 +2784,7 @@ index a66e4586b7a0d4498ac7b9257fb93608981d6295..46d4e0b239e9c7bd45b052c84ddcdbe5 @Override public float getBukkitYaw() { -@@ -285,7 +287,8 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -284,7 +286,8 @@ public abstract class LivingEntity extends Entity implements Attackable { this.effectsDirty = true; this.useItem = ItemStack.EMPTY; this.lastClimbablePos = Optional.empty(); @@ -2795,7 +2794,7 @@ index a66e4586b7a0d4498ac7b9257fb93608981d6295..46d4e0b239e9c7bd45b052c84ddcdbe5 this.craftAttributes = new CraftAttributeMap(this.attributes); // CraftBukkit // CraftBukkit - setHealth(getMaxHealth()) inlined and simplified to skip the instanceof check for EntityPlayer, as getBukkitEntity() is not initialized in constructor this.entityData.set(LivingEntity.DATA_HEALTH_ID, (float) this.getAttribute(Attributes.MAX_HEALTH).getValue()); -@@ -301,6 +304,8 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -300,6 +303,8 @@ public abstract class LivingEntity extends Entity implements Attackable { this.brain = this.makeBrain(new Dynamic(dynamicopsnbt, (Tag) dynamicopsnbt.createMap((Map) ImmutableMap.of(dynamicopsnbt.createString("memories"), (Tag) dynamicopsnbt.emptyMap())))); } @@ -2804,7 +2803,7 @@ index a66e4586b7a0d4498ac7b9257fb93608981d6295..46d4e0b239e9c7bd45b052c84ddcdbe5 public Brain getBrain() { return this.brain; } -@@ -336,6 +341,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -335,6 +340,7 @@ public abstract class LivingEntity extends Entity implements Attackable { public static AttributeSupplier.Builder createLivingAttributes() { return AttributeSupplier.builder().add(Attributes.MAX_HEALTH).add(Attributes.KNOCKBACK_RESISTANCE).add(Attributes.MOVEMENT_SPEED).add(Attributes.ARMOR).add(Attributes.ARMOR_TOUGHNESS).add(Attributes.MAX_ABSORPTION); } @@ -2812,7 +2811,7 @@ index a66e4586b7a0d4498ac7b9257fb93608981d6295..46d4e0b239e9c7bd45b052c84ddcdbe5 @Override protected void checkFallDamage(double heightDifference, boolean onGround, BlockState state, BlockPos landedPosition) { -@@ -348,7 +354,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -347,7 +353,7 @@ public abstract class LivingEntity extends Entity implements Attackable { this.tryAddSoulSpeed(); } @@ -2821,7 +2820,7 @@ index a66e4586b7a0d4498ac7b9257fb93608981d6295..46d4e0b239e9c7bd45b052c84ddcdbe5 double d1 = this.getX(); double d2 = this.getY(); double d3 = this.getZ(); -@@ -363,7 +369,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -362,7 +368,7 @@ public abstract class LivingEntity extends Entity implements Attackable { d3 = (double) landedPosition.getZ() + 0.5D + d5 / d6 * 0.5D; } @@ -2830,7 +2829,7 @@ index a66e4586b7a0d4498ac7b9257fb93608981d6295..46d4e0b239e9c7bd45b052c84ddcdbe5 double d7 = Math.min((double) (0.2F + f / 15.0F), 2.5D); int i = (int) (150.0D * d7); -@@ -423,6 +429,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -422,6 +428,7 @@ public abstract class LivingEntity extends Entity implements Attackable { double d1 = this.level().getWorldBorder().getDamagePerBlock(); if (d1 > 0.0D) { @@ -2838,7 +2837,7 @@ index a66e4586b7a0d4498ac7b9257fb93608981d6295..46d4e0b239e9c7bd45b052c84ddcdbe5 this.hurt(this.damageSources().outOfBorder(), (float) Math.max(1, Mth.floor(-d0 * d1))); } } -@@ -434,7 +441,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -433,7 +440,7 @@ public abstract class LivingEntity extends Entity implements Attackable { if (flag1) { this.setAirSupply(this.decreaseAirSupply(this.getAirSupply())); @@ -2847,7 +2846,7 @@ index a66e4586b7a0d4498ac7b9257fb93608981d6295..46d4e0b239e9c7bd45b052c84ddcdbe5 this.setAirSupply(0); Vec3 vec3d = this.getDeltaMovement(); -@@ -446,7 +453,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -445,7 +452,7 @@ public abstract class LivingEntity extends Entity implements Attackable { this.level().addParticle(ParticleTypes.BUBBLE, this.getX() + d2, this.getY() + d3, this.getZ() + d4, vec3d.x, vec3d.y, vec3d.z); } @@ -2856,7 +2855,7 @@ index a66e4586b7a0d4498ac7b9257fb93608981d6295..46d4e0b239e9c7bd45b052c84ddcdbe5 } } -@@ -796,6 +803,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -795,6 +802,7 @@ public abstract class LivingEntity extends Entity implements Attackable { dataresult.resultOrPartial(logger::error).ifPresent((nbtbase) -> { nbt.put("Brain", nbtbase); }); @@ -2953,7 +2952,7 @@ index a66e4586b7a0d4498ac7b9257fb93608981d6295..46d4e0b239e9c7bd45b052c84ddcdbe5 org.bukkit.inventory.EquipmentSlot handSlot = (hand != null) ? org.bukkit.craftbukkit.CraftEquipmentSlot.getHand(hand) : null; EntityResurrectEvent event = new EntityResurrectEvent((org.bukkit.entity.LivingEntity) this.getBukkitEntity(), handSlot); event.setCancelled(itemstack == null); -@@ -1784,7 +1831,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -1785,7 +1832,7 @@ public abstract class LivingEntity extends Entity implements Attackable { boolean flag = false; if (this.dead && adversary instanceof WitherBoss) { // Paper @@ -2962,7 +2961,7 @@ index a66e4586b7a0d4498ac7b9257fb93608981d6295..46d4e0b239e9c7bd45b052c84ddcdbe5 BlockPos blockposition = this.blockPosition(); BlockState iblockdata = Blocks.WITHER_ROSE.defaultBlockState(); -@@ -1830,6 +1877,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -1831,6 +1878,7 @@ public abstract class LivingEntity extends Entity implements Attackable { this.dropEquipment(); // CraftBukkit - from below if (this.shouldDropLoot() && this.level().getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) { @@ -2970,7 +2969,7 @@ index a66e4586b7a0d4498ac7b9257fb93608981d6295..46d4e0b239e9c7bd45b052c84ddcdbe5 this.dropFromLootTable(source, flag); // Paper start final boolean prev = this.clearEquipmentSlots; -@@ -1838,6 +1886,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -1839,6 +1887,7 @@ public abstract class LivingEntity extends Entity implements Attackable { // Paper end this.dropCustomDeathLoot(source, i, flag); this.clearEquipmentSlots = prev; // Paper @@ -2978,7 +2977,7 @@ index a66e4586b7a0d4498ac7b9257fb93608981d6295..46d4e0b239e9c7bd45b052c84ddcdbe5 } // CraftBukkit start - Call death event // Paper start - call advancement triggers with correct entity equipment org.bukkit.event.entity.EntityDeathEvent deathEvent = CraftEventFactory.callEntityDeathEvent(this, this.drops, () -> { -@@ -2109,7 +2158,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -2110,7 +2159,7 @@ public abstract class LivingEntity extends Entity implements Attackable { MobEffectInstance mobeffect = this.getEffect(MobEffects.JUMP); float f2 = mobeffect == null ? 0.0F : (float) (mobeffect.getAmplifier() + 1); @@ -2987,7 +2986,7 @@ index a66e4586b7a0d4498ac7b9257fb93608981d6295..46d4e0b239e9c7bd45b052c84ddcdbe5 } } -@@ -2332,6 +2381,20 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -2333,6 +2382,20 @@ public abstract class LivingEntity extends Entity implements Attackable { } } @@ -3008,7 +3007,7 @@ index a66e4586b7a0d4498ac7b9257fb93608981d6295..46d4e0b239e9c7bd45b052c84ddcdbe5 if (f > 0 || !human) { if (human) { // PAIL: Be sure to drag all this code from the EntityHuman subclass each update. -@@ -2552,7 +2615,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -2553,7 +2616,7 @@ public abstract class LivingEntity extends Entity implements Attackable { @Override protected void onBelowWorld() { @@ -3017,7 +3016,7 @@ index a66e4586b7a0d4498ac7b9257fb93608981d6295..46d4e0b239e9c7bd45b052c84ddcdbe5 } protected void updateSwingTime() { -@@ -2746,7 +2809,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -2747,7 +2810,7 @@ public abstract class LivingEntity extends Entity implements Attackable { } protected long lastJumpTime = 0L; // Paper - Prevent excessive velocity through repeated crits @@ -3026,7 +3025,7 @@ index a66e4586b7a0d4498ac7b9257fb93608981d6295..46d4e0b239e9c7bd45b052c84ddcdbe5 Vec3 vec3d = this.getDeltaMovement(); // Paper start - Prevent excessive velocity through repeated crits long time = System.nanoTime(); -@@ -2898,6 +2961,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -2899,6 +2962,7 @@ public abstract class LivingEntity extends Entity implements Attackable { if (f3 > 0.0F) { this.playSound(this.getFallDamageSound((int) f3), 1.0F, 1.0F); @@ -3034,10 +3033,10 @@ index a66e4586b7a0d4498ac7b9257fb93608981d6295..46d4e0b239e9c7bd45b052c84ddcdbe5 this.hurt(this.damageSources().flyIntoWall(), f3); } } -@@ -3508,8 +3572,10 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -3509,8 +3573,10 @@ public abstract class LivingEntity extends Entity implements Attackable { this.pushEntities(); - // Paper start + // Paper start - Add EntityMoveEvent - if (((ServerLevel) this.level()).hasEntityMoveEvent && !(this instanceof net.minecraft.world.entity.player.Player)) { - if (this.xo != this.getX() || this.yo != this.getY() || this.zo != this.getZ() || this.yRotO != this.getYRot() || this.xRotO != this.getXRot()) { + // Purpur start @@ -3045,9 +3044,9 @@ index a66e4586b7a0d4498ac7b9257fb93608981d6295..46d4e0b239e9c7bd45b052c84ddcdbe5 + if (((ServerLevel) this.level()).hasEntityMoveEvent && !(this instanceof net.minecraft.world.entity.player.Player)) { + // Purpur end Location from = new Location(this.level().getWorld(), this.xo, this.yo, this.zo, this.yRotO, this.xRotO); - Location to = new Location (this.level().getWorld(), this.getX(), this.getY(), this.getZ(), this.getYRot(), this.getXRot()); + Location to = new Location(this.level().getWorld(), this.getX(), this.getY(), this.getZ(), this.getYRot(), this.getXRot()); io.papermc.paper.event.entity.EntityMoveEvent event = new io.papermc.paper.event.entity.EntityMoveEvent(this.getBukkitLivingEntity(), from, to.clone()); -@@ -3519,12 +3585,48 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -3520,12 +3586,48 @@ public abstract class LivingEntity extends Entity implements Attackable { this.absMoveTo(event.getTo().getX(), event.getTo().getY(), event.getTo().getZ(), event.getTo().getYaw(), event.getTo().getPitch()); } } @@ -3067,7 +3066,7 @@ index a66e4586b7a0d4498ac7b9257fb93608981d6295..46d4e0b239e9c7bd45b052c84ddcdbe5 + } + // Purpur end } - // Paper end + // Paper end - Add EntityMoveEvent if (!this.level().isClientSide && this.isSensitiveToWater() && this.isInWaterRainOrBubble()) { this.hurt(this.damageSources().drown(), 1.0F); } @@ -3096,7 +3095,7 @@ index a66e4586b7a0d4498ac7b9257fb93608981d6295..46d4e0b239e9c7bd45b052c84ddcdbe5 } public boolean isSensitiveToWater() { -@@ -3545,7 +3647,16 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -3546,7 +3648,16 @@ public abstract class LivingEntity extends Entity implements Attackable { int j = i / 10; if (j % 2 == 0) { @@ -3115,7 +3114,7 @@ index a66e4586b7a0d4498ac7b9257fb93608981d6295..46d4e0b239e9c7bd45b052c84ddcdbe5 }); } diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java -index 2dc30295126d79913a3da0f4d4c466554e82a2b4..47e956a48c3d2ff6baea322b3a27c6f8af0378ab 100644 +index b760e390e0a0c734d0dadca6e82cc4ff65dc76fe..b171c53efae9cc39bc68164fbe0f90afb47769be 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java @@ -66,6 +66,7 @@ import net.minecraft.world.item.ProjectileWeaponItem; @@ -3239,7 +3238,7 @@ index 2dc30295126d79913a3da0f4d4c466554e82a2b4..47e956a48c3d2ff6baea322b3a27c6f8 } else if (this.getLeashHolder() == player) { + if (hand == InteractionHand.OFF_HAND && (level().purpurConfig.villagerCanBeLeashed || level().purpurConfig.wanderingTraderCanBeLeashed) && this instanceof net.minecraft.world.entity.npc.AbstractVillager) return InteractionResult.CONSUME; // Purpur // CraftBukkit start - fire PlayerUnleashEntityEvent - // Paper start - drop leash variable + // Paper start - Expand EntityUnleashEvent org.bukkit.event.player.PlayerUnleashEntityEvent event = CraftEventFactory.callPlayerUnleashEntityEvent(this, player, hand, !player.getAbilities().instabuild); @@ -1366,7 +1402,7 @@ public abstract class Mob extends LivingEntity implements Targeting { protected void onOffspringSpawnedFromEgg(Player player, Mob child) {} @@ -3359,7 +3358,7 @@ index 2ee48ac3b665db2b02bcb1a30ec972d43a3725b0..59e8f5431ce5026209e1428b5fa5b548 } // Paper end - custom shear drops diff --git a/src/main/java/net/minecraft/world/entity/ai/attributes/AttributeMap.java b/src/main/java/net/minecraft/world/entity/ai/attributes/AttributeMap.java -index c5cdeb3a86453106c092c6f108da23ef54cb8123..635037fb2a44a422b42d7c3c27cc7638c7715635 100644 +index 0c804e597b08eb1fce53a1161aad3405b63c8058..7394c2d99499faaa4489a7eee1dd8b73ec08668d 100644 --- a/src/main/java/net/minecraft/world/entity/ai/attributes/AttributeMap.java +++ b/src/main/java/net/minecraft/world/entity/ai/attributes/AttributeMap.java @@ -27,14 +27,22 @@ public class AttributeMap { @@ -3853,7 +3852,7 @@ index 53b0519bbc5d52490040eaf0fe449648f021d0c2..b323157327203f5614d0051284b6bb24 if (list != null) { list.trimToSize(); diff --git a/src/main/java/net/minecraft/world/entity/ai/targeting/TargetingConditions.java b/src/main/java/net/minecraft/world/entity/ai/targeting/TargetingConditions.java -index 09bc539502dada5dfdd95e50141e587c1c3dee4c..bac374f348363cd0f8b981dc444d419b2f0b0022 100644 +index 29963fbccdd9adadcf46970473ff1fccc68572f0..903063332195af1bf1ef88f9b5c54b807447398f 100644 --- a/src/main/java/net/minecraft/world/entity/ai/targeting/TargetingConditions.java +++ b/src/main/java/net/minecraft/world/entity/ai/targeting/TargetingConditions.java @@ -64,6 +64,10 @@ public class TargetingConditions { @@ -3868,7 +3867,7 @@ index 09bc539502dada5dfdd95e50141e587c1c3dee4c..bac374f348363cd0f8b981dc444d419b if (baseEntity == null) { if (this.isCombat && (!targetEntity.canBeSeenAsEnemy() || targetEntity.level().getDifficulty() == Difficulty.PEACEFUL)) { diff --git a/src/main/java/net/minecraft/world/entity/ambient/Bat.java b/src/main/java/net/minecraft/world/entity/ambient/Bat.java -index 685823c4c6f175460fdeb84053ea115c24a67909..ed5c062edc767c186da377ddfc7a7a79a6cbdb13 100644 +index 4f7e6f5c7b38ad19beeb5010b3a385c2efc5ef4a..51a8c84f13268d97b1d052db1efe464dad395c6f 100644 --- a/src/main/java/net/minecraft/world/entity/ambient/Bat.java +++ b/src/main/java/net/minecraft/world/entity/ambient/Bat.java @@ -19,6 +19,7 @@ import net.minecraft.world.entity.EntityDimensions; @@ -4107,7 +4106,7 @@ index 081d1e38b7b1f286e138b0981aaa760e58761215..a64ab2058d4e3439bf6ee418f3192b83 entityanimal.resetLove(); worldserver.broadcastEntityEvent(this, (byte) 18); diff --git a/src/main/java/net/minecraft/world/entity/animal/Bee.java b/src/main/java/net/minecraft/world/entity/animal/Bee.java -index a87a34b0c4c8e5d0cf079025c230b1434c919b54..bdb78cc701543cfe91a6bafd1786fe2ea0bf1ddc 100644 +index f9521a6e115f0c975a7885b024c99eae300b63bf..997ab942be9f742804041b07d607e7dd6473ba96 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Bee.java +++ b/src/main/java/net/minecraft/world/entity/animal/Bee.java @@ -43,6 +43,7 @@ import net.minecraft.world.entity.EntityType; @@ -4123,7 +4122,7 @@ index a87a34b0c4c8e5d0cf079025c230b1434c919b54..bdb78cc701543cfe91a6bafd1786fe2e super(type, world); this.remainingCooldownBeforeLocatingNewFlower = Mth.nextInt(this.random, 20, 60); + final org.purpurmc.purpur.controller.FlyingMoveControllerWASD flyingController = new org.purpurmc.purpur.controller.FlyingMoveControllerWASD(this, 0.25F, 1.0F, false); // Purpur - // Paper start - apply gravity to bees when they get stuck in the void, fixes MC-167279 + // Paper start - Fix MC-167279 class BeeFlyingMoveControl extends FlyingMoveControl { public BeeFlyingMoveControl(final Mob entity, final int maxPitchChange, final boolean noGravity) { @@ -155,22 +157,69 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { @@ -4150,7 +4149,7 @@ index a87a34b0c4c8e5d0cf079025c230b1434c919b54..bdb78cc701543cfe91a6bafd1786fe2e + // Purpur end } this.moveControl = new BeeFlyingMoveControl(this, 20, true); - // Paper end + // Paper end - Fix MC-167279 this.lookControl = new Bee.BeeLookControl(this); this.setPathfindingMalus(BlockPathTypes.DANGER_FIRE, -1.0F); - this.setPathfindingMalus(BlockPathTypes.WATER, -1.0F); @@ -5085,7 +5084,7 @@ index 287e52dc844c2a64dac74dad117b775f46631157..c763fae0ac4e914305b3d3754aee3d8d if (iblockdata.is(Blocks.SWEET_BERRY_BUSH)) { diff --git a/src/main/java/net/minecraft/world/entity/animal/IronGolem.java b/src/main/java/net/minecraft/world/entity/animal/IronGolem.java -index f383928fc5b331ddf128bdcb6a23010d8fe088d3..64aba511e615983988cdb6a0fd45b7d9d4f2f16d 100644 +index 6cfe0d6c46caa122db107c607d27a2bdcd82f7a8..442eb602f5c82550a87e218e2013171b718abd62 100644 --- a/src/main/java/net/minecraft/world/entity/animal/IronGolem.java +++ b/src/main/java/net/minecraft/world/entity/animal/IronGolem.java @@ -60,14 +60,59 @@ public class IronGolem extends AbstractGolem implements NeutralMob { @@ -5357,7 +5356,7 @@ index 4300fab61765dd224fab084d118aae7294fc9de6..3c5f25300d1c7800144a459cc8bf5983 } diff --git a/src/main/java/net/minecraft/world/entity/animal/Panda.java b/src/main/java/net/minecraft/world/entity/animal/Panda.java -index 387aa050235c944818617e8896d0d5f1e7e4cecb..4225b6ea965c180202ccaf8328dd08ffb3132c22 100644 +index be554dbaa9900207753e4f67f0ba402333e21338..588048ad83486adc7e798fba6dbbfe9f4926d7b0 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Panda.java +++ b/src/main/java/net/minecraft/world/entity/animal/Panda.java @@ -114,6 +114,53 @@ public class Panda extends Animal { @@ -5491,7 +5490,7 @@ index 387aa050235c944818617e8896d0d5f1e7e4cecb..4225b6ea965c180202ccaf8328dd08ff } } diff --git a/src/main/java/net/minecraft/world/entity/animal/Parrot.java b/src/main/java/net/minecraft/world/entity/animal/Parrot.java -index 4c34edc55fa0e136ccf49a3aef001f413274dfac..351b580611bf4b92d7addcc402c3276f7cb4e639 100644 +index f3f48225c2a1e4bd3d0091d1b4b7e4e150850ed2..670cf5a74554b0b420706db2fbce3a8e5dca147b 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Parrot.java +++ b/src/main/java/net/minecraft/world/entity/animal/Parrot.java @@ -131,12 +131,88 @@ public class Parrot extends ShoulderRidingEntity implements VariantHolder type, Level world) { super(type, world); -- //this.random.setSeed((long)this.getId()); // Paper - we set the random to shared, do not clobber the seed -+ if (!world.purpurConfig.entitySharedRandom) this.random.setSeed((long) this.getId()); // Paper - we set the random to shared, do not clobber the seed // Purpur +- //this.random.setSeed((long)this.getId()); // Paper - Share random for entities to make them more random ++ if (!world.purpurConfig.entitySharedRandom) this.random.setSeed((long) this.getId()); // Paper - Share random for entities to make them more random // Purpur this.tentacleSpeed = 1.0F / (this.random.nextFloat() + 1.0F) * 0.2F; } @@ -6497,7 +6496,7 @@ index b05b560b7570e97bc234b75f26233909fcf575b3..87b6f6b10ba6e3d9c6a42298a2019a52 return "entity.minecraft.tropical_fish.predefined." + variant; } diff --git a/src/main/java/net/minecraft/world/entity/animal/Turtle.java b/src/main/java/net/minecraft/world/entity/animal/Turtle.java -index d8056421249c8e75e96a55ec07dce84d2bba9c5c..8f891e9fd9fc0bf4a9c022a3415b371cea9b92fa 100644 +index d595f1590619b24d460fc2c10a5412844f62cba0..f1f5ec98f1c85aadf8202c882c8758b1039801ef 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Turtle.java +++ b/src/main/java/net/minecraft/world/entity/animal/Turtle.java @@ -86,6 +86,43 @@ public class Turtle extends Animal { @@ -7303,7 +7302,7 @@ index d75178611f2c74af45e39c9e37770e2c56773b1d..af81fa69336d21408de3703def803af9 brain.setMemory(MemoryModuleType.RAM_TARGET, entity.position()); brain.eraseMemory(MemoryModuleType.RAM_COOLDOWN_TICKS); diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/AbstractHorse.java b/src/main/java/net/minecraft/world/entity/animal/horse/AbstractHorse.java -index d9539f5275c4cb63910ba79aa522d9569ad35a89..97684d00c79ab2e5712a3d44b7690b1bca15b4a7 100644 +index 815eb15086976b8f9e03bf8182d9ed50aec14720..3170f9044f18b8c609433ddbd3ef9ac330644a0f 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/AbstractHorse.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/AbstractHorse.java @@ -149,12 +149,60 @@ public abstract class AbstractHorse extends Animal implements ContainerListener, @@ -8036,7 +8035,7 @@ index c99ab157e43fc990549fc06f5b6fb1e227014fde..5f1a643ce6fe4e3aa3026be8b2c961ff this.onDestroyedBy(source); diff --git a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java -index ce2d3387f5a812f6e074e0f46e2fd61e474f4734..e231cad94d01a0e58e12649fedf5f54c2057c5e7 100644 +index a86ae40b945b1ecdf42a69d753d0412f39ee3001..54f89e785c2bf24457311aaba01d459c9c53e32c 100644 --- a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java +++ b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java @@ -107,6 +107,7 @@ public class EnderDragon extends Mob implements Enemy { @@ -8500,18 +8499,18 @@ index ac9eaeaf7df1e84ee588f371628c0a10784d50bc..0003af3edd5cbef6d871ae9b8631a4b5 } diff --git a/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java b/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java -index a9c1f99ba2461333bd154ac16e812031f234f7a6..526943db39a61c6b281d44a1159ebbd8452b5798 100644 +index 94a30a0c1266bf919d1dc4ca2b19489edd54a7fa..0f77af39df048682473950291bed5827ede0e1a7 100644 --- a/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java +++ b/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java @@ -99,10 +99,12 @@ public class ArmorStand extends LivingEntity { private boolean noTickPoseDirty = false; private boolean noTickEquipmentDirty = false; - // Paper end + // Paper end - Allow ArmorStands not to tick + public boolean canMovementTick = true; // Purpur public ArmorStand(EntityType type, Level world) { super(type, world); - if (world != null) this.canTick = world.paperConfig().entities.armorStands.tick; // Paper - armour stand ticking + if (world != null) this.canTick = world.paperConfig().entities.armorStands.tick; // Paper - Allow ArmorStands not to tick + if (world != null) this.canMovementTick = world.purpurConfig.armorstandMovement; // Purpur this.handItems = NonNullList.withSize(2, ItemStack.EMPTY); this.armorItems = NonNullList.withSize(4, ItemStack.EMPTY); @@ -8537,8 +8536,8 @@ index a9c1f99ba2461333bd154ac16e812031f234f7a6..526943db39a61c6b281d44a1159ebbd8 @Override public void tick() { -+ maxUpStep = level().purpurConfig.armorstandStepHeight; - // Paper start ++ maxUpStep = level().purpurConfig.armorstandStepHeight; // Purpur + // Paper start - Allow ArmorStands not to tick if (!this.canTick) { if (this.noTickPoseDirty) { @@ -1004,4 +1008,18 @@ public class ArmorStand extends LivingEntity { @@ -8608,12 +8607,12 @@ index d9016807bc21c38a5c38170e1335c79b39355bcb..62cdc36a21c0203ed98d2946a1efdf54 } 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 3ff5c1b932bb28203aa5b48393ff41724c93618a..9dca61d28bccc0dd24e763f7670c88754f68b933 100644 +index a0f30f6dffac70fc7702f8f35addaa28e53cad80..2c19d6687e1554373e4c7f43a8fec8e770942f50 100644 --- a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java +++ b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java @@ -60,6 +60,12 @@ public class ItemEntity extends Entity implements TraceableEntity { - public boolean canMobPickup = true; // Paper - private int despawnRate = -1; // Paper + public boolean canMobPickup = true; // Paper - Item#canEntityPickup + private int despawnRate = -1; // Paper - Alternative item-despawn-rate public net.kyori.adventure.util.TriState frictionState = net.kyori.adventure.util.TriState.NOT_SET; // Paper - Friction API + // Purpur start + public boolean immuneToCactus = false; @@ -8645,7 +8644,7 @@ index 3ff5c1b932bb28203aa5b48393ff41724c93618a..9dca61d28bccc0dd24e763f7670c8875 @@ -595,6 +610,12 @@ public class ItemEntity extends Entity implements TraceableEntity { public void setItem(ItemStack stack) { this.getEntityData().set(ItemEntity.DATA_ITEM, stack); - this.despawnRate = this.level().paperConfig().entities.spawning.altItemDespawnRate.enabled ? this.level().paperConfig().entities.spawning.altItemDespawnRate.items.getOrDefault(stack.getItem(), this.level().spigotConfig.itemDespawnRate) : this.level().spigotConfig.itemDespawnRate; // Paper + this.despawnRate = this.level().paperConfig().entities.spawning.altItemDespawnRate.enabled ? this.level().paperConfig().entities.spawning.altItemDespawnRate.items.getOrDefault(stack.getItem(), this.level().spigotConfig.itemDespawnRate) : this.level().spigotConfig.itemDespawnRate; // Paper - Alternative item-despawn-rate + // Purpur start + if (level().purpurConfig.itemImmuneToCactus.contains(stack.getItem())) immuneToCactus = true; + if (level().purpurConfig.itemImmuneToExplosion.contains(stack.getItem())) immuneToExplosion = true; @@ -8656,13 +8655,13 @@ index 3ff5c1b932bb28203aa5b48393ff41724c93618a..9dca61d28bccc0dd24e763f7670c8875 @Override diff --git a/src/main/java/net/minecraft/world/entity/item/PrimedTnt.java b/src/main/java/net/minecraft/world/entity/item/PrimedTnt.java -index 2274541c9386e4f1bbae489a1f123d502ccbf9cc..9b21aa209b549356b88321c7582f682e85cfe0d6 100644 +index cd7b955754b809826048b80723e2e9055b373a4a..b929bef749397797203eb6fb7a7e817d90ec310c 100644 --- a/src/main/java/net/minecraft/world/entity/item/PrimedTnt.java +++ b/src/main/java/net/minecraft/world/entity/item/PrimedTnt.java -@@ -207,4 +207,29 @@ public class PrimedTnt extends Entity implements TraceableEntity { +@@ -199,4 +199,29 @@ public class PrimedTnt extends Entity implements TraceableEntity { return !level().paperConfig().fixes.preventTntFromMovingInWater && super.isPushedByFluid(); } - // Paper end + // Paper end - Option to prevent TNT from moving in water + // Purpur start - Shears can defuse TNT + @Override + public net.minecraft.world.InteractionResult interact(net.minecraft.world.entity.player.Player player, net.minecraft.world.InteractionHand hand) { @@ -8690,7 +8689,7 @@ index 2274541c9386e4f1bbae489a1f123d502ccbf9cc..9b21aa209b549356b88321c7582f682e + // Purpur end - Shears can defuse TNT } diff --git a/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java b/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java -index 8527388f7cb5fce43ff485c903d6b78c10c4259e..85f064b7d0ddc88a7381f4b0d17decbdb7ec0f9b 100644 +index 586e3e92ccc275446df6dbbff9bf010a37a9aa8f..3a4cd10a3614cd5e29c49ecde490d5e564d9e568 100644 --- a/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java +++ b/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java @@ -66,16 +66,19 @@ public abstract class AbstractSkeleton extends Monster implements RangedAttackMo @@ -8923,7 +8922,7 @@ index 70d25bb45ad603095a1f5812cc396dfc5f16a1e1..c9bd400473166999479f5eef1edad529 public boolean doHurtTarget(Entity target) { if (super.doHurtTarget(target)) { diff --git a/src/main/java/net/minecraft/world/entity/monster/Creeper.java b/src/main/java/net/minecraft/world/entity/monster/Creeper.java -index 52eb3f6a73fa99d12d5fc75bab03e47a605c653a..64f6b5f44db4fd90e789032e3833da60cfcfbef1 100644 +index 6a91960f93e624a4b975c1cf76698eb45ceda838..8bbc11845d190b33296f61c503f54209d218bc85 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Creeper.java +++ b/src/main/java/net/minecraft/world/entity/monster/Creeper.java @@ -59,21 +59,99 @@ public class Creeper extends Monster implements PowerableMob { @@ -9100,9 +9099,9 @@ index 52eb3f6a73fa99d12d5fc75bab03e47a605c653a..64f6b5f44db4fd90e789032e3833da60 + if (!event.isIgnited()) setSwellDir(-1); // Purpur } } - // Paper end + // Paper end - CreeperIgniteEvent diff --git a/src/main/java/net/minecraft/world/entity/monster/Drowned.java b/src/main/java/net/minecraft/world/entity/monster/Drowned.java -index 485d14d71fb26e6e0d00a43da040bf63d696b66a..034bb2d1292dde6276885c3ea71d886c3894311c 100644 +index 01897af1e6253b987734a24c052daf2ce1314092..7600e747d91ae888eb801cfafcb09bffb76c8e62 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Drowned.java +++ b/src/main/java/net/minecraft/world/entity/monster/Drowned.java @@ -29,6 +29,7 @@ import net.minecraft.world.entity.ai.goal.MoveToBlockGoal; @@ -9180,9 +9179,9 @@ index 485d14d71fb26e6e0d00a43da040bf63d696b66a..034bb2d1292dde6276885c3ea71d886c this.goalSelector.addGoal(7, new RandomStrollGoal(this, 1.0D)); this.targetSelector.addGoal(1, (new HurtByTargetGoal(this, new Class[]{Drowned.class})).setAlertOthers(ZombifiedPiglin.class)); this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, 10, true, false, this::okTarget)); -- if (this.level().spigotConfig.zombieAggressiveTowardsVillager) this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractVillager.class, false)); // Paper +- if (this.level().spigotConfig.zombieAggressiveTowardsVillager) this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractVillager.class, false)); // Paper - Check drowned for villager aggression config + // Purpur start -+ if (this.level().spigotConfig.zombieAggressiveTowardsVillager) this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractVillager.class, false) { // Spigot ++ if (this.level().spigotConfig.zombieAggressiveTowardsVillager) this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractVillager.class, false) { // Paper - Check drowned for villager aggression config + @Override + public boolean canUse() { + return (level().purpurConfig.zombieAggressiveTowardsVillagerWhenLagging || !level().getServer().server.isLagging()) && super.canUse(); @@ -9244,7 +9243,7 @@ index 485d14d71fb26e6e0d00a43da040bf63d696b66a..034bb2d1292dde6276885c3ea71d886c } diff --git a/src/main/java/net/minecraft/world/entity/monster/ElderGuardian.java b/src/main/java/net/minecraft/world/entity/monster/ElderGuardian.java -index 6d4810626980ce46e02042a5660f615c58d0d5fd..93e51be1ad77a5ae57e4bd92ba1b4535d9ea37d8 100644 +index 91ff663b2260d1cdd1388c93068e4cd9d0331aea..cb189457305916f509d624beb303feff35d0c358 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ElderGuardian.java +++ b/src/main/java/net/minecraft/world/entity/monster/ElderGuardian.java @@ -36,6 +36,33 @@ public class ElderGuardian extends Guardian { @@ -9282,7 +9281,7 @@ index 6d4810626980ce46e02042a5660f615c58d0d5fd..93e51be1ad77a5ae57e4bd92ba1b4535 return Guardian.createAttributes().add(Attributes.MOVEMENT_SPEED, 0.30000001192092896D).add(Attributes.ATTACK_DAMAGE, 8.0D).add(Attributes.MAX_HEALTH, 80.0D); } diff --git a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -index 9c52161d8d4049cbcd6433f7dff395e34f31c0d2..c7de52a84ee07435ce6ff5bd1e2936991c980d35 100644 +index 9898e05682c2d47953c95e355d51c701a3b0cc1b..d945b0d74a4f87e7eea6cc8625c0da47ac53dfe7 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java @@ -95,12 +95,40 @@ public class EnderMan extends Monster implements NeutralMob { @@ -9340,7 +9339,7 @@ index 9c52161d8d4049cbcd6433f7dff395e34f31c0d2..c7de52a84ee07435ce6ff5bd1e293699 } @@ -247,7 +276,7 @@ public class EnderMan extends Monster implements NeutralMob { - // Paper end + // Paper end - EndermanAttackPlayerEvent ItemStack itemstack = (ItemStack) player.getInventory().armor.get(3); - if (itemstack.is(Blocks.CARVED_PUMPKIN.asItem())) { @@ -9362,7 +9361,7 @@ index 9c52161d8d4049cbcd6433f7dff395e34f31c0d2..c7de52a84ee07435ce6ff5bd1e293699 + if ((getRider() == null || !this.isControllable()) && this.level().isDay() && this.tickCount >= this.targetChangeTime + 600) { // Purpur - no random teleporting float f = this.getLightLevelDependentMagicValue(); - if (f > 0.5F && this.level().canSeeSky(this.blockPosition()) && this.random.nextFloat() * 30.0F < (f - 0.4F) * 2.0F && this.tryEscape(com.destroystokyo.paper.event.entity.EndermanEscapeEvent.Reason.RUNAWAY)) { // Paper + if (f > 0.5F && this.level().canSeeSky(this.blockPosition()) && this.random.nextFloat() * 30.0F < (f - 0.4F) * 2.0F && this.tryEscape(com.destroystokyo.paper.event.entity.EndermanEscapeEvent.Reason.RUNAWAY)) { // Paper - EndermanEscapeEvent @@ -415,6 +444,8 @@ public class EnderMan extends Monster implements NeutralMob { public boolean hurt(DamageSource source, float amount) { if (this.isInvulnerableTo(source)) { @@ -9377,7 +9376,7 @@ index 9c52161d8d4049cbcd6433f7dff395e34f31c0d2..c7de52a84ee07435ce6ff5bd1e293699 flag1 = flag && this.hurtWithCleanWater(source, (ThrownPotion) source.getDirectEntity(), amount); + if (!flag1 && this.level().purpurConfig.endermanIgnoreProjectiles) return super.hurt(source, amount); // Purpur - if (this.tryEscape(com.destroystokyo.paper.event.entity.EndermanEscapeEvent.Reason.INDIRECT)) { // Paper start + if (this.tryEscape(com.destroystokyo.paper.event.entity.EndermanEscapeEvent.Reason.INDIRECT)) { // Paper - EndermanEscapeEvent for (int i = 0; i < 64; ++i) { if (this.teleport()) { @@ -475,7 +507,7 @@ public class EnderMan extends Monster implements NeutralMob { @@ -9994,7 +9993,7 @@ index 72b8290bebe8ed9bc3c464b30cfe5d2d664310f5..06a5106a94a44c1d21537410d801cdd9 @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/Illusioner.java b/src/main/java/net/minecraft/world/entity/monster/Illusioner.java -index 63fce7e3d9f59f36e29bc827a46396d73143bb8b..f9cddf46d1dbcabc738842ba039daa76bb6f3eb5 100644 +index fb84b35e34063075e69e00e430bc00e7c3b9d62c..a8b3431c67442c5440b063426a1adc423f5c0658 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Illusioner.java +++ b/src/main/java/net/minecraft/world/entity/monster/Illusioner.java @@ -59,10 +59,45 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { @@ -10148,7 +10147,7 @@ index fbca4d6bc84e8be359b989ef089469838f896910..1be6f724fa6447fe733c8374ac295c6d return false; } else { diff --git a/src/main/java/net/minecraft/world/entity/monster/Phantom.java b/src/main/java/net/minecraft/world/entity/monster/Phantom.java -index bb52085d706293fa86df16a1b8e76d17a90ea9e9..355445b7f8972cb789d33f59d03c382f238c294d 100644 +index 187037c43ebb5b245ffa4b50163d443490668744..b70065edff5da1f564aae14b3032b2498d2bb998 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Phantom.java +++ b/src/main/java/net/minecraft/world/entity/monster/Phantom.java @@ -50,6 +50,8 @@ public class Phantom extends FlyingMob implements Enemy { @@ -10356,10 +10355,10 @@ index bb52085d706293fa86df16a1b8e76d17a90ea9e9..355445b7f8972cb789d33f59d03c382f // Paper end } -@@ -263,8 +379,14 @@ public class Phantom extends FlyingMob implements Enemy { +@@ -262,8 +378,14 @@ public class Phantom extends FlyingMob implements Enemy { + return spawningEntity; } public void setSpawningEntity(java.util.UUID entity) { this.spawningEntity = entity; } - - private boolean shouldBurnInDay = true; - public boolean shouldBurnInDay() { return shouldBurnInDay; } + // private boolean shouldBurnInDay = true; // Purpur - moved to LivingEntity - keep methods for ABI compatibility @@ -10373,7 +10372,7 @@ index bb52085d706293fa86df16a1b8e76d17a90ea9e9..355445b7f8972cb789d33f59d03c382f public void setShouldBurnInDay(boolean shouldBurnInDay) { this.shouldBurnInDay = shouldBurnInDay; } // Paper end private static enum AttackPhase { -@@ -274,7 +396,125 @@ public class Phantom extends FlyingMob implements Enemy { +@@ -273,7 +395,125 @@ public class Phantom extends FlyingMob implements Enemy { private AttackPhase() {} } @@ -10500,7 +10499,7 @@ index bb52085d706293fa86df16a1b8e76d17a90ea9e9..355445b7f8972cb789d33f59d03c382f private float speed = 0.1F; -@@ -282,8 +522,19 @@ public class Phantom extends FlyingMob implements Enemy { +@@ -281,8 +521,19 @@ public class Phantom extends FlyingMob implements Enemy { super(entity); } @@ -10521,7 +10520,7 @@ index bb52085d706293fa86df16a1b8e76d17a90ea9e9..355445b7f8972cb789d33f59d03c382f if (Phantom.this.horizontalCollision) { Phantom.this.setYRot(Phantom.this.getYRot() + 180.0F); this.speed = 0.1F; -@@ -329,14 +580,20 @@ public class Phantom extends FlyingMob implements Enemy { +@@ -328,14 +579,20 @@ public class Phantom extends FlyingMob implements Enemy { } } @@ -10544,7 +10543,7 @@ index bb52085d706293fa86df16a1b8e76d17a90ea9e9..355445b7f8972cb789d33f59d03c382f } private class PhantomBodyRotationControl extends BodyRotationControl { -@@ -423,6 +680,12 @@ public class Phantom extends FlyingMob implements Enemy { +@@ -422,6 +679,12 @@ public class Phantom extends FlyingMob implements Enemy { return false; } else if (!entityliving.isAlive()) { return false; @@ -10557,7 +10556,7 @@ index bb52085d706293fa86df16a1b8e76d17a90ea9e9..355445b7f8972cb789d33f59d03c382f } else { if (entityliving instanceof Player) { Player entityhuman = (Player) entityliving; -@@ -568,6 +831,7 @@ public class Phantom extends FlyingMob implements Enemy { +@@ -567,6 +830,7 @@ public class Phantom extends FlyingMob implements Enemy { this.nextScanTick = reducedTickDelay(60); List list = Phantom.this.level().getNearbyPlayers(this.attackTargeting, Phantom.this, Phantom.this.getBoundingBox().inflate(16.0D, 64.0D, 16.0D)); @@ -10620,7 +10619,7 @@ index cec545c3baa6599d47b9cf1a4b97de8771062a22..06d52d8b61abc4dbbdc953bfed2e688b this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractVillager.class, false)); diff --git a/src/main/java/net/minecraft/world/entity/monster/Ravager.java b/src/main/java/net/minecraft/world/entity/monster/Ravager.java -index 0c11d9bef8f0129c541e30ad057612e881703b24..c9c21c87e3bd1c404fbef6768761bcb5d97d98b9 100644 +index 151acc43c96b4545ce92d3d559d8e1591874b4b5..2d834e57253f666f04f8e0b47c8b8a45458c0a75 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Ravager.java +++ b/src/main/java/net/minecraft/world/entity/monster/Ravager.java @@ -71,14 +71,54 @@ public class Ravager extends Raider { @@ -10706,7 +10705,7 @@ index 0c11d9bef8f0129c541e30ad057612e881703b24..c9c21c87e3bd1c404fbef6768761bcb5 if (!CraftEventFactory.callEntityChangeBlockEvent(this, blockposition, iblockdata.getFluidState().createLegacyBlock())) { // Paper - fix wrong block state continue; diff --git a/src/main/java/net/minecraft/world/entity/monster/Shulker.java b/src/main/java/net/minecraft/world/entity/monster/Shulker.java -index b73dac8f68041f8a2e0752d70cc9d08b5cfd1cde..8a52c1ad5e2872e4b484eebc834fa42fd1930481 100644 +index f3c2a2ffb74daa89a516db4c188ce675c79932bf..ab21a44905a4154013cd65acdecbf55b741da086 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Shulker.java +++ b/src/main/java/net/minecraft/world/entity/monster/Shulker.java @@ -22,6 +22,8 @@ import net.minecraft.tags.DamageTypeTags; @@ -10814,7 +10813,7 @@ index b73dac8f68041f8a2e0752d70cc9d08b5cfd1cde..8a52c1ad5e2872e4b484eebc834fa42f if (entityshulker != null) { entityshulker.setVariant(this.getVariant()); -@@ -586,7 +646,7 @@ public class Shulker extends AbstractGolem implements VariantHolder getVariant() { @@ -10823,7 +10822,7 @@ index b73dac8f68041f8a2e0752d70cc9d08b5cfd1cde..8a52c1ad5e2872e4b484eebc834fa42f } @Nullable -@@ -596,7 +656,7 @@ public class Shulker extends AbstractGolem implements VariantHolder type, Level world) { super(type, world); - this.breakDoorGoal = new BreakDoorGoal(this, com.google.common.base.Predicates.in(world.paperConfig().entities.behavior.doorBreakingDifficulty.getOrDefault(type, world.paperConfig().entities.behavior.doorBreakingDifficulty.get(EntityType.ZOMBIE)))); // Paper + this.breakDoorGoal = new BreakDoorGoal(this, com.google.common.base.Predicates.in(world.paperConfig().entities.behavior.doorBreakingDifficulty.getOrDefault(type, world.paperConfig().entities.behavior.doorBreakingDifficulty.get(EntityType.ZOMBIE)))); // Paper - Configurable door breaking difficulty + this.setShouldBurnInDay(true); // Purpur } @@ -11816,7 +11815,7 @@ index ab41bd0f1810207a83ed506d6d1aa0289508d09a..60e2a8d83a89f09c2f54bdc4be626c3c @Override protected void registerGoals() { + this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - if (this.level().paperConfig().entities.behavior.zombiesTargetTurtleEggs) this.goalSelector.addGoal(4, new Zombie.ZombieAttackTurtleEggGoal(this, 1.0D, 3)); // Paper + if (this.level().paperConfig().entities.behavior.zombiesTargetTurtleEggs) this.goalSelector.addGoal(4, new Zombie.ZombieAttackTurtleEggGoal(this, 1.0D, 3)); // Paper - Add zombie targets turtle egg config this.goalSelector.addGoal(8, new LookAtPlayerGoal(this, Player.class, 8.0F)); this.goalSelector.addGoal(8, new RandomLookAroundGoal(this)); + this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur @@ -11882,25 +11881,25 @@ index ab41bd0f1810207a83ed506d6d1aa0289508d09a..60e2a8d83a89f09c2f54bdc4be626c3c + public boolean shouldBurnInDay() { return isSunSensitive(); } // Purpur - for ABI compatibility public boolean isSunSensitive() { - return this.shouldBurnInDay; // Paper - use api value instead + return this.shouldBurnInDay; // Paper - Add more Zombie API } @@ -433,7 +470,7 @@ public class Zombie extends Monster { nbt.putBoolean("CanBreakDoors", this.canBreakDoors()); nbt.putInt("InWaterTime", this.isInWater() ? this.inWaterTime : -1); nbt.putInt("DrownedConversionTime", this.isUnderWaterConverting() ? this.conversionTime : -1); -- nbt.putBoolean("Paper.ShouldBurnInDay", this.shouldBurnInDay); // Paper -+ // nbt.putBoolean("Paper.ShouldBurnInDay", this.shouldBurnInDay); // Paper // Purpur - implemented in LivingEntity +- nbt.putBoolean("Paper.ShouldBurnInDay", this.shouldBurnInDay); // Paper - Add more Zombie API ++ //nbt.putBoolean("Paper.ShouldBurnInDay", this.shouldBurnInDay); // Paper - Add more Zombie API // Purpur - implemented in LivingEntity } @Override @@ -447,7 +484,7 @@ public class Zombie extends Monster { } - // Paper start + // Paper start - Add more Zombie API if (nbt.contains("Paper.ShouldBurnInDay")) { - this.shouldBurnInDay = nbt.getBoolean("Paper.ShouldBurnInDay"); + // this.shouldBurnInDay = nbt.getBoolean("Paper.ShouldBurnInDay"); // Purpur - implemented in LivingEntity } - // Paper end + // Paper end - Add more Zombie API @@ -520,19 +557,20 @@ public class Zombie extends Monster { if (object instanceof Zombie.ZombieGroupData) { @@ -12380,7 +12379,7 @@ index 5cad15c512919ce6b0cae9f45e9011dd66134622..07fa613d75f3659145945245926e9068 public static void applyDarknessAround(ServerLevel world, Vec3 pos, @Nullable Entity entity, int range) { diff --git a/src/main/java/net/minecraft/world/entity/npc/AbstractVillager.java b/src/main/java/net/minecraft/world/entity/npc/AbstractVillager.java -index 5a591c439c5cef6b7e7e6f836ab813cb4f29b08c..44bb73e6846fc5f536b6efd5db7c5f1560ffecae 100644 +index 4e6c2f6b2e54a4c126e9a026b9cad05ce835ad66..69553b5b3c56998e4ae40876b1458929b335ad5d 100644 --- a/src/main/java/net/minecraft/world/entity/npc/AbstractVillager.java +++ b/src/main/java/net/minecraft/world/entity/npc/AbstractVillager.java @@ -42,6 +42,7 @@ import org.bukkit.event.entity.VillagerAcquireTradeEvent; @@ -12438,7 +12437,7 @@ index 5f407535298a31a34cfe114dd863fd6a9b977707..29c7e33fe961020e5a0007287fe9b663 } diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java -index 07fb53a908f8b10b40017f083648fdc47f2d6150..6bb6d61f1a8b7f07686e129241a1a8849b51c7d1 100644 +index e6b5b7c58505f021dc042c2c40733addcf286dcd..ef0f318227d2b9d0836f9f6d729add6f433e0537 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java @@ -145,6 +145,8 @@ public class Villager extends AbstractVillager implements ReputationEventHandler @@ -12450,7 +12449,7 @@ index 07fb53a908f8b10b40017f083648fdc47f2d6150..6bb6d61f1a8b7f07686e129241a1a884 public Villager(EntityType entityType, Level world) { this(entityType, world, VillagerType.PLAINS); -@@ -157,6 +159,90 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -157,6 +159,91 @@ public class Villager extends AbstractVillager implements ReputationEventHandler this.getNavigation().setCanFloat(true); this.setCanPickUpLoot(true); this.setVillagerData(this.getVillagerData().setType(type).setProfession(VillagerProfession.NONE)); @@ -12501,13 +12500,14 @@ index 07fb53a908f8b10b40017f083648fdc47f2d6150..6bb6d61f1a8b7f07686e129241a1a884 + + private boolean checkLobotomized() { + int interval = this.level().purpurConfig.villagerLobotomizeCheckInterval; ++ boolean shouldCheckForTradeLocked = this.level().purpurConfig.villagerLobotomizeWaitUntilTradeLocked; + if (this.notLobotomizedCount > 3) { + // check half as often if not lobotomized for the last 3+ consecutive checks + interval *= 2; + } + if (this.level().getGameTime() % interval == 0) { + // offset Y for short blocks like dirt_path/farmland -+ this.isLobotomized = !canTravelFrom(BlockPos.containing(this.position().x, this.getBoundingBox().minY + 0.0625D, this.position().z)); ++ this.isLobotomized = !(shouldCheckForTradeLocked && this.getVillagerXp() == 0) && !canTravelFrom(BlockPos.containing(this.position().x, this.getBoundingBox().minY + 0.0625D, this.position().z)); + + if (this.isLobotomized) { + this.notLobotomizedCount = 0; @@ -12541,7 +12541,7 @@ index 07fb53a908f8b10b40017f083648fdc47f2d6150..6bb6d61f1a8b7f07686e129241a1a884 } @Override -@@ -193,7 +279,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -193,7 +280,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler brain.addActivity(Activity.PLAY, VillagerGoalPackages.getPlayPackage(0.5F)); } else { brain.setSchedule(Schedule.VILLAGER_DEFAULT); @@ -12550,7 +12550,7 @@ index 07fb53a908f8b10b40017f083648fdc47f2d6150..6bb6d61f1a8b7f07686e129241a1a884 } brain.addActivity(Activity.CORE, VillagerGoalPackages.getCorePackage(villagerprofession, 0.5F)); -@@ -256,13 +342,21 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -256,13 +343,21 @@ public class Villager extends AbstractVillager implements ReputationEventHandler // Paper start this.customServerAiStep(false); } @@ -12575,7 +12575,7 @@ index 07fb53a908f8b10b40017f083648fdc47f2d6150..6bb6d61f1a8b7f07686e129241a1a884 if (this.assignProfessionWhenSpawned) { this.assignProfessionWhenSpawned = false; } -@@ -318,7 +412,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -318,7 +413,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler if (!itemstack.is(Items.VILLAGER_SPAWN_EGG) && this.isAlive() && !this.isTrading() && !this.isSleeping()) { if (this.isBaby()) { this.setUnhappy(); @@ -12584,7 +12584,7 @@ index 07fb53a908f8b10b40017f083648fdc47f2d6150..6bb6d61f1a8b7f07686e129241a1a884 } else { boolean flag = this.getOffers().isEmpty(); -@@ -331,9 +425,10 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -331,9 +426,10 @@ public class Villager extends AbstractVillager implements ReputationEventHandler } if (flag) { @@ -12597,7 +12597,7 @@ index 07fb53a908f8b10b40017f083648fdc47f2d6150..6bb6d61f1a8b7f07686e129241a1a884 this.startTrading(player); } -@@ -502,7 +597,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -502,7 +598,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler while (iterator.hasNext()) { MerchantOffer merchantrecipe = (MerchantOffer) iterator.next(); @@ -12606,7 +12606,7 @@ index 07fb53a908f8b10b40017f083648fdc47f2d6150..6bb6d61f1a8b7f07686e129241a1a884 } } -@@ -752,7 +847,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -752,7 +848,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler @Override public boolean canBreed() { @@ -12615,7 +12615,7 @@ index 07fb53a908f8b10b40017f083648fdc47f2d6150..6bb6d61f1a8b7f07686e129241a1a884 } private boolean hungry() { -@@ -966,6 +1061,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -966,6 +1062,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler public boolean hasFarmSeeds() { return this.getInventory().hasAnyMatching((itemstack) -> { @@ -12627,7 +12627,7 @@ index 07fb53a908f8b10b40017f083648fdc47f2d6150..6bb6d61f1a8b7f07686e129241a1a884 return itemstack.is(ItemTags.VILLAGER_PLANTABLE_SEEDS); }); } -@@ -1023,6 +1123,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -1023,6 +1124,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler } public void spawnGolemIfNeeded(ServerLevel world, long time, int requiredCount) { @@ -12635,7 +12635,7 @@ index 07fb53a908f8b10b40017f083648fdc47f2d6150..6bb6d61f1a8b7f07686e129241a1a884 if (this.wantsToSpawnGolem(time)) { AABB axisalignedbb = this.getBoundingBox().inflate(10.0D, 10.0D, 10.0D); List list = world.getEntitiesOfClass(Villager.class, axisalignedbb); -@@ -1087,6 +1188,12 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -1087,6 +1189,12 @@ public class Villager extends AbstractVillager implements ReputationEventHandler @Override public void startSleeping(BlockPos pos) { @@ -12740,7 +12740,7 @@ index 1c89f20debfad9807c90a21cc336d5790294ebce..3f78ab74cd7706ad16f6d5a989803691 this.openTradingScreen(player, this.getDisplayName(), 1); } diff --git a/src/main/java/net/minecraft/world/entity/npc/WanderingTraderSpawner.java b/src/main/java/net/minecraft/world/entity/npc/WanderingTraderSpawner.java -index 8385eb1d60f377da94e3178ab506feefb43563fd..a5443f92786427c42092aec8350e7ab37704db7a 100644 +index d7bddedb19c10f62fd1f7d3128453ad706ed16be..752b38d45d59d8b3cd492246e5aa4f378a78734d 100644 --- a/src/main/java/net/minecraft/world/entity/npc/WanderingTraderSpawner.java +++ b/src/main/java/net/minecraft/world/entity/npc/WanderingTraderSpawner.java @@ -159,7 +159,17 @@ public class WanderingTraderSpawner implements CustomSpawner { @@ -12763,13 +12763,13 @@ index 8385eb1d60f377da94e3178ab506feefb43563fd..a5443f92786427c42092aec8350e7ab3 if (NaturalSpawner.isSpawnPositionOk(SpawnPlacements.Type.ON_GROUND, world, blockposition2, EntityType.WANDERING_TRADER)) { blockposition1 = blockposition2; diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java -index c97531959fae3ad8e1f4dc3483b6f8e1fff19035..8b665475ab5cd2bae4e11aa1755af3bb9b99b284 100644 +index 34490ea2673f376b0ac11b52964eab46995cfb36..7264f6e05a6b1fee296ccde4f39e973c8a454b58 100644 --- a/src/main/java/net/minecraft/world/entity/player/Player.java +++ b/src/main/java/net/minecraft/world/entity/player/Player.java -@@ -186,11 +186,21 @@ public abstract class Player extends LivingEntity { - public boolean affectsSpawning = true; +@@ -184,11 +184,21 @@ public abstract class Player extends LivingEntity { + public float hurtDir; // Paper - protected -> public + public boolean affectsSpawning = true; // Paper - Affects Spawning API public net.kyori.adventure.util.TriState flyingFallDamage = net.kyori.adventure.util.TriState.NOT_SET; // Paper - flying fall damage - // Paper end + public int sixRowEnderchestSlotCount = -1; // Purpur + public int burpDelay = 0; // Purpur + public boolean canPortalInstant = false; // Purpur @@ -12788,7 +12788,7 @@ index c97531959fae3ad8e1f4dc3483b6f8e1fff19035..8b665475ab5cd2bae4e11aa1755af3bb @Override public CraftHumanEntity getBukkitEntity() { return (CraftHumanEntity) super.getBukkitEntity(); -@@ -199,6 +209,19 @@ public abstract class Player extends LivingEntity { +@@ -197,6 +207,19 @@ public abstract class Player extends LivingEntity { public final int sendAllPlayerInfoBucketIndex; // Gale - Purpur - spread out sending all player info @@ -12808,7 +12808,7 @@ index c97531959fae3ad8e1f4dc3483b6f8e1fff19035..8b665475ab5cd2bae4e11aa1755af3bb public Player(Level world, BlockPos pos, float yaw, GameProfile gameProfile) { super(EntityType.PLAYER, world); this.lastItemInMainHand = ItemStack.EMPTY; -@@ -244,6 +267,12 @@ public abstract class Player extends LivingEntity { +@@ -242,6 +265,12 @@ public abstract class Player extends LivingEntity { @Override public void tick() { @@ -12857,7 +12857,7 @@ index c97531959fae3ad8e1f4dc3483b6f8e1fff19035..8b665475ab5cd2bae4e11aa1755af3bb } else if (!entity.isRemoved()) { this.touch(entity); @@ -1293,7 +1332,7 @@ public abstract class Player extends LivingEntity { - flag2 = flag2 && !this.level().paperConfig().entities.behavior.disablePlayerCrits; // Paper + flag2 = flag2 && !this.level().paperConfig().entities.behavior.disablePlayerCrits; // Paper - Toggleable player crits flag2 = flag2 && !this.isSprinting(); if (flag2) { - f *= 1.5F; @@ -12918,11 +12918,11 @@ index c97531959fae3ad8e1f4dc3483b6f8e1fff19035..8b665475ab5cd2bae4e11aa1755af3bb if (name == null || name.isEmpty() || name.length() > 16) { return false; diff --git a/src/main/java/net/minecraft/world/entity/player/StackedContents.java b/src/main/java/net/minecraft/world/entity/player/StackedContents.java -index 26b236a764177ac16d53f5cbaf83d3e21d015ebc..90b92aeeb893146a2036f4ad21bf3b084c2c50bd 100644 +index 9c7b05fec22a8b84c29d7210f1104030a20cc7aa..6f220fae380575622dee0d99d20704f0f30e883a 100644 --- a/src/main/java/net/minecraft/world/entity/player/StackedContents.java +++ b/src/main/java/net/minecraft/world/entity/player/StackedContents.java @@ -42,7 +42,6 @@ public class StackedContents { - if (this.extrasMap != null && stack.hasTag() && this.extrasMap.accountStack(stack, j)) return; // Paper - if an exact ingredient, don't include it + if (this.extrasMap != null && stack.hasTag() && this.extrasMap.accountStack(stack, j)) return; // Paper - Improve exact choice recipe ingredients; if an exact ingredient, don't include it this.put(i, j); } - @@ -12930,7 +12930,7 @@ index 26b236a764177ac16d53f5cbaf83d3e21d015ebc..90b92aeeb893146a2036f4ad21bf3b08 public static int getStackingIndex(ItemStack stack) { diff --git a/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java b/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java -index f70fb4fdfa7b7024a19514ce2160bfb6aa8f2c13..5b698ac22e06f71fddcecc9ccc30edfeb9267586 100644 +index 4ed35187a22c595db5a0986162e4b45c594e7c3e..c105e8d2ce2a27495ba7cae44de0629634911bcc 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java +++ b/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java @@ -74,6 +74,7 @@ public abstract class AbstractArrow extends Projectile { @@ -13000,7 +13000,7 @@ index 0bbe853f7df93f9dcd2b21d762939f8b6be069aa..7db9844083703944f59e112c6dc5e1a5 public void tick() { super.tick(); diff --git a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java -index 0e27f7052a88c1771ec1d0b0dbd0c5776c0a02e8..c0d32acccb1efa62c1049ce385ac5dacf3362e94 100644 +index d3a055e221ec62070f6557d1686febadf1249402..33156c5613965d123d7758472a04a74656f46c03 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java +++ b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java @@ -343,7 +343,7 @@ public abstract class Projectile extends Entity implements TraceableEntity { @@ -13199,7 +13199,7 @@ index 31831811ce16265e9828fa34d9e67d8ac195d723..a1f74718240da3dfb0fc53f337ec3bf1 if (!this.raidMap.containsKey(raid.getId())) { this.raidMap.put(raid.getId(), raid); diff --git a/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java b/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java -index dc421a0a6430583f1f0154e1dd689b80253f6e3d..9984ac31e911473a94d90aae1cdd46e16ac0182b 100644 +index d514ec1e4cbdc579c3a61533998437903afdc8b6..eb5bd5cfd131042e366872bf599a315d83dc732b 100644 --- a/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java +++ b/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java @@ -105,12 +105,14 @@ public abstract class AbstractMinecart extends VehicleEntity { @@ -13303,7 +13303,7 @@ index dc421a0a6430583f1f0154e1dd689b80253f6e3d..9984ac31e911473a94d90aae1cdd46e1 Vec3 vec3d5 = this.getDeltaMovement(); double d21 = vec3d5.x; diff --git a/src/main/java/net/minecraft/world/entity/vehicle/Boat.java b/src/main/java/net/minecraft/world/entity/vehicle/Boat.java -index dfd53ca465c9d4864020c14a49f4e74b717df5d6..de772614af6ca495fc76682719fc39b4b10798ca 100644 +index db6aa75d642f4a7258f197933671907faf79c8f2..81e0930acccd014e977b88d22e10346627f0edb0 100644 --- a/src/main/java/net/minecraft/world/entity/vehicle/Boat.java +++ b/src/main/java/net/minecraft/world/entity/vehicle/Boat.java @@ -521,6 +521,7 @@ public class Boat extends VehicleEntity implements VariantHolder { @@ -13400,7 +13400,7 @@ index b16d9e2eaa589f19c563ee70b1a56d67dbcdecb0..71beab673f04cd051c46ea37f8c84731 public static final FoodProperties BAKED_POTATO = (new FoodProperties.Builder()).nutrition(5).saturationMod(0.6F).build(); public static final FoodProperties BEEF = (new FoodProperties.Builder()).nutrition(3).saturationMod(0.3F).meat().build(); diff --git a/src/main/java/net/minecraft/world/inventory/AbstractContainerMenu.java b/src/main/java/net/minecraft/world/inventory/AbstractContainerMenu.java -index 1548bc20988fea3f032d71cad40299fdf5b08b71..4c268dcff56d48e9ce39f51d8470c28a1966d82a 100644 +index 48f634a7521d31c1e9dfd3cfc83139d428dbd37a..fa185a8145843edf44fc0aeedb6c36b2b13263ae 100644 --- a/src/main/java/net/minecraft/world/inventory/AbstractContainerMenu.java +++ b/src/main/java/net/minecraft/world/inventory/AbstractContainerMenu.java @@ -76,6 +76,7 @@ public abstract class AbstractContainerMenu { @@ -13431,7 +13431,7 @@ index 1af7e1548f0648890a1ef2fc0ff4e4c3a56c947c..decea1697c075e7549ccc7501c8e5935 } else if (this.isFuel(itemstack1)) { if (!this.moveItemStackTo(itemstack1, 1, 2, false)) { diff --git a/src/main/java/net/minecraft/world/inventory/AnvilMenu.java b/src/main/java/net/minecraft/world/inventory/AnvilMenu.java -index f00638e9d7baf8b803dd610f2bf6250da34efab3..27d76e0c4809d333c548379bf78ec2db083b027e 100644 +index cab3e0ba471c93764b5949ad68a0f2cce4d00099..2913d69fcff4b6df68586146b7323cea33eba74b 100644 --- a/src/main/java/net/minecraft/world/inventory/AnvilMenu.java +++ b/src/main/java/net/minecraft/world/inventory/AnvilMenu.java @@ -23,6 +23,13 @@ import org.slf4j.Logger; @@ -13711,7 +13711,7 @@ index 343f44db579839eb61376f876b5eff2e615dc2e5..849b6a30d412d10f1e2e6e88f2d8d990 }); } diff --git a/src/main/java/net/minecraft/world/inventory/GrindstoneMenu.java b/src/main/java/net/minecraft/world/inventory/GrindstoneMenu.java -index 4acad717bfec91e4abcdd59900e6872838d0712c..46c4468b846085d92f773142ecbee0fe258ff319 100644 +index 23462de504932bd351b8dfacde514fe361343912..af99ce32872e079beb6ac1caf3a8ac4c3cae4648 100644 --- a/src/main/java/net/minecraft/world/inventory/GrindstoneMenu.java +++ b/src/main/java/net/minecraft/world/inventory/GrindstoneMenu.java @@ -95,9 +95,11 @@ public class GrindstoneMenu extends AbstractContainerMenu { @@ -13799,7 +13799,7 @@ index 9af1da3858d6cf79b8bfaf99dde1370ccc50d023..1acb41fab25bdbc4109913b111dbe3b0 @Override diff --git a/src/main/java/net/minecraft/world/inventory/ItemCombinerMenu.java b/src/main/java/net/minecraft/world/inventory/ItemCombinerMenu.java -index e5a7f36843d621e6c714ef2e1cb8e2e3551924ef..2071c21783cc5e3f542018de3b0a7a1c579147da 100644 +index 62e1b7096fa659778b737b3d520389e73138dc5d..3756de835ea87e3a4fb87cbf77365ffd87957ea9 100644 --- a/src/main/java/net/minecraft/world/inventory/ItemCombinerMenu.java +++ b/src/main/java/net/minecraft/world/inventory/ItemCombinerMenu.java @@ -178,7 +178,9 @@ public abstract class ItemCombinerMenu extends AbstractContainerMenu { @@ -13944,7 +13944,7 @@ index 2e75fd06e9e379eb95ebfe55086ffc327706ab2f..2918b1aca8fae6a319881a631dc727b6 return optional3; } else { diff --git a/src/main/java/net/minecraft/world/item/BlockItem.java b/src/main/java/net/minecraft/world/item/BlockItem.java -index 8ab80717f7f694ed262fb84f9145bc189e3c087c..7c72ef5e08660b1d566960b8ecf9323484c8d375 100644 +index 8d2c0accadaf0c5d28e7db6e62a05f6c619cf02f..f33fcd7bca6f315c4b4cf1f5063f4772790ad20d 100644 --- a/src/main/java/net/minecraft/world/item/BlockItem.java +++ b/src/main/java/net/minecraft/world/item/BlockItem.java @@ -152,7 +152,24 @@ public class BlockItem extends Item { @@ -14064,7 +14064,7 @@ index 6371f326fc86cfc53e39bf8ed13b646f7705fbbc..3dec0c5fc8dece5341634eaf8e94fe19 return true; diff --git a/src/main/java/net/minecraft/world/item/CrossbowItem.java b/src/main/java/net/minecraft/world/item/CrossbowItem.java -index eede02c3f125d230af537bb67bebed9b88f7d1b4..2c51a73ebfd05af21b0f5d731fc9f1df77fed1a1 100644 +index f3a428f80c265639250114498b10067b4bf1ada1..211d8e59a9b3460b346e5f8cf581df70b05d1b8f 100644 --- a/src/main/java/net/minecraft/world/item/CrossbowItem.java +++ b/src/main/java/net/minecraft/world/item/CrossbowItem.java @@ -64,7 +64,7 @@ public class CrossbowItem extends ProjectileWeaponItem implements Vanishable { @@ -14077,11 +14077,11 @@ index eede02c3f125d230af537bb67bebed9b88f7d1b4..2c51a73ebfd05af21b0f5d731fc9f1df return InteractionResultHolder.consume(itemstack); } else if (!user.getProjectile(itemstack).isEmpty()) { @@ -114,7 +114,7 @@ public class CrossbowItem extends ProjectileWeaponItem implements Vanishable { - // Paper end + // Paper end - Add EntityLoadCrossbowEvent int i = EnchantmentHelper.getItemEnchantmentLevel(Enchantments.MULTISHOT, crossbow); int j = i == 0 ? 1 : 3; -- boolean flag = !consume || shooter instanceof Player && ((Player) shooter).getAbilities().instabuild; // Paper - add consume -+ boolean flag = !consume || shooter instanceof Player && ((Player) shooter).getAbilities().instabuild || (org.purpurmc.purpur.PurpurConfig.allowCrossbowInfinity && EnchantmentHelper.getItemEnchantmentLevel(Enchantments.INFINITY_ARROWS, crossbow) > 0); // Paper - add consume // Purpur +- boolean flag = !consume || shooter instanceof Player && ((Player) shooter).getAbilities().instabuild; // Paper - Add EntityLoadCrossbowEvent ++ boolean flag = !consume || shooter instanceof Player && ((Player) shooter).getAbilities().instabuild || (org.purpurmc.purpur.PurpurConfig.allowCrossbowInfinity && EnchantmentHelper.getItemEnchantmentLevel(Enchantments.INFINITY_ARROWS, crossbow) > 0); // Paper - Add EntityLoadCrossbowEvent // Purpur ItemStack itemstack1 = shooter.getProjectile(crossbow); ItemStack itemstack2 = itemstack1.copy(); @@ -14125,7 +14125,7 @@ index 88e1c2431d51d8cdc3d555b711e506648225d289..ac8735cc9d127fc1f867b40d4000c033 + // Purpur end } diff --git a/src/main/java/net/minecraft/world/item/EggItem.java b/src/main/java/net/minecraft/world/item/EggItem.java -index 58cb992c5defec2f092755cbde661ff10f38bf9d..52f48681407d23f0925f4c9c072d5f0a2a6b1778 100644 +index a3bd507793994e9cc87a956871a8afbb8ca9460d..ef2197a23aef0a4215fae09bd4618e449e14c64e 100644 --- a/src/main/java/net/minecraft/world/item/EggItem.java +++ b/src/main/java/net/minecraft/world/item/EggItem.java @@ -24,7 +24,7 @@ public class EggItem extends Item { @@ -14134,7 +14134,7 @@ index 58cb992c5defec2f092755cbde661ff10f38bf9d..52f48681407d23f0925f4c9c072d5f0a entityegg.setItem(itemstack); - entityegg.shootFromRotation(user, user.getXRot(), user.getYRot(), 0.0F, 1.5F, 1.0F); + entityegg.shootFromRotation(user, user.getXRot(), user.getYRot(), 0.0F, 1.5F, (float) world.purpurConfig.eggProjectileOffset); // Purpur - // Paper start + // Paper start - PlayerLaunchProjectileEvent com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent((org.bukkit.entity.Player) user.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemstack), (org.bukkit.entity.Projectile) entityegg.getBukkitEntity()); if (event.callEvent() && world.addFreshEntity(entityegg)) { diff --git a/src/main/java/net/minecraft/world/item/EndCrystalItem.java b/src/main/java/net/minecraft/world/item/EndCrystalItem.java @@ -14151,7 +14151,7 @@ index a0bc8bb8d88e96457a2be0befe1fd69ef4973e11..26b0084f0b8c707f6d2b90e4cf6de7e9 } else { BlockPos blockposition1 = blockposition.above(); final BlockPos aboveBlockPosition = blockposition1; // Paper - OBFHELPER diff --git a/src/main/java/net/minecraft/world/item/EnderpearlItem.java b/src/main/java/net/minecraft/world/item/EnderpearlItem.java -index 749ab72edc0d2e9c6f1161415ab8d59d3d6ca976..6b27d98d06b163243bb0e1bb979aad03f48d7770 100644 +index 8c8cf8705107c95d9a4eab28b5845ae13c4ffb3c..8031e38c66468676b3b4a7443d6678eec6b1e8a4 100644 --- a/src/main/java/net/minecraft/world/item/EnderpearlItem.java +++ b/src/main/java/net/minecraft/world/item/EnderpearlItem.java @@ -24,7 +24,7 @@ public class EnderpearlItem extends Item { @@ -14160,8 +14160,8 @@ index 749ab72edc0d2e9c6f1161415ab8d59d3d6ca976..6b27d98d06b163243bb0e1bb979aad03 entityenderpearl.setItem(itemstack); - entityenderpearl.shootFromRotation(user, user.getXRot(), user.getYRot(), 0.0F, 1.5F, 1.0F); + entityenderpearl.shootFromRotation(user, user.getXRot(), user.getYRot(), 0.0F, 1.5F, (float) world.purpurConfig.enderPearlProjectileOffset); // Purpur - // Paper start - com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent((org.bukkit.entity.Player) user.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemstack), (org.bukkit.entity.Projectile) entityenderpearl.getBukkitEntity()); + // Paper start - PlayerLaunchProjectileEvent + com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent((org.bukkit.entity.Player) user.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemstack), (org.bukkit.entity.Projectile) entityenderpearl.getBukkitEntity()); if (event.callEvent() && world.addFreshEntity(entityenderpearl)) { @@ -36,7 +36,7 @@ public class EnderpearlItem extends Item { @@ -14170,10 +14170,10 @@ index 749ab72edc0d2e9c6f1161415ab8d59d3d6ca976..6b27d98d06b163243bb0e1bb979aad03 - user.getCooldowns().addCooldown(this, 20); + user.getCooldowns().addCooldown(this, user.getAbilities().instabuild ? world.purpurConfig.enderPearlCooldownCreative : world.purpurConfig.enderPearlCooldown); // Purpur } else { - // Paper end + // Paper end - PlayerLaunchProjectileEvent if (user instanceof net.minecraft.server.level.ServerPlayer) { diff --git a/src/main/java/net/minecraft/world/item/FireworkRocketItem.java b/src/main/java/net/minecraft/world/item/FireworkRocketItem.java -index 82b0bda3e35ec2157a477e1a17b2b46baadc97d9..0fc45b1048a1c4e0dc2bd1ae0437eecbe113cf96 100644 +index 0821c06a4c66edc8fcee09fc192335a588d2944b..56d7c05c93bc074f6caba51b1741f25d6f0861cd 100644 --- a/src/main/java/net/minecraft/world/item/FireworkRocketItem.java +++ b/src/main/java/net/minecraft/world/item/FireworkRocketItem.java @@ -15,6 +15,7 @@ import net.minecraft.util.ByIdMap; @@ -14269,7 +14269,7 @@ index 180aec596110309aade13d2080f8824d152b07cb..552c31c0f3746dd35388395036e70a92 return InteractionResult.PASS; } diff --git a/src/main/java/net/minecraft/world/item/ItemStack.java b/src/main/java/net/minecraft/world/item/ItemStack.java -index e4cd42b9b143cbdc614d66978de07ccc22d0c9cb..2b1cb20cbdb255581768726c6e3fb2b4563bfad2 100644 +index c196f35d76268aac1304a9008a6a12f7b1ed1a3c..22c4da01d69a5d18cc384622e8255fc7464c41d0 100644 --- a/src/main/java/net/minecraft/world/item/ItemStack.java +++ b/src/main/java/net/minecraft/world/item/ItemStack.java @@ -453,6 +453,7 @@ public final class ItemStack { @@ -14386,7 +14386,7 @@ index f692149d91b525bda6dc79d489d7496ea24037e8..cf68dca4096556b0c2594c76fcf11341 } } diff --git a/src/main/java/net/minecraft/world/item/MapItem.java b/src/main/java/net/minecraft/world/item/MapItem.java -index 797415866a7f182d804f6b8e57ceb07a6ac2a20a..6cfd169c2c32b644d70907358c2d4a2087c00a68 100644 +index d8dd99ec8bf7444c5a3c426db3a9c13e334dc0ff..8d3c1897044f9a2bbe1911e1a72dc9a00fb246df 100644 --- a/src/main/java/net/minecraft/world/item/MapItem.java +++ b/src/main/java/net/minecraft/world/item/MapItem.java @@ -235,6 +235,7 @@ public class MapItem extends ComplexItem { @@ -14445,17 +14445,17 @@ index 3aa73cd44aa8c86b78c35bc1788e4f83018c49ed..66a8b28275619079e3bcbcc460146976 } } diff --git a/src/main/java/net/minecraft/world/item/NameTagItem.java b/src/main/java/net/minecraft/world/item/NameTagItem.java -index 2941c16ef486345b57ab2dfcd26f0272285d3b5a..7cc6812bf6f2ba015f65fd1fc1eaac02dd0f53e2 100644 +index a0b3c2d3b3f86ecd6cb80ff767839d29ca4f4f68..61b4430d6dd73b5406c4879e41ff80a1b6f67f84 100644 --- a/src/main/java/net/minecraft/world/item/NameTagItem.java +++ b/src/main/java/net/minecraft/world/item/NameTagItem.java @@ -20,6 +20,7 @@ public class NameTagItem extends Item { if (!event.callEvent()) return InteractionResult.PASS; - LivingEntity newEntityLiving = ((org.bukkit.craftbukkit.entity.CraftLivingEntity) event.getEntity()).getHandle(); - newEntityLiving.setCustomName(event.getName() != null ? io.papermc.paper.adventure.PaperAdventure.asVanilla(event.getName()) : null); + LivingEntity newEntity = ((org.bukkit.craftbukkit.entity.CraftLivingEntity) event.getEntity()).getHandle(); + newEntity.setCustomName(event.getName() != null ? io.papermc.paper.adventure.PaperAdventure.asVanilla(event.getName()) : null); + if (user.level().purpurConfig.armorstandFixNametags && entity instanceof net.minecraft.world.entity.decoration.ArmorStand) entity.setCustomNameVisible(true); // Purpur - if (event.isPersistent() && newEntityLiving instanceof Mob) { - ((Mob) newEntityLiving).setPersistenceRequired(); - // Paper end + if (event.isPersistent() && newEntity instanceof Mob) { + ((Mob) newEntity).setPersistenceRequired(); + // Paper end - Add PlayerNameEntityEvent diff --git a/src/main/java/net/minecraft/world/item/ShovelItem.java b/src/main/java/net/minecraft/world/item/ShovelItem.java index 21212462e6b415e96536a27b2c009d1562f18946..193bcb12152347f5f02ce18b01ba918e5e838f30 100644 --- a/src/main/java/net/minecraft/world/item/ShovelItem.java @@ -14486,7 +14486,7 @@ index 21212462e6b415e96536a27b2c009d1562f18946..193bcb12152347f5f02ce18b01ba918e return InteractionResult.PASS; } diff --git a/src/main/java/net/minecraft/world/item/SnowballItem.java b/src/main/java/net/minecraft/world/item/SnowballItem.java -index ef3f90a5bcdd7b9815a4053cff166f9d2552f55d..e7e5e1cc92f56e3daba8fa09c59188febec5e8f2 100644 +index bc8186a5bc3a98b35fad570729dd4ba52efab238..caab0c1e2bc5696080750797cbf1c93f57799f7d 100644 --- a/src/main/java/net/minecraft/world/item/SnowballItem.java +++ b/src/main/java/net/minecraft/world/item/SnowballItem.java @@ -25,7 +25,7 @@ public class SnowballItem extends Item { @@ -14495,11 +14495,11 @@ index ef3f90a5bcdd7b9815a4053cff166f9d2552f55d..e7e5e1cc92f56e3daba8fa09c59188fe entitysnowball.setItem(itemstack); - entitysnowball.shootFromRotation(user, user.getXRot(), user.getYRot(), 0.0F, 1.5F, 1.0F); + entitysnowball.shootFromRotation(user, user.getXRot(), user.getYRot(), 0.0F, 1.5F, (float) world.purpurConfig.snowballProjectileOffset); // Purpur - // Paper start + // Paper start - PlayerLaunchProjectileEvent com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent((org.bukkit.entity.Player) user.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemstack), (org.bukkit.entity.Projectile) entitysnowball.getBukkitEntity()); if (event.callEvent() && world.addFreshEntity(entitysnowball)) { diff --git a/src/main/java/net/minecraft/world/item/SpawnEggItem.java b/src/main/java/net/minecraft/world/item/SpawnEggItem.java -index 4f10f801dc126e9135432939b6663770c0e7a0bc..4249d8c8795c188f56da3bce00166f2e1aa46067 100644 +index 3bfbf7daa190b03f978b9fc72233c18c383b6659..afed52ed201193867f19054c5b379270a6fbe480 100644 --- a/src/main/java/net/minecraft/world/item/SpawnEggItem.java +++ b/src/main/java/net/minecraft/world/item/SpawnEggItem.java @@ -68,6 +68,16 @@ public class SpawnEggItem extends Item { @@ -14520,7 +14520,7 @@ index 4f10f801dc126e9135432939b6663770c0e7a0bc..4249d8c8795c188f56da3bce00166f2e world.sendBlockUpdated(blockposition, iblockdata, iblockdata, 3); world.gameEvent((Entity) context.getPlayer(), GameEvent.BLOCK_CHANGE, blockposition); diff --git a/src/main/java/net/minecraft/world/item/ThrowablePotionItem.java b/src/main/java/net/minecraft/world/item/ThrowablePotionItem.java -index de5bdceb4c8578fb972a2fd5ee0dfdae509e46dc..bcf63ccb6e679cb97d658780b2663aafa3568bcb 100644 +index f47f793c62a919fb65c081ddb82d597a978d3b20..3bbb44ae3da68afbd6012df68dee277a7dbf98c0 100644 --- a/src/main/java/net/minecraft/world/item/ThrowablePotionItem.java +++ b/src/main/java/net/minecraft/world/item/ThrowablePotionItem.java @@ -18,7 +18,7 @@ public class ThrowablePotionItem extends PotionItem { @@ -14529,11 +14529,11 @@ index de5bdceb4c8578fb972a2fd5ee0dfdae509e46dc..bcf63ccb6e679cb97d658780b2663aaf thrownPotion.setItem(itemStack); - thrownPotion.shootFromRotation(user, user.getXRot(), user.getYRot(), -20.0F, 0.5F, 1.0F); + thrownPotion.shootFromRotation(user, user.getXRot(), user.getYRot(), -20.0F, 0.5F, (float) world.purpurConfig.throwablePotionProjectileOffset); // Purpur - // Paper start + // Paper start - PlayerLaunchProjectileEvent com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent((org.bukkit.entity.Player) user.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemStack), (org.bukkit.entity.Projectile) thrownPotion.getBukkitEntity()); if (event.callEvent() && world.addFreshEntity(thrownPotion)) { diff --git a/src/main/java/net/minecraft/world/item/TridentItem.java b/src/main/java/net/minecraft/world/item/TridentItem.java -index 5fab851b319847035fb1eefd0ab999de3ccc2cd8..ec5daeef857fdad6c7659130fb42f52cf6eb491f 100644 +index fa876ddf54780728e7f3ecfe02aa8a16b8ef6f8d..dcd6f241271beecf9601e34547225d7921958c20 100644 --- a/src/main/java/net/minecraft/world/item/TridentItem.java +++ b/src/main/java/net/minecraft/world/item/TridentItem.java @@ -77,11 +77,19 @@ public class TridentItem extends Item implements Vanishable { @@ -14555,7 +14555,7 @@ index 5fab851b319847035fb1eefd0ab999de3ccc2cd8..ec5daeef857fdad6c7659130fb42f52c + // Purpur end + // CraftBukkit start - // Paper start + // Paper start - PlayerLaunchProjectileEvent com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent((org.bukkit.entity.Player) entityhuman.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(stack), (org.bukkit.entity.Projectile) entitythrowntrident.getBukkitEntity()); @@ -131,6 +139,14 @@ public class TridentItem extends Item implements Vanishable { f2 *= f6 / f5; @@ -14712,25 +14712,25 @@ index 7f1ffc0ac402fcf0ec086986e959ecc9f78dde03..1351d52374d1c2367932e5ecd5f46379 public int getMinCost(int level) { return 15 + (level - 1) * 9; diff --git a/src/main/java/net/minecraft/world/item/trading/MerchantOffer.java b/src/main/java/net/minecraft/world/item/trading/MerchantOffer.java -index 4f7457578ab3118d10e0d5dfc23d79c9b20c2f44..e03ce53b93d1b9366f2a7f14f341750a163ae0db 100644 +index 02feea12c998f37098b72becf6bfaf6b27d155de..9c89a85d934955c9388cfe1361f13e70e699d279 100644 --- a/src/main/java/net/minecraft/world/item/trading/MerchantOffer.java +++ b/src/main/java/net/minecraft/world/item/trading/MerchantOffer.java @@ -149,7 +149,12 @@ public class MerchantOffer { } public void updateDemand() { -- this.demand = Math.max(0, this.demand + this.uses - (this.maxUses - this.uses)); // Paper +- this.demand = Math.max(0, this.demand + this.uses - (this.maxUses - this.uses)); // Paper - Fix MC-163962 + // Purpur start + this.updateDemand(0); + } + public void updateDemand(int minimumDemand) { -+ this.demand = Math.max(minimumDemand, this.demand + this.uses - (this.maxUses - this.uses)); ++ this.demand = Math.max(minimumDemand, this.demand + this.uses - (this.maxUses - this.uses)); // Paper - Fix MC-163962 + // Purpur end } public ItemStack assemble() { diff --git a/src/main/java/net/minecraft/world/level/BaseSpawner.java b/src/main/java/net/minecraft/world/level/BaseSpawner.java -index 3aa4cb526f04a171ace0b95d18ecebc9a002470a..ac6bdf21d5ff8ba563f8c9187f6a8dcc823587aa 100644 +index 65c3e91ac4541c0150057dc9f012eb1ee566516e..40c199812ecf7b16fe5a17c18cb0d6d3ce258910 100644 --- a/src/main/java/net/minecraft/world/level/BaseSpawner.java +++ b/src/main/java/net/minecraft/world/level/BaseSpawner.java @@ -57,6 +57,7 @@ public abstract class BaseSpawner { @@ -14742,7 +14742,7 @@ index 3aa4cb526f04a171ace0b95d18ecebc9a002470a..ac6bdf21d5ff8ba563f8c9187f6a8dcc } diff --git a/src/main/java/net/minecraft/world/level/EntityGetter.java b/src/main/java/net/minecraft/world/level/EntityGetter.java -index ff0b7b9e4ae3aa0c170d05bc51fd7ff26e7531ee..53d4000593d4c79de8e8ab04bfd614b7ee0ad7a5 100644 +index ed84c87a3f76bc0254c1abb189e6b8b808823465..5bc68b1ef33f297e9a4b1bdd7d69f86a46ad6fbd 100644 --- a/src/main/java/net/minecraft/world/level/EntityGetter.java +++ b/src/main/java/net/minecraft/world/level/EntityGetter.java @@ -191,7 +191,7 @@ public interface EntityGetter { @@ -14755,7 +14755,7 @@ index ff0b7b9e4ae3aa0c170d05bc51fd7ff26e7531ee..53d4000593d4c79de8e8ab04bfd614b7 if (range < 0.0D || d < range * range) { return true; diff --git a/src/main/java/net/minecraft/world/level/Explosion.java b/src/main/java/net/minecraft/world/level/Explosion.java -index 525e41f3c38c9a79e237f32ac49ba02ab3438c30..0e5aa6e33cff3258ceefd58242ed6068b94e54fe 100644 +index 5a67925bd9d850780f17eaf4dd5bc31c3816a6d0..a88b97805108260b6e350e44e21ff56b3fcfad1c 100644 --- a/src/main/java/net/minecraft/world/level/Explosion.java +++ b/src/main/java/net/minecraft/world/level/Explosion.java @@ -97,7 +97,7 @@ public class Explosion { @@ -14797,10 +14797,10 @@ index 525e41f3c38c9a79e237f32ac49ba02ab3438c30..0e5aa6e33cff3258ceefd58242ed6068 Set set = Sets.newHashSet(); boolean flag = true; diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index a2d388ff4dd85daf0ffed2161e55538842c815cd..3a1ef6f06d8911709eabdefc4f69ba76bc93a409 100644 +index c5ee421f127ccd089c085f5fe7d314a8376d9882..765f7034d3b1da22dd81c4186649e06fa58e50a5 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java -@@ -178,6 +178,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -175,6 +175,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { // Gale end - Gale configuration public final com.destroystokyo.paper.antixray.ChunkPacketBlockController chunkPacketBlockController; // Paper - Anti-Xray @@ -14808,7 +14808,7 @@ index a2d388ff4dd85daf0ffed2161e55538842c815cd..3a1ef6f06d8911709eabdefc4f69ba76 public final co.aikar.timings.WorldTimingsHandler timings; // Paper public static BlockPos lastPhysicsProblem; // Spigot private org.spigotmc.TickLimiter entityLimiter; -@@ -197,6 +198,49 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -194,6 +195,49 @@ public abstract class Level implements LevelAccessor, AutoCloseable { } // Paper end - fix and optimise world upgrading @@ -14858,7 +14858,7 @@ index a2d388ff4dd85daf0ffed2161e55538842c815cd..3a1ef6f06d8911709eabdefc4f69ba76 public CraftWorld getWorld() { return this.world; } -@@ -227,6 +271,8 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -224,6 +268,8 @@ public abstract class Level implements LevelAccessor, AutoCloseable { this.spigotConfig = new org.spigotmc.SpigotWorldConfig(((net.minecraft.world.level.storage.PrimaryLevelData) worlddatamutable).getLevelName()); // Spigot this.paperConfig = paperWorldConfigCreator.apply(this.spigotConfig); // Paper - create paper world config this.galeConfig = galeWorldConfigCreator.apply(this.spigotConfig); // Gale - Gale configuration @@ -14867,10 +14867,10 @@ index a2d388ff4dd85daf0ffed2161e55538842c815cd..3a1ef6f06d8911709eabdefc4f69ba76 this.generator = gen; this.world = new CraftWorld((ServerLevel) this, gen, biomeProvider, env); -@@ -1920,4 +1966,14 @@ public abstract class Level implements LevelAccessor, AutoCloseable { - } +@@ -1911,4 +1957,14 @@ public abstract class Level implements LevelAccessor, AutoCloseable { + return null; } - // Paper end - notify observers even if grow failed + // Paper end - optimize redstone (Alternate Current) + + // Purpur start + public boolean isNether() { @@ -14883,7 +14883,7 @@ index a2d388ff4dd85daf0ffed2161e55538842c815cd..3a1ef6f06d8911709eabdefc4f69ba76 + // Purpur end } diff --git a/src/main/java/net/minecraft/world/level/NaturalSpawner.java b/src/main/java/net/minecraft/world/level/NaturalSpawner.java -index 2dbde305124a3d0b79ce845dec0ced3fbb6f81b0..1e7cd5b79b6c0e2f07518b6149c60af01f99285b 100644 +index ffa5f8be4aefb451352e1c6db84f36adca3a044d..88b13e6eeec956c10b486e4811b1e0dae0fd990e 100644 --- a/src/main/java/net/minecraft/world/level/NaturalSpawner.java +++ b/src/main/java/net/minecraft/world/level/NaturalSpawner.java @@ -256,7 +256,7 @@ public final class NaturalSpawner { @@ -14992,7 +14992,7 @@ index 2a65c7b859b1126dbac9819a01ca2652e20498a9..3192edee23b899107b17e354ddfb3159 return true; } else { diff --git a/src/main/java/net/minecraft/world/level/block/BedBlock.java b/src/main/java/net/minecraft/world/level/block/BedBlock.java -index 8677dc684bd2e0bb3cf5f77b659ce02b79627e76..59438af88fd7e83cc9a878d43084f954f030607d 100644 +index 38fcde81d797dc46409f5a9ed426fe296d79bdfa..83fa72b5a8fde431e7035fe5cacc50e33ae506bf 100644 --- a/src/main/java/net/minecraft/world/level/block/BedBlock.java +++ b/src/main/java/net/minecraft/world/level/block/BedBlock.java @@ -106,7 +106,7 @@ public class BedBlock extends HorizontalDirectionalBlock implements EntityBlock @@ -15036,7 +15036,7 @@ index 0d92bd6f1e4f3470a62f573add3490220e60ef7a..2e89b22de852f43f2694be52043799f0 if (i != -1) { world.scheduleTick(blockposition, (Block) this, i); diff --git a/src/main/java/net/minecraft/world/level/block/Block.java b/src/main/java/net/minecraft/world/level/block/Block.java -index 57e36794623050476c361919f6b33c07f988ef66..b2ae99b9826a33e0cd736eb1bdc072afb1d74e5d 100644 +index 154b5a8520b13928686c6eb0e2481c3dd1d1de28..8c242b67f162a40311d7d987fd76771c38c3eadb 100644 --- a/src/main/java/net/minecraft/world/level/block/Block.java +++ b/src/main/java/net/minecraft/world/level/block/Block.java @@ -63,6 +63,13 @@ import net.minecraft.world.phys.shapes.Shapes; @@ -15073,16 +15073,16 @@ index 57e36794623050476c361919f6b33c07f988ef66..b2ae99b9826a33e0cd736eb1bdc072af }); state.spawnAfterBreak((ServerLevel) world, pos, ItemStack.EMPTY, true); } -@@ -338,7 +349,7 @@ public class Block extends BlockBehaviour implements ItemLike { - event.setExpToDrop(block.getExpDrop(state, (ServerLevel) world, pos, net.minecraft.world.item.ItemStack.EMPTY, true)); // Paper - Properly handle xp dropping +@@ -339,7 +350,7 @@ public class Block extends BlockBehaviour implements ItemLike { + event.setExpToDrop(block.getExpDrop(state, serverLevel, pos, net.minecraft.world.item.ItemStack.EMPTY, true)); // Paper - Properly handle xp dropping event.callEvent(); - for (var drop : event.getDrops()) { -- popResource(world.getMinecraftWorld(), pos, org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(drop)); -+ popResource(world.getMinecraftWorld(), pos, applyDisplayNameAndLoreFromTile(org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(drop), blockEntity)); // Purpur + for (org.bukkit.inventory.ItemStack drop : event.getDrops()) { +- popResource(serverLevel, pos, org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(drop)); ++ popResource(serverLevel, pos, applyDisplayNameAndLoreFromTile(org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(drop), blockEntity)); // Purpur } - state.spawnAfterBreak(world.getMinecraftWorld(), pos, ItemStack.EMPTY, false); // Paper - Properly handle xp dropping - block.popExperience((ServerLevel) world, pos, event.getExpToDrop()); // Paper - Properly handle xp dropping -@@ -355,13 +366,53 @@ public class Block extends BlockBehaviour implements ItemLike { + state.spawnAfterBreak(serverLevel, pos, ItemStack.EMPTY, false); // Paper - Properly handle xp dropping + block.popExperience(serverLevel, pos, event.getExpToDrop()); // Paper - Properly handle xp dropping +@@ -356,13 +367,53 @@ public class Block extends BlockBehaviour implements ItemLike { // Paper end - Properly handle xp dropping if (world instanceof ServerLevel) { Block.getDrops(state, (ServerLevel) world, pos, blockEntity, entity, tool).forEach((itemstack1) -> { @@ -15137,7 +15137,7 @@ index 57e36794623050476c361919f6b33c07f988ef66..b2ae99b9826a33e0cd736eb1bdc072af public static void popResource(Level world, BlockPos pos, ItemStack stack) { double d0 = (double) EntityType.ITEM.getHeight() / 2.0D; double d1 = (double) pos.getX() + 0.5D + Mth.nextDouble(world.random, -0.25D, 0.25D); -@@ -445,7 +496,17 @@ public class Block extends BlockBehaviour implements ItemLike { +@@ -446,7 +497,17 @@ public class Block extends BlockBehaviour implements ItemLike { } // Paper - fix drops not preventing stats/food exhaustion } @@ -15156,7 +15156,7 @@ index 57e36794623050476c361919f6b33c07f988ef66..b2ae99b9826a33e0cd736eb1bdc072af public boolean isPossibleToRespawnInThis(BlockState state) { return !state.isSolid() && !state.liquid(); -@@ -464,7 +525,7 @@ public class Block extends BlockBehaviour implements ItemLike { +@@ -465,7 +526,7 @@ public class Block extends BlockBehaviour implements ItemLike { } public void fallOn(Level world, BlockState state, BlockPos pos, Entity entity, float fallDistance) { @@ -15219,7 +15219,7 @@ index bed3d9c781c7d3ca260027b4737970889a54689c..db1941ed32d141327a8b11e54b3ff990 + // Purpur end } diff --git a/src/main/java/net/minecraft/world/level/block/CactusBlock.java b/src/main/java/net/minecraft/world/level/block/CactusBlock.java -index 88ca50038b483fe5c207ef5c2bf3ea87540e147e..6e00deca805e13c1904c8cbd47e58938be89d2fe 100644 +index 232a3a0332d8d2c1ec625f3f2155316c69d95153..d74cc541a1aefe6518f02923d90b34a0b11df6d1 100644 --- a/src/main/java/net/minecraft/world/level/block/CactusBlock.java +++ b/src/main/java/net/minecraft/world/level/block/CactusBlock.java @@ -23,7 +23,7 @@ import net.minecraft.world.phys.shapes.CollisionContext; @@ -15328,7 +15328,7 @@ index cdd7ab3fe589d089c0c03508721f46f6c136fc8a..6f148028c0fe503e9f6b327596d0954c entity.moveTo((double) pos.getX() + 0.5D, (double) pos.getY() + 0.05D, (double) pos.getZ() + 0.5D, 0.0F, 0.0F); // CraftBukkit start diff --git a/src/main/java/net/minecraft/world/level/block/CauldronBlock.java b/src/main/java/net/minecraft/world/level/block/CauldronBlock.java -index 274dc56a71fb05060de42169df34dfd8097f2b62..a09fd5fbf7923c721d7a89a4e7e17bf88c7cc8e3 100644 +index 47b6b83842201620bd6620f5acf11bb14334e35d..b4d2499ae39fd3f14b2600a9663ea8a823bdfbe4 100644 --- a/src/main/java/net/minecraft/world/level/block/CauldronBlock.java +++ b/src/main/java/net/minecraft/world/level/block/CauldronBlock.java @@ -36,7 +36,7 @@ public class CauldronBlock extends AbstractCauldronBlock { @@ -15341,7 +15341,7 @@ index 274dc56a71fb05060de42169df34dfd8097f2b62..a09fd5fbf7923c721d7a89a4e7e17bf8 @Override diff --git a/src/main/java/net/minecraft/world/level/block/CaveVinesBlock.java b/src/main/java/net/minecraft/world/level/block/CaveVinesBlock.java -index 788d8a04398482fdfd0fe89e519b2a6c57410ec3..9bd149d315c2448c71c5dfef609d3b0d4651ff87 100644 +index 1ec8c2d24ec8468d20f322d67143b9454ff266eb..558f243ee0923af9a8cb9e1bb6f4a0e5c8341fe4 100644 --- a/src/main/java/net/minecraft/world/level/block/CaveVinesBlock.java +++ b/src/main/java/net/minecraft/world/level/block/CaveVinesBlock.java @@ -95,4 +95,11 @@ public class CaveVinesBlock extends GrowingPlantHeadBlock implements Bonemealabl @@ -15370,7 +15370,7 @@ index daae7fd6e0148cfba8e359d990748a0c83a3376e..0e06b1bcd906e92c083dc74d56d6d0a2 return random.nextFloat() < f1 ? this.getNext(state) : Optional.empty(); } diff --git a/src/main/java/net/minecraft/world/level/block/ChestBlock.java b/src/main/java/net/minecraft/world/level/block/ChestBlock.java -index 9804ee2020e5cef23d3f5174d153fc149e611503..3a5e5cf88c5592e1bc3e6dc9eced2d1dd47bd145 100644 +index 305bce4d833116cc21e64fdcdfe13f03e94ff4ba..58838f3c443f80eb53c33f8aa764645240263da2 100644 --- a/src/main/java/net/minecraft/world/level/block/ChestBlock.java +++ b/src/main/java/net/minecraft/world/level/block/ChestBlock.java @@ -358,6 +358,7 @@ public class ChestBlock extends AbstractChestBlock implements @@ -15382,7 +15382,7 @@ index 9804ee2020e5cef23d3f5174d153fc149e611503..3a5e5cf88c5592e1bc3e6dc9eced2d1d return world.getBlockState(blockposition1).isRedstoneConductor(world, blockposition1); diff --git a/src/main/java/net/minecraft/world/level/block/ComposterBlock.java b/src/main/java/net/minecraft/world/level/block/ComposterBlock.java -index f991a3f0ba55aeb99138038618f80bd33a5f10c2..f29d1979c65f466fa726e72818ce9ccb2505b2ce 100644 +index 689ba0cc4d3571efc2664e45fde00af724007934..1eebce1bb69dbf8888e5ad3818af3bff43c0ff93 100644 --- a/src/main/java/net/minecraft/world/level/block/ComposterBlock.java +++ b/src/main/java/net/minecraft/world/level/block/ComposterBlock.java @@ -238,20 +238,28 @@ public class ComposterBlock extends Block implements WorldlyContainerHolder { @@ -15653,7 +15653,7 @@ index ddca14f1224327a738415fb8b37398d8df0aa9c8..fe3236295790b9e250486835176cae81 }, CONTAINER_TITLE)); player.awardStat(Stats.OPEN_ENDERCHEST); diff --git a/src/main/java/net/minecraft/world/level/block/FarmBlock.java b/src/main/java/net/minecraft/world/level/block/FarmBlock.java -index 47eb8bf604a63259c0200cada1403dc005a6cbac..221d06a5707398ed7523229e80b2a3f965b98ae2 100644 +index 6e4c852c93f2418ea69e485ed3a10cbe3a6e3bd2..0c39126ce51439cce05747161aba43bce33a12d8 100644 --- a/src/main/java/net/minecraft/world/level/block/FarmBlock.java +++ b/src/main/java/net/minecraft/world/level/block/FarmBlock.java @@ -110,7 +110,7 @@ public class FarmBlock extends Block { @@ -15775,12 +15775,12 @@ index ef364aa171a48482a45bc18cfe730ec20c3f7be6..74971d90506aa253d5ee821b5390fb25 } } diff --git a/src/main/java/net/minecraft/world/level/block/IceBlock.java b/src/main/java/net/minecraft/world/level/block/IceBlock.java -index 19f6e36daed6af02dca3bb88bb81000268264438..24d771e4196a4ed7d93ddefdc34879b82b129469 100644 +index 9c8c1df5187daefb1c8098b4d4a0976c71a7bbfd..cf4c1097d54c84b309ab02e9892d1b9e39d57490 100644 --- a/src/main/java/net/minecraft/world/level/block/IceBlock.java +++ b/src/main/java/net/minecraft/world/level/block/IceBlock.java @@ -41,7 +41,7 @@ public class IceBlock extends HalfTransparentBlock { public void afterDestroy(Level world, BlockPos pos, ItemStack tool) { - // Paper end + // Paper end - Improve Block#breakNaturally API if (EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) == 0) { - if (world.dimensionType().ultraWarm()) { + if (world.isNether() || (world.isTheEnd() && !org.purpurmc.purpur.PurpurConfig.allowWaterPlacementInTheEnd)) { // Purpur @@ -15813,7 +15813,7 @@ index 4dbacee1930bc3955ce431e1d32353588b47afc9..a53c6ab63fd10ac94292836120152f54 + // Purpur end } diff --git a/src/main/java/net/minecraft/world/level/block/LiquidBlock.java b/src/main/java/net/minecraft/world/level/block/LiquidBlock.java -index 2bd097203f1e92d3fc343f91dc37220e09dd5066..016fe816819ab9022fd03c50427b62abbcd18b3c 100644 +index 9b3dcf1a4d4cece92a629506d341f6bfe79d13d0..0ed39daf88a98f7fa887fb45d4f7c0348a607551 100644 --- a/src/main/java/net/minecraft/world/level/block/LiquidBlock.java +++ b/src/main/java/net/minecraft/world/level/block/LiquidBlock.java @@ -139,7 +139,7 @@ public class LiquidBlock extends Block implements BucketPickup { @@ -15822,7 +15822,7 @@ index 2bd097203f1e92d3fc343f91dc37220e09dd5066..016fe816819ab9022fd03c50427b62ab public void onPlace(BlockState state, Level world, BlockPos pos, BlockState oldState, boolean notify) { - if (this.shouldSpreadLiquid(world, pos, state)) { + if (world.purpurConfig.tickFluids && this.shouldSpreadLiquid(world, pos, state)) { // Purpur - world.scheduleTick(pos, state.getFluidState().getType(), this.getFlowSpeed(world, pos)); // Paper + world.scheduleTick(pos, state.getFluidState().getType(), this.getFlowSpeed(world, pos)); // Paper - Configurable speed for water flowing over lava } @@ -167,7 +167,7 @@ public class LiquidBlock extends Block implements BucketPickup { @@ -15840,7 +15840,7 @@ index 2bd097203f1e92d3fc343f91dc37220e09dd5066..016fe816819ab9022fd03c50427b62ab public void neighborChanged(BlockState state, Level world, BlockPos pos, Block sourceBlock, BlockPos sourcePos, boolean notify) { - if (this.shouldSpreadLiquid(world, pos, state)) { + if (world.purpurConfig.tickFluids && this.shouldSpreadLiquid(world, pos, state)) { // Purpur - world.scheduleTick(pos, state.getFluidState().getType(), this.getFlowSpeed(world, pos)); // Paper + world.scheduleTick(pos, state.getFluidState().getType(), this.getFlowSpeed(world, pos)); // Paper - Configurable speed for water flowing over lava } diff --git a/src/main/java/net/minecraft/world/level/block/MagmaBlock.java b/src/main/java/net/minecraft/world/level/block/MagmaBlock.java @@ -15857,7 +15857,7 @@ index 10f5ffacc72a5e0116e2599ca83ee57a5b1ce0eb..31e6468f639de3ed0b25c3bc4ee09333 entity.hurt(world.damageSources().hotFloor(), 1.0F); org.bukkit.craftbukkit.event.CraftEventFactory.blockDamage = null; // CraftBukkit diff --git a/src/main/java/net/minecraft/world/level/block/NetherPortalBlock.java b/src/main/java/net/minecraft/world/level/block/NetherPortalBlock.java -index e6b762c70cbc08b20fc225b7731abd19c626369c..a885517bcbeec6580efd0822bd28eea0e203f779 100644 +index 1b5cc5d6aa0b4313da980ce175c54145852d0db0..f7b724696151b73343feac1ce406fca9377f2508 100644 --- a/src/main/java/net/minecraft/world/level/block/NetherPortalBlock.java +++ b/src/main/java/net/minecraft/world/level/block/NetherPortalBlock.java @@ -60,7 +60,7 @@ public class NetherPortalBlock extends Block { @@ -16157,7 +16157,7 @@ index e8b1c44da90f60cde20cda65aba2aa1e30f89d25..1ac38424a44aa2225b9bd3fa0fbbe61b int i = 15 + worldserver.random.nextInt(15) + worldserver.random.nextInt(15); diff --git a/src/main/java/net/minecraft/world/level/block/SpongeBlock.java b/src/main/java/net/minecraft/world/level/block/SpongeBlock.java -index c4667bea0708d12e228ec2a4c84fcee7e48ca08c..9e4146ecd36ff2698ee951660ed88290c80fd8f7 100644 +index 8f3cca228f8ec1ea9379fa43af4baa7b18012dd2..7e87b4299979c9e46abb582da7a8e54a36e8dfc5 100644 --- a/src/main/java/net/minecraft/world/level/block/SpongeBlock.java +++ b/src/main/java/net/minecraft/world/level/block/SpongeBlock.java @@ -58,7 +58,7 @@ public class SpongeBlock extends Block { @@ -16211,7 +16211,7 @@ index 77ae7b8ab24935d046cce1f8f7f476310876f9df..b683f3c2fcd37b17a732802738cd14be + // Purpur end } diff --git a/src/main/java/net/minecraft/world/level/block/SugarCaneBlock.java b/src/main/java/net/minecraft/world/level/block/SugarCaneBlock.java -index ceaec1776067b7635c3952025f00f13f4ea86c88..8b6c43b0a2fb4b89d6f63716e56074ef0e194e63 100644 +index 04957d461d0e968d443737068aaeec1d0bce78b2..7a283fbe4663cb321739f8e42ade4039d84e462b 100644 --- a/src/main/java/net/minecraft/world/level/block/SugarCaneBlock.java +++ b/src/main/java/net/minecraft/world/level/block/SugarCaneBlock.java @@ -20,7 +20,7 @@ import net.minecraft.world.level.material.FluidState; @@ -16349,7 +16349,7 @@ index fb180f0bcd20e51d41cfc924029c0b23d3d26258..688d161cd6725f494366c23668ebd6ff if (!world.addFreshEntity(entitywither, SpawnReason.BUILD_WITHER)) { return; diff --git a/src/main/java/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java -index f64682dc7476c25c8a14608ba156a901029e65d8..436d67bb4cf183fb4dcda892340b08de6673e173 100644 +index a1ee7133d182dcbacf474172a9f1b5c0219102c6..5f9f4125f838e7d670741b0a80c242b79724caf3 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java @@ -46,6 +46,7 @@ import net.minecraft.world.level.Level; @@ -16361,7 +16361,7 @@ index f64682dc7476c25c8a14608ba156a901029e65d8..436d67bb4cf183fb4dcda892340b08de // CraftBukkit start import org.bukkit.craftbukkit.block.CraftBlock; @@ -210,6 +211,22 @@ public abstract class AbstractFurnaceBlockEntity extends BaseContainerBlockEntit - // Paper end + // Paper end - cache burn durations } + // Purpur start @@ -16472,7 +16472,7 @@ index 416aa989ebb18a8741cc9d605a1180ab830f6643..e38a0adf5463c48311ad08b8d2e5b5c2 @Override diff --git a/src/main/java/net/minecraft/world/level/block/entity/BeaconBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/BeaconBlockEntity.java -index 6efd46c2c5a83a3e4f5ab8fee4519476de3459c0..81604d442a61002c1fa1430b9ac3867deaf94afb 100644 +index 4b81b0180dfc96fc6a88646838a886ca5b5d301b..2c2e819fb8d92e2de0b4981333219ed529138520 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/BeaconBlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/BeaconBlockEntity.java @@ -88,6 +88,16 @@ public class BeaconBlockEntity extends BlockEntity implements MenuProvider, Name @@ -16515,12 +16515,12 @@ index 6efd46c2c5a83a3e4f5ab8fee4519476de3459c0..81604d442a61002c1fa1430b9ac3867d } - if (blockEntity.levels > 0 && !blockEntity.beamSections.isEmpty()) { -+ if (blockEntity.levels > 0 && (!blockEntity.beamSections.isEmpty() || (world.purpurConfig.beaconAllowEffectsWithTintedGlass && isTintedGlass))) { - BeaconBlockEntity.applyEffects(world, pos, blockEntity.levels, blockEntity.primaryPower, blockEntity.secondaryPower, blockEntity); // Paper ++ if (blockEntity.levels > 0 && (!blockEntity.beamSections.isEmpty() || (world.purpurConfig.beaconAllowEffectsWithTintedGlass && isTintedGlass))) { // Purpur + BeaconBlockEntity.applyEffects(world, pos, blockEntity.levels, blockEntity.primaryPower, blockEntity.secondaryPower, blockEntity); // Paper - Custom beacon ranges BeaconBlockEntity.playSound(world, pos, SoundEvents.BEACON_AMBIENT); } diff --git a/src/main/java/net/minecraft/world/level/block/entity/BeehiveBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/BeehiveBlockEntity.java -index 560a6e7b7888a87011aa48d7c9a17949bf086f8d..ea0cc7fa5f034955dae55c0d08332f769eca4427 100644 +index 56b328c64bea0ffd51930d8ba15fb87a36e6d8a1..f9b4ac5acaf809e1eb9d10d87dd0e17c63d1e3c5 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/BeehiveBlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/BeehiveBlockEntity.java @@ -43,7 +43,7 @@ public class BeehiveBlockEntity extends BlockEntity { @@ -16590,7 +16590,7 @@ index 560a6e7b7888a87011aa48d7c9a17949bf086f8d..ea0cc7fa5f034955dae55c0d08332f76 int exitTickCounter; // Paper - Fix bees aging inside hives; separate counter for checking if bee should exit to reduce exit attempts final int minOccupationTicks; diff --git a/src/main/java/net/minecraft/world/level/block/entity/BlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/BlockEntity.java -index 4ce7a7947fa727e64556148f923508ce76c128c4..075aa1f0c0ced25d5c2fd8bf434915d08ac3e483 100644 +index 9ea74d37cd951e0dc76d20ed8234b5871035566c..07a83e06e9cb6e30c600445809e49a3fd23a391a 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/BlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/BlockEntity.java @@ -6,6 +6,8 @@ import net.minecraft.CrashReportCategory; @@ -16798,7 +16798,7 @@ index 65e1381bb2d10bd212463feb602c60f8fdb9ade1..b7370e64fd0d50e8725d7d5afc30af2e + // Purpur } diff --git a/src/main/java/net/minecraft/world/level/block/entity/SignBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/SignBlockEntity.java -index 6a883c185eb7ae228cb767044f7395ef1d08ab28..afd0b9b9e00a54b836e74266149e1e9c086496e2 100644 +index 927c7ea03560be0c86884cec70ee8e408e66cb07..93764bf849ad8e427bf119f6ff3dbcbcc4c2415e 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/SignBlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/SignBlockEntity.java @@ -200,16 +200,31 @@ public class SignBlockEntity extends BlockEntity implements CommandSource { // C @@ -16865,7 +16865,7 @@ index 6a883c185eb7ae228cb767044f7395ef1d08ab28..afd0b9b9e00a54b836e74266149e1e9c public CompoundTag getUpdateTag() { return this.saveWithoutMetadata(); 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 ff92b93dbffa6f3463c62d55cec535a3871ed7d8..5d9f25da1bd502b0047abc64ef7602968ee3cb20 100644 +index cc558ca79c4f442ce7aa2ada941f781da21c9f30..72a69569fab9d62c27c3ea4005c4e24816bdc5cd 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 @@ -178,6 +178,14 @@ public class TheEndGatewayBlockEntity extends TheEndPortalBlockEntity { @@ -16915,10 +16915,10 @@ index 744d91546d1a810f60a43c15ed74b4158f341a4a..354538daefa603f6df5a139b6bff87db } diff --git a/src/main/java/net/minecraft/world/level/block/state/BlockBehaviour.java b/src/main/java/net/minecraft/world/level/block/state/BlockBehaviour.java -index 7a29d43d06de9138c8db5d3f4af29d6b5dc60efc..2d4f11b173040a6fc9055890064ccd31e67d0f3a 100644 +index 2892e586146cbc560f0bcf4b9af6d0575cb0a82e..d38d8fc7ef22fb68e867cc29dab1171c9aa6ac35 100644 --- a/src/main/java/net/minecraft/world/level/block/state/BlockBehaviour.java +++ b/src/main/java/net/minecraft/world/level/block/state/BlockBehaviour.java -@@ -85,7 +85,7 @@ public abstract class BlockBehaviour implements FeatureElement { +@@ -84,7 +84,7 @@ public abstract class BlockBehaviour implements FeatureElement { protected static final Direction[] UPDATE_SHAPE_ORDER = new Direction[]{Direction.WEST, Direction.EAST, Direction.NORTH, Direction.SOUTH, Direction.DOWN, Direction.UP}; public final boolean hasCollision; @@ -16927,7 +16927,7 @@ index 7a29d43d06de9138c8db5d3f4af29d6b5dc60efc..2d4f11b173040a6fc9055890064ccd31 protected final boolean isRandomlyTicking; protected final SoundType soundType; protected final float friction; -@@ -93,7 +93,7 @@ public abstract class BlockBehaviour implements FeatureElement { +@@ -92,7 +92,7 @@ public abstract class BlockBehaviour implements FeatureElement { protected final float jumpFactor; protected final boolean dynamicShape; protected final FeatureFlagSet requiredFeatures; @@ -16949,7 +16949,7 @@ index 23dc37ff1f92951817864963bf93220d5aae91bb..af563ffb67c43b50555951fe1b5e4320 final EntityType entityType = entity.getType(); final int saveLimit = level.paperConfig().chunks.entityPerChunkSaveLimit.getOrDefault(entityType, -1); diff --git a/src/main/java/net/minecraft/world/level/levelgen/PhantomSpawner.java b/src/main/java/net/minecraft/world/level/levelgen/PhantomSpawner.java -index 0b899372d5e7ebbb490684514e8f764efb46f3d0..bb2840dd55a043eb2806921ad847c5a30cdfdf30 100644 +index 3380125f68b865977ac627579615820405bc98df..8a28952257fd6c01b0f2a4d6dffbd91c1cd1d534 100644 --- a/src/main/java/net/minecraft/world/level/levelgen/PhantomSpawner.java +++ b/src/main/java/net/minecraft/world/level/levelgen/PhantomSpawner.java @@ -49,7 +49,7 @@ public class PhantomSpawner implements CustomSpawner { @@ -16962,7 +16962,7 @@ index 0b899372d5e7ebbb490684514e8f764efb46f3d0..bb2840dd55a043eb2806921ad847c5a3 } else { int i = 0; @@ -61,10 +61,10 @@ public class PhantomSpawner implements CustomSpawner { - if (!entityplayer.isSpectator() && (!world.paperConfig().entities.behavior.phantomsDoNotSpawnOnCreativePlayers || !entityplayer.isCreative())) { // Paper + if (!entityplayer.isSpectator() && (!world.paperConfig().entities.behavior.phantomsDoNotSpawnOnCreativePlayers || !entityplayer.isCreative())) { // Paper - Add phantom creative and insomniac controls BlockPos blockposition = entityplayer.blockPosition(); - if (!world.dimensionType().hasSkyLight() || blockposition.getY() >= world.getSeaLevel() && world.canSeeSky(blockposition)) { @@ -16982,12 +16982,12 @@ index 0b899372d5e7ebbb490684514e8f764efb46f3d0..bb2840dd55a043eb2806921ad847c5a3 + int k = world.purpurConfig.phantomSpawnMinPerAttempt + world.random.nextInt((world.purpurConfig.phantomSpawnMaxPerAttempt < 0 ? difficultydamagescaler.getDifficulty().getId() : world.purpurConfig.phantomSpawnMaxPerAttempt - world.purpurConfig.phantomSpawnMinPerAttempt) + 1); // Purpur for (int l = 0; l < k; ++l) { - // Paper start + // Paper start - PhantomPreSpawnEvent diff --git a/src/main/java/net/minecraft/world/level/material/FlowingFluid.java b/src/main/java/net/minecraft/world/level/material/FlowingFluid.java -index b402547e8189d24a0f1da67187ddd9b4b7c66059..0d00c6bc0b4b78c98a8142d6fe57cc1c66b651a7 100644 +index 05273fa3b59d67858abffcb1ff18a6ff5885c316..6b27719bed1963183015207b21bfd4d6cc84e020 100644 --- a/src/main/java/net/minecraft/world/level/material/FlowingFluid.java +++ b/src/main/java/net/minecraft/world/level/material/FlowingFluid.java -@@ -228,7 +228,7 @@ public abstract class FlowingFluid extends Fluid { +@@ -227,7 +227,7 @@ public abstract class FlowingFluid extends Fluid { } } @@ -16996,7 +16996,7 @@ index b402547e8189d24a0f1da67187ddd9b4b7c66059..0d00c6bc0b4b78c98a8142d6fe57cc1c BlockState iblockdata2 = world.getBlockState(pos.below()); FluidState fluid1 = iblockdata2.getFluidState(); -@@ -337,6 +337,12 @@ public abstract class FlowingFluid extends Fluid { +@@ -336,6 +336,12 @@ public abstract class FlowingFluid extends Fluid { protected abstract boolean canConvertToSource(Level world); @@ -17055,7 +17055,7 @@ index cde93efaecd42b9081405638af3ba91cb5e184c9..c664fd77dd865037293a3e86699fd1fa @Override protected void beforeDestroyingBlock(LevelAccessor world, BlockPos pos, BlockState state, BlockPos source) { diff --git a/src/main/java/net/minecraft/world/level/pathfinder/WalkNodeEvaluator.java b/src/main/java/net/minecraft/world/level/pathfinder/WalkNodeEvaluator.java -index 2aca9b193db5dadc4fb90b8d7548277b698924aa..29ec2f9a35dd73e8a6adf2e4edcfe543270520d8 100644 +index 70c7c735fdd0c1b66243915622e47eab8a57e7cc..996bd26e95e766ce4ca7e61d060881feb9dd4a89 100644 --- a/src/main/java/net/minecraft/world/level/pathfinder/WalkNodeEvaluator.java +++ b/src/main/java/net/minecraft/world/level/pathfinder/WalkNodeEvaluator.java @@ -241,7 +241,7 @@ public class WalkNodeEvaluator extends NodeEvaluator { @@ -17070,7 +17070,7 @@ index 2aca9b193db5dadc4fb90b8d7548277b698924aa..29ec2f9a35dd73e8a6adf2e4edcfe543 @@ -471,7 +471,7 @@ public class WalkNodeEvaluator extends NodeEvaluator { return BlockPathTypes.BLOCKED; } else { - // Paper end + // Paper end - Do not load chunks during pathfinding - if (blockState.is(Blocks.CACTUS) || blockState.is(Blocks.SWEET_BERRY_BUSH)) { + if (blockState.is(Blocks.CACTUS) || blockState.is(Blocks.SWEET_BERRY_BUSH) || blockState.is(Blocks.STONECUTTER)) { // Purpur return BlockPathTypes.DANGER_OTHER; @@ -17086,10 +17086,10 @@ index 2aca9b193db5dadc4fb90b8d7548277b698924aa..29ec2f9a35dd73e8a6adf2e4edcfe543 return BlockPathTypes.STICKY_HONEY; } else if (blockState.is(Blocks.COCOA)) { diff --git a/src/main/java/net/minecraft/world/level/portal/PortalShape.java b/src/main/java/net/minecraft/world/level/portal/PortalShape.java -index 590cd053a1b1c2a489772a2879998725fe0d783c..ba3f79cc1f7e672f0a9d32d262122ec6eba22b97 100644 +index 912cee9ec45876f831ca230b59a1be3b48ce6aa5..46910a3bdacc9df1835e16b300f9e107744d2660 100644 --- a/src/main/java/net/minecraft/world/level/portal/PortalShape.java +++ b/src/main/java/net/minecraft/world/level/portal/PortalShape.java -@@ -34,7 +34,7 @@ public class PortalShape { +@@ -33,7 +33,7 @@ public class PortalShape { private static final int MIN_HEIGHT = 3; public static final int MAX_HEIGHT = 21; private static final BlockBehaviour.StatePredicate FRAME = (iblockdata, iblockaccess, blockposition) -> { @@ -17144,10 +17144,52 @@ index 67d595f75e0c3bffdb27b85b25ccd1f0bf1427d5..4d0c524af87d05dbd4a923ad6c40e1f2 + // Purpur } diff --git a/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java b/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java -index 2bbc39c257965ad91ee360cdfcd3538a0f041c7e..91fbc0cfc84045e32a4ee16fba8164de7901c7e6 100644 +index 4a875bce9563f3b9351ebecde9b0eb1287beb50e..d3fd9a8752e501f45c154e28d8ffd49b01514979 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java -@@ -567,4 +567,213 @@ public class CraftOfflinePlayer implements OfflinePlayer, ConfigurationSerializa +@@ -335,14 +335,26 @@ public class CraftOfflinePlayer implements OfflinePlayer, ConfigurationSerializa + + @Override + public Location getLocation() { ++ // Purpur start ++ if (this.isOnline()) { ++ return this.getPlayer().getLocation(); ++ } ++ // Purpur end ++ + CompoundTag data = this.getData(); + if (data == null) { + return null; + } + +- if (data.contains("Pos") && data.contains("Rotation")) { +- ListTag position = (ListTag) data.get("Pos"); +- ListTag rotation = (ListTag) data.get("Rotation"); ++ // Purpur start - OfflinePlayer API ++ //if (data.contains("Pos") && data.contains("Rotation")) { ++ ListTag position = data.getList("Pos", net.minecraft.nbt.Tag.TAG_DOUBLE); ++ ListTag rotation = data.getList("Rotation", net.minecraft.nbt.Tag.TAG_FLOAT); ++ ++ if (position.isEmpty() && rotation.isEmpty()) { ++ return null; ++ } ++ // Purpur end - OfflinePlayer API + + UUID uuid = new UUID(data.getLong("WorldUUIDMost"), data.getLong("WorldUUIDLeast")); + +@@ -353,9 +365,9 @@ public class CraftOfflinePlayer implements OfflinePlayer, ConfigurationSerializa + rotation.getFloat(0), + rotation.getFloat(1) + ); +- } ++ //} // Purpur - OfflinePlayer API + +- return null; ++ //return null; // Purpur - OfflinePlayer API + } + + @Override +@@ -598,4 +610,191 @@ public class CraftOfflinePlayer implements OfflinePlayer, ConfigurationSerializa manager.save(); } } @@ -17268,28 +17310,6 @@ index 2bbc39c257965ad91ee360cdfcd3538a0f041c7e..91fbc0cfc84045e32a4ee16fba8164de + } + + @Override -+ public Location getLocation() { -+ if (this.isOnline()) { -+ return this.getPlayer().getLocation(); -+ } else { -+ CompoundTag data = this.getData(); -+ if (data == null) return null; -+ long worldUUIDMost = data.getLong("WorldUUIDMost"); -+ long worldUUIDLeast = data.getLong("WorldUUIDLeast"); -+ net.minecraft.nbt.ListTag position = data.getList("Pos", org.bukkit.craftbukkit.util.CraftMagicNumbers.NBT.TAG_DOUBLE); -+ net.minecraft.nbt.ListTag rotation = data.getList("Rotation", org.bukkit.craftbukkit.util.CraftMagicNumbers.NBT.TAG_FLOAT); -+ UUID worldUuid = new UUID(worldUUIDMost, worldUUIDLeast); -+ org.bukkit.World world = server.getWorld(worldUuid); -+ double x = position.getDouble(0); -+ double y = position.getDouble(1); -+ double z = position.getDouble(2); -+ float yaw = rotation.getFloat(0); -+ float pitch = rotation.getFloat(1); -+ return new Location(world, x, y, z, yaw, pitch); -+ } -+ } -+ -+ @Override + public boolean teleportOffline(Location destination) { + if (this.isOnline()) { + return this.getPlayer().teleport(destination); @@ -17362,7 +17382,7 @@ index 2bbc39c257965ad91ee360cdfcd3538a0f041c7e..91fbc0cfc84045e32a4ee16fba8164de + // Purpur end - OfflinePlayer API } diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 6eb24411388dc80dea275850e2693940e5306e98..864c62d6c84da666adfba105e3fb5c0ca0341889 100644 +index adcc3a2f2777b9810433bd9156f43c692754a07d..3be29ecb26bf46ad8873fc948c8d19118779d88d 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -402,6 +402,20 @@ public final class CraftServer implements Server { @@ -17410,7 +17430,7 @@ index 6eb24411388dc80dea275850e2693940e5306e98..864c62d6c84da666adfba105e3fb5c0c this.overrideAllCommandBlockCommands = this.commandsConfiguration.getStringList("command-block-overrides").contains("*"); this.ignoreVanillaPermissions = this.commandsConfiguration.getBoolean("ignore-vanilla-permissions"); -@@ -1574,6 +1591,55 @@ public final class CraftServer implements Server { +@@ -1573,6 +1590,55 @@ public final class CraftServer implements Server { return true; } @@ -17466,15 +17486,7 @@ index 6eb24411388dc80dea275850e2693940e5306e98..864c62d6c84da666adfba105e3fb5c0c @Override public List getRecipesFor(ItemStack result) { Preconditions.checkArgument(result != null, "ItemStack cannot be null"); -@@ -2973,6 +3039,7 @@ public final class CraftServer implements Server { - @Override - public double[] getTPS() { - return new double[] { -+ net.minecraft.server.MinecraftServer.getServer().tps5s.getAverage(), // Purpur - net.minecraft.server.MinecraftServer.getServer().tps1.getAverage(), - net.minecraft.server.MinecraftServer.getServer().tps5.getAverage(), - net.minecraft.server.MinecraftServer.getServer().tps15.getAverage() -@@ -3065,6 +3132,18 @@ public final class CraftServer implements Server { +@@ -3013,6 +3079,18 @@ public final class CraftServer implements Server { } // Gale end - Gale configuration - API @@ -17493,7 +17505,7 @@ index 6eb24411388dc80dea275850e2693940e5306e98..864c62d6c84da666adfba105e3fb5c0c @Override public void restart() { org.spigotmc.RestartCommand.restart(); -@@ -3305,4 +3384,15 @@ public final class CraftServer implements Server { +@@ -3299,4 +3377,15 @@ public final class CraftServer implements Server { } // Gale end - YAPFA - last tick time - API @@ -17510,10 +17522,10 @@ index 6eb24411388dc80dea275850e2693940e5306e98..864c62d6c84da666adfba105e3fb5c0c + // Purpur end } diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -index d2b2f892677bfcbc2b22dc1256ec5fabce81d06f..4b222fc6a4824caffef4aad78092bd02a8892026 100644 +index b8a14d98dee0945aa0e913ace3de3c401a4ef665..9fc292c4767b6275b17d0657b4289327ebaeaefe 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -@@ -2415,6 +2415,48 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -2375,6 +2375,48 @@ public class CraftWorld extends CraftRegionAccessor implements World { return (this.getHandle().getDragonFight() == null) ? null : new CraftDragonBattle(this.getHandle().getDragonFight()); } @@ -17563,7 +17575,7 @@ index d2b2f892677bfcbc2b22dc1256ec5fabce81d06f..4b222fc6a4824caffef4aad78092bd02 public PersistentDataContainer getPersistentDataContainer() { return this.persistentDataContainer; diff --git a/src/main/java/org/bukkit/craftbukkit/Main.java b/src/main/java/org/bukkit/craftbukkit/Main.java -index f0953c110177a3000d857dea49cc1a4b88db1c2f..ff921eeb4d7d5791794484315bf751629307ac62 100644 +index 4ef9e98891a85e4b81f7d3f011bee5ad0eaee4f9..94a998b877e3cfff0477cbef4400ca4113e7681d 100644 --- a/src/main/java/org/bukkit/craftbukkit/Main.java +++ b/src/main/java/org/bukkit/craftbukkit/Main.java @@ -195,6 +195,14 @@ public class Main { @@ -17703,10 +17715,10 @@ index 4e56018b64d11f76c8da43fd8f85c6de72204e36..aa8212432825db65cf485cd93f734ccd @Override diff --git a/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java b/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java -index 92465b2a9f1483be76004c9f80a1fe15913b3b8b..593e7fc97559e18df13bece888616d03bd534971 100644 +index 5b7579395e61684592758f408d61cffe57f8b21d..015ea2ecac493c88f45d6ad66c2ef346252b4ec8 100644 --- a/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java +++ b/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java -@@ -80,6 +80,8 @@ public class CraftEnchantment extends Enchantment { +@@ -71,6 +71,8 @@ public class CraftEnchantment extends Enchantment implements Handleable EnchantmentTarget.TRIDENT; case CROSSBOW -> EnchantmentTarget.CROSSBOW; case VANISHABLE -> EnchantmentTarget.VANISHABLE; @@ -17735,7 +17747,7 @@ index d657fd2c507a5b215aeab0a5f3e9c2ee892a27c8..985e9ec21c60a1f47973bd5fc53b96a6 // Paper start @Override diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java -index 1c3e1153d08b59d29b3613fc3b50a4780aa7a3ac..ea5ac1f53309fdd30aad40fd4a092f297d76fd61 100644 +index 8698104e3eb98e2cc5da5de87a8f538860c1d91d..9304a2d06400dfa244ddb4d9591de988b334c3cf 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java @@ -83,6 +83,11 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { @@ -17790,7 +17802,7 @@ index 1c3e1153d08b59d29b3613fc3b50a4780aa7a3ac..ea5ac1f53309fdd30aad40fd4a092f29 + // Purpur end } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java -index 827fe201a7b74f485abb46b127a28bf0cb479c3b..00f64a0ce2d32bf8b9a627495c043297e013633c 100644 +index acbb64010cd59668aa1bcb52ff1220789cadb1d3..6c2e91b986099027d83aba85f14ae69cbc358348 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java @@ -266,6 +266,7 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { @@ -17824,7 +17836,7 @@ index 63cae1a2e95d8da17c45c4404a8dd0ca6a413c39..966587c2788b5c93be83259ddc962a89 + // Purpur end } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java -index 81498941748d646ebe6495f4a7ce6953532144c6..df1f7bd8d2e1ef29cc65443bc8f929acd4bcdc53 100644 +index 832def3c518be8d6d81e71f6022566e6179e2d17..c853a2464bbab46cd3f30dc12e1096b1e39a438c 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java @@ -151,4 +151,46 @@ public class CraftItem extends CraftEntity implements Item { @@ -17875,7 +17887,7 @@ index 81498941748d646ebe6495f4a7ce6953532144c6..df1f7bd8d2e1ef29cc65443bc8f929ac + // Purpur end } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java -index 1f1ef68a9a449a4a90c284f34a397ab4b6d905f6..d46fbc76fd6934e3c19a9ef237f759c0488da040 100644 +index 4afc1c9d2a7638e84a55fe30932dc36db465c31a..eeea7b8b6436cc0ff7a940f64a7d1dd321f0cba4 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java @@ -452,7 +452,7 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { @@ -17942,10 +17954,10 @@ index 0ad16ee7b33582d214dab41eeee378d52c8e38ed..16bd1294c219f15ada653ef810bc2d74 + // Purpur end } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index e7ec441824e034a488deeede093cb9ea7add7c3e..b1121abf9249d758bb2499f2d2b383a3fd91bcad 100644 +index 39b25c2478eadd373383a3445a7f27ea30d18550..f16d150526c99b8a280ec681f8eb548419691357 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -524,10 +524,15 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -482,10 +482,15 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @Override public void setPlayerListName(String name) { @@ -17962,7 +17974,7 @@ index e7ec441824e034a488deeede093cb9ea7add7c3e..b1121abf9249d758bb2499f2d2b383a3 for (ServerPlayer player : (List) this.server.getHandle().players) { if (player.getBukkitEntity().canSee(this)) { player.connection.send(new ClientboundPlayerInfoUpdatePacket(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_DISPLAY_NAME, this.getHandle())); -@@ -1363,6 +1368,10 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -1321,6 +1326,10 @@ public class CraftPlayer extends CraftHumanEntity implements Player { } if (entity.isVehicle() && !ignorePassengers) { // Paper - Teleport API @@ -17973,7 +17985,7 @@ index e7ec441824e034a488deeede093cb9ea7add7c3e..b1121abf9249d758bb2499f2d2b383a3 return false; } -@@ -2637,6 +2646,28 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -2610,6 +2619,28 @@ public class CraftPlayer extends CraftHumanEntity implements Player { return this.getHandle().getAbilities().walkingSpeed * 2f; } @@ -18002,10 +18014,10 @@ index e7ec441824e034a488deeede093cb9ea7add7c3e..b1121abf9249d758bb2499f2d2b383a3 private void validateSpeed(float value) { Preconditions.checkArgument(value <= 1f && value >= -1f, "Speed value (%s) need to be between -1f and 1f", value); } -@@ -3373,4 +3404,70 @@ public class CraftPlayer extends CraftHumanEntity implements Player { - return this.spigot; +@@ -3376,4 +3407,70 @@ public class CraftPlayer extends CraftHumanEntity implements Player { + public void setSendViewDistance(final int viewDistance) { + this.getHandle().setSendViewDistance(viewDistance); } - // Spigot end + + // Purpur start + @Override @@ -18155,7 +18167,7 @@ index 38b6d2c377800134de592a780b737b45c8096a11..449acd9dc983be1cd51208bc8f8d843d + // Purpur end } diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java -index 55c26840957f69860816c917c16f59d02074b388..b3d8e795683ab186295902aba7d476a689ff0f3f 100644 +index 23b4b5d63d45108534bde330079c7a12b3aa4f5f..038461f693e38a26b16f465ce43a6661ea91c345 100644 --- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java @@ -591,6 +591,15 @@ public class CraftEventFactory { @@ -19060,10 +19072,10 @@ index 0000000000000000000000000000000000000000..b12437a7e292fbf9aefc7a41b5bc1695 +} diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java new file mode 100644 -index 0000000000000000000000000000000000000000..9d10d7f4b71026d79d469f82d09c77f84dafd604 +index 0000000000000000000000000000000000000000..359dc08ffa2c89f5194387d01b42c3aec536e117 --- /dev/null +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -0,0 +1,3288 @@ +@@ -0,0 +1,3290 @@ +package org.purpurmc.purpur; + +import net.minecraft.core.registries.BuiltInRegistries; @@ -21948,6 +21960,7 @@ index 0000000000000000000000000000000000000000..9d10d7f4b71026d79d469f82d09c77f8 + public int villagerMinimumDemand = 0; + public boolean villagerLobotomizeEnabled = false; + public int villagerLobotomizeCheckInterval = 100; ++ public boolean villagerLobotomizeWaitUntilTradeLocked = false; + public boolean villagerDisplayTradeItem = true; + public int villagerSpawnIronGolemRadius = 0; + public int villagerSpawnIronGolemLimit = 0; @@ -21983,6 +21996,7 @@ index 0000000000000000000000000000000000000000..9d10d7f4b71026d79d469f82d09c77f8 + } + villagerLobotomizeEnabled = getBoolean("mobs.villager.lobotomize.enabled", villagerLobotomizeEnabled); + villagerLobotomizeCheckInterval = getInt("mobs.villager.lobotomize.check-interval", villagerLobotomizeCheckInterval); ++ villagerLobotomizeWaitUntilTradeLocked = getBoolean("mobs.villager.lobotomize.wait-until-trade-locked", villagerLobotomizeWaitUntilTradeLocked); + villagerDisplayTradeItem = getBoolean("mobs.villager.display-trade-item", villagerDisplayTradeItem); + villagerSpawnIronGolemRadius = getInt("mobs.villager.spawn-iron-golem.radius", villagerSpawnIronGolemRadius); + villagerSpawnIronGolemLimit = getInt("mobs.villager.spawn-iron-golem.limit", villagerSpawnIronGolemLimit); @@ -24619,7 +24633,7 @@ index 0000000000000000000000000000000000000000..b7586f494528f30eb0da82420d3bcf5b + } +} diff --git a/src/main/java/org/spigotmc/ActivationRange.java b/src/main/java/org/spigotmc/ActivationRange.java -index ece01155a8281fb40ae3696d511fb317d68635aa..fb8260a1801f7f11a13b4310b0c7ccd963854591 100644 +index 2833c1ebc3a4d0e268527d1fcf2c74b5b5038c82..d88d553fc5b9d9e13d24d94275ed5b9c91d5e41f 100644 --- a/src/main/java/org/spigotmc/ActivationRange.java +++ b/src/main/java/org/spigotmc/ActivationRange.java @@ -15,6 +15,7 @@ import net.minecraft.world.entity.ambient.AmbientCreature; @@ -24638,7 +24652,7 @@ index ece01155a8281fb40ae3696d511fb317d68635aa..fb8260a1801f7f11a13b4310b0c7ccd9 // Paper start int worldHeight = world.getHeight(); ActivationRange.maxBB = player.getBoundingBox().inflate( maxRange, worldHeight, maxRange ); -@@ -415,6 +417,7 @@ public class ActivationRange +@@ -414,6 +416,7 @@ public class ActivationRange */ public static boolean checkIfActive(Entity entity) { diff --git a/patches/server/0010-Purpur-Configurable-server-mod-name.patch b/patches/server/0010-Purpur-Configurable-server-mod-name.patch index a4ae7dab..c3670ffd 100644 --- a/patches/server/0010-Purpur-Configurable-server-mod-name.patch +++ b/patches/server/0010-Purpur-Configurable-server-mod-name.patch @@ -7,15 +7,15 @@ 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 2e8c390a0b1a4342bfdfca5bee3a2eeef2ac9beb..3e38c0b186d49ecb8e3408f7c005da37cc64e1c9 100644 +index 330f0f66ab16c88b2a827f09f99c42671a53a410..b0e87f3df1985c84d013db2a67c7e1b5b528a6fa 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1842,7 +1842,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop // Paper - Paper > // Spigot - Spigot > // CraftBukkit - cb > vanilla! -+ return org.dreeam.leaf.LeafConfig.serverModName; // Leaf - Leaf > // Gale - branding changes - Gale > // Paper - Paper > // Spigot - Spigot > // CraftBukkit - cb > vanilla! +- return "Gale"; // Paper // Gale - branding changes ++ return org.dreeam.leaf.LeafConfig.serverModName; // Paper // Gale - branding changes // Leaf } public SystemReport fillSystemReport(SystemReport details) { diff --git a/patches/server/0011-Configurable-server-Gui-name.patch b/patches/server/0011-Configurable-server-Gui-name.patch index 84da8775..d8893abb 100644 --- a/patches/server/0011-Configurable-server-Gui-name.patch +++ b/patches/server/0011-Configurable-server-Gui-name.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Configurable server Gui name diff --git a/src/main/java/net/minecraft/server/gui/MinecraftServerGui.java b/src/main/java/net/minecraft/server/gui/MinecraftServerGui.java -index 64e12201e164f4dc8070711605dcfcb6e56421f6..4eb4d9eebe72089faaf6683103ef44e5e024c3f3 100644 +index 7f07ffab0835d45d4d170fe171d7fa996d5913d9..0f20cb3dcf4aac8a8c6cd7408808dec962869c1a 100644 --- a/src/main/java/net/minecraft/server/gui/MinecraftServerGui.java +++ b/src/main/java/net/minecraft/server/gui/MinecraftServerGui.java @@ -56,7 +56,7 @@ public class MinecraftServerGui extends JComponent { @@ -21,20 +21,20 @@ index 64e12201e164f4dc8070711605dcfcb6e56421f6..4eb4d9eebe72089faaf6683103ef44e5 jframe.pack(); jframe.setLocationRelativeTo((Component) null); jframe.setVisible(true); -- jframe.setName("Purpur Minecraft server"); // Paper // Purpur -+ jframe.setName(org.dreeam.leaf.LeafConfig.serverGuiName); // Paper // Purpur // Leaf - Configurable server Gui name +- jframe.setName("Purpur Minecraft server"); // Paper - Improve ServerGUI // Purpur ++ jframe.setName(org.dreeam.leaf.LeafConfig.serverGuiName); // Paper - Improve ServerGUI // Purpur // Leaf - Configurable server Gui name - // Paper start - Add logo as frame image + // Paper start - Improve ServerGUI try { diff --git a/src/main/java/org/dreeam/leaf/LeafConfig.java b/src/main/java/org/dreeam/leaf/LeafConfig.java -index 80a196442edbc6b4eb44bb6a405100871aea2f6a..d6db0ecadf840fd0957f4a7da92ca78c180b58fa 100644 +index 80a196442edbc6b4eb44bb6a405100871aea2f6a..c3c186a561442351ef7e1146ae09f3b5be900dbc 100644 --- a/src/main/java/org/dreeam/leaf/LeafConfig.java +++ b/src/main/java/org/dreeam/leaf/LeafConfig.java @@ -165,8 +165,10 @@ public class LeafConfig { } public static String serverModName = "Leaf"; -+ public static String serverGuiName = "Leaf Minecraft server"; ++ public static String serverGuiName = "Leaf Console"; private static void serverModName() { serverModName = getString("server-mod-name", serverModName); + serverGuiName = getString("server-Gui-name", serverGuiName); diff --git a/patches/server/0012-Remove-Timings.patch b/patches/server/0012-Remove-Timings.patch index 14d70844..3a83dcab 100644 --- a/patches/server/0012-Remove-Timings.patch +++ b/patches/server/0012-Remove-Timings.patch @@ -194,10 +194,10 @@ index 4b467f1af93452d13829f756d55dee18b8889d40..00000000000000000000000000000000 -} diff --git a/src/main/java/co/aikar/timings/TimingsExport.java b/src/main/java/co/aikar/timings/TimingsExport.java deleted file mode 100644 -index 61fc65624f7d9a3bfa399a58112efb7f55b31652..0000000000000000000000000000000000000000 +index 0756ee94251620d591cd11e935c579559afab589..0000000000000000000000000000000000000000 --- a/src/main/java/co/aikar/timings/TimingsExport.java +++ /dev/null -@@ -1,453 +0,0 @@ +@@ -1,451 +0,0 @@ -/* - * This file is licensed under the MIT License (MIT). - * @@ -421,11 +421,9 @@ index 61fc65624f7d9a3bfa399a58112efb7f55b31652..00000000000000000000000000000000 - pair("gamerules", toObjectMapper(world.getWorld().getGameRules(), rule -> { - return pair(rule, world.getWorld().getGameRuleValue(rule)); - })), -- // Paper start - replace chunk loader system - pair("ticking-distance", world.getWorld().getSimulationDistance()), - pair("no-ticking-distance", world.getWorld().getViewDistance()), - pair("sending-distance", world.getWorld().getSendViewDistance()) -- // Paper end - replace chunk loader system - )); - })); - @@ -941,7 +939,7 @@ index 3e2d5dcd62775b6ed7c0ce0ba51a71b635b1d644..deca974c2a82bc341fe23ea46f61f42f } catch (Exception exception) { label25: diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 3e38c0b186d49ecb8e3408f7c005da37cc64e1c9..7334b13af92d7a323dd24a14102b789c10dfbb4f 100644 +index b0e87f3df1985c84d013db2a67c7e1b5b528a6fa..b2dee5866f44dfedad37827257b56818d9f6b00f 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -178,8 +178,6 @@ import org.bukkit.craftbukkit.Main; @@ -953,15 +951,15 @@ index 3e38c0b186d49ecb8e3408f7c005da37cc64e1c9..7334b13af92d7a323dd24a14102b789c public abstract class MinecraftServer extends ReentrantBlockableEventLoop implements ServerInfo, CommandSource, AutoCloseable { public static final int SERVER_THREAD_PRIORITY = Integer.getInteger("gale.thread.priority.server", -1); // Gale - server thread priority environment variable -@@ -961,7 +959,6 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop { return !this.canSleepForTickNoOversleep(); // Paper - move oversleep into full server tick -@@ -1406,8 +1403,6 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop { entityplayer.connection.suspendFlushing(); }); @@ -1037,7 +1035,7 @@ index 3e38c0b186d49ecb8e3408f7c005da37cc64e1c9..7334b13af92d7a323dd24a14102b789c // Paper start - Folia scheduler API ((io.papermc.paper.threadedregions.scheduler.FoliaGlobalRegionScheduler) Bukkit.getGlobalRegionScheduler()).tick(); getAllLevels().forEach(level -> { -@@ -1655,20 +1638,15 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0; // Purpur -@@ -1708,14 +1685,12 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop list = Lists.newArrayList(); List list1 = this.level.players(); ObjectIterator objectiterator = this.entityMap.values().iterator(); @@ -1224,7 +1222,7 @@ index ac564147383af02820f38ea823e083b9e74a8a3d..95add10db1d7600167312160cd1a15a7 ChunkMap.TrackedEntity playerchunkmap_entitytracker; -@@ -1206,17 +1189,14 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider +@@ -1192,17 +1175,14 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider playerchunkmap_entitytracker.serverEntity.sendChanges(); } } @@ -1243,21 +1241,21 @@ index ac564147383af02820f38ea823e083b9e74a8a3d..95add10db1d7600167312160cd1a15a7 } diff --git a/src/main/java/net/minecraft/server/level/ServerChunkCache.java b/src/main/java/net/minecraft/server/level/ServerChunkCache.java -index 58f3d1f957ec85e69b80c78e533cedc3a7ac1937..e04ab410b88f681032de4406dceac5ef51476ce1 100644 +index cd71e1127673e625746bce45174afb619ddebd3e..e841f12a43c4506f87b64b537a8c47bf54de5aa2 100644 --- a/src/main/java/net/minecraft/server/level/ServerChunkCache.java +++ b/src/main/java/net/minecraft/server/level/ServerChunkCache.java -@@ -291,10 +291,8 @@ public class ServerChunkCache extends ChunkSource { +@@ -276,10 +276,8 @@ public class ServerChunkCache extends ChunkSource { + if (!completablefuture.isDone()) { // Paper io.papermc.paper.chunk.system.scheduling.ChunkTaskScheduler.pushChunkWait(this.level, x1, z1); // Paper - rewrite chunk system - // Paper end - com.destroystokyo.paper.io.SyncLoadFinder.logSyncLoad(this.level, x1, z1); // Paper - sync load info + com.destroystokyo.paper.io.SyncLoadFinder.logSyncLoad(this.level, x, z); // Paper - Add debug for sync chunk loads - this.level.timings.syncChunkLoad.startTiming(); // Paper chunkproviderserver_b.managedBlock(completablefuture::isDone); - io.papermc.paper.chunk.system.scheduling.ChunkTaskScheduler.popChunkWait(); // Paper - async chunk debug // Paper - rewrite chunk system + io.papermc.paper.chunk.system.scheduling.ChunkTaskScheduler.popChunkWait(); // Paper - rewrite chunk system - this.level.timings.syncChunkLoad.stopTiming(); // Paper } // Paper ichunkaccess = (ChunkAccess) ((Either) completablefuture.join()).map((ichunkaccess1) -> { return ichunkaccess1; -@@ -443,17 +441,13 @@ public class ServerChunkCache extends ChunkSource { +@@ -428,17 +426,13 @@ public class ServerChunkCache extends ChunkSource { public void save(boolean flush) { this.runDistanceManagerUpdates(); @@ -1266,16 +1264,16 @@ index 58f3d1f957ec85e69b80c78e533cedc3a7ac1937..e04ab410b88f681032de4406dceac5ef - } // Paper - Timings } - // Paper start - duplicate save, but call incremental + // Paper start - Incremental chunk and player saving; duplicate save, but call incremental public void saveIncrementally() { this.runDistanceManagerUpdates(); - try (co.aikar.timings.Timing timed = level.timings.chunkSaveData.startTiming()) { // Paper - Timings this.chunkMap.saveIncrementally(); - } // Paper - Timings } - // Paper end + // Paper end - Incremental chunk and player saving -@@ -479,21 +473,15 @@ public class ServerChunkCache extends ChunkSource { +@@ -471,21 +465,15 @@ public class ServerChunkCache extends ChunkSource { @Override public void tick(BooleanSupplier shouldKeepTicking, boolean tickChunks) { @@ -1297,7 +1295,7 @@ index 58f3d1f957ec85e69b80c78e533cedc3a7ac1937..e04ab410b88f681032de4406dceac5ef this.clearCache(); } -@@ -503,8 +491,6 @@ public class ServerChunkCache extends ChunkSource { +@@ -495,8 +483,6 @@ public class ServerChunkCache extends ChunkSource { this.lastInhabitedUpdate = i; if (!this.level.isDebug()) { @@ -1306,23 +1304,23 @@ index 58f3d1f957ec85e69b80c78e533cedc3a7ac1937..e04ab410b88f681032de4406dceac5ef // Paper - optimise chunk tick iteration -@@ -516,7 +502,6 @@ public class ServerChunkCache extends ChunkSource { +@@ -508,7 +494,6 @@ public class ServerChunkCache extends ChunkSource { boolean flagAndHasNaturalSpawn = flag && this.anySpawnCategoryIsSpawnedThisTick(); if (flagAndHasNaturalSpawn) { // Gale end - MultiPaper - skip unnecessary mob spawning computations - this.level.timings.countNaturalMobs.startTiming(); // Paper - timings int k = this.distanceManager.getNaturalSpawnChunkCount(); - // Paper start - per player mob spawning + // Paper start - Optional per player mob spawns int naturalSpawnChunkCount = k; -@@ -545,7 +530,6 @@ public class ServerChunkCache extends ChunkSource { +@@ -537,7 +522,6 @@ public class ServerChunkCache extends ChunkSource { // Pufferfish end } - // Paper end + // Paper end - Optional per player mob spawns - this.level.timings.countNaturalMobs.stopTiming(); // Paper - timings //this.lastSpawnState = spawnercreature_d; // Pufferfish - this is managed asynchronously // Gale start - MultiPaper - skip unnecessary mob spawning computations -@@ -657,17 +641,13 @@ public class ServerChunkCache extends ChunkSource { +@@ -649,17 +633,13 @@ public class ServerChunkCache extends ChunkSource { } } // Paper end - optimise chunk tick iteration @@ -1340,7 +1338,7 @@ index 58f3d1f957ec85e69b80c78e533cedc3a7ac1937..e04ab410b88f681032de4406dceac5ef // Paper start - optimise chunk tick iteration if (!this.chunkMap.needsChangeBroadcasting.isEmpty()) { it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet copy = this.chunkMap.needsChangeBroadcasting.clone(); -@@ -681,7 +661,6 @@ public class ServerChunkCache extends ChunkSource { +@@ -673,7 +653,6 @@ public class ServerChunkCache extends ChunkSource { } } // Paper end - optimise chunk tick iteration @@ -1349,7 +1347,7 @@ index 58f3d1f957ec85e69b80c78e533cedc3a7ac1937..e04ab410b88f681032de4406dceac5ef } diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index d4d86b650dd305187b69820923d66003d9e46b24..dbd18a3b72cb116f636049e137464cc4922e830c 100644 +index a6a9a425aecdd58a65a926a22cd44f7a5c711007..a3b9068efc38b3eb05e884bcc3fb13532e49308d 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java @@ -1,7 +1,6 @@ @@ -1360,7 +1358,7 @@ index d4d86b650dd305187b69820923d66003d9e46b24..dbd18a3b72cb116f636049e137464cc4 import com.google.common.collect.Lists; import com.mojang.datafixers.DataFixer; import com.mojang.datafixers.util.Pair; -@@ -867,27 +866,19 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -862,27 +861,19 @@ public class ServerLevel extends Level implements WorldGenLevel { this.tickTime(); } @@ -1388,7 +1386,7 @@ index d4d86b650dd305187b69820923d66003d9e46b24..dbd18a3b72cb116f636049e137464cc4 } this.handlingTick = false; -@@ -898,13 +889,11 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -893,13 +884,11 @@ public class ServerLevel extends Level implements WorldGenLevel { } if (flag1 || this.emptyTime++ < 300) { @@ -1402,7 +1400,7 @@ index d4d86b650dd305187b69820923d66003d9e46b24..dbd18a3b72cb116f636049e137464cc4 this.entityTickList.forEach((entity) -> { entity.activatedPriorityReset = false; // Pufferfish - DAB if (!entity.isRemoved()) { -@@ -941,8 +930,6 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -936,8 +925,6 @@ public class ServerLevel extends Level implements WorldGenLevel { } } }); @@ -1411,15 +1409,15 @@ index d4d86b650dd305187b69820923d66003d9e46b24..dbd18a3b72cb116f636049e137464cc4 this.tickBlockEntities(); } -@@ -1076,7 +1063,6 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1071,7 +1058,6 @@ public class ServerLevel extends Level implements WorldGenLevel { } - } // Paper + } // Paper - Option to disable ice and snow - timings.chunkTicksBlocks.startTiming(); // Paper if (randomTickSpeed > 0) { // Paper start - optimize random block ticking LevelChunkSection[] sections = chunk.getSections(); -@@ -1109,8 +1095,6 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1104,8 +1090,6 @@ public class ServerLevel extends Level implements WorldGenLevel { } } // Paper end - optimise random block ticking @@ -1428,7 +1426,7 @@ index d4d86b650dd305187b69820923d66003d9e46b24..dbd18a3b72cb116f636049e137464cc4 } @VisibleForTesting -@@ -1440,31 +1424,21 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1435,31 +1419,21 @@ public class ServerLevel extends Level implements WorldGenLevel { currentlyTickingEntity.lazySet(entity); } // Paper end - log detailed entity tick information @@ -1460,7 +1458,7 @@ index d4d86b650dd305187b69820923d66003d9e46b24..dbd18a3b72cb116f636049e137464cc4 Iterator iterator = entity.getPassengers().iterator(); while (iterator.hasNext()) { -@@ -1472,7 +1446,6 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1467,7 +1441,6 @@ public class ServerLevel extends Level implements WorldGenLevel { this.tickPassenger(entity, entity1); } @@ -1468,7 +1466,7 @@ index d4d86b650dd305187b69820923d66003d9e46b24..dbd18a3b72cb116f636049e137464cc4 // Paper start - log detailed entity tick information } finally { if (currentlyTickingEntity.get() == entity) { -@@ -1487,9 +1460,6 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1482,9 +1455,6 @@ public class ServerLevel extends Level implements WorldGenLevel { if (passenger instanceof Player || this.entityTickList.contains(passenger)) { // Paper - EAR 2 final boolean isActive = org.spigotmc.ActivationRange.checkIfActive(passenger); @@ -1478,7 +1476,7 @@ index d4d86b650dd305187b69820923d66003d9e46b24..dbd18a3b72cb116f636049e137464cc4 passenger.setOldPosAndRot(); ++passenger.tickCount; // Paper start - EAR 2 -@@ -1510,8 +1480,6 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1505,8 +1475,6 @@ public class ServerLevel extends Level implements WorldGenLevel { this.tickPassenger(passenger, entity2); } @@ -1487,13 +1485,13 @@ index d4d86b650dd305187b69820923d66003d9e46b24..dbd18a3b72cb116f636049e137464cc4 } } else { passenger.stopRiding(); -@@ -1531,14 +1499,11 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1526,14 +1494,11 @@ public class ServerLevel extends Level implements WorldGenLevel { org.bukkit.Bukkit.getPluginManager().callEvent(new org.bukkit.event.world.WorldSaveEvent(getWorld())); } - try (co.aikar.timings.Timing ignored = this.timings.worldSave.startTiming()) { if (doFull) { - this.saveLevelData(); + this.saveLevelData(true); // Paper - Write SavedData IO async } - this.timings.worldSaveChunks.startTiming(); // Paper @@ -1502,15 +1500,15 @@ index d4d86b650dd305187b69820923d66003d9e46b24..dbd18a3b72cb116f636049e137464cc4 // Copied from save() // CraftBukkit start - moved from MinecraftServer.saveChunks -@@ -1550,7 +1515,6 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1545,7 +1510,6 @@ public class ServerLevel extends Level implements WorldGenLevel { this.convertable.saveDataTag(this.server.registryAccess(), this.serverLevelData, this.server.getPlayerList().getSingleplayerData()); } // CraftBukkit end - } } - // Paper end + // Paper end - Incremental chunk and player saving -@@ -1564,7 +1528,6 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1559,7 +1523,6 @@ public class ServerLevel extends Level implements WorldGenLevel { if (!savingDisabled) { org.bukkit.Bukkit.getPluginManager().callEvent(new org.bukkit.event.world.WorldSaveEvent(this.getWorld())); // CraftBukkit @@ -1518,7 +1516,7 @@ index d4d86b650dd305187b69820923d66003d9e46b24..dbd18a3b72cb116f636049e137464cc4 if (progressListener != null) { progressListener.progressStartNoAbort(Component.translatable("menu.savingLevel")); } -@@ -1574,11 +1537,8 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1569,11 +1532,8 @@ public class ServerLevel extends Level implements WorldGenLevel { progressListener.progressStage(Component.translatable("menu.savingChunks")); } @@ -1531,10 +1529,10 @@ index d4d86b650dd305187b69820923d66003d9e46b24..dbd18a3b72cb116f636049e137464cc4 } else if (close) { chunkproviderserver.close(false); } // Paper - rewrite chunk system diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 03b9416aa19a4fac28a1499f15cc097ef71a657e..c82101247896498e7b02a3f6b212262720e41241 100644 +index 32c04eac5936719eeb1fdd41b729e87eadbbd47f..4d1d3e10a2bea585cdd86bc641e20c89e7014c6a 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -2489,7 +2489,6 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2468,7 +2468,6 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl public void handleCommand(String s) { // Paper - private -> public org.spigotmc.AsyncCatcher.catchOp("Command Dispatched Async: " + s); // Paper - Add async catcher @@ -1542,7 +1540,7 @@ index 03b9416aa19a4fac28a1499f15cc097ef71a657e..c82101247896498e7b02a3f6b2122627 if ( org.spigotmc.SpigotConfig.logCommands ) // Spigot this.LOGGER.info(this.player.getScoreboardName() + " issued server command: " + s); -@@ -2499,7 +2498,6 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2478,7 +2477,6 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl this.cserver.getPluginManager().callEvent(event); if (event.isCancelled()) { @@ -1550,7 +1548,7 @@ index 03b9416aa19a4fac28a1499f15cc097ef71a657e..c82101247896498e7b02a3f6b2122627 return; } -@@ -2511,8 +2509,6 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2490,8 +2488,6 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl player.sendMessage(org.bukkit.ChatColor.RED + "An internal error occurred while attempting to perform this command"); java.util.logging.Logger.getLogger(ServerGamePacketListenerImpl.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); return; @@ -1560,7 +1558,7 @@ index 03b9416aa19a4fac28a1499f15cc097ef71a657e..c82101247896498e7b02a3f6b2122627 } // CraftBukkit end diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index 4652ff409ba93440f249fc2ee504e4fe6e1609de..2ac6126e1a840950e284c453f99ce704ce949c7b 100644 +index 5748ada42d5039e8f2999f1ca0a74067a1dad08f..6fe6126dd37272ddeac89087887d9fe688a6bfcc 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java @@ -1,6 +1,5 @@ @@ -1570,7 +1568,7 @@ index 4652ff409ba93440f249fc2ee504e4fe6e1609de..2ac6126e1a840950e284c453f99ce704 import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; -@@ -1338,7 +1337,6 @@ public abstract class PlayerList { +@@ -1337,7 +1336,6 @@ public abstract class PlayerList { public void saveAll(int interval) { io.papermc.paper.util.MCUtil.ensureMain("Save Players" , () -> { // Paper - Ensure main @@ -1578,16 +1576,16 @@ index 4652ff409ba93440f249fc2ee504e4fe6e1609de..2ac6126e1a840950e284c453f99ce704 int numSaved = 0; long now = MinecraftServer.currentTick; for (int i = 0; i < this.players.size(); ++i) { -@@ -1349,7 +1347,6 @@ public abstract class PlayerList { +@@ -1348,7 +1346,6 @@ public abstract class PlayerList { } - // Paper end + // Paper end - Incremental chunk and player saving } - MinecraftTimings.savePlayers.stopTiming(); // Paper return null; }); // Paper - ensure main } diff --git a/src/main/java/net/minecraft/world/entity/EntityType.java b/src/main/java/net/minecraft/world/entity/EntityType.java -index 658c6d27b828e5a1d4538136a74fc49a69b471c0..bc6940beb4bfdaba082b101e7e20f195e958c86d 100644 +index a9e2a758669550530eb29475ba99fe42e520f6ae..d617e803f47219621b6b3b42c3bb7f30eb6cb805 100644 --- a/src/main/java/net/minecraft/world/entity/EntityType.java +++ b/src/main/java/net/minecraft/world/entity/EntityType.java @@ -340,15 +340,6 @@ public class EntityType implements FeatureElement, EntityTypeT @@ -1606,7 +1604,7 @@ index 658c6d27b828e5a1d4538136a74fc49a69b471c0..bc6940beb4bfdaba082b101e7e20f195 this.builtInRegistryHolder = BuiltInRegistries.ENTITY_TYPE.createIntrusiveHolder(this); this.factory = factory; this.category = spawnGroup; -@@ -724,12 +715,6 @@ public class EntityType implements FeatureElement, EntityTypeT +@@ -720,12 +711,6 @@ public class EntityType implements FeatureElement, EntityTypeT return this.updateInterval; } @@ -1619,7 +1617,7 @@ index 658c6d27b828e5a1d4538136a74fc49a69b471c0..bc6940beb4bfdaba082b101e7e20f195 public boolean trackDeltas() { return this != EntityType.PLAYER && this != EntityType.LLAMA_SPIT && this != EntityType.WITHER && this != EntityType.BAT && this != EntityType.ITEM_FRAME && this != EntityType.GLOW_ITEM_FRAME && this != EntityType.LEASH_KNOT && this != EntityType.PAINTING && this != EntityType.END_CRYSTAL && this != EntityType.EVOKER_FANGS; } -@@ -839,7 +824,7 @@ public class EntityType implements FeatureElement, EntityTypeT +@@ -835,7 +820,7 @@ public class EntityType implements FeatureElement, EntityTypeT Util.fetchChoiceType(References.ENTITY_TREE, id); } @@ -1726,10 +1724,10 @@ index fcdb9bde8e1605e30dde3e580491522d4b62cdc0..4de18d00cc464313b777874430da3f55 } diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index 3a1ef6f06d8911709eabdefc4f69ba76bc93a409..8126df40be79b3da0b8b841477b02feae0b667fb 100644 +index 765f7034d3b1da22dd81c4186649e06fa58e50a5..36a420f8cf463dcabe5717df1af59472db3142fc 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java -@@ -179,7 +179,6 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -176,7 +176,6 @@ public abstract class Level implements LevelAccessor, AutoCloseable { public final com.destroystokyo.paper.antixray.ChunkPacketBlockController chunkPacketBlockController; // Paper - Anti-Xray public final org.purpurmc.purpur.PurpurWorldConfig purpurConfig; // Purpur @@ -1737,15 +1735,15 @@ index 3a1ef6f06d8911709eabdefc4f69ba76bc93a409..8126df40be79b3da0b8b841477b02fea public static BlockPos lastPhysicsProblem; // Spigot private org.spigotmc.TickLimiter entityLimiter; private org.spigotmc.TickLimiter tileLimiter; -@@ -358,7 +357,6 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -355,7 +354,6 @@ public abstract class Level implements LevelAccessor, AutoCloseable { public void onBorderSetDamageSafeZOne(WorldBorder border, double safeZoneRadius) {} }); // CraftBukkit end - this.timings = new co.aikar.timings.WorldTimingsHandler(this); // Paper - code below can generate new world and access timings - this.keepSpawnInMemory = this.paperConfig().spawn.keepSpawnLoaded; // Paper + this.keepSpawnInMemory = this.paperConfig().spawn.keepSpawnLoaded; // Paper - Option to keep spawn chunks loaded this.entityLimiter = new org.spigotmc.TickLimiter(this.spigotConfig.entityMaxTickTime); this.tileLimiter = new org.spigotmc.TickLimiter(this.spigotConfig.tileMaxTickTime); -@@ -1330,15 +1328,12 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -1323,15 +1321,12 @@ public abstract class Level implements LevelAccessor, AutoCloseable { } protected void tickBlockEntities() { @@ -1761,9 +1759,9 @@ index 3a1ef6f06d8911709eabdefc4f69ba76bc93a409..8126df40be79b3da0b8b841477b02fea // Spigot start // Iterator iterator = this.blockEntityTickers.iterator(); boolean flag = this.tickRateManager().runsNormally(); -@@ -1367,9 +1362,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -1360,9 +1355,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { } - this.blockEntityTickers.removeAll(toRemove); + this.blockEntityTickers.removeAll(toRemove); // Paper - Fix MC-117075 - this.timings.tileEntityTick.stopTiming(); // Spigot this.tickingBlockEntities = false; @@ -1772,7 +1770,7 @@ index 3a1ef6f06d8911709eabdefc4f69ba76bc93a409..8126df40be79b3da0b8b841477b02fea } diff --git a/src/main/java/net/minecraft/world/level/NaturalSpawner.java b/src/main/java/net/minecraft/world/level/NaturalSpawner.java -index 1e7cd5b79b6c0e2f07518b6149c60af01f99285b..7508d91a692a5cfdf49bd0143167edcff2d14811 100644 +index 88b13e6eeec956c10b486e4811b1e0dae0fd990e..31003588de8bef9952a688c486049077328e89a3 100644 --- a/src/main/java/net/minecraft/world/level/NaturalSpawner.java +++ b/src/main/java/net/minecraft/world/level/NaturalSpawner.java @@ -132,7 +132,6 @@ public final class NaturalSpawner { @@ -1784,7 +1782,7 @@ index 1e7cd5b79b6c0e2f07518b6149c60af01f99285b..7508d91a692a5cfdf49bd0143167edcf int i = aenumcreaturetype.length; @@ -184,8 +183,6 @@ public final class NaturalSpawner { - // Paper end + // Paper end - Optional per player mob spawns } } - @@ -1793,7 +1791,7 @@ index 1e7cd5b79b6c0e2f07518b6149c60af01f99285b..7508d91a692a5cfdf49bd0143167edcf // Paper start - Add mobcaps commands diff --git a/src/main/java/net/minecraft/world/level/block/Block.java b/src/main/java/net/minecraft/world/level/block/Block.java -index b2ae99b9826a33e0cd736eb1bdc072afb1d74e5d..c10af7f406f61a2b41a252c59332bcd6022472af 100644 +index 8c242b67f162a40311d7d987fd76771c38c3eadb..f1ca87ab1ab07a5b8ddda959a90f29ea6a16b346 100644 --- a/src/main/java/net/minecraft/world/level/block/Block.java +++ b/src/main/java/net/minecraft/world/level/block/Block.java @@ -114,13 +114,6 @@ public class Block extends BlockBehaviour implements ItemLike { @@ -1811,7 +1809,7 @@ index b2ae99b9826a33e0cd736eb1bdc072afb1d74e5d..c10af7f406f61a2b41a252c59332bcd6 @Nullable private String descriptionId; diff --git a/src/main/java/net/minecraft/world/level/block/entity/BlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/BlockEntity.java -index 075aa1f0c0ced25d5c2fd8bf434915d08ac3e483..b9536b3f6ea07d8f0e41410808a96de29912a253 100644 +index 07a83e06e9cb6e30c600445809e49a3fd23a391a..171feda35239281b0ec2416485bead192dd9d0f0 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/BlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/BlockEntity.java @@ -23,14 +23,9 @@ import org.bukkit.craftbukkit.persistence.CraftPersistentDataTypeRegistry; @@ -1830,7 +1828,7 @@ index 075aa1f0c0ced25d5c2fd8bf434915d08ac3e483..b9536b3f6ea07d8f0e41410808a96de2 private static final CraftPersistentDataTypeRegistry DATA_TYPE_REGISTRY = new CraftPersistentDataTypeRegistry(); public CraftPersistentDataContainer persistentDataContainer; diff --git a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java -index d13a61ad34c00e5ad67adc64e919c4f559621cc9..897919d305ca669fb746dd3202cd393a4c4227f5 100644 +index 3d0b8761866046ae7ee6b5777fb098ce786abd94..221a4a3fbeac621ec593c7ba44b83f4b247a5589 100644 --- a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java +++ b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java @@ -792,7 +792,6 @@ public class LevelChunk extends ChunkAccess { @@ -1858,9 +1856,9 @@ index d13a61ad34c00e5ad67adc64e919c4f559621cc9..897919d305ca669fb746dd3202cd393a if (this.blockEntity.getType().isValid(iblockdata)) { @@ -1185,14 +1182,9 @@ public class LevelChunk extends ChunkAccess { - net.minecraft.world.level.chunk.LevelChunk.this.level.getCraftServer().getPluginManager().callEvent(new com.destroystokyo.paper.event.server.ServerExceptionEvent(new ServerInternalException(msg, throwable))); + net.minecraft.world.level.chunk.LevelChunk.this.level.getCraftServer().getPluginManager().callEvent(new com.destroystokyo.paper.event.server.ServerExceptionEvent(new ServerInternalException(msg, throwable))); // Paper - ServerExceptionEvent LevelChunk.this.removeBlockEntity(this.getPos()); - // Paper end + // Paper end - Prevent block entity and entity crashes - // Spigot start - } finally { - this.blockEntity.tickTimer.stopTiming(); @@ -1873,7 +1871,7 @@ index d13a61ad34c00e5ad67adc64e919c4f559621cc9..897919d305ca669fb746dd3202cd393a @Override diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 864c62d6c84da666adfba105e3fb5c0ca0341889..99fe3b9444c436eba0642135c7e19d147f7df022 100644 +index 3be29ecb26bf46ad8873fc948c8d19118779d88d..e0e7e1b986c04cbefb86dfd1ecef2504bda3ecfb 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -468,7 +468,6 @@ public final class CraftServer implements Server { @@ -1885,10 +1883,10 @@ index 864c62d6c84da666adfba105e3fb5c0ca0341889..99fe3b9444c436eba0642135c7e19d14 console.autosavePeriod = this.configuration.getInt("ticks-per.autosave"); this.warningState = WarningState.value(this.configuration.getString("settings.deprecated-verbose")); diff --git a/src/main/java/org/bukkit/craftbukkit/Main.java b/src/main/java/org/bukkit/craftbukkit/Main.java -index ff921eeb4d7d5791794484315bf751629307ac62..d7d5622c0d2940567e9020aa4b8fe634b1569d98 100644 +index 94a998b877e3cfff0477cbef4400ca4113e7681d..e43203060dfc26387fd5826ffae9e9ca7a01abf2 100644 --- a/src/main/java/org/bukkit/craftbukkit/Main.java +++ b/src/main/java/org/bukkit/craftbukkit/Main.java -@@ -372,8 +372,6 @@ public class Main { +@@ -373,8 +373,6 @@ public class Main { tryPreloadClass("org.jline.terminal.impl.MouseSupport"); tryPreloadClass("org.jline.terminal.impl.MouseSupport$1"); tryPreloadClass("org.jline.terminal.Terminal$MouseTracking"); @@ -1898,7 +1896,7 @@ index ff921eeb4d7d5791794484315bf751629307ac62..d7d5622c0d2940567e9020aa4b8fe634 tryPreloadClass("io.netty.channel.AbstractChannelHandlerContext$11"); tryPreloadClass("io.netty.channel.AbstractChannelHandlerContext$12"); diff --git a/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java b/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java -index 4be39d64431b7c42ef23c13c2872f8ab46fffdc7..1b8728dbb8dcde72935ce0b45f32520ce3586f77 100644 +index 006adb2adb27c497ede69f87e78bc3e34499cbf8..4ee1c3461d21feab3a54e76a7c2ab80b6ea2ab38 100644 --- a/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java +++ b/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java @@ -1,6 +1,5 @@ @@ -1908,7 +1906,7 @@ index 4be39d64431b7c42ef23c13c2872f8ab46fffdc7..1b8728dbb8dcde72935ce0b45f32520c import com.google.common.base.Preconditions; import com.google.common.util.concurrent.ThreadFactoryBuilder; import java.util.ArrayList; -@@ -302,7 +301,7 @@ public class CraftScheduler implements BukkitScheduler { +@@ -304,7 +303,7 @@ public class CraftScheduler implements BukkitScheduler { } return false; } @@ -1917,7 +1915,7 @@ index 4be39d64431b7c42ef23c13c2872f8ab46fffdc7..1b8728dbb8dcde72935ce0b45f32520c this.handle(task, 0L); for (CraftTask taskPending = this.head.getNext(); taskPending != null; taskPending = taskPending.getNext()) { if (taskPending == task) { -@@ -342,7 +341,7 @@ public class CraftScheduler implements BukkitScheduler { +@@ -344,7 +343,7 @@ public class CraftScheduler implements BukkitScheduler { } } } @@ -1926,7 +1924,7 @@ index 4be39d64431b7c42ef23c13c2872f8ab46fffdc7..1b8728dbb8dcde72935ce0b45f32520c this.handle(task, 0L); for (CraftTask taskPending = this.head.getNext(); taskPending != null; taskPending = taskPending.getNext()) { if (taskPending == task) { -@@ -513,10 +512,8 @@ public class CraftScheduler implements BukkitScheduler { +@@ -515,10 +514,8 @@ public class CraftScheduler implements BukkitScheduler { this.runners.remove(task.getTaskId()); } } @@ -1937,7 +1935,7 @@ index 4be39d64431b7c42ef23c13c2872f8ab46fffdc7..1b8728dbb8dcde72935ce0b45f32520c //this.debugHead = this.debugHead.getNextHead(currentTick); // Paper } -@@ -559,7 +556,6 @@ public class CraftScheduler implements BukkitScheduler { +@@ -561,7 +558,6 @@ public class CraftScheduler implements BukkitScheduler { } void parsePending() { // Paper @@ -1945,7 +1943,7 @@ index 4be39d64431b7c42ef23c13c2872f8ab46fffdc7..1b8728dbb8dcde72935ce0b45f32520c CraftTask head = this.head; CraftTask task = head.getNext(); CraftTask lastTask = head; -@@ -578,7 +574,6 @@ public class CraftScheduler implements BukkitScheduler { +@@ -580,7 +576,6 @@ public class CraftScheduler implements BukkitScheduler { task.setNext(null); } this.head = lastTask; @@ -2038,7 +2036,7 @@ index b3e1adeb932da9b3bed16acd94e2f16da48a7c72..e9798517b9211c50a20ea5c69603aab3 } } diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java -index 8561bc5482574365d7cff3a4046afe11b00f6d1f..b39d1ba982f633d68837a04dd0be2e639ee69ba4 100644 +index b1bd810d4a83086966da16f4b0327f67c794246a..19d2015437c764f0cc5970b05de33f037b96caf0 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java +++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java @@ -209,12 +209,6 @@ public final class CraftMagicNumbers implements UnsafeValues { @@ -2272,7 +2270,7 @@ index 139d946346594d2a59a8b2930c4eae794c880dbc..00000000000000000000000000000000 - -} diff --git a/src/main/java/org/spigotmc/ActivationRange.java b/src/main/java/org/spigotmc/ActivationRange.java -index fb8260a1801f7f11a13b4310b0c7ccd963854591..48a836df10dec491185c33ba2e3e2892c96958f7 100644 +index d88d553fc5b9d9e13d24d94275ed5b9c91d5e41f..83841079cb17d426a89e9d8b43afdc289d13dee6 100644 --- a/src/main/java/org/spigotmc/ActivationRange.java +++ b/src/main/java/org/spigotmc/ActivationRange.java @@ -35,7 +35,6 @@ import net.minecraft.world.entity.projectile.FireworkRocketEntity; @@ -2291,7 +2289,7 @@ index fb8260a1801f7f11a13b4310b0c7ccd963854591..48a836df10dec491185c33ba2e3e2892 final int miscActivationRange = world.spigotConfig.miscActivationRange; final int raiderActivationRange = world.spigotConfig.raiderActivationRange; final int animalActivationRange = world.spigotConfig.animalActivationRange; -@@ -264,7 +262,6 @@ public class ActivationRange +@@ -263,7 +261,6 @@ public class ActivationRange } // Paper end } diff --git a/patches/server/0013-Bump-Dependencies.patch b/patches/server/0013-Bump-Dependencies.patch index 34f0430e..e24bba84 100644 --- a/patches/server/0013-Bump-Dependencies.patch +++ b/patches/server/0013-Bump-Dependencies.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Bump Dependencies diff --git a/build.gradle.kts b/build.gradle.kts -index 04d0a5827c454478b80c2da1b204e20ab7828370..1871bcb34cc1cc0bb810d44ec043df215a0f0e8d 100644 +index 04d0a5827c454478b80c2da1b204e20ab7828370..e7ac805b5b455083b6b07eec05ca2e3bc655edd0 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -22,9 +22,9 @@ dependencies { @@ -13,7 +13,7 @@ index 04d0a5827c454478b80c2da1b204e20ab7828370..1871bcb34cc1cc0bb810d44ec043df21 // Gale end - project setup // Paper start - implementation("org.jline:jline-terminal-jansi:3.21.0") -+ implementation("org.jline:jline-terminal-jansi:3.25.0") // Leaf - Bump Dependencies ++ implementation("org.jline:jline-terminal-jansi:3.25.1") // Leaf - Bump Dependencies implementation("net.minecrell:terminalconsoleappender:1.3.0") - implementation("net.kyori:adventure-text-serializer-ansi:4.14.0") // Keep in sync with adventureVersion from Paper-API build file + implementation("net.kyori:adventure-text-serializer-ansi:4.15.0") // Keep in sync with adventureVersion from Paper-API build file // Leaf - Bump Dependencies @@ -46,7 +46,7 @@ index 04d0a5827c454478b80c2da1b204e20ab7828370..1871bcb34cc1cc0bb810d44ec043df21 - runtimeOnly("com.lmax:disruptor:3.4.4") // Paper + // Leaf end + implementation("net.fabricmc:mapping-io:0.5.1") // Paper - needed to read mappings for stacktrace deobfuscation -+ runtimeOnly("org.xerial:sqlite-jdbc:3.45.0.0") ++ runtimeOnly("org.xerial:sqlite-jdbc:3.45.1.0") // Leaf - Bump Dependencies + runtimeOnly("com.mysql:mysql-connector-j:8.3.0") + runtimeOnly("com.lmax:disruptor:3.4.4") // Paper // Leaf - Bump Dependencies - Waiting Log4j 3.x that supported disruptor 4.0.0 // Paper start - Use Velocity cipher @@ -66,7 +66,7 @@ index 04d0a5827c454478b80c2da1b204e20ab7828370..1871bcb34cc1cc0bb810d44ec043df21 + testImplementation("org.junit.jupiter:junit-jupiter:5.10.1") testImplementation("org.hamcrest:hamcrest:2.2") - testImplementation("org.mockito:mockito-core:5.5.0") -+ testImplementation("org.mockito:mockito-core:5.9.0") ++ testImplementation("org.mockito:mockito-core:5.10.0") + + implementation("io.netty:netty-all:4.1.105.Final") + // Leaf end diff --git a/patches/server/0016-Remove-UseItemOnPacket-Too-Far-Check.patch b/patches/server/0016-Remove-UseItemOnPacket-Too-Far-Check.patch index 529a0255..fe1c6d87 100644 --- a/patches/server/0016-Remove-UseItemOnPacket-Too-Far-Check.patch +++ b/patches/server/0016-Remove-UseItemOnPacket-Too-Far-Check.patch @@ -7,10 +7,10 @@ This Check is added in 1.17.x -> 1.18.x update by Mojang. By removing this check, it enable hackers to use some modules of hack clients. diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index c82101247896498e7b02a3f6b212262720e41241..a5fb09c24788fef07463a6abb6bee2718bdd779e 100644 +index 4d1d3e10a2bea585cdd86bc641e20c89e7014c6a..1c1f6d89b622a5fb7d2ab541dbe4f029723c7811 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -2013,7 +2013,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1992,7 +1992,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl Vec3 vec3d2 = vec3d.subtract(vec3d1); double d0 = 1.0000001D; @@ -20,7 +20,7 @@ index c82101247896498e7b02a3f6b212262720e41241..a5fb09c24788fef07463a6abb6bee271 this.player.resetLastActionTime(); diff --git a/src/main/java/org/dreeam/leaf/LeafConfig.java b/src/main/java/org/dreeam/leaf/LeafConfig.java -index 4660e1732f8f2e2c236b3d6c3c60e5122daa1172..4ef2a90296dd4ca7c61e257821d794e112489735 100644 +index e88cfb1a48f253e2f6360b2ff00bd36b58af6a23..df16a84545dd726e6f4eaaff13232e4d95dd11af 100644 --- a/src/main/java/org/dreeam/leaf/LeafConfig.java +++ b/src/main/java/org/dreeam/leaf/LeafConfig.java @@ -173,6 +173,8 @@ public class LeafConfig { diff --git a/patches/server/0018-KeYi-Player-Skull-API.patch b/patches/server/0018-KeYi-Player-Skull-API.patch index 124e4a41..1399c7e6 100644 --- a/patches/server/0018-KeYi-Player-Skull-API.patch +++ b/patches/server/0018-KeYi-Player-Skull-API.patch @@ -7,7 +7,7 @@ Original license: MIT Original project: https://github.com/KeYiMC/KeYi diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 8c90eddd40c8ab2f4d727e3c7d9b6312d57bf277..2026f2b42658e5625da39097d3faae2b86b0153b 100644 +index f16d150526c99b8a280ec681f8eb548419691357..c63b0da7e41d2827dacf45745d8f6581b6f930ed 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -29,6 +29,11 @@ import java.util.Optional; @@ -30,7 +30,7 @@ index 8c90eddd40c8ab2f4d727e3c7d9b6312d57bf277..2026f2b42658e5625da39097d3faae2b import org.bukkit.map.MapCursor; import org.bukkit.map.MapView; import org.bukkit.metadata.MetadataValue; -@@ -3470,4 +3476,28 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -3473,4 +3479,28 @@ public class CraftPlayer extends CraftHumanEntity implements Player { this.getHandle().connection.send(new net.minecraft.network.protocol.game.ClientboundPlayerCombatKillPacket(getEntityId(), io.papermc.paper.adventure.PaperAdventure.asVanilla(message))); } // Purpur end diff --git a/patches/server/0023-Akarin-Save-Json-list-asynchronously.patch b/patches/server/0023-Akarin-Save-Json-list-asynchronously.patch index d7c9b7e6..300e0884 100644 --- a/patches/server/0023-Akarin-Save-Json-list-asynchronously.patch +++ b/patches/server/0023-Akarin-Save-Json-list-asynchronously.patch @@ -8,7 +8,7 @@ Original license: GPL v3 Original project: https://github.com/Akarin-project/Akarin diff --git a/src/main/java/net/minecraft/server/players/StoredUserList.java b/src/main/java/net/minecraft/server/players/StoredUserList.java -index 71e1c1a1ae59f74cfeea071aa6988f6fe47a286d..ca8f58aef40ff481dc3d620998f432dc23e48c1c 100644 +index 219e0059418e6d64f5b859ba253c3cf3e91713cf..a358d177c266841f79809053e5b158f8202e54dc 100644 --- a/src/main/java/net/minecraft/server/players/StoredUserList.java +++ b/src/main/java/net/minecraft/server/players/StoredUserList.java @@ -23,6 +23,7 @@ import java.util.stream.Stream; @@ -19,7 +19,7 @@ index 71e1c1a1ae59f74cfeea071aa6988f6fe47a286d..ca8f58aef40ff481dc3d620998f432dc import net.minecraft.Util; import net.minecraft.util.GsonHelper; import org.slf4j.Logger; -@@ -127,37 +128,43 @@ public abstract class StoredUserList> { +@@ -104,37 +105,43 @@ public abstract class StoredUserList> { } public void save() throws IOException { diff --git a/patches/server/0024-Slice-Smooth-Teleports.patch b/patches/server/0024-Slice-Smooth-Teleports.patch index 77eec997..861e5cf1 100644 --- a/patches/server/0024-Slice-Smooth-Teleports.patch +++ b/patches/server/0024-Slice-Smooth-Teleports.patch @@ -7,7 +7,7 @@ Original license: MIT Original project: https://github.com/Cryptite/Slice diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index 9363801ce4342f598309b3aab40ee36b95e0d047..b20aa80b500e689c920cd6bc85a45f342bb6e9c0 100644 +index 98c488e5e8cfc0947d80b5d11aa40f7ca801a67b..331f6c6cfb96795ce3002f86165f34e5bbbcc526 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java @@ -286,6 +286,7 @@ public class ServerPlayer extends Player { @@ -19,10 +19,10 @@ index 9363801ce4342f598309b3aab40ee36b95e0d047..b20aa80b500e689c920cd6bc85a45f34 // Paper start - replace player chunk loader private final java.util.concurrent.atomic.AtomicReference viewDistances = new java.util.concurrent.atomic.AtomicReference<>(new io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader.ViewDistances(-1, -1, -1)); diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index de08bdced1d55da22b5abd6f44fdad708ec8f238..0a6f3536d6ca9bf2efb18524eb1dd00ef5a8f1e0 100644 +index 6fe6126dd37272ddeac89087887d9fe688a6bfcc..8fd80d1167edea751fec1c14deabc427c221e98b 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java -@@ -970,10 +970,10 @@ public abstract class PlayerList { +@@ -969,10 +969,10 @@ public abstract class PlayerList { ServerLevel worldserver2 = entityplayer1.serverLevel(); LevelData worlddata = worldserver2.getLevelData(); @@ -36,10 +36,10 @@ index de08bdced1d55da22b5abd6f44fdad708ec8f238..0a6f3536d6ca9bf2efb18524eb1dd00e entityplayer1.connection.send(new ClientboundChangeDifficultyPacket(worlddata.getDifficulty(), worlddata.isDifficultyLocked())); entityplayer1.connection.send(new ClientboundSetExperiencePacket(entityplayer1.experienceProgress, entityplayer1.totalExperience, entityplayer1.experienceLevel)); diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 2026f2b42658e5625da39097d3faae2b86b0153b..7e13ffee8e650cd5fe63fddf636321830e6ffb6d 100644 +index c63b0da7e41d2827dacf45745d8f6581b6f930ed..8875cf92722a1a25c02cd887ff5d000a84e6722d 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -1278,6 +1278,15 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -1236,6 +1236,15 @@ public class CraftPlayer extends CraftHumanEntity implements Player { // Paper end } diff --git a/patches/server/0026-Leaves-Server-Utils.patch b/patches/server/0026-Leaves-Server-Utils.patch index 3d312bbf..7c6913b8 100644 --- a/patches/server/0026-Leaves-Server-Utils.patch +++ b/patches/server/0026-Leaves-Server-Utils.patch @@ -7,10 +7,10 @@ Original license: GPLv3 Original project: https://github.com/LeavesMC/Leaves diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 4e3d22cc21b50e563416a3f89715078aeb059f40..6da78fe423b78b35dd408367209b5b0fbdc6154d 100644 +index c984b9a614690a44f9506de42707edc63d1ecc65..fc77f4ec5234ad0d450a8fa74f316b4355033022 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -425,6 +425,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -424,6 +424,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S private UUID originWorld; public boolean freezeLocked = false; // Paper - Freeze Tick Lock API public boolean fixedPose = false; // Paper - Expand Pose API @@ -18,7 +18,7 @@ index 4e3d22cc21b50e563416a3f89715078aeb059f40..6da78fe423b78b35dd408367209b5b0f public void setOrigin(@javax.annotation.Nonnull Location location) { this.origin = location.toVector(); -@@ -2531,6 +2532,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -2528,6 +2529,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S nbttagcompound.putBoolean("Paper.FreezeLock", true); } // Paper end @@ -26,7 +26,7 @@ index 4e3d22cc21b50e563416a3f89715078aeb059f40..6da78fe423b78b35dd408367209b5b0f return nbttagcompound; } catch (Throwable throwable) { CrashReport crashreport = CrashReport.forThrowable(throwable, "Saving entity NBT"); -@@ -2678,6 +2680,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -2675,6 +2677,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S freezeLocked = nbt.getBoolean("Paper.FreezeLock"); } // Paper end @@ -38,7 +38,7 @@ index 4e3d22cc21b50e563416a3f89715078aeb059f40..6da78fe423b78b35dd408367209b5b0f } catch (Throwable throwable) { CrashReport crashreport = CrashReport.forThrowable(throwable, "Loading entity NBT"); -@@ -5115,4 +5122,10 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -5107,4 +5114,10 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S return false; } // Purpur end diff --git a/patches/server/0027-Leaves-Protocol-Core.patch b/patches/server/0027-Leaves-Protocol-Core.patch index 55d98af9..36579e4a 100644 --- a/patches/server/0027-Leaves-Protocol-Core.patch +++ b/patches/server/0027-Leaves-Protocol-Core.patch @@ -25,10 +25,10 @@ index af86f752c33a2990405fea058b7c41c437ba9d46..bada9fae1e7178162429e1f5a1608b9c } diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 7334b13af92d7a323dd24a14102b789c10dfbb4f..a2933d814d453971080eeba90bb1819a8d599ba7 100644 +index b2dee5866f44dfedad37827257b56818d9f6b00f..9af04084afe0689e5486be775cee3ba20e30617e 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1708,6 +1708,8 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop detectedPlayers = new HashSet<>(); + protected final Set currentMobs = new HashSet<>(); +- protected long cooldownEndsAt; ++ public long cooldownEndsAt; // Leaves - protected -> public + protected long nextMobSpawnsAt; + protected int totalMobsSpawned; + protected Optional nextSpawnData; diff --git a/src/main/java/org/dreeam/leaf/LeafConfig.java b/src/main/java/org/dreeam/leaf/LeafConfig.java -index 08f794bbd19d596591b4c786f5b131f56bf88b2e..b96b32e417ce2db80ea7fd581ae6122925d69ed8 100644 +index e81cb3b303a53b4d2edb80563be806c8ef9c8bed..cd50493c1d165424c7e66d55e7b9b26645f2bf50 100644 --- a/src/main/java/org/dreeam/leaf/LeafConfig.java +++ b/src/main/java/org/dreeam/leaf/LeafConfig.java @@ -248,7 +248,9 @@ public class LeafConfig { @@ -37,10 +50,10 @@ index 08f794bbd19d596591b4c786f5b131f56bf88b2e..b96b32e417ce2db80ea7fd581ae61229 public static String sentryDsn = ""; diff --git a/src/main/java/top/leavesmc/leaves/protocol/JadeProtocol.java b/src/main/java/top/leavesmc/leaves/protocol/JadeProtocol.java new file mode 100644 -index 0000000000000000000000000000000000000000..d9727943c5d44361d35b96ee8045918c4e863ec6 +index 0000000000000000000000000000000000000000..d175d83fc7fe509349cb76220362f7b5df33c7f2 --- /dev/null +++ b/src/main/java/top/leavesmc/leaves/protocol/JadeProtocol.java -@@ -0,0 +1,621 @@ +@@ -0,0 +1,900 @@ +package top.leavesmc.leaves.protocol; + +import com.google.common.cache.Cache; @@ -49,8 +62,11 @@ index 0000000000000000000000000000000000000000..d9727943c5d44361d35b96ee8045918c +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ListMultimap; +import com.google.common.collect.Lists; ++import com.google.common.collect.Multimap; +import com.mojang.authlib.GameProfile; ++import it.unimi.dsi.fastutil.objects.Object2IntLinkedOpenHashMap; +import net.minecraft.core.BlockPos; ++import net.minecraft.core.Direction; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; @@ -61,16 +77,17 @@ index 0000000000000000000000000000000000000000..d9727943c5d44361d35b96ee8045918c +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.MinecraftServer; -+import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; ++import net.minecraft.server.players.GameProfileCache; +import net.minecraft.world.Container; +import net.minecraft.world.LockCode; ++import net.minecraft.world.MenuProvider; +import net.minecraft.world.Nameable; ++import net.minecraft.world.RandomizableContainer; +import net.minecraft.world.effect.MobEffectCategory; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.entity.AgeableMob; +import net.minecraft.world.entity.Entity; -+import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.OwnableEntity; +import net.minecraft.world.entity.animal.Animal; @@ -78,18 +95,23 @@ index 0000000000000000000000000000000000000000..d9727943c5d44361d35b96ee8045918c +import net.minecraft.world.entity.animal.allay.Allay; +import net.minecraft.world.entity.animal.frog.Tadpole; +import net.minecraft.world.entity.animal.horse.AbstractHorse; ++import net.minecraft.world.entity.monster.ZombieVillager; +import net.minecraft.world.entity.vehicle.ContainerEntity; ++import net.minecraft.world.inventory.PlayerEnderChestContainer; ++import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.BaseCommandBlock; +import net.minecraft.world.level.Level; ++import net.minecraft.world.level.block.CalibratedSculkSensorBlock; +import net.minecraft.world.level.block.ChestBlock; +import net.minecraft.world.level.block.entity.AbstractFurnaceBlockEntity; +import net.minecraft.world.level.block.entity.BaseContainerBlockEntity; +import net.minecraft.world.level.block.entity.BeehiveBlockEntity; +import net.minecraft.world.level.block.entity.BlockEntity; -+import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.entity.BrewingStandBlockEntity; ++import net.minecraft.world.level.block.entity.CalibratedSculkSensorBlockEntity; ++import net.minecraft.world.level.block.entity.CampfireBlockEntity; +import net.minecraft.world.level.block.entity.ChestBlockEntity; +import net.minecraft.world.level.block.entity.ChiseledBookShelfBlockEntity; +import net.minecraft.world.level.block.entity.CommandBlockEntity; @@ -98,11 +120,11 @@ index 0000000000000000000000000000000000000000..d9727943c5d44361d35b96ee8045918c +import net.minecraft.world.level.block.entity.HopperBlockEntity; +import net.minecraft.world.level.block.entity.JukeboxBlockEntity; +import net.minecraft.world.level.block.entity.LecternBlockEntity; -+import net.minecraft.world.level.block.entity.RandomizableContainerBlockEntity; ++import net.minecraft.world.level.block.entity.TrialSpawnerBlockEntity; ++import net.minecraft.world.level.block.entity.trialspawner.TrialSpawnerData; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.phys.BlockHitResult; -+import org.apache.commons.lang3.mutable.MutableInt; +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; @@ -116,7 +138,11 @@ index 0000000000000000000000000000000000000000..d9727943c5d44361d35b96ee8045918c +import java.util.Objects; +import java.util.UUID; +import java.util.concurrent.ExecutionException; ++import java.util.concurrent.TimeUnit; ++import java.util.concurrent.atomic.AtomicInteger; ++import java.util.concurrent.atomic.AtomicLong; +import java.util.function.Function; ++import java.util.function.Predicate; +import java.util.stream.IntStream; +import java.util.stream.Stream; + @@ -129,8 +155,13 @@ index 0000000000000000000000000000000000000000..d9727943c5d44361d35b96ee8045918c + public static final ResourceLocation PACKET_SERVER_PING = id("server_ping"); + public static final ResourceLocation PACKET_RECEIVE_DATA = id("receive_data"); + -+ private static final HierarchyLookup> entityDataProviders = new HierarchyLookup<>(Entity.class); -+ private static final HierarchyLookup> tileDataProviders = new HierarchyLookup<>(BlockEntity.class); ++ private static final HierarchyLookup> entityDataProviders = new HierarchyLookup<>(Entity.class); ++ private static final HierarchyLookup> tileDataProviders = new HierarchyLookup<>(BlockEntity.class); ++ ++ private static final HierarchyLookup> entityItemProviders = new HierarchyLookup<>(Entity.class); ++ private static final HierarchyLookup> tileItemProviders = new HierarchyLookup<>(BlockEntity.class); ++ ++ public static final Cache> targetCache = CacheBuilder.newBuilder().weakKeys().expireAfterAccess(60, TimeUnit.SECONDS).build(); + + public static final int MAX_DISTANCE_SQR = 900; + @@ -141,13 +172,101 @@ index 0000000000000000000000000000000000000000..d9727943c5d44361d35b96ee8045918c + + @ProtocolHandler.Init + public static void init() { -+ entityDataProviders.register(Entity.class, ((data, player, world, entity, showDetails) -> { -+ UUID ownerUUID = null; -+ if (entity instanceof OwnableEntity) { -+ ownerUUID = ((OwnableEntity) entity).getOwnerUUID(); ++ entityItemProviders.register(Entity.class, (player, world, target) -> { ++ if (target instanceof ContainerEntity containerEntity && containerEntity.getLootTable() != null) { ++ return List.of(); + } ++ ++ ItemCollector itemCollector; ++ try { ++ itemCollector = targetCache.get(target, () -> { ++ if (target instanceof AbstractHorse) { ++ return new ItemCollector<>(new ItemIterator.ContainerItemIterator(o -> { ++ if (o instanceof AbstractHorse horse) { ++ return horse.inventory; ++ } ++ return null; ++ }, 2)); ++ } ++ return ItemCollector.EMPTY; ++ }); ++ } catch (ExecutionException e) { ++ return null; ++ } ++ ++ if (itemCollector == ItemCollector.EMPTY) { ++ return null; ++ } ++ return itemCollector.update(target, world.getGameTime()); ++ }); ++ ++ tileItemProviders.register(CampfireBlockEntity.class, (player, world, target) -> { ++ CampfireBlockEntity campfire = (CampfireBlockEntity) target; ++ List list = Lists.newArrayList(); ++ for (int i = 0; i < campfire.cookingTime.length; i++) { ++ ItemStack stack = campfire.getItems().get(i); ++ if (stack.isEmpty()) { ++ continue; ++ } ++ stack = stack.copy(); ++ stack.getOrCreateTag().putInt("jade:cooking", campfire.cookingTime[i] - campfire.cookingProgress[i]); ++ list.add(stack); ++ } ++ return List.of(new ViewGroup<>(list)); ++ }); ++ tileItemProviders.register(BlockEntity.class, (player, world, target) -> { ++ if (target instanceof RandomizableContainer te && te.getLootTable() != null) { ++ return List.of(); ++ } ++ ++ if (!player.isCreative() && !player.isSpectator() && target instanceof BaseContainerBlockEntity te) { ++ if (te.lockKey != LockCode.NO_LOCK) { ++ return List.of(); ++ } ++ } ++ if (target instanceof EnderChestBlockEntity) { ++ PlayerEnderChestContainer inventory = player.getEnderChestInventory(); ++ return new ItemCollector<>(new ItemIterator.ContainerItemIterator(0)).update(inventory, world.getGameTime()); ++ } ++ ItemCollector itemCollector; ++ try { ++ itemCollector = targetCache.get(target, () -> { ++ if (target instanceof Container) { ++ if (target instanceof ChestBlockEntity) { ++ return new ItemCollector<>(new ItemIterator.ContainerItemIterator(o -> { ++ if (o instanceof ChestBlockEntity be) { ++ if (be.getBlockState().getBlock() instanceof ChestBlock chestBlock) { ++ Container compound = ChestBlock.getContainer(chestBlock, be.getBlockState(), world, be.getBlockPos(), false); ++ if (compound != null) { ++ return compound; ++ } ++ } ++ return be; ++ } ++ return null; ++ }, 0)); ++ } ++ return new ItemCollector<>(new ItemIterator.ContainerItemIterator(0)); ++ } ++ return ItemCollector.EMPTY; ++ }); ++ } catch (ExecutionException e) { ++ return null; ++ } ++ ++ if (itemCollector == ItemCollector.EMPTY) { ++ return null; ++ } ++ return itemCollector.update(target, world.getGameTime()); ++ }); ++ ++ entityDataProviders.register(OwnableEntity.class, ((data, player, world, entity, showDetails) -> { ++ UUID ownerUUID = ((OwnableEntity) entity).getOwnerUUID(); + if (ownerUUID != null) { -+ MinecraftServer.getServer().getProfileCache().get(ownerUUID).map(GameProfile::getName).ifPresent(name -> data.putString("OwnerName", name)); ++ GameProfileCache cache = MinecraftServer.getServer().getProfileCache(); ++ if (cache != null) { ++ cache.get(ownerUUID).map(GameProfile::getName).ifPresent(name -> data.putString("OwnerName", name)); ++ } + } + })); + entityDataProviders.register(LivingEntity.class, ((data, player, world, entity, showDetails) -> { @@ -199,27 +318,38 @@ index 0000000000000000000000000000000000000000..d9727943c5d44361d35b96ee8045918c + } + })); + entityDataProviders.register(Chicken.class, ((data, player, world, entity, showDetails) -> { -+ data.putInt("NextEgg", ((Chicken) entity).eggTime / 20); ++ data.putInt("NextEggIn", ((Chicken) entity).eggTime); + })); + entityDataProviders.register(Entity.class, ((tag, player, world, object, showDetails) -> { -+ var groups = getGroups(player, (ServerLevel) world, object, showDetails); -+ if (groups != null) { ++ for (var provider : entityItemProviders.get(object)) { ++ var groups = provider.getGroups(player, world, object); ++ if (groups == null) { ++ continue; ++ } + if (ViewGroup.saveList(tag, "JadeItemStorage", groups, item -> { + CompoundTag itemTag = new CompoundTag(); + int count = item.getCount(); -+ if (count > 64) item.setCount(1); ++ if (count > 64) { ++ item.setCount(1); ++ } + item.save(itemTag); -+ if (count > 64) itemTag.putInt("NewCount", count); ++ if (count > 64) { ++ itemTag.putInt("NewCount", count); ++ item.setCount(count); ++ } + return itemTag; + })) { -+ tag.putString("JadeItemStorageUid", EntityType.getKey(object.getType()).toString()); -+ } else { -+ if (object instanceof ContainerEntity containerEntity && containerEntity.getLootTable() != null) { -+ tag.putBoolean("Loot", true); -+ } ++ tag.putString("JadeItemStorageUid", "minecraft:item_storage"); + } ++ break; + } + })); ++ entityDataProviders.register(ZombieVillager.class, (data, player, world, object, showDetails) -> { ++ ZombieVillager entity = (ZombieVillager) object; ++ if (entity.villagerConversionTime > 0) { ++ data.putInt("ConversionTime", entity.villagerConversionTime); ++ } ++ }); + + tileDataProviders.register(BrewingStandBlockEntity.class, ((data, player, world, object, showDetails) -> { + if (object instanceof BrewingStandBlockEntity brewingStand) { @@ -236,7 +366,7 @@ index 0000000000000000000000000000000000000000..d9727943c5d44361d35b96ee8045918c + data.putBoolean("Full", beehive.isFull()); + })); + tileDataProviders.register(CommandBlockEntity.class, ((data, player, world, object, showDetails) -> { -+ if (object == null || !player.canUseGameMasterBlocks()) { ++ if (!player.canUseGameMasterBlocks()) { + return; + } + BaseCommandBlock logic = ((CommandBlockEntity) object).getCommandBlock(); @@ -287,8 +417,18 @@ index 0000000000000000000000000000000000000000..d9727943c5d44361d35b96ee8045918c + })); + tileDataProviders.register(BlockEntity.class, ((data, player, world, object, showDetails) -> { + if (object instanceof Nameable nameable) { -+ if (nameable.hasCustomName()) { -+ data.putString("givenName", Component.Serializer.toJson(nameable.getCustomName())); ++ Component name = null; ++ if (nameable instanceof ChestBlockEntity chestBlock) { ++ MenuProvider menuProvider = chestBlock.getBlockState().getMenuProvider(world, chestBlock.getBlockPos()); ++ if (menuProvider != null) { ++ name = menuProvider.getDisplayName(); ++ } ++ } else if (nameable.hasCustomName()) { ++ name = nameable.getDisplayName(); ++ } ++ ++ if (name != null) { ++ data.putString("givenName", Component.Serializer.toJson(name)); + } + } + })); @@ -302,30 +442,49 @@ index 0000000000000000000000000000000000000000..d9727943c5d44361d35b96ee8045918c + if (object instanceof AbstractFurnaceBlockEntity) { + return; + } -+ var groups = getGroups(player, (ServerLevel) world, object, showDetails); -+ if (groups != null) { ++ ++ for (var provider : tileItemProviders.get(object)) { ++ var groups = provider.getGroups(player, world, object); ++ if (groups == null) { ++ continue; ++ } ++ + if (ViewGroup.saveList(tag, "JadeItemStorage", groups, item -> { + CompoundTag itemTag = new CompoundTag(); + int count = item.getCount(); -+ if (count > 64) item.setCount(1); ++ if (count > 64) { ++ item.setCount(1); ++ } + item.save(itemTag); -+ if (count > 64) itemTag.putInt("NewCount", count); ++ if (count > 64) { ++ itemTag.putInt("NewCount", count); ++ item.setCount(count); ++ } + return itemTag; + })) { -+ tag.putString("JadeItemStorageUid", BlockEntityType.getKey(object.getType()).toString()); -+ } else { -+ if (object instanceof RandomizableContainerBlockEntity te && te.lootTable != null) { -+ tag.putBoolean("Loot", true); -+ return; -+ } -+ if (!player.isCreative() && !player.isSpectator() && object instanceof BaseContainerBlockEntity te) { -+ if (te.lockKey != LockCode.NO_LOCK) { -+ tag.putBoolean("Locked", true); -+ } ++ tag.putString("JadeItemStorageUid", "minecraft:item_storage"); ++ } else if (object instanceof RandomizableContainer containerEntity && containerEntity.getLootTable() != null) { ++ tag.putBoolean("Loot", true); ++ } else if (!player.isCreative() && !player.isSpectator() && object instanceof BaseContainerBlockEntity te) { ++ if (te.lockKey != LockCode.NO_LOCK) { ++ tag.putBoolean("Locked", true); + } + } ++ break; + } + })); ++ tileDataProviders.register(TrialSpawnerBlockEntity.class, (data, player, world, object, showDetails) -> { ++ TrialSpawnerBlockEntity spawner = (TrialSpawnerBlockEntity) object; ++ TrialSpawnerData spawnerData = spawner.getTrialSpawner().getData(); ++ if (spawner.getTrialSpawner().canSpawnInLevel(world) && world.getGameTime() < spawnerData.cooldownEndsAt) { ++ data.putInt("Cooldown", (int) (spawnerData.cooldownEndsAt - world.getGameTime())); ++ } ++ }); ++ tileDataProviders.register(CalibratedSculkSensorBlockEntity.class, ((data, player, world, object, showDetails) -> { ++ Direction direction = object.getBlockState().getValue(CalibratedSculkSensorBlock.FACING).getOpposite(); ++ int signal = world.getSignal(object.getBlockPos().relative(direction), direction); ++ data.putInt("Signal", signal); ++ })); + } + + @ProtocolHandler.PlayerJoin @@ -356,7 +515,7 @@ index 0000000000000000000000000000000000000000..d9727943c5d44361d35b96ee8045918c + } + + CompoundTag tag = new CompoundTag(); -+ for (IJadeProvider provider : providers) { ++ for (IJadeDataProvider provider : providers) { + try { + provider.saveData(tag, player, world, entity, showDetails); + } catch (Exception e) { @@ -388,13 +547,13 @@ index 0000000000000000000000000000000000000000..d9727943c5d44361d35b96ee8045918c + BlockEntity tile = world.getBlockEntity(pos); + if (tile == null) return; + -+ List> providers = tileDataProviders.get(tile); ++ List> providers = tileDataProviders.get(tile); + if (providers.isEmpty()) { + return; + } + + CompoundTag tag = new CompoundTag(); -+ for (IJadeProvider provider : providers) { ++ for (IJadeDataProvider provider : providers) { + try { + provider.saveData(tag, player, world, tile, showDetails); + } catch (Exception e) { @@ -424,10 +583,6 @@ index 0000000000000000000000000000000000000000..d9727943c5d44361d35b96ee8045918c + } + } + -+ public interface IJadeProvider { -+ void saveData(CompoundTag data, ServerPlayer player, Level world, T object, boolean showDetails); -+ } -+ + public record RequestEntityPayload(boolean showDetails, int entityId, float hitX, float hitY, float hitZ) implements CustomPacketPayload { + + private static final ResourceLocation PACKET_REQUEST_ENTITY = JadeProtocol.id("request_entity"); @@ -485,53 +640,26 @@ index 0000000000000000000000000000000000000000..d9727943c5d44361d35b96ee8045918c + return mutableComponent; + } + -+ public static List> getGroups(ServerPlayer player, ServerLevel world, Object target, boolean showDetails) { -+ if (target instanceof RandomizableContainerBlockEntity te && te.lootTable != null) { -+ return List.of(); -+ } -+ if (target instanceof ContainerEntity containerEntity && containerEntity.getLootTable() != null) { -+ return List.of(); -+ } -+ if (!player.isCreative() && !player.isSpectator() && target instanceof BaseContainerBlockEntity te) { -+ if (te.lockKey != LockCode.NO_LOCK) { -+ return List.of(); ++ public interface IJadeProvider { ++ } ++ ++ public interface IJadeDataProvider { ++ void saveData(CompoundTag data, ServerPlayer player, Level world, T object, boolean showDetails); ++ } ++ ++ public interface IServerExtensionProvider { ++ List> getGroups(ServerPlayer player, Level world, IN target); ++ } ++ ++ public static class ItemCollector { ++ public static final int MAX_SIZE = 54; ++ public static final ItemCollector EMPTY = new ItemCollector<>(null); ++ private static final Predicate NON_EMPTY = stack -> { ++ if (stack.isEmpty()) { ++ return false; + } -+ } -+ -+ return wrapItemStorage(target, player); -+ } -+ -+ public static List> wrapItemStorage(Object target, ServerPlayer player) { -+ int size = 54; -+ if (target instanceof AbstractHorse horse) { -+ return List.of(fromContainer(horse.inventory, size, 2)); -+ } -+ if (target instanceof Container container) { -+ if (target instanceof ChestBlockEntity be) { -+ if (be.getBlockState().getBlock() instanceof ChestBlock chestBlock) { -+ Container compound = ChestBlock.getContainer(chestBlock, be.getBlockState(), be.getLevel(), be.getBlockPos(), false); -+ if (compound != null) { -+ container = compound; -+ } -+ } -+ } -+ return List.of(fromContainer(container, size, 0)); -+ } -+ if (player != null && target instanceof EnderChestBlockEntity) { -+ return List.of(fromContainer(player.getEnderChestInventory(), size, 0)); -+ } -+ return null; -+ } -+ -+ public static ViewGroup fromContainer(Container container, int maxSize, int startIndex) { -+ return compacted(IntStream.range(startIndex, container.getContainerSize()).limit(maxSize * 3L).mapToObj(container::getItem), maxSize); -+ } -+ -+ public static ViewGroup compacted(Stream stream, int maxSize) { -+ List stacks = Lists.newArrayList(); -+ MutableInt start = new MutableInt(); -+ stream.filter(stack -> !stack.isEmpty()).filter(stack -> { -+ if (stack.hasTag() && stack.getTag().contains("CustomModelData")) { ++ CompoundTag tag = stack.getTag(); ++ if (tag != null && tag.contains("CustomModelData")) { + for (String key : stack.getTag().getAllKeys()) { + if (key.toLowerCase(Locale.ENGLISH).endsWith("clear") && stack.getTag().getBoolean(key)) { + return false; @@ -539,21 +667,180 @@ index 0000000000000000000000000000000000000000..d9727943c5d44361d35b96ee8045918c + } + } + return true; -+ }).forEach(stack -> { -+ int size = stacks.size(); -+ if (size > maxSize) return; -+ for (int i = 0; i < size; i++) { -+ int j = (i + start.intValue()) % size; -+ if (ItemStack.isSameItemSameTags(stack, stacks.get(j))) { -+ stacks.get(j).grow(stack.getCount()); -+ start.setValue(j); -+ return; -+ } ++ }; ++ private final Object2IntLinkedOpenHashMap items = new Object2IntLinkedOpenHashMap<>(); ++ private final ItemIterator iterator; ++ public long version; ++ public long lastTimeFinished; ++ public List> mergedResult; ++ ++ public ItemCollector(ItemIterator iterator) { ++ this.iterator = iterator; ++ } ++ ++ public List> update(Object target, long gameTime) { ++ if (iterator == null) { ++ return null; + } -+ stacks.add(stack.copy()); -+ }); -+ if (stacks.size() > maxSize) stacks.remove(maxSize); -+ return new ViewGroup<>(stacks); ++ T container = iterator.find(target); ++ if (container == null) { ++ return null; ++ } ++ long currentVersion = iterator.getVersion(container); ++ if (mergedResult != null && iterator.isFinished()) { ++ if (version == currentVersion) { ++ return mergedResult; // content not changed ++ } ++ if (lastTimeFinished + 5 > gameTime) { ++ return mergedResult; // avoid update too frequently ++ } ++ iterator.reset(); ++ } ++ AtomicInteger count = new AtomicInteger(); ++ iterator.populate(container).forEach(stack -> { ++ count.incrementAndGet(); ++ if (NON_EMPTY.test(stack)) { ++ ItemDefinition def = new ItemDefinition(stack); ++ items.addTo(def, stack.getCount()); ++ } ++ }); ++ iterator.afterPopulate(count.get()); ++ if (mergedResult != null && !iterator.isFinished()) { ++ updateCollectingProgress(mergedResult.get(0)); ++ return mergedResult; ++ } ++ List partialResult = items.object2IntEntrySet().stream().limit(54).map(entry -> { ++ ItemDefinition def = entry.getKey(); ++ return def.toStack(entry.getIntValue()); ++ }).toList(); ++ List> groups = List.of(updateCollectingProgress(new ViewGroup<>(partialResult))); ++ if (iterator.isFinished()) { ++ mergedResult = groups; ++ version = currentVersion; ++ lastTimeFinished = gameTime; ++ items.clear(); ++ } ++ return groups; ++ } ++ ++ protected ViewGroup updateCollectingProgress(ViewGroup group) { ++ float progress = iterator.getCollectingProgress(); ++ CompoundTag data = group.getExtraData(); ++ if (Float.isNaN(progress)) { ++ progress = 0; ++ } ++ if (progress >= 1) { ++ data.remove("Collecting"); ++ } else { ++ data.putFloat("Collecting", progress); ++ } ++ return group; ++ } ++ ++ public record ItemDefinition(Item item, @Nullable CompoundTag tag) { ++ ItemDefinition(ItemStack stack) { ++ this(stack.getItem(), stack.getTag()); ++ } ++ ++ public ItemStack toStack(int count) { ++ ItemStack stack = new ItemStack(item); ++ stack.setCount(count); ++ stack.setTag(tag); ++ return stack; ++ } ++ } ++ } ++ ++ public static abstract class ItemIterator { ++ public static final AtomicLong version = new AtomicLong(); ++ protected final Function containerFinder; ++ protected final int fromIndex; ++ protected boolean finished; ++ protected int currentIndex; ++ ++ protected ItemIterator(Function containerFinder, int fromIndex) { ++ this.containerFinder = containerFinder; ++ this.currentIndex = this.fromIndex = fromIndex; ++ } ++ ++ public @Nullable T find(Object target) { ++ return containerFinder.apply(target); ++ } ++ ++ public final boolean isFinished() { ++ return finished; ++ } ++ ++ public long getVersion(T container) { ++ return version.getAndIncrement(); ++ } ++ ++ public abstract Stream populate(T container); ++ ++ public void reset() { ++ currentIndex = fromIndex; ++ finished = false; ++ } ++ ++ public void afterPopulate(int count) { ++ currentIndex += count; ++ if (count == 0 || currentIndex >= 10000) { ++ finished = true; ++ } ++ } ++ ++ public float getCollectingProgress() { ++ return Float.NaN; ++ } ++ ++ public static abstract class SlottedItemIterator extends ItemIterator { ++ protected float progress; ++ ++ public SlottedItemIterator(Function containerFinder, int fromIndex) { ++ super(containerFinder, fromIndex); ++ } ++ ++ protected abstract int getSlotCount(T container); ++ ++ protected abstract ItemStack getItemInSlot(T container, int slot); ++ ++ @Override ++ public Stream populate(T container) { ++ int slotCount = getSlotCount(container); ++ int toIndex = currentIndex + ItemCollector.MAX_SIZE * 2; ++ if (toIndex >= slotCount) { ++ toIndex = slotCount; ++ finished = true; ++ } ++ progress = (float) (currentIndex - fromIndex) / (slotCount - fromIndex); ++ return IntStream.range(currentIndex, toIndex).mapToObj(slot -> getItemInSlot(container, slot)); ++ } ++ ++ @Override ++ public float getCollectingProgress() { ++ return progress; ++ } ++ } ++ ++ public static class ContainerItemIterator extends SlottedItemIterator { ++ public ContainerItemIterator(int fromIndex) { ++ this(Container.class::cast, fromIndex); ++ } ++ ++ public ContainerItemIterator(Function containerFinder, int fromIndex) { ++ super(containerFinder, fromIndex); ++ } ++ ++ @Override ++ protected int getSlotCount(Container container) { ++ return container.getContainerSize(); ++ } ++ ++ @Override ++ protected ItemStack getItemInSlot(Container container, int slot) { ++ return container.getItem(slot); ++ } ++ } + } + + public static class ViewGroup { @@ -583,7 +870,10 @@ index 0000000000000000000000000000000000000000..d9727943c5d44361d35b96ee8045918c + } + + public static boolean saveList(CompoundTag tag, String key, List> groups, Function writer) { -+ if (groups == null || groups.isEmpty()) return false; ++ if (groups == null || groups.isEmpty()) { ++ return false; ++ } ++ + ListTag groupList = new ListTag(); + for (ViewGroup group : groups) { + if (group.views.isEmpty()) { @@ -606,18 +896,14 @@ index 0000000000000000000000000000000000000000..d9727943c5d44361d35b96ee8045918c + } + return extraData; + } -+ -+ public void setProgress(float progress) { -+ getExtraData().putFloat("Progress", progress); -+ } + } + -+ public static class HierarchyLookup> { ++ public static class HierarchyLookup { + + private final Class baseClass; -+ private final ListMultimap, T> objects = ArrayListMultimap.create(); + private final Cache, List> resultCache = CacheBuilder.newBuilder().build(); + private final boolean singleton; ++ private ListMultimap, T> objects = ArrayListMultimap.create(); + + public HierarchyLookup(Class baseClass) { + this(baseClass, false); @@ -645,7 +931,9 @@ index 0000000000000000000000000000000000000000..d9727943c5d44361d35b96ee8045918c + return resultCache.get(clazz, () -> { + List list = Lists.newArrayList(); + getInternal(clazz, list); -+ if (singleton && !list.isEmpty()) return ImmutableList.of(list.get(0)); ++ if (singleton && !list.isEmpty()) { ++ return ImmutableList.of(list.get(0)); ++ } + return list; + }); + } catch (ExecutionException e) { @@ -660,5 +948,9 @@ index 0000000000000000000000000000000000000000..d9727943c5d44361d35b96ee8045918c + } + list.addAll(objects.get(clazz)); + } ++ ++ public Multimap, T> getObjects() { ++ return objects; ++ } + } +} diff --git a/patches/server/0030-Leaves-Xaero-Map-Protocol.patch b/patches/server/0030-Leaves-Xaero-Map-Protocol.patch index 6ff29c50..43460424 100644 --- a/patches/server/0030-Leaves-Xaero-Map-Protocol.patch +++ b/patches/server/0030-Leaves-Xaero-Map-Protocol.patch @@ -7,10 +7,10 @@ Original license: GPLv3 Original project: https://github.com/LeavesMC/Leaves diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index 9b8b0740a06b5b92fb3e905d7f8945c91ee637fb..d823423ae9e5273355c40e0f5b0e7b5ff4ef34c3 100644 +index 80db3fcf338846770e8c8ee6aa7635a68f2b6753..d9640b2a08101e9bd65323019c1de9c087822dde 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java -@@ -1376,6 +1376,7 @@ public abstract class PlayerList { +@@ -1375,6 +1375,7 @@ public abstract class PlayerList { player.connection.send(new ClientboundInitializeBorderPacket(worldborder)); player.connection.send(new ClientboundSetTimePacket(world.getGameTime(), world.getDayTime(), world.getGameRules().getBoolean(GameRules.RULE_DAYLIGHT))); player.connection.send(new ClientboundSetDefaultSpawnPositionPacket(world.getSharedSpawnPos(), world.getSharedSpawnAngle())); @@ -19,7 +19,7 @@ index 9b8b0740a06b5b92fb3e905d7f8945c91ee637fb..d823423ae9e5273355c40e0f5b0e7b5f // CraftBukkit start - handle player weather // entityplayer.connection.send(new PacketPlayOutGameStateChange(PacketPlayOutGameStateChange.START_RAINING, 0.0F)); diff --git a/src/main/java/org/dreeam/leaf/LeafConfig.java b/src/main/java/org/dreeam/leaf/LeafConfig.java -index 472cbd7c35f8bbbdfdd2708f97b18f0422a1f648..3bfa1c7b7a4ad44224cde67fe3778fe8676e61ef 100644 +index 097c02b204369cd8e3acf852db761533ad58af89..429e2fb485a7c0fa9329078a2690ed48c649a49d 100644 --- a/src/main/java/org/dreeam/leaf/LeafConfig.java +++ b/src/main/java/org/dreeam/leaf/LeafConfig.java @@ -2,6 +2,7 @@ package org.dreeam.leaf; diff --git a/patches/server/0031-Leaves-Syncmatica-Protocol.patch b/patches/server/0031-Leaves-Syncmatica-Protocol.patch index 5605bdf4..65fd5ee0 100644 --- a/patches/server/0031-Leaves-Syncmatica-Protocol.patch +++ b/patches/server/0031-Leaves-Syncmatica-Protocol.patch @@ -9,10 +9,10 @@ Original project: https://github.com/LeavesMC/Leaves This patch is Powered by Syncmatica(https://github.com/End-Tech/syncmatica) diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index a5fb09c24788fef07463a6abb6bee2718bdd779e..998e8c9edbe658484f220daf8c6f7da1d4ce7cfd 100644 +index 1c1f6d89b622a5fb7d2ab541dbe4f029723c7811..e5aeb104beff9ca8969c86bb2b2c2bea9dcde5ab 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -311,6 +311,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -310,6 +310,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl Objects.requireNonNull(server); this.signedMessageDecoder = SignedMessageChain.Decoder.unsigned(uuid, server::enforceSecureProfile); this.chatMessageChain = new FutureChain(server.chatExecutor); // CraftBukkit - async chat @@ -20,7 +20,7 @@ index a5fb09c24788fef07463a6abb6bee2718bdd779e..998e8c9edbe658484f220daf8c6f7da1 } // CraftBukkit start - add fields -@@ -350,6 +351,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -349,6 +350,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl ); // Purpur end @@ -30,7 +30,7 @@ index a5fb09c24788fef07463a6abb6bee2718bdd779e..998e8c9edbe658484f220daf8c6f7da1 public void tick() { if (this.ackBlockChangesUpTo > -1) { diff --git a/src/main/java/org/dreeam/leaf/LeafConfig.java b/src/main/java/org/dreeam/leaf/LeafConfig.java -index 3bfa1c7b7a4ad44224cde67fe3778fe8676e61ef..49fc8b6e0be0e1d5bdc283cef91ab0834dc387f1 100644 +index 429e2fb485a7c0fa9329078a2690ed48c649a49d..86f95b0e99b1a00883d5f4c735f155769c53879f 100644 --- a/src/main/java/org/dreeam/leaf/LeafConfig.java +++ b/src/main/java/org/dreeam/leaf/LeafConfig.java @@ -253,11 +253,20 @@ public class LeafConfig { diff --git a/patches/server/0032-Leaves-Disable-moved-wrongly-threshold.patch b/patches/server/0032-Leaves-Disable-moved-wrongly-threshold.patch index 93b893bb..44994311 100644 --- a/patches/server/0032-Leaves-Disable-moved-wrongly-threshold.patch +++ b/patches/server/0032-Leaves-Disable-moved-wrongly-threshold.patch @@ -7,10 +7,10 @@ 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 998e8c9edbe658484f220daf8c6f7da1d4ce7cfd..a2950eab75913c3d8faa3955373d6ad5b0b7d54c 100644 +index e5aeb104beff9ca8969c86bb2b2c2bea9dcde5ab..268eff03168d25cccba703d1c5df603c9c3663cd 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -247,7 +247,6 @@ import org.bukkit.inventory.EquipmentSlot; +@@ -246,7 +246,6 @@ import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.InventoryView; import org.bukkit.inventory.SmithingInventory; // CraftBukkit end @@ -18,16 +18,16 @@ index 998e8c9edbe658484f220daf8c6f7da1d4ce7cfd..a2950eab75913c3d8faa3955373d6ad5 public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl implements ServerGamePacketListener, ServerPlayerConnection, TickablePacketListener { static final Logger LOGGER = LogUtils.getLogger(); -@@ -583,7 +582,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -579,7 +578,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl } - // Paper end + // Paper end - Prevent moving into unloaded chunks - if (d10 - d9 > Math.max(100.0D, Math.pow((double) (org.spigotmc.SpigotConfig.movedTooQuicklyMultiplier * (float) i * speed), 2)) && !this.isSingleplayerOwner()) { + 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 +618,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -615,7 +614,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl d10 = d6 * d6 + d7 * d7 + d8 * d8; boolean flag2 = false; @@ -36,7 +36,7 @@ index 998e8c9edbe658484f220daf8c6f7da1d4ce7cfd..a2950eab75913c3d8faa3955373d6ad5 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)}); } -@@ -1489,7 +1488,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1483,7 +1482,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()) { @@ -45,9 +45,9 @@ index 998e8c9edbe658484f220daf8c6f7da1d4ce7cfd..a2950eab75913c3d8faa3955373d6ad5 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; -@@ -1559,7 +1558,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1553,7 +1552,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl d10 = d6 * d6 + d7 * d7 + d8 * d8; - boolean flag2 = false; + boolean movedWrongly = false; // Paper - Add fail move event; rename - if (!this.player.isChangingDimension() && d10 > org.spigotmc.SpigotConfig.movedWronglyThreshold && !this.player.isSleeping() && !this.player.gameMode.isCreative() && this.player.gameMode.getGameModeForPlayer() != GameType.SPECTATOR) { // Spigot + 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 @@ -55,7 +55,7 @@ index 998e8c9edbe658484f220daf8c6f7da1d4ce7cfd..a2950eab75913c3d8faa3955373d6ad5 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 49fc8b6e0be0e1d5bdc283cef91ab0834dc387f1..c16913bda424c060d0abd83fcfaa93f52f4f8891 100644 +index 86f95b0e99b1a00883d5f4c735f155769c53879f..4cc25879528dc06f3a6f8112ad0571baae8d838b 100644 --- a/src/main/java/org/dreeam/leaf/LeafConfig.java +++ b/src/main/java/org/dreeam/leaf/LeafConfig.java @@ -176,6 +176,7 @@ public class LeafConfig { 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 index a4ab916c..3284de1f 100644 --- a/patches/server/0033-Leaves-Fix-vehicle-teleport-by-end-gateway.patch +++ b/patches/server/0033-Leaves-Fix-vehicle-teleport-by-end-gateway.patch @@ -7,12 +7,12 @@ 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 +index 72a69569fab9d62c27c3ea4005c4e24816bdc5cd..82199b522db0fb21e5a74111284f8574f48109c1 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 + // Paper start - Ensure safe gateway teleport for (Entity entity : list) { - if (entity.canChangeDimensions()) { + if (org.dreeam.leaf.LeafConfig.useVanillaEndTeleport || entity.canChangeDimensions()) { // Leaf - be vanilla @@ -20,7 +20,7 @@ index 5d9f25da1bd502b0047abc64ef7602968ee3cb20..9f84d53f82e430e92568aef0bb7ec5bd 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 +index 4cc25879528dc06f3a6f8112ad0571baae8d838b..1754f580d833670c16c8f9b7f087250ea62612dd 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 { diff --git a/patches/server/0036-Petal-Async-Pathfinding.patch b/patches/server/0036-Petal-Async-Pathfinding.patch index 710dbcac..6f003ce0 100644 --- a/patches/server/0036-Petal-Async-Pathfinding.patch +++ b/patches/server/0036-Petal-Async-Pathfinding.patch @@ -15,7 +15,7 @@ This patch was ported downstream from the Petal fork. Makes most pathfinding-related work happen asynchronously diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java -index b9f1bfef9f33138c52f800084828bdc805960cab..1ea2f6829747e4c4a722a533c165aacd4aae1c81 100644 +index b171c53efae9cc39bc68164fbe0f90afb47769be..21d5abd15e833c77983692b59475a77c66ca3ecc 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java @@ -294,6 +294,7 @@ public abstract class Mob extends LivingEntity implements Targeting { @@ -320,7 +320,7 @@ index 9d3b32c852d660356e0f16d4cc10072b1c603e64..3a8579ccedc9c70abe75adc99d8e72aa } diff --git a/src/main/java/net/minecraft/world/entity/ai/navigation/FlyingPathNavigation.java b/src/main/java/net/minecraft/world/entity/ai/navigation/FlyingPathNavigation.java -index 027eef4ace908147285c8d72b612d16e4f925672..5ce3daabd949f72b16abc8e7888e2e80deb13b21 100644 +index e35c38feb62c3345d82636081decc09db9f061ab..f9d34b6a3a470b45360a1b53c0b36d59465e70a9 100644 --- a/src/main/java/net/minecraft/world/entity/ai/navigation/FlyingPathNavigation.java +++ b/src/main/java/net/minecraft/world/entity/ai/navigation/FlyingPathNavigation.java @@ -10,16 +10,34 @@ import net.minecraft.world.level.pathfinder.FlyNodeEvaluator; @@ -367,7 +367,7 @@ index 027eef4ace908147285c8d72b612d16e4f925672..5ce3daabd949f72b16abc8e7888e2e80 if (!this.isDone()) { if (this.canUpdatePath()) { diff --git a/src/main/java/net/minecraft/world/entity/ai/navigation/GroundPathNavigation.java b/src/main/java/net/minecraft/world/entity/ai/navigation/GroundPathNavigation.java -index ac996b066415e461af1fcb71b19807401179c7f8..8a36614c32d209e75fcbee0b2ea65855675363dd 100644 +index 47de460ff5435ea6712c800c77093126908d0fce..6c6d61a554e5bfdf7495fa5184dbd6eca1633971 100644 --- a/src/main/java/net/minecraft/world/entity/ai/navigation/GroundPathNavigation.java +++ b/src/main/java/net/minecraft/world/entity/ai/navigation/GroundPathNavigation.java @@ -15,6 +15,8 @@ import net.minecraft.world.level.pathfinder.Path; @@ -407,7 +407,7 @@ index ac996b066415e461af1fcb71b19807401179c7f8..8a36614c32d209e75fcbee0b2ea65855 } diff --git a/src/main/java/net/minecraft/world/entity/ai/navigation/PathNavigation.java b/src/main/java/net/minecraft/world/entity/ai/navigation/PathNavigation.java -index 91f85cdf46f9bb59c6d00293b1d95d49a6c2a52a..a08149f9b8705a27fc5b20cbd76abc9bb67a03be 100644 +index 33983ed67ad6b0d25d2ae00e03415bda940584eb..801077daca6781e68193f71be20076390e42200e 100644 --- a/src/main/java/net/minecraft/world/entity/ai/navigation/PathNavigation.java +++ b/src/main/java/net/minecraft/world/entity/ai/navigation/PathNavigation.java @@ -25,6 +25,8 @@ import net.minecraft.world.level.pathfinder.PathFinder; @@ -419,7 +419,7 @@ index 91f85cdf46f9bb59c6d00293b1d95d49a6c2a52a..a08149f9b8705a27fc5b20cbd76abc9b public abstract class PathNavigation { private static final int MAX_TIME_RECOMPUTE = 20; -@@ -152,6 +154,10 @@ public abstract class PathNavigation { +@@ -153,6 +155,10 @@ public abstract class PathNavigation { return null; } else if (!this.canUpdatePath()) { return null; @@ -430,7 +430,7 @@ index 91f85cdf46f9bb59c6d00293b1d95d49a6c2a52a..a08149f9b8705a27fc5b20cbd76abc9b } else if (this.path != null && !this.path.isDone() && positions.contains(this.targetPos)) { return this.path; } else { -@@ -176,11 +182,29 @@ public abstract class PathNavigation { +@@ -177,11 +183,29 @@ public abstract class PathNavigation { int i = (int)(followRange + (float)range); PathNavigationRegion pathNavigationRegion = new PathNavigationRegion(this.level, blockPos.offset(-i, -i, -i), blockPos.offset(i, i, i)); Path path = this.pathFinder.findPath(pathNavigationRegion, this.mob, positions, followRange, distance, this.maxVisitedNodesMultiplier); @@ -460,7 +460,7 @@ index 91f85cdf46f9bb59c6d00293b1d95d49a6c2a52a..a08149f9b8705a27fc5b20cbd76abc9b return path; } -@@ -227,8 +251,8 @@ public abstract class PathNavigation { +@@ -228,8 +252,8 @@ public abstract class PathNavigation { if (this.isDone()) { return false; } else { @@ -471,7 +471,7 @@ index 91f85cdf46f9bb59c6d00293b1d95d49a6c2a52a..a08149f9b8705a27fc5b20cbd76abc9b return false; } else { this.speedModifier = speed; -@@ -251,6 +275,7 @@ public abstract class PathNavigation { +@@ -252,6 +276,7 @@ public abstract class PathNavigation { if (this.hasDelayedRecomputation) { this.recomputePath(); } @@ -479,7 +479,7 @@ index 91f85cdf46f9bb59c6d00293b1d95d49a6c2a52a..a08149f9b8705a27fc5b20cbd76abc9b if (!this.isDone()) { if (this.canUpdatePath()) { -@@ -277,6 +302,7 @@ public abstract class PathNavigation { +@@ -278,6 +303,7 @@ public abstract class PathNavigation { } protected void followThePath() { @@ -487,7 +487,7 @@ index 91f85cdf46f9bb59c6d00293b1d95d49a6c2a52a..a08149f9b8705a27fc5b20cbd76abc9b Vec3 vec3 = this.getTempMobPos(); this.maxDistanceToWaypoint = this.mob.getBbWidth() > 0.75F ? this.mob.getBbWidth() / 2.0F : 0.75F - this.mob.getBbWidth() / 2.0F; Vec3i vec3i = this.path.getNextNodePos(); -@@ -432,7 +458,7 @@ public abstract class PathNavigation { +@@ -433,7 +459,7 @@ public abstract class PathNavigation { public boolean shouldRecomputePath(BlockPos pos) { if (this.hasDelayedRecomputation) { return false; @@ -592,7 +592,7 @@ index 8db20db72cd51046213625fac46c35854c59ec5d..fc99483dfe248d26885c904b72c93b0d } } diff --git a/src/main/java/net/minecraft/world/entity/animal/Bee.java b/src/main/java/net/minecraft/world/entity/animal/Bee.java -index bdb78cc701543cfe91a6bafd1786fe2ea0bf1ddc..8d2e60c24e8d48094a93fdd864d931d0c33d0ca0 100644 +index 997ab942be9f742804041b07d607e7dd6473ba96..9ef7be84999ab0ec39d2b58a48cdaebf42db10c9 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Bee.java +++ b/src/main/java/net/minecraft/world/entity/animal/Bee.java @@ -1154,7 +1154,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { @@ -657,7 +657,7 @@ index 819445535895fbf79b99222bc6bf33cbd9089813..80a7197835531fa8cd276d9d31860f2b } } diff --git a/src/main/java/net/minecraft/world/entity/monster/Drowned.java b/src/main/java/net/minecraft/world/entity/monster/Drowned.java -index 034bb2d1292dde6276885c3ea71d886c3894311c..3556f9a37d6a4790f9311e1004d32156aff541e2 100644 +index 7600e747d91ae888eb801cfafcb09bffb76c8e62..0939ca7c225790c7a294accd820be3ff8000ac75 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Drowned.java +++ b/src/main/java/net/minecraft/world/entity/monster/Drowned.java @@ -282,7 +282,6 @@ public class Drowned extends Zombie implements RangedAttackMob { @@ -718,7 +718,7 @@ index 2f49b528601a1feb7246fe7a9b83ce828c2d78fc..a29f212f3b38f1d80d7d5023f86a7acf } diff --git a/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java b/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java -index 96f98389d8cdf588396bf6257a11236a577878a0..c23d192baf78890093b0e88d03735eef4569e75f 100644 +index 07fa613d75f3659145945245926e9068057e3ed2..da834424b655d49388926a0472cacb5ecc4d56fd 100644 --- a/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java +++ b/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java @@ -623,6 +623,16 @@ public class Warden extends Monster implements VibrationSystem { @@ -757,7 +757,7 @@ index 42407c5c0c09cd9d19bc7af92af8868bb038c686..204a17ab514d63294e72d609b0b35749 @Override diff --git a/src/main/java/net/minecraft/world/level/pathfinder/Path.java b/src/main/java/net/minecraft/world/level/pathfinder/Path.java -index eea4c932d909145e7af848cf76e3f49dbb2deff2..7160459ec8ba81f66a85082a1fe7b06377180afa 100644 +index 3049edb5a8b5967e5242a3896b23665888eb3472..0da9acd785cf785d82be7aab0a1e2bfd70c62998 100644 --- a/src/main/java/net/minecraft/world/level/pathfinder/Path.java +++ b/src/main/java/net/minecraft/world/level/pathfinder/Path.java @@ -27,6 +27,17 @@ public class Path { @@ -787,7 +787,7 @@ index eea4c932d909145e7af848cf76e3f49dbb2deff2..7160459ec8ba81f66a85082a1fe7b063 return false; } else if (o.nodes.size() != this.nodes.size()) { diff --git a/src/main/java/net/minecraft/world/level/pathfinder/PathFinder.java b/src/main/java/net/minecraft/world/level/pathfinder/PathFinder.java -index c4052d1a7c2903564a8a6226c1b019d299c71b2a..97490ba1adeed8d0c941587d42700d35b5a41fd5 100644 +index 61d5fe8e5344a6cb94d427859488c34821c8a3f6..c679bdd7b26783463fddfd848005385e05d69903 100644 --- a/src/main/java/net/minecraft/world/level/pathfinder/PathFinder.java +++ b/src/main/java/net/minecraft/world/level/pathfinder/PathFinder.java @@ -1,20 +1,18 @@ @@ -852,13 +852,13 @@ index c4052d1a7c2903564a8a6226c1b019d299c71b2a..97490ba1adeed8d0c941587d42700d35 + NodeEvaluatorCache.removeNodeEvaluator(nodeEvaluator); // Kaiiju - petal - handle nodeEvaluatorGenerator return null; } else { - // Paper start - remove streams - and optimize collection + // Paper start - Perf: remove streams and optimize collection List> map = Lists.newArrayList(); for (BlockPos pos : positions) { - map.add(new java.util.AbstractMap.SimpleEntry<>(this.nodeEvaluator.getGoal(pos.getX(), pos.getY(), pos.getZ()), pos)); + map.add(new java.util.AbstractMap.SimpleEntry<>(nodeEvaluator.getGoal(pos.getX(), pos.getY(), pos.getZ()), pos)); // Kaiiju - petal - handle nodeEvaluatorGenerator } - // Paper end + // Paper end - Perf: remove streams and optimize collection - Path path = this.findPath(node, map, followRange, distance, rangeMultiplier); // Gale - Purpur - remove vanilla profiler - this.nodeEvaluator.done(); - return path; @@ -884,9 +884,8 @@ index c4052d1a7c2903564a8a6226c1b019d299c71b2a..97490ba1adeed8d0c941587d42700d35 } } -- @Nullable -+ //@Nullable // Kaiiju - Always not null - // Paper start - optimize collection + @Nullable + // Paper start - Perf: remove streams and optimize collection private Path findPath(Node startNode, List> positions, float followRange, int distance, float rangeMultiplier) { // Gale - Purpur - remove vanilla profiler + // Kaiiju start - petal - split pathfinding into the original sync method for compat and processing for delaying + try { @@ -920,7 +919,7 @@ index c4052d1a7c2903564a8a6226c1b019d299c71b2a..97490ba1adeed8d0c941587d42700d35 } + //noinspection ConstantConditions // Kaiiju - petal - ignore this warning, we know that the above loop always runs at least once since positions is not empty return best; - // Paper end + // Paper end - Perf: remove streams and optimize collection } diff --git a/src/main/java/net/minecraft/world/level/pathfinder/SwimNodeEvaluator.java b/src/main/java/net/minecraft/world/level/pathfinder/SwimNodeEvaluator.java index 0e2b14e7dfedf209d63279c81723fd7955122d78..079b278e2e262af433bb5bd0c12b3d8db4fa12fc 100644 @@ -936,7 +935,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 41009a22116ef4a81e9e550af186f5c0d9d43fa7..d6646f4db522aa4a5404acf17fb34bfe01a5763a 100644 +index 1754f580d833670c16c8f9b7f087250ea62612dd..393c8d887e0de195d6bd95c9c3273b03d7b3eb03 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; diff --git a/patches/server/0037-Fix-tracker-NPE.patch b/patches/server/0037-Fix-tracker-NPE.patch index ea0f5079..ffe1464c 100644 --- a/patches/server/0037-Fix-tracker-NPE.patch +++ b/patches/server/0037-Fix-tracker-NPE.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Fix tracker NPE diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java -index 95add10db1d7600167312160cd1a15a715c7b54f..62ac94fff8542eedd3fea5fbaef5c4f617fdac01 100644 +index 2b9968a8a3d0d66d9db5a83dcf2a44767a9fe412..da9c5d362a0bde281c95e9ebc413c51d66aaaa0f 100644 --- a/src/main/java/net/minecraft/server/level/ChunkMap.java +++ b/src/main/java/net/minecraft/server/level/ChunkMap.java @@ -241,7 +241,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider @@ -17,7 +17,7 @@ index 95add10db1d7600167312160cd1a15a715c7b54f..62ac94fff8542eedd3fea5fbaef5c4f6 public final com.destroystokyo.paper.util.misc.PlayerAreaMap playerMobSpawnMap = new gg.pufferfish.pufferfish.util.AsyncPlayerAreaMap(this.pooledLinkedPlayerHashSets); // Pufferfish // Paper end - optimise chunk tick iteration -@@ -1298,7 +1298,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider +@@ -1284,7 +1284,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider final Entity entity; private final int range; SectionPos lastSectionPos; @@ -27,7 +27,7 @@ index 95add10db1d7600167312160cd1a15a715c7b54f..62ac94fff8542eedd3fea5fbaef5c4f6 public TrackedEntity(Entity entity, int i, int j, boolean flag) { this.serverEntity = new ServerEntity(ChunkMap.this.level, entity, j, flag, this::broadcast, this.seenBy); // CraftBukkit diff --git a/src/main/java/net/minecraft/server/level/ServerChunkCache.java b/src/main/java/net/minecraft/server/level/ServerChunkCache.java -index e04ab410b88f681032de4406dceac5ef51476ce1..02b517288ef0794ccfd46802bf76fa56af21c524 100644 +index e841f12a43c4506f87b64b537a8c47bf54de5aa2..1273760f0c1dde908e2512efee2df5460e70eb42 100644 --- a/src/main/java/net/minecraft/server/level/ServerChunkCache.java +++ b/src/main/java/net/minecraft/server/level/ServerChunkCache.java @@ -9,6 +9,7 @@ import java.io.IOException; @@ -38,7 +38,7 @@ index e04ab410b88f681032de4406dceac5ef51476ce1..02b517288ef0794ccfd46802bf76fa56 import java.util.Objects; import java.util.Optional; import java.util.concurrent.CompletableFuture; -@@ -650,7 +651,7 @@ public class ServerChunkCache extends ChunkSource { +@@ -642,7 +643,7 @@ public class ServerChunkCache extends ChunkSource { // Paper - optimise chunk tick iteration // Paper start - optimise chunk tick iteration if (!this.chunkMap.needsChangeBroadcasting.isEmpty()) { @@ -48,7 +48,7 @@ index e04ab410b88f681032de4406dceac5ef51476ce1..02b517288ef0794ccfd46802bf76fa56 for (ChunkHolder holder : copy) { holder.broadcastChanges(holder.getFullChunkNowUnchecked()); // LevelChunks are NEVER unloaded diff --git a/src/main/java/net/minecraft/world/entity/ai/attributes/AttributeMap.java b/src/main/java/net/minecraft/world/entity/ai/attributes/AttributeMap.java -index 635037fb2a44a422b42d7c3c27cc7638c7715635..4fa17d2ba40bfd0159c182b909f9ab936e3ddf39 100644 +index 7394c2d99499faaa4489a7eee1dd8b73ec08668d..d1603df4f829a7f3690970965f5549c99620db01 100644 --- a/src/main/java/net/minecraft/world/entity/ai/attributes/AttributeMap.java +++ b/src/main/java/net/minecraft/world/entity/ai/attributes/AttributeMap.java @@ -1,6 +1,7 @@ diff --git a/patches/server/0039-Reduce-canSee-work.patch b/patches/server/0039-Reduce-canSee-work.patch index 82dd5a40..2c19f97f 100644 --- a/patches/server/0039-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..86d535c704d174da9b75bd599a7b302ba5fe5e56 100644 +index 36a420f8cf463dcabe5717df1af59472db3142fc..3c5d8275782df8d9b3fb6e8047bfde02e26ca93f 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java -@@ -386,17 +386,19 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -383,17 +383,19 @@ public abstract class Level implements LevelAccessor, AutoCloseable { for (int i = 0, len = entities.size(); i < len; ++i) { Entity entity = entities.get(i); @@ -35,10 +35,10 @@ index 2c5c84c028d1298bb145fa1149752db3f83d5de2..86d535c704d174da9b75bd599a7b302b 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..f0da7fb7b09c8a5483b5d741810ab99985df64b6 100644 +index 8875cf92722a1a25c02cd887ff5d000a84e6722d..2b4279efe6698e786f9db8066f73b7934c8660d4 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -591,6 +591,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -549,6 +549,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { return false; } OfflinePlayer other = (OfflinePlayer) obj; diff --git a/patches/server/0040-Faster-Natural-Spawning.patch b/patches/server/0040-Faster-Natural-Spawning.patch index 88ccf49f..af6461a9 100644 --- a/patches/server/0040-Faster-Natural-Spawning.patch +++ b/patches/server/0040-Faster-Natural-Spawning.patch @@ -22,10 +22,10 @@ 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 86d535c704d174da9b75bd599a7b302ba5fe5e56..8658ba808791901cf45b3aeb6317b3ec80387609 100644 +index 3c5d8275782df8d9b3fb6e8047bfde02e26ca93f..a4c5bab9d2a714f15d8053e988e6f585377170d3 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 { +@@ -126,6 +126,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { protected float oThunderLevel; public float thunderLevel; public final RandomSource random = RandomSource.create(); @@ -34,10 +34,10 @@ index 86d535c704d174da9b75bd599a7b302ba5fe5e56..8658ba808791901cf45b3aeb6317b3ec @Deprecated private final RandomSource threadSafeRandom = RandomSource.createThreadSafe(); diff --git a/src/main/java/net/minecraft/world/level/NaturalSpawner.java b/src/main/java/net/minecraft/world/level/NaturalSpawner.java -index ec6afe51fd204e4c0764850dcc4535f7f8c159ab..9f8c6fa8fdf83ecc1e2582345bcf6bb757577f60 100644 +index 31003588de8bef9952a688c486049077328e89a3..9c4a8b6a4371bf8b1af05fb180b8fee020226e05 100644 --- a/src/main/java/net/minecraft/world/level/NaturalSpawner.java +++ b/src/main/java/net/minecraft/world/level/NaturalSpawner.java -@@ -426,12 +426,12 @@ public final class NaturalSpawner { +@@ -422,12 +422,12 @@ public final class NaturalSpawner { private static BlockPos getRandomPosWithin(ServerLevel world, LevelChunk chunk) { // Gale - Airplane - Use ThreadUnsafeRandom for mob spawning - accept ServerLevel ChunkPos chunkcoordintpair = chunk.getPos(); diff --git a/patches/server/0045-Configurable-movement-speed-of-more-entities.patch b/patches/server/0045-Configurable-movement-speed-of-more-entities.patch index 5348cd51..406174af 100644 --- a/patches/server/0045-Configurable-movement-speed-of-more-entities.patch +++ b/patches/server/0045-Configurable-movement-speed-of-more-entities.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Configurable movement speed of more entities diff --git a/src/main/java/net/minecraft/world/entity/monster/Drowned.java b/src/main/java/net/minecraft/world/entity/monster/Drowned.java -index 3556f9a37d6a4790f9311e1004d32156aff541e2..232c6a456298c56f8ce7665705d766a874738b63 100644 +index 0939ca7c225790c7a294accd820be3ff8000ac75..cd0439a24644d0d5adf89911bad3e746b28191dc 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Drowned.java +++ b/src/main/java/net/minecraft/world/entity/monster/Drowned.java @@ -89,6 +89,7 @@ public class Drowned extends Zombie implements RangedAttackMob { @@ -37,7 +37,7 @@ index 06a5106a94a44c1d21537410d801cdd945503d69..be8e667841f7e4b9f9b261c90dc05c6a @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/Zombie.java b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -index 007e75ec5a6a8f1522e7f0d105507834028eb819..cd3f64e88e1f0a600c19e9a0940442c912360332 100644 +index 6d69d936a2346f42abe8f867d51040121213b6ff..5ae6c0aa59f577ea4601fc8ba3768ed81bf0bcdb 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zombie.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zombie.java @@ -128,6 +128,7 @@ public class Zombie extends Monster { @@ -66,7 +66,7 @@ index 007e75ec5a6a8f1522e7f0d105507834028eb819..cd3f64e88e1f0a600c19e9a0940442c9 @Override protected void defineSynchedData() { diff --git a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java -index d8731350ca97de34b256ccf44e08e32037ed527e..91b73e4ae6e556d37700706e9f5cee03d0d371a2 100644 +index d713afdc687b44595c40690f76e5d6c7ccb501c6..5435bbea79a4399b6e42ddd7c6dddf5e7e49d9bf 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java @@ -27,6 +27,7 @@ import net.minecraft.world.entity.EntityType; @@ -86,7 +86,7 @@ index d8731350ca97de34b256ccf44e08e32037ed527e..91b73e4ae6e556d37700706e9f5cee03 @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java -index df8c7a45eb49a8c667030eb67d6d49dcbaef4fcf..6a534272546b19a75880940f39458ca69b0d1653 100644 +index feba8a264bae656244f60296d0511a8046297f73..2a24928fc4509ac3603f7e5ce574fed81274a5a1 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java @@ -84,6 +84,7 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { @@ -113,7 +113,7 @@ index df8c7a45eb49a8c667030eb67d6d49dcbaef4fcf..6a534272546b19a75880940f39458ca6 @Override protected float getStandingEyeHeight(Pose pose, EntityDimensions dimensions) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 307d2703d61285dfe5225be27d8933098b4aa67c..0a29f28cf666896f0715d40bb121017e4675b4e7 100644 +index 88c9389f27f51a6423dfa4c71cf353b8b417e602..18a4b27a9159c211a0faf204e69e895f107b0163 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -1535,6 +1535,7 @@ public class PurpurWorldConfig { @@ -148,7 +148,7 @@ index 307d2703d61285dfe5225be27d8933098b4aa67c..0a29f28cf666896f0715d40bb121017e } public boolean illusionerRidable = false; -@@ -3122,6 +3126,7 @@ public class PurpurWorldConfig { +@@ -3124,6 +3128,7 @@ public class PurpurWorldConfig { public boolean zombieTakeDamageFromWater = false; public boolean zombieAlwaysDropExp = false; public double zombieHeadVisibilityPercent = 0.5D; @@ -156,7 +156,7 @@ index 307d2703d61285dfe5225be27d8933098b4aa67c..0a29f28cf666896f0715d40bb121017e private void zombieSettings() { zombieRidable = getBoolean("mobs.zombie.ridable", zombieRidable); zombieRidableInWater = getBoolean("mobs.zombie.ridable-in-water", zombieRidableInWater); -@@ -3141,6 +3146,7 @@ public class PurpurWorldConfig { +@@ -3143,6 +3148,7 @@ public class PurpurWorldConfig { zombieTakeDamageFromWater = getBoolean("mobs.zombie.takes-damage-from-water", zombieTakeDamageFromWater); zombieAlwaysDropExp = getBoolean("mobs.zombie.always-drop-exp", zombieAlwaysDropExp); zombieHeadVisibilityPercent = getDouble("mobs.zombie.head-visibility-percent", zombieHeadVisibilityPercent); @@ -164,7 +164,7 @@ index 307d2703d61285dfe5225be27d8933098b4aa67c..0a29f28cf666896f0715d40bb121017e } public boolean zombieHorseRidable = false; -@@ -3189,6 +3195,7 @@ public class PurpurWorldConfig { +@@ -3191,6 +3197,7 @@ public class PurpurWorldConfig { public int zombieVillagerCuringTimeMax = 6000; public boolean zombieVillagerCureEnabled = true; public boolean zombieVillagerAlwaysDropExp = false; @@ -172,7 +172,7 @@ index 307d2703d61285dfe5225be27d8933098b4aa67c..0a29f28cf666896f0715d40bb121017e private void zombieVillagerSettings() { zombieVillagerRidable = getBoolean("mobs.zombie_villager.ridable", zombieVillagerRidable); zombieVillagerRidableInWater = getBoolean("mobs.zombie_villager.ridable-in-water", zombieVillagerRidableInWater); -@@ -3208,6 +3215,7 @@ public class PurpurWorldConfig { +@@ -3210,6 +3217,7 @@ public class PurpurWorldConfig { zombieVillagerCuringTimeMax = getInt("mobs.zombie_villager.curing_time.max", zombieVillagerCuringTimeMax); zombieVillagerCureEnabled = getBoolean("mobs.zombie_villager.cure.enabled", zombieVillagerCureEnabled); zombieVillagerAlwaysDropExp = getBoolean("mobs.zombie_villager.always-drop-exp", zombieVillagerAlwaysDropExp); @@ -180,7 +180,7 @@ index 307d2703d61285dfe5225be27d8933098b4aa67c..0a29f28cf666896f0715d40bb121017e } public boolean zombifiedPiglinRidable = false; -@@ -3221,6 +3229,7 @@ public class PurpurWorldConfig { +@@ -3223,6 +3231,7 @@ public class PurpurWorldConfig { public boolean zombifiedPiglinCountAsPlayerKillWhenAngry = true; public boolean zombifiedPiglinTakeDamageFromWater = false; public boolean zombifiedPiglinAlwaysDropExp = false; @@ -188,7 +188,7 @@ index 307d2703d61285dfe5225be27d8933098b4aa67c..0a29f28cf666896f0715d40bb121017e private void zombifiedPiglinSettings() { zombifiedPiglinRidable = getBoolean("mobs.zombified_piglin.ridable", zombifiedPiglinRidable); zombifiedPiglinRidableInWater = getBoolean("mobs.zombified_piglin.ridable-in-water", zombifiedPiglinRidableInWater); -@@ -3238,6 +3247,7 @@ public class PurpurWorldConfig { +@@ -3240,6 +3249,7 @@ public class PurpurWorldConfig { zombifiedPiglinCountAsPlayerKillWhenAngry = getBoolean("mobs.zombified_piglin.count-as-player-kill-when-angry", zombifiedPiglinCountAsPlayerKillWhenAngry); zombifiedPiglinTakeDamageFromWater = getBoolean("mobs.zombified_piglin.takes-damage-from-water", zombifiedPiglinTakeDamageFromWater); zombifiedPiglinAlwaysDropExp = getBoolean("mobs.zombified_piglin.always-drop-exp", zombifiedPiglinAlwaysDropExp); diff --git a/patches/server/0046-Fix-TerminalConsoleAppender-NPE-error-on-server-clos.patch b/patches/server/0046-Fix-TerminalConsoleAppender-NPE-error-on-server-clos.patch index d6d73f2d..867c98fd 100644 --- a/patches/server/0046-Fix-TerminalConsoleAppender-NPE-error-on-server-clos.patch +++ b/patches/server/0046-Fix-TerminalConsoleAppender-NPE-error-on-server-clos.patch @@ -13,23 +13,23 @@ Fixed errors in console has no color,also fixed`Advanced terminal features are n or `Unable to create terminal` like issues diff --git a/build.gradle.kts b/build.gradle.kts -index 3ed769d9fa46f8a5f340c5874f5cc6f11d2ba6f4..2adcf3c29257580b814e66b451ca71e772a6f49f 100644 +index e7ac805b5b455083b6b07eec05ca2e3bc655edd0..f9b4cd6f7032908ff32cfa68e736c01eaec24ce1 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -23,7 +23,7 @@ dependencies { // Gale end - project setup // Paper start - implementation("org.jline:jline-terminal-jansi:3.25.0") // Leaf - Bump Dependencies + implementation("org.jline:jline-terminal-jansi:3.25.1") // Leaf - Bump Dependencies - implementation("net.minecrell:terminalconsoleappender:1.3.0") + implementation("com.github.Dreeam-qwq:TerminalConsoleAppender:360a0759") // Leaf - Use own TerminalConsoleAppender fork to fix some issues under latest version of jline/log4j implementation("net.kyori:adventure-text-serializer-ansi:4.15.0") // Keep in sync with adventureVersion from Paper-API build file // Leaf - Bump Dependencies implementation("net.kyori:ansi:1.0.3") // Manually bump beyond above transitive dep /* diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index a2933d814d453971080eeba90bb1819a8d599ba7..cd259a016a3f3189aab59ab1950e991fe6c31cd2 100644 +index 9af04084afe0689e5486be775cee3ba20e30617e..5b7f99a534dc7a02fcc6d6b01a80d5c62d8af527 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1268,10 +1268,12 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0) { + // Leaf start - Configurable PandaSpigot knockback if (target instanceof LivingEntity) { -- ((LivingEntity) target).knockback((double) ((float) i * 0.5F), (double) Mth.sin(this.getYRot() * 0.017453292F), (double) (-Mth.cos(this.getYRot() * 0.017453292F)), this); // Paper +- ((LivingEntity) target).knockback((double) ((float) i * 0.5F), (double) Mth.sin(this.getYRot() * 0.017453292F), (double) (-Mth.cos(this.getYRot() * 0.017453292F)), this); // Paper - Add EntityKnockbackByEntityEvent and EntityPushedByEntityAttackEvent + ((LivingEntity) target).knockback( -+ (float) i * 0.5F, -+ Mth.sin(this.getYRot() * 0.017453292F), -+ -Mth.cos(this.getYRot() * 0.017453292F), -+ this -+ ); // Paper ++ (float) i * 0.5F, ++ Mth.sin(this.getYRot() * 0.017453292F), ++ -Mth.cos(this.getYRot() * 0.017453292F), ++ this ++ ); // Paper - Add EntityKnockbackByEntityEvent and EntityPushedByEntityAttackEvent } else { -- target.push((double) (-Mth.sin(this.getYRot() * 0.017453292F) * (float) i * 0.5F), 0.1D, (double) (Mth.cos(this.getYRot() * 0.017453292F) * (float) i * 0.5F), this); // Paper +- target.push((double) (-Mth.sin(this.getYRot() * 0.017453292F) * (float) i * 0.5F), 0.1D, (double) (Mth.cos(this.getYRot() * 0.017453292F) * (float) i * 0.5F), this); // Paper - Add EntityKnockbackByEntityEvent and EntityPushedByEntityAttackEvent + target.push( + -Mth.sin(this.getYRot() * 0.017453292F) * (float) i * org.dreeam.leaf.LeafConfig.extraHorizontal, + org.dreeam.leaf.LeafConfig.extraVertical, + Mth.cos(this.getYRot() * 0.017453292F) * (float) i * org.dreeam.leaf.LeafConfig.extraHorizontal, -+ this); // Paper ++ this ++ ); // Paper - Add EntityKnockbackByEntityEvent and EntityPushedByEntityAttackEvent } + // Leaf end this.setDeltaMovement(this.getDeltaMovement().multiply(0.6D, 1.0D, 0.6D)); - // Paper start - Configuration option to disable automatic sprint interruption -@@ -1406,27 +1417,27 @@ public abstract class Player extends LivingEntity { + // Paper start - Configurable sprint interruption on attack +@@ -1406,27 +1418,27 @@ public abstract class Player extends LivingEntity { this.sweepAttack(); } @@ -104,7 +105,7 @@ index 8b665475ab5cd2bae4e11aa1755af3bb9b99b284..681e6cf3593f44a018488e56d1a40aef 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 337a08470d015c9a28ef14f700ce6e11eb87c7a7..f673490b78f89efaffc1422ebe4bee95dd58b47e 100644 +index 2b4279efe6698e786f9db8066f73b7934c8660d4..d246d49b510160a9a53f6f4fc18398596d4e305a 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 +116,7 @@ index 337a08470d015c9a28ef14f700ce6e11eb87c7a7..f673490b78f89efaffc1422ebe4bee95 import net.minecraft.network.protocol.game.ClientboundSetEquipmentPacket; import net.minecraft.network.protocol.game.ClientboundSetExperiencePacket; import net.minecraft.network.protocol.game.ClientboundSetHealthPacket; -@@ -3269,6 +3270,40 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -3242,6 +3243,40 @@ public class CraftPlayer extends CraftHumanEntity implements Player { getHandle().resetAttackStrengthTicker(); } // Paper end @@ -157,7 +158,7 @@ index 337a08470d015c9a28ef14f700ce6e11eb87c7a7..f673490b78f89efaffc1422ebe4bee95 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 c871d3c03b384a3f7e4c8c919b9d565ebe4e8a77..635f09b234c723b79d35686105c2c3335f868e6a 100644 +index 8db4b1268e7bc18d60cc53f2753a73c2fc3ec242..26c7a5020e9fd9dac212c6540dc79cad26e64796 100644 --- a/src/main/java/org/dreeam/leaf/LeafConfig.java +++ b/src/main/java/org/dreeam/leaf/LeafConfig.java @@ -305,4 +305,19 @@ public class LeafConfig { diff --git a/patches/server/0050-LinearPurpur-Add-Linear-region-format.patch b/patches/server/0050-LinearPurpur-Add-Linear-region-format.patch index 3b542362..8e76117a 100644 --- a/patches/server/0050-LinearPurpur-Add-Linear-region-format.patch +++ b/patches/server/0050-LinearPurpur-Add-Linear-region-format.patch @@ -17,38 +17,23 @@ This format saves about 50% of disk space. Documentation: https://github.com/xymb-endcrystalme/LinearRegionFileFormatTools diff --git a/build.gradle.kts b/build.gradle.kts -index 2adcf3c29257580b814e66b451ca71e772a6f49f..4dccb446c22055c2b4c9986094898607566fa204 100644 +index f9b4cd6f7032908ff32cfa68e736c01eaec24ce1..bc77b529a6345ccc79c344cfe807ff93396307d6 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -22,6 +22,8 @@ dependencies { } // Gale end - project setup // Paper start -+ implementation("com.github.luben:zstd-jni:1.5.5-11") -+ implementation("org.lz4:lz4-java:1.8.0") - implementation("org.jline:jline-terminal-jansi:3.25.0") // Leaf - Bump Dependencies ++ implementation("com.github.luben:zstd-jni:1.5.5-11") // LinearPurpur ++ implementation("org.lz4:lz4-java:1.8.0") // LinearPurpur + implementation("org.jline:jline-terminal-jansi:3.25.1") // Leaf - Bump Dependencies implementation("com.github.Dreeam-qwq:TerminalConsoleAppender:360a0759") // Leaf - Use own TerminalConsoleAppender fork to fix some issues under latest version of jline/log4j implementation("net.kyori:adventure-text-serializer-ansi:4.15.0") // Keep in sync with adventureVersion from Paper-API build file // Leaf - Bump Dependencies -diff --git a/src/main/java/com/destroystokyo/paper/io/PaperFileIOThread.java b/src/main/java/com/destroystokyo/paper/io/PaperFileIOThread.java -index f2c27e0ac65be4b75c1d86ef6fd45fdb538d96ac..bcd35b189bf5ec44733161df952ef6957f7fbe79 100644 ---- a/src/main/java/com/destroystokyo/paper/io/PaperFileIOThread.java -+++ b/src/main/java/com/destroystokyo/paper/io/PaperFileIOThread.java -@@ -314,8 +314,8 @@ public final class PaperFileIOThread extends QueueExecutorThread { - public abstract void writeData(final int x, final int z, final CompoundTag compound) throws IOException; - public abstract CompoundTag readData(final int x, final int z) throws IOException; - -- public abstract T computeForRegionFile(final int chunkX, final int chunkZ, final Function function); -- public abstract T computeForRegionFileIfLoaded(final int chunkX, final int chunkZ, final Function function); -+ public abstract T computeForRegionFile(final int chunkX, final int chunkZ, final Function function); // LinearPurpur -+ public abstract T computeForRegionFileIfLoaded(final int chunkX, final int chunkZ, final Function function); // LinearPurpur - - public static final class InProgressWrite { - public long writeCounter; diff --git a/src/main/java/io/papermc/paper/chunk/system/io/RegionFileIOThread.java b/src/main/java/io/papermc/paper/chunk/system/io/RegionFileIOThread.java -index 8a11e10b01fa012b2f98b1c193c53251e848f909..17b6199a8b7184cf5b4b59d88ed8bdcae88bf0bf 100644 +index 2934f0cf0ef09c84739312b00186c2ef0019a165..e67543ef424d448096379bef118b8cb24b938964 100644 --- a/src/main/java/io/papermc/paper/chunk/system/io/RegionFileIOThread.java +++ b/src/main/java/io/papermc/paper/chunk/system/io/RegionFileIOThread.java -@@ -811,7 +811,7 @@ public final class RegionFileIOThread extends PrioritisedQueueExecutorThread { +@@ -816,7 +816,7 @@ public final class RegionFileIOThread extends PrioritisedQueueExecutorThread { final ChunkDataController taskController) { final ChunkPos chunkPos = new ChunkPos(chunkX, chunkZ); if (intendingToBlock) { @@ -57,7 +42,7 @@ index 8a11e10b01fa012b2f98b1c193c53251e848f909..17b6199a8b7184cf5b4b59d88ed8bdca if (file == null) { // null if no regionfile exists return Boolean.FALSE; } -@@ -824,7 +824,7 @@ public final class RegionFileIOThread extends PrioritisedQueueExecutorThread { +@@ -829,7 +829,7 @@ public final class RegionFileIOThread extends PrioritisedQueueExecutorThread { return Boolean.FALSE; } // else: it either exists or is not known, fall back to checking the loaded region file @@ -66,7 +51,7 @@ index 8a11e10b01fa012b2f98b1c193c53251e848f909..17b6199a8b7184cf5b4b59d88ed8bdca if (file == null) { // null if not loaded // not sure at this point, let the I/O thread figure it out return Boolean.TRUE; -@@ -1126,9 +1126,9 @@ public final class RegionFileIOThread extends PrioritisedQueueExecutorThread { +@@ -1131,9 +1131,9 @@ public final class RegionFileIOThread extends PrioritisedQueueExecutorThread { return this.getCache().doesRegionFileNotExistNoIO(new ChunkPos(chunkX, chunkZ)); } @@ -78,7 +63,7 @@ index 8a11e10b01fa012b2f98b1c193c53251e848f909..17b6199a8b7184cf5b4b59d88ed8bdca synchronized (cache) { try { regionFile = cache.getRegionFile(new ChunkPos(chunkX, chunkZ), existingOnly, true); -@@ -1141,19 +1141,19 @@ public final class RegionFileIOThread extends PrioritisedQueueExecutorThread { +@@ -1146,19 +1146,19 @@ public final class RegionFileIOThread extends PrioritisedQueueExecutorThread { return function.apply(regionFile); } finally { if (regionFile != null) { @@ -102,7 +87,7 @@ index 8a11e10b01fa012b2f98b1c193c53251e848f909..17b6199a8b7184cf5b4b59d88ed8bdca } } -@@ -1161,7 +1161,7 @@ public final class RegionFileIOThread extends PrioritisedQueueExecutorThread { +@@ -1166,7 +1166,7 @@ public final class RegionFileIOThread extends PrioritisedQueueExecutorThread { return function.apply(regionFile); } finally { if (regionFile != null) { @@ -112,7 +97,7 @@ index 8a11e10b01fa012b2f98b1c193c53251e848f909..17b6199a8b7184cf5b4b59d88ed8bdca } } diff --git a/src/main/java/io/papermc/paper/world/ThreadedWorldUpgrader.java b/src/main/java/io/papermc/paper/world/ThreadedWorldUpgrader.java -index c13df3a375f416273c6a26f5f77624c1f34a918c..e2c780e7d914e2cfd322fe07951aa54ab7ac8be4 100644 +index 8dffb330b474b830d2f816ecf8be2e8d2e4556cd..bed46642b59d38e58e6aa663a47cbfc92a40963b 100644 --- a/src/main/java/io/papermc/paper/world/ThreadedWorldUpgrader.java +++ b/src/main/java/io/papermc/paper/world/ThreadedWorldUpgrader.java @@ -85,8 +85,15 @@ public class ThreadedWorldUpgrader { @@ -133,10 +118,10 @@ index c13df3a375f416273c6a26f5f77624c1f34a918c..e2c780e7d914e2cfd322fe07951aa54a long expectedChunks = (long)regionFiles.length * (32L * 32L); // Gale start - instantly continue on world upgrade finish diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index cd259a016a3f3189aab59ab1950e991fe6c31cd2..252ca6e63e50f4f19445c6abec24619ab7f845fd 100644 +index 5b7f99a534dc7a02fcc6d6b01a80d5c62d8af527..0f3e73414ec946915c0a048c3174d516c1c93d38 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -868,7 +868,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop(Entity.class, new ServerLevel.EntityCallbacks(), entitypersistentstorage, this.entitySliceManager); // Paper // Paper - rewrite chunk system StructureTemplateManager structuretemplatemanager = minecraftserver.getStructureManager(); diff --git a/src/main/java/net/minecraft/util/worldupdate/WorldUpgrader.java b/src/main/java/net/minecraft/util/worldupdate/WorldUpgrader.java -index f2a7cb6ebed7a4b4019a09af2a025f624f6fe9c9..61c3730a1448e89c59983a1e92507592f61de964 100644 +index 77dd632a266f4abed30b87b7909d77857c01e316..4938d86f62071f578822684f576b838296d4070f 100644 --- a/src/main/java/net/minecraft/util/worldupdate/WorldUpgrader.java +++ b/src/main/java/net/minecraft/util/worldupdate/WorldUpgrader.java @@ -61,7 +61,7 @@ public class WorldUpgrader { @@ -253,7 +238,7 @@ index f2a7cb6ebed7a4b4019a09af2a025f624f6fe9c9..61c3730a1448e89c59983a1e92507592 } ImmutableMap, ChunkStorage> immutablemap1 = builder1.build(); -@@ -235,7 +241,7 @@ public class WorldUpgrader { +@@ -241,7 +247,7 @@ public class WorldUpgrader { File file = this.levelStorage.getDimensionPath(world).toFile(); File file1 = new File(file, "region"); File[] afile = file1.listFiles((file2, s) -> { @@ -262,7 +247,7 @@ index f2a7cb6ebed7a4b4019a09af2a025f624f6fe9c9..61c3730a1448e89c59983a1e92507592 }); if (afile == null) { -@@ -254,7 +260,11 @@ public class WorldUpgrader { +@@ -260,7 +266,11 @@ public class WorldUpgrader { int l = Integer.parseInt(matcher.group(2)) << 5; try { @@ -291,25 +276,23 @@ index 12a7aaeaa8b4b788b620b1985591c3b93253ccd5..af639cc29999a49f4f2d494dc82f9957 } diff --git a/src/main/java/net/minecraft/world/level/chunk/storage/ChunkStorage.java b/src/main/java/net/minecraft/world/level/chunk/storage/ChunkStorage.java -index 4a84ada69c6abc8f2743579d4451e639836274b4..31cd961bc296f84f5482318c1fb7fcef3e3c1445 100644 +index d16d7c2fed89fb1347df7ddd95856e7f08c22e8a..625a49f42bdd36772a8f4a992396f76822026911 100644 --- a/src/main/java/net/minecraft/world/level/chunk/storage/ChunkStorage.java +++ b/src/main/java/net/minecraft/world/level/chunk/storage/ChunkStorage.java -@@ -37,11 +37,11 @@ public class ChunkStorage implements AutoCloseable { - public final RegionFileStorage regionFileCache; - // Paper end - async chunk loading +@@ -36,9 +36,9 @@ public class ChunkStorage implements AutoCloseable { + @Nullable + private volatile LegacyStructureDataHandler legacyStructureHandler; - public ChunkStorage(Path directory, DataFixer dataFixer, boolean dsync) { + public ChunkStorage(org.purpurmc.purpur.region.RegionFileFormat format, int linearCompression, boolean linearCrashOnBrokenSymlink, Path directory, DataFixer dataFixer, boolean dsync) { // LinearPurpur this.fixerUpper = dataFixer; - // Paper start - async chunk io - // remove IO worker -- this.regionFileCache = new RegionFileStorage(directory, dsync, true); // Paper - nuke IOWorker // Paper - Attempt to recalculate regionfile header if it is corrupt -+ this.regionFileCache = new RegionFileStorage(format, linearCompression, linearCrashOnBrokenSymlink, directory, dsync, true); // Paper - nuke IOWorker // Paper - Attempt to recalculate regionfile header if it is corrupt // LinearPurpur - // Paper end - async chunk io +- this.regionFileCache = new RegionFileStorage(directory, dsync, true); // Paper - rewrite chunk system; async chunk IO & Attempt to recalculate regionfile header if it is corrupt ++ this.regionFileCache = new RegionFileStorage(format, linearCompression, linearCrashOnBrokenSymlink, directory, dsync, true); // Paper - rewrite chunk system; async chunk IO & Attempt to recalculate regionfile header if it is corrupt // LinearPurpur } + public boolean isOldChunkAround(ChunkPos chunkPos, int checkRadius) { diff --git a/src/main/java/net/minecraft/world/level/chunk/storage/RegionFile.java b/src/main/java/net/minecraft/world/level/chunk/storage/RegionFile.java -index ad0859ccc7603ebe3b51e16b275d952bd2508299..0d21e8fc3de43e9c02157114778be3a4ee3e708a 100644 +index 21070516fc936109f537494e38e240982bebf66a..9f8ce97791dda51a23937f6522ad877d75df7044 100644 --- a/src/main/java/net/minecraft/world/level/chunk/storage/RegionFile.java +++ b/src/main/java/net/minecraft/world/level/chunk/storage/RegionFile.java @@ -26,7 +26,7 @@ import net.minecraft.nbt.NbtIo; // Paper @@ -347,7 +330,7 @@ index ad0859ccc7603ebe3b51e16b275d952bd2508299..0d21e8fc3de43e9c02157114778be3a4 if (!this.canRecalcHeader) { return false; } -@@ -954,10 +964,10 @@ public class RegionFile implements AutoCloseable { +@@ -955,10 +965,10 @@ public class RegionFile implements AutoCloseable { private static int getChunkIndex(int x, int z) { return (x & 31) + (z & 31) * 32; } @@ -360,7 +343,7 @@ index ad0859ccc7603ebe3b51e16b275d952bd2508299..0d21e8fc3de43e9c02157114778be3a4 final int offset = getChunkIndex(x, z); boolean previous = this.oversized[offset] == 1; this.oversized[offset] = (byte) (oversized ? 1 : 0); -@@ -996,7 +1006,7 @@ public class RegionFile implements AutoCloseable { +@@ -997,7 +1007,7 @@ public class RegionFile implements AutoCloseable { return this.regionFile.getParent().resolve(this.regionFile.getFileName().toString().replaceAll("\\.mca$", "") + "_oversized_" + x + "_" + z + ".nbt"); } @@ -370,7 +353,7 @@ index ad0859ccc7603ebe3b51e16b275d952bd2508299..0d21e8fc3de43e9c02157114778be3a4 try (DataInputStream out = new DataInputStream(new java.io.BufferedInputStream(new InflaterInputStream(Files.newInputStream(file))))) { return NbtIo.read((java.io.DataInput) out); diff --git a/src/main/java/net/minecraft/world/level/chunk/storage/RegionFileStorage.java b/src/main/java/net/minecraft/world/level/chunk/storage/RegionFileStorage.java -index 6bec4549fbcfb68a053300451e25babf8ff38e99..70f0bff6eff0b4190b832335a32e6eb36a582d2a 100644 +index fe312b1aef579cb4bf81bdd967cf72ff880d7505..8ee307a453e79e59444f5c5b8b45ffc7755237c7 100644 --- a/src/main/java/net/minecraft/world/level/chunk/storage/RegionFileStorage.java +++ b/src/main/java/net/minecraft/world/level/chunk/storage/RegionFileStorage.java @@ -19,11 +19,17 @@ import net.minecraft.world.level.ChunkPos; @@ -474,7 +457,7 @@ index 6bec4549fbcfb68a053300451e25babf8ff38e99..70f0bff6eff0b4190b832335a32e6eb3 @@ -123,28 +148,45 @@ public class RegionFileStorage implements AutoCloseable { } // Paper end - cache regionfile does not exist state - if (this.regionCache.size() >= io.papermc.paper.configuration.GlobalConfiguration.get().misc.regionFileCacheSize) { // Paper - configurable + if (this.regionCache.size() >= io.papermc.paper.configuration.GlobalConfiguration.get().misc.regionFileCacheSize) { // Paper - Sanitise RegionFileCache and make configurable - ((RegionFile) this.regionCache.removeLast()).close(); + this.regionCache.removeLast().close(); // LinearPurpur } @@ -524,16 +507,16 @@ index 6bec4549fbcfb68a053300451e25babf8ff38e99..70f0bff6eff0b4190b832335a32e6eb3 } // Paper end return regionfile1; -@@ -172,7 +214,7 @@ public class RegionFileStorage implements AutoCloseable { +@@ -156,7 +198,7 @@ public class RegionFileStorage implements AutoCloseable { + org.apache.logging.log4j.LogManager.getLogger().fatal(msg + " (" + file.toString().replaceAll(".+[\\\\/]", "") + " - " + x + "," + z + ") Go clean it up to remove this message. /minecraft:tp " + (x<<4)+" 128 "+(z<<4) + " - DO NOT REPORT THIS TO PAPER - You may ask for help on Discord, but do not file an issue. These error messages can not be removed."); } - - private static CompoundTag readOversizedChunk(RegionFile regionfile, ChunkPos chunkCoordinate) throws IOException { + private static CompoundTag readOversizedChunk(org.purpurmc.purpur.region.AbstractRegionFile regionfile, ChunkPos chunkCoordinate) throws IOException { // LinearPurpur synchronized (regionfile) { try (DataInputStream datainputstream = regionfile.getChunkDataInputStream(chunkCoordinate)) { CompoundTag oversizedData = regionfile.getOversizedData(chunkCoordinate.x, chunkCoordinate.z); -@@ -219,14 +261,14 @@ public class RegionFileStorage implements AutoCloseable { +@@ -191,14 +233,14 @@ public class RegionFileStorage implements AutoCloseable { @Nullable public CompoundTag read(ChunkPos pos) throws IOException { // CraftBukkit start - SPIGOT-5680: There's no good reason to preemptively create files on read, save that for writing @@ -550,7 +533,7 @@ index 6bec4549fbcfb68a053300451e25babf8ff38e99..70f0bff6eff0b4190b832335a32e6eb3 // We add the regionfile parameter to avoid the potential deadlock (on fileLock) if we went back to obtain a regionfile // if we decide to re-read // Paper end -@@ -236,7 +278,7 @@ public class RegionFileStorage implements AutoCloseable { +@@ -208,7 +250,7 @@ public class RegionFileStorage implements AutoCloseable { // Paper start if (regionfile.isOversized(pos.x, pos.z)) { @@ -559,7 +542,7 @@ index 6bec4549fbcfb68a053300451e25babf8ff38e99..70f0bff6eff0b4190b832335a32e6eb3 return readOversizedChunk(regionfile, pos); } // Paper end -@@ -250,12 +292,12 @@ public class RegionFileStorage implements AutoCloseable { +@@ -222,12 +264,12 @@ public class RegionFileStorage implements AutoCloseable { if (this.isChunkData) { ChunkPos chunkPos = ChunkSerializer.getChunkCoordinate(nbttagcompound); if (!chunkPos.equals(pos)) { @@ -575,7 +558,7 @@ index 6bec4549fbcfb68a053300451e25babf8ff38e99..70f0bff6eff0b4190b832335a32e6eb3 return null; } } -@@ -289,13 +331,13 @@ public class RegionFileStorage implements AutoCloseable { +@@ -261,13 +303,13 @@ public class RegionFileStorage implements AutoCloseable { return nbttagcompound; } finally { // Paper start @@ -591,25 +574,25 @@ index 6bec4549fbcfb68a053300451e25babf8ff38e99..70f0bff6eff0b4190b832335a32e6eb3 if (regionfile == null) { return; } -@@ -325,7 +367,7 @@ public class RegionFileStorage implements AutoCloseable { - } +@@ -298,7 +340,7 @@ public class RegionFileStorage implements AutoCloseable { protected void write(ChunkPos pos, @Nullable CompoundTag nbt) throws IOException { -- RegionFile regionfile = this.getRegionFile(pos, nbt == null, true); // CraftBukkit // Paper // Paper start - rewrite chunk system + // Paper start - rewrite chunk system +- RegionFile regionfile = this.getRegionFile(pos, nbt == null, true); // CraftBukkit + org.purpurmc.purpur.region.AbstractRegionFile regionfile = this.getRegionFile(pos, nbt == null, true); // CraftBukkit // Paper // Paper start - rewrite chunk system // LinearPurpur if (nbt == null && regionfile == null) { return; } -@@ -375,7 +417,7 @@ public class RegionFileStorage implements AutoCloseable { - } - // Paper end - } finally { // Paper start +@@ -353,7 +395,7 @@ public class RegionFileStorage implements AutoCloseable { + // Paper end - Chunk save reattempt + // Paper start - rewrite chunk system + } finally { - regionfile.fileLock.unlock(); + regionfile.getFileLock().unlock(); // LinearPurpur - } // Paper end + } + // Paper end - rewrite chunk system } - -@@ -384,7 +426,7 @@ public class RegionFileStorage implements AutoCloseable { +@@ -363,7 +405,7 @@ public class RegionFileStorage implements AutoCloseable { ObjectIterator objectiterator = this.regionCache.values().iterator(); while (objectiterator.hasNext()) { @@ -618,7 +601,7 @@ index 6bec4549fbcfb68a053300451e25babf8ff38e99..70f0bff6eff0b4190b832335a32e6eb3 try { regionfile.close(); -@@ -400,7 +442,7 @@ public class RegionFileStorage implements AutoCloseable { +@@ -379,7 +421,7 @@ public class RegionFileStorage implements AutoCloseable { ObjectIterator objectiterator = this.regionCache.values().iterator(); while (objectiterator.hasNext()) { @@ -643,13 +626,13 @@ index 4aac1979cf57300825a999c876fcf24d3170e68e..79a389b9a139f6838adf32d3b5d4d7ec this.factory = factory; this.fixerUpper = dataFixer; diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -index 4b222fc6a4824caffef4aad78092bd02a8892026..db36f3b98a3955ec867972f546211db8975734ec 100644 +index 9fc292c4767b6275b17d0657b4289327ebaeaefe..325e9580ac4409111488e2728b7ae5d0c5390a6c 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java @@ -567,7 +567,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { + world.getChunk(x, z); // make sure we're at ticket level 32 or lower return true; } - - net.minecraft.world.level.chunk.storage.RegionFile file; + org.purpurmc.purpur.region.AbstractRegionFile file; // LinearPurpur try { @@ -680,7 +663,7 @@ index b12437a7e292fbf9aefc7a41b5bc1695733a11c5..c3f095236093c436d37c4730f5537d4f private static void disableGiveCommandDrops() { disableGiveCommandDrops = getBoolean("settings.disable-give-dropping", disableGiveCommandDrops); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 0a29f28cf666896f0715d40bb121017e4675b4e7..2b4408d398962fa4feab9eb248540c6d11037a94 100644 +index 18a4b27a9159c211a0faf204e69e895f107b0163..b32fb80be08146d28d437d5db320c56ba05aebc7 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -27,6 +27,7 @@ import java.util.Map; diff --git a/patches/server/0051-Plazma-Add-missing-purpur-configuration-options.patch b/patches/server/0051-Plazma-Add-missing-purpur-configuration-options.patch index f4b5f5c9..e7fdfd1a 100644 --- a/patches/server/0051-Plazma-Add-missing-purpur-configuration-options.patch +++ b/patches/server/0051-Plazma-Add-missing-purpur-configuration-options.patch @@ -37,7 +37,7 @@ index eb60d2d99155aae4a761051175fbbddf9ed5dad9..5444213b336bc08eb371673890ded04c @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/camel/Camel.java b/src/main/java/net/minecraft/world/entity/animal/camel/Camel.java -index 11181c0429b720381e7752f8a0d5e89615bcce4b..637beec8d5a1d39748db9e87bfb9a999f2c728ec 100644 +index 8a3e815bf1c35d39d3c07e483c5b8ef70ee45654..7b87ea3578f3bb8b7e93054171a0f66c0e0d1262 100644 --- a/src/main/java/net/minecraft/world/entity/animal/camel/Camel.java +++ b/src/main/java/net/minecraft/world/entity/animal/camel/Camel.java @@ -95,6 +95,18 @@ public class Camel extends AbstractHorse implements PlayerRideableJumping, Saddl @@ -116,7 +116,7 @@ index 1fbd034002fd5761011976510b9f9263ca0f5cac..a9d75fe602d0f946519582d2eaf2eb55 @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/sniffer/Sniffer.java b/src/main/java/net/minecraft/world/entity/animal/sniffer/Sniffer.java -index b8a055f938ade211c07ca5a74bade19707568eb1..7e8de65d7e5f9251d8ea4fb9bd3a4044457e0bda 100644 +index 9962e83e9478db6de3869d53eaa4c4dc9dc847b4..4e7867e7239eb573b287a70eee8191bdf434f686 100644 --- a/src/main/java/net/minecraft/world/entity/animal/sniffer/Sniffer.java +++ b/src/main/java/net/minecraft/world/entity/animal/sniffer/Sniffer.java @@ -106,6 +106,18 @@ public class Sniffer extends Animal { @@ -139,7 +139,7 @@ index b8a055f938ade211c07ca5a74bade19707568eb1..7e8de65d7e5f9251d8ea4fb9bd3a4044 @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java b/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java -index c23d192baf78890093b0e88d03735eef4569e75f..25ee9670c37c4342993c3aed8417ff050bbcb779 100644 +index da834424b655d49388926a0472cacb5ecc4d56fd..141c41c05623ab5802ae3e03ee772d310efda3a8 100644 --- a/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java +++ b/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java @@ -147,6 +147,23 @@ public class Warden extends Monster implements VibrationSystem { @@ -209,7 +209,7 @@ index c3f095236093c436d37c4730f5537d4fbc0ea6c0..d13bc7e913ebe816598f6104f928c90b org.bukkit.event.inventory.InventoryType.ENDER_CHEST.setDefaultSize(enderChestSixRows ? 54 : 27); enderChestPermissionRows = getBoolean("settings.blocks.ender_chest.use-permissions-for-rows", enderChestPermissionRows); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 2b4408d398962fa4feab9eb248540c6d11037a94..8191ca6341bafbdc7a74a42ebcb0615f61e5bbab 100644 +index b32fb80be08146d28d437d5db320c56ba05aebc7..c2bd513882ae8716f52ef7540d9fec9bd3f6017e 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -1195,7 +1195,15 @@ public class PurpurWorldConfig { @@ -290,7 +290,7 @@ index 2b4408d398962fa4feab9eb248540c6d11037a94..8191ca6341bafbdc7a74a42ebcb0615f tadpoleRidable = getBoolean("mobs.tadpole.ridable", tadpoleRidable); tadpoleRidableInWater = getBoolean("mobs.tadpole.ridable-in-water", tadpoleRidableInWater); tadpoleControllable = getBoolean("mobs.tadpole.controllable", tadpoleControllable); -@@ -2999,7 +3037,15 @@ public class PurpurWorldConfig { +@@ -3001,7 +3039,15 @@ public class PurpurWorldConfig { public boolean wardenRidable = false; public boolean wardenRidableInWater = true; public boolean wardenControllable = true; diff --git a/patches/server/0054-PaperPR-Rewrite-framed-map-tracker-ticking.patch b/patches/server/0054-PaperPR-Rewrite-framed-map-tracker-ticking.patch index ba519914..6861306c 100644 --- a/patches/server/0054-PaperPR-Rewrite-framed-map-tracker-ticking.patch +++ b/patches/server/0054-PaperPR-Rewrite-framed-map-tracker-ticking.patch @@ -16,7 +16,7 @@ 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 dc09d893f1a7dd36f994ac8ea5bea5b1fa689c83..be950b74d68662932e8f62e3d321db1262289c4e 100644 +index 515e3f444e317de1d82421ad414c1ac10d4668ab..66e04209f45c03b3efab10cd567f147fc85cd106 100644 --- a/src/main/java/net/minecraft/server/level/ServerEntity.java +++ b/src/main/java/net/minecraft/server/level/ServerEntity.java @@ -111,29 +111,42 @@ public class ServerEntity { @@ -67,7 +67,7 @@ index dc09d893f1a7dd36f994ac8ea5bea5b1fa689c83..be950b74d68662932e8f62e3d321db12 } } -@@ -368,6 +381,19 @@ public class ServerEntity { +@@ -374,6 +387,19 @@ public class ServerEntity { } } diff --git a/patches/server/0056-SparklyPaper-Cache-coordinate-key-used-for-nearby-pl.patch b/patches/server/0056-SparklyPaper-Cache-coordinate-key-used-for-nearby-pl.patch index dbdb85ee..f2d458b4 100644 --- a/patches/server/0056-SparklyPaper-Cache-coordinate-key-used-for-nearby-pl.patch +++ b/patches/server/0056-SparklyPaper-Cache-coordinate-key-used-for-nearby-pl.patch @@ -13,7 +13,7 @@ So instead of paying the price on each tick, we pay the price when the chunk is 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..8e8aad958c96fa1df3d906ec120a89adecae38c4 100644 +index f164256d59b761264876ca0c85f812d101bfd5de..10465a33d90a1e43b9dbd7764c895dd39ef11b1a 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,14 @@ public final class NearbyPlayers { @@ -32,10 +32,10 @@ index 17ba07cbd4792f63d88ce29d00da280f30c4abff..8e8aad958c96fa1df3d906ec120a89ad final TrackedChunk chunk = this.byChunk.get(CoordinateUtils.getChunkKey(chunkX, chunkZ)); diff --git a/src/main/java/net/minecraft/server/level/ServerChunkCache.java b/src/main/java/net/minecraft/server/level/ServerChunkCache.java -index 02b517288ef0794ccfd46802bf76fa56af21c524..e75ebf0bbb9da6e294d52e8c99607ed590c123a5 100644 +index 1273760f0c1dde908e2512efee2df5460e70eb42..34f03851ccca7870545128155a6dbb43fb42eda9 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 { +@@ -594,7 +594,7 @@ public class ServerChunkCache extends ChunkSource { // Paper start - optimise chunk tick iteration com.destroystokyo.paper.util.maplist.ReferenceList playersNearby diff --git a/patches/server/0057-SparklyPaper-Optimize-canSee-checks.patch b/patches/server/0057-SparklyPaper-Optimize-canSee-checks.patch index 2533aff0..5abd6021 100644 --- a/patches/server/0057-SparklyPaper-Optimize-canSee-checks.patch +++ b/patches/server/0057-SparklyPaper-Optimize-canSee-checks.patch @@ -16,10 +16,10 @@ This seems stupid, but it does seem that it improves the performance a bit, and 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 c175681d1e57d0ea922bec1f1c10cfb14fcbb25e..ab790bcf4c4ea067ba5bdfb30c006fa0cc65def0 100644 +index 5dd66c3434205c03eecb842ee0211d9e19ff110f..413c648691ce45bce536e870d772d0335f89679a 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 +@@ -1399,7 +1399,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider // Paper end - Configurable entity tracking range by Y // CraftBukkit start - respect vanish API @@ -29,7 +29,7 @@ index c175681d1e57d0ea922bec1f1c10cfb14fcbb25e..ab790bcf4c4ea067ba5bdfb30c006fa0 } // 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 f673490b78f89efaffc1422ebe4bee95dd58b47e..7f7f2c558c359b816adae6eae62a8e8b5bccabf6 100644 +index d246d49b510160a9a53f6f4fc18398596d4e305a..df07fbabe36573282c60f4a469e1b9534405d7a0 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 { @@ -41,7 +41,7 @@ index f673490b78f89efaffc1422ebe4bee95dd58b47e..7f7f2c558c359b816adae6eae62a8e8b private final Set unlistedEntities = new HashSet<>(); // Paper - Add Listing API for Player private static final WeakHashMap> pluginWeakReferences = new WeakHashMap<>(); private int hash = 0; -@@ -2164,9 +2164,16 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -2137,9 +2137,16 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @Override public boolean canSee(org.bukkit.entity.Entity entity) { diff --git a/patches/server/0059-Redirect-to-Gale-s-method-to-fix-plugin-incompatibil.patch b/patches/server/0059-Redirect-to-Gale-s-method-to-fix-plugin-incompatibil.patch index 03064cd6..de6267c0 100644 --- a/patches/server/0059-Redirect-to-Gale-s-method-to-fix-plugin-incompatibil.patch +++ b/patches/server/0059-Redirect-to-Gale-s-method-to-fix-plugin-incompatibil.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Redirect to Gale's method to fix plugin incompatibility diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index a2950eab75913c3d8faa3955373d6ad5b0b7d54c..b7058feb8ea17fa1515fee9c7e110f8cf0f656ee 100644 +index 268eff03168d25cccba703d1c5df603c9c3663cd..e64c8942668830ca9e460b519cceb4397e0b4b56 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -336,6 +336,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -335,6 +335,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl } // Gale end - make max interaction distance configurable