diff --git a/README.md b/README.md index ca4bc25d..739eb0b8 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ ## 📥 Download You can find latest successful build in [GitHub Action](https://github.com/Winds-Studio/Leaf/actions) or [Releases](https://github.com/Winds-Studio/Leaf/releases) -**Please note Java >= 17 is required, Java >= 21 is recommended.** +**Please note Java >= 17 is required, Java 21 is recommended.** ## 📦 Building Building a Paperclip JAR for distribution: diff --git a/build.gradle.kts b/build.gradle.kts index 01a42841..52b58897 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -3,7 +3,7 @@ plugins { `maven-publish` id("com.github.johnrengelman.shadow") version "8.1.1" apply false // paperweight required this original shadow id("io.github.goooler.shadow") version "8.1.7" apply false - id("io.papermc.paperweight.patcher") version "1.5.14-SNAPSHOT" + id("io.papermc.paperweight.patcher") version "1.5.16-SNAPSHOT" } val paperMavenPublicUrl = "https://repo.papermc.io/repository/maven-public/" @@ -17,7 +17,7 @@ repositories { dependencies { remapper("net.fabricmc:tiny-remapper:0.10.1:fat") - decompiler("org.vineflower:vineflower:1.10.0") + decompiler("org.vineflower:vineflower:1.10.1") paperclip("io.papermc:paperclip:3.0.4-SNAPSHOT") } diff --git a/gradle.properties b/gradle.properties index 0f862338..129468b0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,7 +1,7 @@ group = org.dreeam.leaf version = 1.20.4-R0.1-SNAPSHOT -galeCommit = 634079471c530a62f3280dfeddc00f8f1d25532e +galeCommit = 53ce7ab06d7eccb91990b163db28c60736153bc7 org.gradle.caching = true org.gradle.parallel = true diff --git a/patches/api/0001-Leaf-config-files.patch b/patches/api/0001-Leaf-config-files.patch index f7226b4c..a46a35e8 100644 --- a/patches/api/0001-Leaf-config-files.patch +++ b/patches/api/0001-Leaf-config-files.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Leaf config files diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java -index bb73389fd8ffcc2fb89ece44e7704f87baa3058e..55830a5621b5f1b59dc7285425e1fd949a4aea83 100644 +index e0615e17765406bab75b5d16f9056d6821c577ee..80499cd30914ca97576532bd86967cbfaabe2577 100644 --- a/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java -@@ -2282,6 +2282,14 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi +@@ -2288,6 +2288,14 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi // Paper end diff --git a/patches/api/0002-Pufferfish-Sentry.patch b/patches/api/0002-Pufferfish-Sentry.patch index c85cc4f7..3e9e6301 100644 --- a/patches/api/0002-Pufferfish-Sentry.patch +++ b/patches/api/0002-Pufferfish-Sentry.patch @@ -7,7 +7,7 @@ Original license: GPL v3 Original project: https://github.com/pufferfish-gg/Pufferfish diff --git a/build.gradle.kts b/build.gradle.kts -index f2cbc7a803177a901135cf020239031979292c6c..1bbc94b97662aa0367c9b5bac19bec313f158c14 100644 +index 810100ac785d49bd332455de23690d37e5fbbb81..4a9deabf03236533aa86860326f0da21650dd38f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -51,6 +51,7 @@ dependencies { @@ -16,8 +16,8 @@ index f2cbc7a803177a901135cf020239031979292c6c..1bbc94b97662aa0367c9b5bac19bec31 api("org.slf4j:slf4j-api:$slf4jVersion") + api("io.sentry:sentry:5.4.0") // Pufferfish - implementation("org.ow2.asm:asm:9.5") - implementation("org.ow2.asm:asm-commons:9.5") + implementation("org.ow2.asm:asm:9.7") + implementation("org.ow2.asm:asm-commons:9.7") diff --git a/src/main/java/gg/pufferfish/pufferfish/sentry/SentryContext.java b/src/main/java/gg/pufferfish/pufferfish/sentry/SentryContext.java new file mode 100644 index 0000000000000000000000000000000000000000..364e20dfb1a141e86ae64663cc5f31ac6be3306f diff --git a/patches/api/0003-Purpur-API-Changes.patch b/patches/api/0003-Purpur-API-Changes.patch index 8b26d2d4..43adc1d6 100644 --- a/patches/api/0003-Purpur-API-Changes.patch +++ b/patches/api/0003-Purpur-API-Changes.patch @@ -34,10 +34,10 @@ index a736d7bcdc5861a01b66ba36158db1c716339346..22fc165fd9c95f0f3ae1be7a0857e48c @Override diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java -index 12412ffbfa05f91d46509a90fe3af7085349eb63..69e1800274218115877870b43d44cecd77f27c83 100644 +index d8201747ede92a0123eec012844a7a674e6947f5..e0ecc43fc6a952b4897c530af2e89f2c0558740e 100644 --- a/src/main/java/org/bukkit/Bukkit.java +++ b/src/main/java/org/bukkit/Bukkit.java -@@ -2945,4 +2945,127 @@ public final class Bukkit { +@@ -2951,4 +2951,127 @@ public final class Bukkit { public static Server.Spigot spigot() { return server.spigot(); } @@ -256,10 +256,10 @@ index 918a045165cdcde264bc24082b7afebb407271de..687d11619379aead7f665d4a5f8f8bcc + // Purpur end } diff --git a/src/main/java/org/bukkit/Material.java b/src/main/java/org/bukkit/Material.java -index f9af60356da4668cec8b24e73f5747ab82e35a91..b304ad1307cdd6785653b1eab9781e070fb14c5a 100644 +index ec117c47401ea1a04beb0e5ee9d4d394db7c5c4e..5b058d709751a5b720e209931774e09fcc9c960c 100644 --- a/src/main/java/org/bukkit/Material.java +++ b/src/main/java/org/bukkit/Material.java -@@ -11557,4 +11557,40 @@ public enum Material implements Keyed, Translatable, net.kyori.adventure.transla +@@ -11559,4 +11559,40 @@ public enum Material implements Keyed, Translatable, net.kyori.adventure.transla public boolean isEnabledByFeature(@NotNull World world) { return Bukkit.getDataPackManager().isEnabledByFeature(this, world); } @@ -412,10 +412,10 @@ index 30298a629b39bd43ce14b414fc697b2dfcbea89c..ce00af9121de7a910aaea4e0685a06d4 + // Purpur end - OfflinePlayer API } diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java -index 55830a5621b5f1b59dc7285425e1fd949a4aea83..bba0c8d28b0d02bd85d279b74a83aa8bf66c37d4 100644 +index 80499cd30914ca97576532bd86967cbfaabe2577..98311ea5696f722b431444a569f0f172a9d32973 100644 --- a/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java -@@ -2282,6 +2282,18 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi +@@ -2288,6 +2288,18 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi // Paper end @@ -434,7 +434,7 @@ index 55830a5621b5f1b59dc7285425e1fd949a4aea83..bba0c8d28b0d02bd85d279b74a83aa8b // Leaf start @NotNull public org.bukkit.configuration.file.YamlConfiguration getLeafConfig() -@@ -2599,4 +2611,111 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi +@@ -2605,4 +2617,111 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi long getLastTickOversleepTime(); // Gale end - YAPFA - last tick time - API @@ -547,10 +547,10 @@ index 55830a5621b5f1b59dc7285425e1fd949a4aea83..bba0c8d28b0d02bd85d279b74a83aa8b + // Purpur end } diff --git a/src/main/java/org/bukkit/World.java b/src/main/java/org/bukkit/World.java -index c5fe36050eeaff80cfb989fe2f38370215af6fe5..565ce4b0c5eb300953aaefa786b9f8938c771f2a 100644 +index 35fb5047dd8a8521586a9ca9f8d70881355fb7f5..c2fc3c7158b65a875515afda0d69e2d6529db976 100644 --- a/src/main/java/org/bukkit/World.java +++ b/src/main/java/org/bukkit/World.java -@@ -4213,6 +4213,86 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient +@@ -4222,6 +4222,86 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient @Nullable public DragonBattle getEnderDragonBattle(); @@ -786,10 +786,10 @@ 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 967125e99adc1b5446f42811d60ef44ba56ef5f5..644f58eeef73bab67ab50b16b87e7c2e798ea2c0 100644 +index 23def071492ccd715693d534cc506936e18f0f46..51ae4b559a6ebb5c324ac029c86e5b5a6b894d7e 100644 --- a/src/main/java/org/bukkit/entity/Entity.java +++ b/src/main/java/org/bukkit/entity/Entity.java -@@ -1138,4 +1138,42 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent +@@ -1144,4 +1144,42 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent */ @NotNull String getScoreboardEntryName(); // Paper end - entity scoreboard name @@ -925,13 +925,13 @@ index bcc6ba95bd21c7972865838c636a03f50b6c1f1a..c3fcd8dd7dbb1e1a18e17c014c1e6411 + // Purpur end } diff --git a/src/main/java/org/bukkit/entity/LivingEntity.java b/src/main/java/org/bukkit/entity/LivingEntity.java -index 5cb82901a5d0c8ee673501fc53389d526d4a5b6f..91ce069e4f23a115a01b329dcf053ed19dfb83bc 100644 +index 65112eae8b92344796850b1e4c89e75443eab2fe..5369d802d37863a1efc0c031520147ceedcadc78 100644 --- a/src/main/java/org/bukkit/entity/LivingEntity.java +++ b/src/main/java/org/bukkit/entity/LivingEntity.java -@@ -1312,4 +1312,41 @@ public interface LivingEntity extends Attributable, Damageable, ProjectileSource +@@ -1445,4 +1445,41 @@ public interface LivingEntity extends Attributable, Damageable, ProjectileSource */ void setBodyYaw(float bodyYaw); - // Paper end + // Paper end - body yaw API + + // Purpur start + /** @@ -1301,7 +1301,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 245a730a54c4b241a9a67eccceefafd2763bd238..516b3bcca3974ad4f4ae74747db0d7d094714e55 100644 +index 7414b4fa690d393a8e9557cc1fd1ce12fa426940..e0f8cab6d78110a43c29d3b5256539d62ba03abf 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; @@ -1323,7 +1323,7 @@ index 245a730a54c4b241a9a67eccceefafd2763bd238..516b3bcca3974ad4f4ae74747db0d7d0 /** * Represents a stack of items. -@@ -1033,4 +1045,636 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat +@@ -1061,4 +1073,636 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat return Bukkit.getUnsafe().computeTooltipLines(this, tooltipContext, player); } // Paper end - expose itemstack tooltip lines diff --git a/patches/api/0004-Remove-Timings.patch b/patches/api/0004-Remove-Timings.patch index 8a16eb01..307d14e5 100644 --- a/patches/api/0004-Remove-Timings.patch +++ b/patches/api/0004-Remove-Timings.patch @@ -2830,7 +2830,7 @@ index 3e61a926620a67daec3af54b72a1b911eaef2ed4..00000000000000000000000000000000 - } -} diff --git a/src/main/java/org/bukkit/UnsafeValues.java b/src/main/java/org/bukkit/UnsafeValues.java -index 9a65c4f614a6c358d74491794d7b25172a00bc11..c4216af83db0529650f190a97f55a55b523161a7 100644 +index b9a07b2db8a3dcdb72c33c8ceda129921b2c02f1..d2e8e1f000277343801261d2dde4d1e5b91035ea 100644 --- a/src/main/java/org/bukkit/UnsafeValues.java +++ b/src/main/java/org/bukkit/UnsafeValues.java @@ -40,7 +40,6 @@ public interface UnsafeValues { @@ -2841,7 +2841,7 @@ index 9a65c4f614a6c358d74491794d7b25172a00bc11..c4216af83db0529650f190a97f55a55b Material toLegacy(Material material); Material fromLegacy(Material material); -@@ -139,11 +138,6 @@ public interface UnsafeValues { +@@ -141,11 +140,6 @@ public interface UnsafeValues { // Paper end // Paper start diff --git a/patches/api/0005-Bump-Dependencies.patch b/patches/api/0005-Bump-Dependencies.patch index 6ff97d39..595e4fdc 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 2ea90f77c8ad7a36c51df0dfe1d333b10a765255..ff15203aa5f18ced362d1d6e5d10ed5fa3b90b40 100644 +index 4a9deabf03236533aa86860326f0da21650dd38f..5cd6853b555778fd198280790968fee390c85a8f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -9,11 +9,11 @@ java { @@ -18,7 +18,7 @@ index 2ea90f77c8ad7a36c51df0dfe1d333b10a765255..ff15203aa5f18ced362d1d6e5d10ed5f val adventureVersion = "4.16.0" -val slf4jVersion = "2.0.9" -val log4jVersion = "2.17.1" -+val slf4jVersion = "2.0.12" // Leaf - Bump Dependencies ++val slf4jVersion = "2.0.13" // Leaf - Bump Dependencies +val log4jVersion = "2.23.1" // Leaf - Bump Dependencies val apiAndDocs: Configuration by configurations.creating { attributes { @@ -41,22 +41,16 @@ index 2ea90f77c8ad7a36c51df0dfe1d333b10a765255..ff15203aa5f18ced362d1d6e5d10ed5f apiAndDocs(platform("net.kyori:adventure-bom:$adventureVersion")) apiAndDocs("net.kyori:adventure-api") apiAndDocs("net.kyori:adventure-text-minimessage") -@@ -51,10 +51,11 @@ dependencies { +@@ -51,7 +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:5.4.0") // Pufferfish -+ api("io.sentry:sentry:7.6.0") // Pufferfish // Leaf - Bump Dependencies ++ api("io.sentry:sentry:7.8.0") // Pufferfish // Leaf - Bump Dependencies -- implementation("org.ow2.asm:asm:9.5") -- implementation("org.ow2.asm:asm-commons:9.5") -+ // Leaf start - Bump Dependencies -+ implementation("org.ow2.asm:asm:9.7") -+ implementation("org.ow2.asm:asm-commons:9.7") - // Paper end - - api("org.apache.maven:maven-resolver-provider:3.9.6") // Paper - make API dependency for Paper Plugins -@@ -66,16 +67,17 @@ dependencies { + implementation("org.ow2.asm:asm:9.7") + implementation("org.ow2.asm:asm-commons:9.7") +@@ -66,13 +66,15 @@ dependencies { testCompileOnly(annotations) // Paper start - add checker @@ -68,17 +62,13 @@ index 2ea90f77c8ad7a36c51df0dfe1d333b10a765255..ff15203aa5f18ced362d1d6e5d10ed5f - testImplementation("org.apache.commons:commons-lang3:3.12.0") - testImplementation("org.junit.jupiter:junit-jupiter:5.10.0") ++ // Leaf start - Bump Dependencies + testImplementation("org.apache.commons:commons-lang3:3.14.0") + testImplementation("org.junit.jupiter:junit-jupiter:5.10.2") - 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.11.0") -+ testImplementation("org.ow2.asm:asm-tree:9.7") + // Leaf end - } - - // Paper start + testImplementation("org.hamcrest:hamcrest:2.2") + testImplementation("org.mockito:mockito-core:5.11.0") + testImplementation("org.ow2.asm:asm-tree:9.7") @@ -143,12 +145,12 @@ tasks.withType { options.use() options.isDocFilesSubDirs = true diff --git a/patches/server/0006-Pufferfish-Optimize-mob-spawning.patch b/patches/server/0006-Pufferfish-Optimize-mob-spawning.patch index 76a925bb..87964f63 100644 --- a/patches/server/0006-Pufferfish-Optimize-mob-spawning.patch +++ b/patches/server/0006-Pufferfish-Optimize-mob-spawning.patch @@ -20,7 +20,7 @@ and, in my opinion, worth the low risk of minor mob-spawning-related inconsistencies. diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 43d362ec5444941b7d897bc3205375ac44c44924..3cfc1e3d332efd3abd5b55b59fb7bcf64b45dfcd 100644 +index 46a223d184bdc91058b90692df4002ed1da4516c..90eb43f08fe781aafe2f8ac7921bdf148178761b 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -297,6 +297,8 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop. diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index 8d517617e38edf7b6cd49f32f404f2f80c014f66..1fe45a264032047c67d84ab387e230af2f0eff20 100644 +index ab0ac738f3e3d231d8fbc663230892d3a5f07660..a26a756c35c77830a3407ae0dfbf8509141f30fa 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java @@ -880,6 +880,7 @@ public class ServerLevel extends Level implements WorldGenLevel { @@ -42,7 +42,7 @@ index 8d517617e38edf7b6cd49f32f404f2f80c014f66..1fe45a264032047c67d84ab387e230af 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 4027ea7cb55dcb70c96cc2ada3b0da09c1dda8ad..1482310673c2c2ac9180ea80a96c24d4094e11c9 100644 +index 7e84b05e8e4261dd36db725ae83dc0a1b48613fd..3b7a00ab7ad3c1b9ce8ce323154d67cbbfb724f9 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -504,6 +504,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S @@ -102,10 +102,10 @@ index a676228a7f4d8d4b7e54a641c1df1f1b0d262f10..43beb25bb42f19832da83f6f7f022cb5 } diff --git a/src/main/java/net/minecraft/world/entity/ai/behavior/VillagerPanicTrigger.java b/src/main/java/net/minecraft/world/entity/ai/behavior/VillagerPanicTrigger.java -index 646d9a121d908a2fc3e4e302484dd5cd1bfc6804..e546ecdccde352502e26a8668eaaafe048d6e282 100644 +index 758f62416ca9c02351348ac0d41deeb4624abc0e..69130969c9a434ec2361e573c9a1ec9f462dfda2 100644 --- a/src/main/java/net/minecraft/world/entity/ai/behavior/VillagerPanicTrigger.java +++ b/src/main/java/net/minecraft/world/entity/ai/behavior/VillagerPanicTrigger.java -@@ -37,7 +37,11 @@ public class VillagerPanicTrigger extends Behavior { +@@ -36,7 +36,11 @@ public class VillagerPanicTrigger extends Behavior { @Override protected void tick(ServerLevel world, Villager entity, long time) { @@ -117,12 +117,12 @@ index 646d9a121d908a2fc3e4e302484dd5cd1bfc6804..e546ecdccde352502e26a8668eaaafe0 + // Pufferfish end entity.spawnGolemIfNeeded(world, time, 3); } - + } 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 5e7b978a3019bc31ef94c1c666a3abdf380ced5c..8cc0d90665e64c81b15fc8aa251f2682b197e9f2 100644 +index fc16161d352221be549760dcdd8c62dfba6a6798..011e04a06f4583722d97e4bc847bd8445910692a 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 { +@@ -50,9 +50,12 @@ public class GoalSelector { } // Paper start @@ -168,11 +168,11 @@ index 207d41b91bc02d94c5b40799619f7314ef84e41d..d0c624a6a000c2a41e41d14dd785a7bf AxolotlAi.updateActivity(this); if (!this.isNoAi()) { diff --git a/src/main/java/net/minecraft/world/entity/animal/frog/Frog.java b/src/main/java/net/minecraft/world/entity/animal/frog/Frog.java -index 81e69ea2858228942177e54c92b50b2b908bc010..d1458cec0313f7317134e7eb8bdabc31cea5df68 100644 +index dfb1f7db2db231049cebf0283ab879618eddaba6..791791fa03c402998fa99b5da9e9f969b256bf4e 100644 --- a/src/main/java/net/minecraft/world/entity/animal/frog/Frog.java +++ b/src/main/java/net/minecraft/world/entity/animal/frog/Frog.java -@@ -159,8 +159,10 @@ public class Frog extends Animal implements VariantHolder { - +@@ -183,8 +183,10 @@ public class Frog extends Animal implements VariantHolder { + } } + private int behaviorTick = 0; // Pufferfish @@ -213,11 +213,11 @@ index c6ff7c756aff281e7de094c05749740370988fe5..d75178611f2c74af45e39c9e37770e2c GoatAi.updateActivity(this); super.customServerAiStep(); diff --git a/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java b/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java -index c97a3c7060b846aa92a730760e3428ba98919879..f270c54028867ae0026bba3f214c3da6d015befb 100644 +index 6b0f5aa9e49c7ff8784ae7a016c4403acf98ca1e..fde1a076d1a490cf7bdea7f89a8714b4661a0d7d 100644 --- a/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java -@@ -128,8 +128,10 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { - return (Brain) super.getBrain(); // Paper - decompile fix +@@ -155,8 +155,10 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { + return (Brain)super.getBrain(); } + private int behaviorTick; // Pufferfish @@ -361,7 +361,7 @@ index 0000000000000000000000000000000000000000..2769eba9841ec866265e814e16f930a5 + } +} diff --git a/src/main/java/org/spigotmc/ActivationRange.java b/src/main/java/org/spigotmc/ActivationRange.java -index 1cff8378c4939af4bbe300e5d6428539e75218ae..0735af396aa89b6ea7d5565d91f070fac90f7da1 100644 +index 5e24b70b102cbf4dce2dec748dab1949a77b0d4d..df50c32482067368b11d2928bd353f4fbe595afe 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; @@ -374,7 +374,7 @@ index 1cff8378c4939af4bbe300e5d6428539e75218ae..0735af396aa89b6ea7d5565d91f070fa public class ActivationRange { -@@ -236,6 +239,25 @@ public class ActivationRange +@@ -238,6 +241,25 @@ public class ActivationRange } // Paper end - Configurable marker ticking ActivationRange.activateEntity(entity); @@ -400,7 +400,7 @@ index 1cff8378c4939af4bbe300e5d6428539e75218ae..0735af396aa89b6ea7d5565d91f070fa } // Paper end } -@@ -252,12 +274,12 @@ public class ActivationRange +@@ -254,12 +276,12 @@ public class ActivationRange if ( MinecraftServer.currentTick > entity.activatedTick ) { if ( entity.defaultActivationState ) diff --git a/patches/server/0010-Purpur-Server-Changes.patch b/patches/server/0010-Purpur-Server-Changes.patch index b0c63e4a..c17405ee 100644 --- a/patches/server/0010-Purpur-Server-Changes.patch +++ b/patches/server/0010-Purpur-Server-Changes.patch @@ -32,7 +32,7 @@ MC-121706-Fix-mobs-not-looking-up-and-down-when-stra.patch Fire-Immunity-API.patch diff --git a/build.gradle.kts b/build.gradle.kts -index a2d13cbc7bdb6edaacb9cdeadc23ea69de20d571..140638a117d9306bd08ed4fbcc4ea123adac4901 100644 +index a52369f6e9588568cb0e8ee45ce59bcb685cc502..0d72b6e0a9d9c12b7d4555aa85dcedde9123c5c1 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -66,6 +66,12 @@ dependencies { @@ -575,10 +575,10 @@ index 676a1499747b071515479130875157263d3a8352..fc1bba350030c076405711716e9830f8 + // Purpur end } diff --git a/src/main/java/net/minecraft/core/BlockPos.java b/src/main/java/net/minecraft/core/BlockPos.java -index e17fa30966dea2836fb791becd032fc7d5cc2611..dd06323731533fb9b1b25a56844a4e39e8a1c4ea 100644 +index 70f9e737b3b9f80395afc3542aafe4a0c774c722..70fa9893c7af6387df9e5c33be21653e73222b36 100644 --- a/src/main/java/net/minecraft/core/BlockPos.java +++ b/src/main/java/net/minecraft/core/BlockPos.java -@@ -48,6 +48,12 @@ public class BlockPos extends Vec3i { +@@ -47,6 +47,12 @@ public class BlockPos extends Vec3i { private static final int X_OFFSET = 38; // Paper end - Optimize Bit Operations by inlining @@ -591,36 +591,6 @@ index e17fa30966dea2836fb791becd032fc7d5cc2611..dd06323731533fb9b1b25a56844a4e39 public BlockPos(int x, int y, int z) { super(x, y, z); } -diff --git a/src/main/java/net/minecraft/core/Direction.java b/src/main/java/net/minecraft/core/Direction.java -index 2a9fc1f1dfc0c5894c1e74dad5a79ae9b02ac74f..f27fe4370cb027df4fce239eccde28bd8dcd301c 100644 ---- a/src/main/java/net/minecraft/core/Direction.java -+++ b/src/main/java/net/minecraft/core/Direction.java -@@ -253,6 +253,12 @@ public enum Direction implements StringRepresentable { - case EAST: - var10000 = SOUTH; - break; -+ // Purpur start -+ case UP: -+ return UP; -+ case DOWN: -+ return DOWN; -+ // Purpur end - default: - throw new IllegalStateException("Unable to get Y-rotated facing of " + this); - } -@@ -365,6 +371,12 @@ public enum Direction implements StringRepresentable { - case EAST: - var10000 = NORTH; - break; -+ // Purpur start -+ case UP: -+ return UP; -+ case DOWN: -+ return DOWN; -+ // Purpur end - default: - throw new IllegalStateException("Unable to get CCW facing of " + this); - } diff --git a/src/main/java/net/minecraft/core/dispenser/DispenseItemBehavior.java b/src/main/java/net/minecraft/core/dispenser/DispenseItemBehavior.java index e2e1273d787536d2fe1bdbbf8af36eb5ac220599..a3fe92e1db6755a9111ab58e84d61f429d72010f 100644 --- a/src/main/java/net/minecraft/core/dispenser/DispenseItemBehavior.java @@ -663,10 +633,10 @@ index 8d65cdb013706a932c2c73231108b2810b99e1c7..5b1938fc849db743e65cd7eed0f83ba0 // Paper end - Add drops to shear events continue; diff --git a/src/main/java/net/minecraft/network/Connection.java b/src/main/java/net/minecraft/network/Connection.java -index 9e37578ac79a63bb72cc04aae7ba4f6f927a2ce4..121651717b13d90751c20947ea46bdeb0d8da587 100644 +index 63b303a68edd7d39f85c8cb56760b2bf46dcb67a..9e5a7fb07edbdf234bddcab13afd3dde8c43197b 100644 --- a/src/main/java/net/minecraft/network/Connection.java +++ b/src/main/java/net/minecraft/network/Connection.java -@@ -570,11 +570,20 @@ public class Connection extends SimpleChannelInboundHandler> { +@@ -571,11 +571,20 @@ public class Connection extends SimpleChannelInboundHandler> { 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 @@ -747,7 +717,7 @@ index 0b090797eb873b703730559049937163f2db8ecb..081bdffb914acb275f47dc47ce54eb84 if (optionset.has("initSettings")) { // CraftBukkit // CraftBukkit start - SPIGOT-5761: Create bukkit.yml and commands.yml if not present diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 220b28e969d5ffd5d3f5bba0e8e2918952528c03..b51f8d8173311a9322f3b63430c99c0e809bf34a 100644 +index 90eb43f08fe781aafe2f8ac7921bdf148178761b..29fe038edd861bd9daca46971e4092cfbfe6f988 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -276,6 +276,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop targets, Holder enchantment, int level) throws CommandSyntaxException { Enchantment enchantment2 = enchantment.value(); @@ -895,20 +865,20 @@ index 37d9c354af887c474094b1a364782007a5f2035d..ec86231077f6a1e03068507555539c5b throw ERROR_LEVEL_TOO_HIGH.create(level, enchantment2.getMaxLevel()); } else { int i = 0; -@@ -58,7 +58,7 @@ public class EnchantCommand { - LivingEntity livingEntity = (LivingEntity)entity; +@@ -81,7 +81,7 @@ public class EnchantCommand { ItemStack itemStack = livingEntity.getMainHandItem(); if (!itemStack.isEmpty()) { -- if (enchantment2.canEnchant(itemStack) && EnchantmentHelper.isEnchantmentCompatible(EnchantmentHelper.getEnchantments(itemStack).keySet(), enchantment2)) { -+ if ((enchantment2.canEnchant(itemStack) && EnchantmentHelper.isEnchantmentCompatible(EnchantmentHelper.getEnchantments(itemStack).keySet(), enchantment2)) || (org.purpurmc.purpur.PurpurConfig.allowUnsafeEnchantCommand && !itemStack.hasEnchantment(enchantment2))) { // Purpur + if (enchantment2.canEnchant(itemStack) +- && EnchantmentHelper.isEnchantmentCompatible(EnchantmentHelper.getEnchantments(itemStack).keySet(), enchantment2)) { ++ && EnchantmentHelper.isEnchantmentCompatible(EnchantmentHelper.getEnchantments(itemStack).keySet(), enchantment2) || (org.purpurmc.purpur.PurpurConfig.allowUnsafeEnchantCommand && !itemStack.hasEnchantment(enchantment2))) { // Purpur itemStack.enchant(enchantment2, level); - ++i; + i++; } else if (targets.size() == 1) { diff --git a/src/main/java/net/minecraft/server/commands/GameModeCommand.java b/src/main/java/net/minecraft/server/commands/GameModeCommand.java -index f7c9127346261d83413ca03a1cdaa84975ae17d6..0cb50229df7df79ad3185a5695707392301653d9 100644 +index d1da3600dc07107309b20ebe6e7c0c4da0e8de76..244b4719c689f153fa36381a60acc280bb0bd9b3 100644 --- a/src/main/java/net/minecraft/server/commands/GameModeCommand.java +++ b/src/main/java/net/minecraft/server/commands/GameModeCommand.java -@@ -45,6 +45,18 @@ public class GameModeCommand { +@@ -57,6 +57,18 @@ public class GameModeCommand { } private static int setMode(CommandContext context, Collection targets, GameType gameMode) { @@ -926,7 +896,7 @@ index f7c9127346261d83413ca03a1cdaa84975ae17d6..0cb50229df7df79ad3185a5695707392 + // Purpur end int i = 0; - for(ServerPlayer serverPlayer : targets) { + for (ServerPlayer serverPlayer : targets) { diff --git a/src/main/java/net/minecraft/server/commands/GiveCommand.java b/src/main/java/net/minecraft/server/commands/GiveCommand.java index 1b459a8ee8a6bc039e742d65796bc76660a1c765..599172b994d75484f7c7e0ce6d3d3d771c1c44d0 100644 --- a/src/main/java/net/minecraft/server/commands/GiveCommand.java @@ -1170,7 +1140,7 @@ index 04249a147f2c0a41499d1149a1f9749689074232..515e3f444e317de1d82421ad414c1ac1 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 1fe45a264032047c67d84ab387e230af2f0eff20..0c376236d0cbc6033865f25db592c42a0d3d30d7 100644 +index a26a756c35c77830a3407ae0dfbf8509141f30fa..9eb2bc23a2e7dce3594d67ec97ba120824a80ab1 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 { @@ -1354,7 +1324,7 @@ index 1fe45a264032047c67d84ab387e230af2f0eff20..0c376236d0cbc6033865f25db592c42a 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. -@@ -2809,7 +2877,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -2820,7 +2888,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 @@ -1364,7 +1334,7 @@ index 1fe45a264032047c67d84ab387e230af2f0eff20..0c376236d0cbc6033865f25db592c42a } // 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 f80b2d4e9a46d84fdaa0f674c562736a1e5c1635..0cc07f1df65a86cc4e2c0a254ea2cb782a797901 100644 +index 172315c2a965b82773dff797d4667d2f80ec8c7a..82aa92a106f844578959158ce1518eb7d0766951 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 { @@ -2108,19 +2078,19 @@ index ccbfcef3e83b1bef364447657bfd08a92d615cf6..aa2331c6df4e79d4bb0add071a0b11d2 } } diff --git a/src/main/java/net/minecraft/world/damagesource/CombatTracker.java b/src/main/java/net/minecraft/world/damagesource/CombatTracker.java -index 9c99b2e365aacb8309f29acb9025faccd2c676b3..1653d154edb38a6450ee51cb5e5b8e3d37a1784e 100644 +index 7056c8ca7a87748f14142c6af274aae492f29f1c..bf06bb78d060bb54d9aaade3605d42ce837d598b 100644 --- a/src/main/java/net/minecraft/world/damagesource/CombatTracker.java +++ b/src/main/java/net/minecraft/world/damagesource/CombatTracker.java -@@ -59,7 +59,7 @@ public class CombatTracker { - } +@@ -53,7 +53,7 @@ public class CombatTracker { - ItemStack itemStack = var10000; -- return !itemStack.isEmpty() && itemStack.hasCustomHoverName() ? Component.translatable(itemDeathTranslationKey, this.mob.getDisplayName(), attackerDisplayName, itemStack.getDisplayName()) : Component.translatable(deathTranslationKey, this.mob.getDisplayName(), attackerDisplayName); -+ return !itemStack.isEmpty() && (org.purpurmc.purpur.PurpurConfig.playerDeathsAlwaysShowItem || itemStack.hasCustomHoverName()) ? Component.translatable(itemDeathTranslationKey, this.mob.getDisplayName(), attackerDisplayName, itemStack.getDisplayName()) : Component.translatable(deathTranslationKey, this.mob.getDisplayName(), attackerDisplayName); + private Component getMessageForAssistedFall(Entity attacker, Component attackerDisplayName, String itemDeathTranslationKey, String deathTranslationKey) { + ItemStack itemStack = attacker instanceof LivingEntity livingEntity ? livingEntity.getMainHandItem() : ItemStack.EMPTY; +- return !itemStack.isEmpty() && itemStack.hasCustomHoverName() ++ return !itemStack.isEmpty() && (org.purpurmc.purpur.PurpurConfig.playerDeathsAlwaysShowItem || itemStack.hasCustomHoverName()) // Purpur + ? Component.translatable(itemDeathTranslationKey, this.mob.getDisplayName(), attackerDisplayName, itemStack.getDisplayName()) + : Component.translatable(deathTranslationKey, this.mob.getDisplayName(), attackerDisplayName); } - - private Component getFallMessage(CombatEntry damageRecord, @Nullable Entity attacker) { -@@ -99,6 +99,13 @@ public class CombatTracker { +@@ -97,6 +97,13 @@ public class CombatTracker { Component component = ComponentUtils.wrapInSquareBrackets(Component.translatable(string + ".link")).withStyle(INTENTIONAL_GAME_DESIGN_STYLE); return Component.translatable(string + ".message", this.mob.getDisplayName(), component); } else { @@ -2252,7 +2222,7 @@ index 3aad6bd0a1fb7bb3f9b7dab2c10c875864900750..31bd845130e363dd11c225dfd1e9dd89 } diff --git a/src/main/java/net/minecraft/world/effect/MobEffectInstance.java b/src/main/java/net/minecraft/world/effect/MobEffectInstance.java -index bf304db1f9506d3e83d16cd632b9155c39346634..d94497083f3da89dbef6479ef8f70591e630e3e7 100644 +index 5c9a0c91ae53b575d325a294c702668d30252fcf..0758ddbd37a519d03ae134731368f4a69c2f8aab 100644 --- a/src/main/java/net/minecraft/world/effect/MobEffectInstance.java +++ b/src/main/java/net/minecraft/world/effect/MobEffectInstance.java @@ -36,6 +36,7 @@ public class MobEffectInstance implements Comparable { @@ -2263,37 +2233,31 @@ index bf304db1f9506d3e83d16cd632b9155c39346634..d94497083f3da89dbef6479ef8f70591 private final Optional factorData; public MobEffectInstance(MobEffect type) { -@@ -54,17 +55,36 @@ public class MobEffectInstance implements Comparable { +@@ -54,8 +55,14 @@ public class MobEffectInstance implements Comparable { this(type, duration, amplifier, ambient, visible, visible); } + // Purpur start -+ public MobEffectInstance(MobEffect type, int duration, int amplifier, boolean ambient, boolean visible, @Nullable org.bukkit.NamespacedKey key) { -+ this(type, duration, amplifier, ambient, visible, visible, key); ++ public MobEffectInstance(MobEffect type, int duration, int amplifier, boolean ambient, boolean showParticles, boolean showIcon, @Nullable org.bukkit.NamespacedKey key) { ++ this(type, duration, amplifier, ambient, showParticles, showIcon, null, key, type.createFactorData()); + } + // Purpur end + public MobEffectInstance(MobEffect type, int duration, int amplifier, boolean ambient, boolean showParticles, boolean showIcon) { -- this(type, duration, amplifier, ambient, showParticles, showIcon, (MobEffectInstance)null, type.createFactorData()); -+ // Purpur start -+ this(type, duration, amplifier, ambient, showParticles, showIcon, (MobEffectInstance)null, type.createFactorData(), (org.bukkit.NamespacedKey)null); -+ } -+ -+ public MobEffectInstance(MobEffect type, int duration, int amplifier, boolean ambient, boolean showParticles, boolean showIcon, @Nullable org.bukkit.NamespacedKey key) { -+ this(type, duration, amplifier, ambient, showParticles, showIcon, (MobEffectInstance)null, type.createFactorData(), key); -+ // Purpur end +- this(type, duration, amplifier, ambient, showParticles, showIcon, null, type.createFactorData()); ++ this(type, duration, amplifier, ambient, showParticles, showIcon, null, null, type.createFactorData()); // Purpur } - public MobEffectInstance(MobEffect type, int duration, int amplifier, boolean ambient, boolean showParticles, boolean showIcon, @Nullable MobEffectInstance hiddenEffect, Optional factorCalculationData) { -+ // Purpur start -+ this(type, duration, amplifier, ambient, showParticles, showIcon, hiddenEffect, factorCalculationData, (org.bukkit.NamespacedKey) null); -+ } -+ -+ public MobEffectInstance(MobEffect type, int duration, int amplifier, boolean ambient, boolean showParticles, boolean showIcon, @Nullable MobEffectInstance hiddenEffect, Optional factorCalculationData, @Nullable org.bukkit.NamespacedKey key) { -+ // Purpur end + public MobEffectInstance( +@@ -66,6 +73,7 @@ public class MobEffectInstance implements Comparable { + boolean showParticles, + boolean showIcon, + @Nullable MobEffectInstance hiddenEffect, ++ @Nullable org.bukkit.NamespacedKey key, // Purpur + Optional factorCalculationData + ) { this.effect = type; - this.duration = duration; - this.amplifier = amplifier; +@@ -74,6 +82,7 @@ public class MobEffectInstance implements Comparable { this.ambient = ambient; this.visible = showParticles; this.showIcon = showIcon; @@ -2301,7 +2265,7 @@ index bf304db1f9506d3e83d16cd632b9155c39346634..d94497083f3da89dbef6479ef8f70591 this.hiddenEffect = hiddenEffect; this.factorData = factorCalculationData; } -@@ -85,6 +105,7 @@ public class MobEffectInstance implements Comparable { +@@ -94,6 +103,7 @@ public class MobEffectInstance implements Comparable { this.ambient = that.ambient; this.visible = that.visible; this.showIcon = that.showIcon; @@ -2309,7 +2273,7 @@ index bf304db1f9506d3e83d16cd632b9155c39346634..d94497083f3da89dbef6479ef8f70591 } public boolean update(MobEffectInstance that) { -@@ -129,6 +150,13 @@ public class MobEffectInstance implements Comparable { +@@ -138,6 +148,13 @@ public class MobEffectInstance implements Comparable { bl = true; } @@ -2323,7 +2287,7 @@ index bf304db1f9506d3e83d16cd632b9155c39346634..d94497083f3da89dbef6479ef8f70591 return bl; } -@@ -172,6 +200,17 @@ public class MobEffectInstance implements Comparable { +@@ -181,6 +198,17 @@ public class MobEffectInstance implements Comparable { return this.showIcon; } @@ -2341,7 +2305,7 @@ index bf304db1f9506d3e83d16cd632b9155c39346634..d94497083f3da89dbef6479ef8f70591 public boolean tick(LivingEntity entity, Runnable overwriteCallback) { if (this.hasRemainingDuration()) { int i = this.isInfiniteDuration() ? entity.tickCount : this.duration; -@@ -232,6 +271,12 @@ public class MobEffectInstance implements Comparable { +@@ -237,6 +265,12 @@ public class MobEffectInstance implements Comparable { string = string + ", Show Icon: false"; } @@ -2354,16 +2318,15 @@ index bf304db1f9506d3e83d16cd632b9155c39346634..d94497083f3da89dbef6479ef8f70591 return string; } -@@ -247,7 +292,7 @@ public class MobEffectInstance implements Comparable { - return false; - } else { - MobEffectInstance mobEffectInstance = (MobEffectInstance)object; -- return this.duration == mobEffectInstance.duration && this.amplifier == mobEffectInstance.amplifier && this.ambient == mobEffectInstance.ambient && this.effect.equals(mobEffectInstance.effect); -+ return this.duration == mobEffectInstance.duration && this.amplifier == mobEffectInstance.amplifier && this.ambient == mobEffectInstance.ambient && this.effect.equals(mobEffectInstance.effect) && this.key == mobEffectInstance.key; // Purpur - add key - } +@@ -251,6 +285,7 @@ public class MobEffectInstance implements Comparable { + && this.duration == mobEffectInstance.duration + && this.amplifier == mobEffectInstance.amplifier + && this.ambient == mobEffectInstance.ambient ++ && this.key == mobEffectInstance.key // Purpur - add key + && this.effect.equals(mobEffectInstance.effect); } -@@ -272,6 +317,11 @@ public class MobEffectInstance implements Comparable { +@@ -275,6 +310,11 @@ public class MobEffectInstance implements Comparable { nbt.putBoolean("ambient", this.isAmbient()); nbt.putBoolean("show_particles", this.isVisible()); nbt.putBoolean("show_icon", this.showIcon()); @@ -2375,7 +2338,7 @@ index bf304db1f9506d3e83d16cd632b9155c39346634..d94497083f3da89dbef6479ef8f70591 if (this.hiddenEffect != null) { CompoundTag compoundTag = new CompoundTag(); this.hiddenEffect.save(compoundTag); -@@ -306,6 +356,13 @@ public class MobEffectInstance implements Comparable { +@@ -311,6 +351,13 @@ public class MobEffectInstance implements Comparable { bl3 = nbt.getBoolean("show_icon"); } @@ -2389,12 +2352,12 @@ index bf304db1f9506d3e83d16cd632b9155c39346634..d94497083f3da89dbef6479ef8f70591 MobEffectInstance mobEffectInstance = null; if (nbt.contains("hidden_effect", 10)) { mobEffectInstance = loadSpecifiedEffect(type, nbt.getCompound("hidden_effect")); -@@ -318,7 +375,7 @@ public class MobEffectInstance implements Comparable { +@@ -325,7 +372,7 @@ public class MobEffectInstance implements Comparable { optional = Optional.empty(); } - return new MobEffectInstance(type, j, Math.max(i, 0), bl, bl2, bl3, mobEffectInstance, optional); -+ return new MobEffectInstance(type, j, Math.max(i, 0), bl, bl2, bl3, mobEffectInstance, optional, key); // Purpur - add key ++ return new MobEffectInstance(type, j, Math.max(i, 0), bl, bl2, bl3, mobEffectInstance, key, optional); // Purpur - add key } @Override @@ -2440,7 +2403,7 @@ index b994ae09621934df2cdd6a83a7d8ecb44649fb16..c2b812c992db1ac9cd391da902c8d819 ((CraftPlayer) entityhuman.getBukkitEntity()).sendHealthUpdate(); diff --git a/src/main/java/net/minecraft/world/effect/WitherMobEffect.java b/src/main/java/net/minecraft/world/effect/WitherMobEffect.java -index 1f9e0c139988c4c44a26552881647d36965aa4fa..b8d612d22aca74a08b53393c0723a2ae3a0b9ddf 100644 +index cc45fd864185a7842c465e26304b36f7c744bb93..434390a6b88eac7bd41ad6b05d223c78571885fb 100644 --- a/src/main/java/net/minecraft/world/effect/WitherMobEffect.java +++ b/src/main/java/net/minecraft/world/effect/WitherMobEffect.java @@ -10,7 +10,7 @@ class WitherMobEffect extends MobEffect { @@ -2453,7 +2416,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 58bfd5f631330c04b935064d8fd813eb7254e671..73a690978ebe9f262f7310a784baeccdd5e2bf05 100644 +index 51d4fd6e38c383122af207f54ffc206f3c0448b2..f5fa8e5534431d35be946aac56c4a90e03bcde31 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -160,7 +160,7 @@ import org.bukkit.plugin.PluginManager; @@ -2797,7 +2760,7 @@ index 36422fb394a158f36c84ba0ee03cc704956c91b2..9a3210e34decb4096533c58f36687e31 public int getValue() { return this.value; diff --git a/src/main/java/net/minecraft/world/entity/GlowSquid.java b/src/main/java/net/minecraft/world/entity/GlowSquid.java -index 1bb8b6e91c44cd13411d96d749fa64835c75a267..b18cbe85330e26de6f6cbfcc3d51a7418bd93877 100644 +index 5de938f4a7f16fd3caff783564cbb7e6b2924f9a..09181e9a0d4ceac30d20f4ff488a85b0ab5b1d04 100644 --- a/src/main/java/net/minecraft/world/entity/GlowSquid.java +++ b/src/main/java/net/minecraft/world/entity/GlowSquid.java @@ -23,6 +23,39 @@ public class GlowSquid extends Squid { @@ -2841,7 +2804,7 @@ 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 9e49ccc50ddd23c974dd0b82da538f8113820c84..dccb8934428b0c29e35f2bf9968fd32443dc11eb 100644 +index 6e1598826bdf173573ad17e51ec396cfa65b524d..a37244bdd21c27d15e0ce6731c28f8797fdddf76 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java @@ -218,9 +218,9 @@ public abstract class LivingEntity extends Entity implements Attackable { @@ -3447,7 +3410,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 0c804e597b08eb1fce53a1161aad3405b63c8058..7394c2d99499faaa4489a7eee1dd8b73ec08668d 100644 +index 12458621cadf5d186307c8b08edcb48f9c70c4f0..94082358b0dd573e09e61b167af2a54f8aa4bb2a 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 { @@ -3473,111 +3436,29 @@ index 0c804e597b08eb1fce53a1161aad3405b63c8058..7394c2d99499faaa4489a7eee1dd8b73 + if (instance.getAttribute().isClientSyncable() && (entity == null || entity.shouldSendAttribute(instance.getAttribute()))) { // Purpur this.dirtyAttributes.add(instance); } - -@@ -46,7 +54,7 @@ public class AttributeMap { - - public Collection getSyncableAttributes() { - return this.attributes.values().stream().filter((attribute) -> { -- return attribute.getAttribute().isClientSyncable(); -+ return attribute.getAttribute().isClientSyncable() && (entity == null || entity.shouldSendAttribute(attribute.getAttribute())); // Purpur - }).collect(Collectors.toList()); + } +@@ -44,7 +52,7 @@ public class AttributeMap { } + public Collection getSyncableAttributes() { +- return this.attributes.values().stream().filter(attribute -> attribute.getAttribute().isClientSyncable()).collect(Collectors.toList()); ++ return this.attributes.values().stream().filter(attribute -> attribute.getAttribute().isClientSyncable() && (entity == null || entity.shouldSendAttribute(attribute.getAttribute()))).collect(Collectors.toList()); // Purpur + } + + @Nullable diff --git a/src/main/java/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java b/src/main/java/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java -index 0a13e076b42bc8c0e7d4962379c207dea89f0435..62cb9f0c052222deecf76ebb8dbdd9652e691b2c 100644 +index c92583b6d1527db32f4a644f30c8f8468e9e2fc2..b8f65dc8f0db4bbe5f9c223e4ba129738fbfd795 100644 --- a/src/main/java/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java +++ b/src/main/java/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java -@@ -81,7 +81,89 @@ import org.slf4j.Logger; - - public class DefaultAttributes { - private static final Logger LOGGER = LogUtils.getLogger(); -- private static final Map, AttributeSupplier> SUPPLIERS = ImmutableMap., AttributeSupplier>builder().put(EntityType.ALLAY, Allay.createAttributes().build()).put(EntityType.ARMOR_STAND, LivingEntity.createLivingAttributes().build()).put(EntityType.AXOLOTL, Axolotl.createAttributes().build()).put(EntityType.BAT, Bat.createAttributes().build()).put(EntityType.BEE, Bee.createAttributes().build()).put(EntityType.BLAZE, Blaze.createAttributes().build()).put(EntityType.CAT, Cat.createAttributes().build()).put(EntityType.CAMEL, Camel.createAttributes().build()).put(EntityType.CAVE_SPIDER, CaveSpider.createCaveSpider().build()).put(EntityType.CHICKEN, Chicken.createAttributes().build()).put(EntityType.COD, AbstractFish.createAttributes().build()).put(EntityType.COW, Cow.createAttributes().build()).put(EntityType.CREEPER, Creeper.createAttributes().build()).put(EntityType.DOLPHIN, Dolphin.createAttributes().build()).put(EntityType.DONKEY, AbstractChestedHorse.createBaseChestedHorseAttributes().build()).put(EntityType.DROWNED, Zombie.createAttributes().build()).put(EntityType.ELDER_GUARDIAN, ElderGuardian.createAttributes().build()).put(EntityType.ENDERMAN, EnderMan.createAttributes().build()).put(EntityType.ENDERMITE, Endermite.createAttributes().build()).put(EntityType.ENDER_DRAGON, EnderDragon.createAttributes().build()).put(EntityType.EVOKER, Evoker.createAttributes().build()).put(EntityType.BREEZE, Breeze.createAttributes().build()).put(EntityType.FOX, Fox.createAttributes().build()).put(EntityType.FROG, Frog.createAttributes().build()).put(EntityType.GHAST, Ghast.createAttributes().build()).put(EntityType.GIANT, Giant.createAttributes().build()).put(EntityType.GLOW_SQUID, GlowSquid.createAttributes().build()).put(EntityType.GOAT, Goat.createAttributes().build()).put(EntityType.GUARDIAN, Guardian.createAttributes().build()).put(EntityType.HOGLIN, Hoglin.createAttributes().build()).put(EntityType.HORSE, AbstractHorse.createBaseHorseAttributes().build()).put(EntityType.HUSK, Zombie.createAttributes().build()).put(EntityType.ILLUSIONER, Illusioner.createAttributes().build()).put(EntityType.IRON_GOLEM, IronGolem.createAttributes().build()).put(EntityType.LLAMA, Llama.createAttributes().build()).put(EntityType.MAGMA_CUBE, MagmaCube.createAttributes().build()).put(EntityType.MOOSHROOM, Cow.createAttributes().build()).put(EntityType.MULE, AbstractChestedHorse.createBaseChestedHorseAttributes().build()).put(EntityType.OCELOT, Ocelot.createAttributes().build()).put(EntityType.PANDA, Panda.createAttributes().build()).put(EntityType.PARROT, Parrot.createAttributes().build()).put(EntityType.PHANTOM, Monster.createMonsterAttributes().build()).put(EntityType.PIG, Pig.createAttributes().build()).put(EntityType.PIGLIN, Piglin.createAttributes().build()).put(EntityType.PIGLIN_BRUTE, PiglinBrute.createAttributes().build()).put(EntityType.PILLAGER, Pillager.createAttributes().build()).put(EntityType.PLAYER, Player.createAttributes().build()).put(EntityType.POLAR_BEAR, PolarBear.createAttributes().build()).put(EntityType.PUFFERFISH, AbstractFish.createAttributes().build()).put(EntityType.RABBIT, Rabbit.createAttributes().build()).put(EntityType.RAVAGER, Ravager.createAttributes().build()).put(EntityType.SALMON, AbstractFish.createAttributes().build()).put(EntityType.SHEEP, Sheep.createAttributes().build()).put(EntityType.SHULKER, Shulker.createAttributes().build()).put(EntityType.SILVERFISH, Silverfish.createAttributes().build()).put(EntityType.SKELETON, AbstractSkeleton.createAttributes().build()).put(EntityType.SKELETON_HORSE, SkeletonHorse.createAttributes().build()).put(EntityType.SLIME, Monster.createMonsterAttributes().build()).put(EntityType.SNIFFER, Sniffer.createAttributes().build()).put(EntityType.SNOW_GOLEM, SnowGolem.createAttributes().build()).put(EntityType.SPIDER, Spider.createAttributes().build()).put(EntityType.SQUID, Squid.createAttributes().build()).put(EntityType.STRAY, AbstractSkeleton.createAttributes().build()).put(EntityType.STRIDER, Strider.createAttributes().build()).put(EntityType.TADPOLE, Tadpole.createAttributes().build()).put(EntityType.TRADER_LLAMA, Llama.createAttributes().build()).put(EntityType.TROPICAL_FISH, AbstractFish.createAttributes().build()).put(EntityType.TURTLE, Turtle.createAttributes().build()).put(EntityType.VEX, Vex.createAttributes().build()).put(EntityType.VILLAGER, Villager.createAttributes().build()).put(EntityType.VINDICATOR, Vindicator.createAttributes().build()).put(EntityType.WARDEN, Warden.createAttributes().build()).put(EntityType.WANDERING_TRADER, Mob.createMobAttributes().build()).put(EntityType.WITCH, Witch.createAttributes().build()).put(EntityType.WITHER, WitherBoss.createAttributes().build()).put(EntityType.WITHER_SKELETON, AbstractSkeleton.createAttributes().build()).put(EntityType.WOLF, Wolf.createAttributes().build()).put(EntityType.ZOGLIN, Zoglin.createAttributes().build()).put(EntityType.ZOMBIE, Zombie.createAttributes().build()).put(EntityType.ZOMBIE_HORSE, ZombieHorse.createAttributes().build()).put(EntityType.ZOMBIE_VILLAGER, Zombie.createAttributes().build()).put(EntityType.ZOMBIFIED_PIGLIN, ZombifiedPiglin.createAttributes().build()).build(); -+ private static final Map, AttributeSupplier> SUPPLIERS = ImmutableMap., AttributeSupplier>builder() -+ .put(EntityType.ALLAY, Allay.createAttributes().build()) -+ .put(EntityType.ARMOR_STAND, LivingEntity.createLivingAttributes().build()) -+ .put(EntityType.AXOLOTL, Axolotl.createAttributes().build()) -+ .put(EntityType.BAT, Bat.createAttributes().build()) -+ .put(EntityType.BEE, Bee.createAttributes().build()) -+ .put(EntityType.BLAZE, Blaze.createAttributes().build()) -+ .put(EntityType.CAT, Cat.createAttributes().build()) -+ .put(EntityType.CAMEL, Camel.createAttributes().build()) -+ .put(EntityType.CAVE_SPIDER, CaveSpider.createCaveSpider().build()) -+ .put(EntityType.CHICKEN, Chicken.createAttributes().build()) -+ .put(EntityType.COD, AbstractFish.createAttributes().build()) -+ .put(EntityType.COW, Cow.createAttributes().build()) -+ .put(EntityType.CREEPER, Creeper.createAttributes().build()) -+ .put(EntityType.DOLPHIN, Dolphin.createAttributes().build()) -+ .put(EntityType.DONKEY, AbstractChestedHorse.createBaseChestedHorseAttributes().build()) -+ .put(EntityType.DROWNED, Zombie.createAttributes().build()) -+ .put(EntityType.ELDER_GUARDIAN, ElderGuardian.createAttributes().build()) -+ .put(EntityType.ENDERMAN, EnderMan.createAttributes().build()) -+ .put(EntityType.ENDERMITE, Endermite.createAttributes().build()) -+ .put(EntityType.ENDER_DRAGON, EnderDragon.createAttributes().build()) -+ .put(EntityType.EVOKER, Evoker.createAttributes().build()) -+ .put(EntityType.BREEZE, Breeze.createAttributes().build()) -+ .put(EntityType.FOX, Fox.createAttributes().build()) -+ .put(EntityType.FROG, Frog.createAttributes().build()) -+ .put(EntityType.GHAST, Ghast.createAttributes().build()) -+ .put(EntityType.GIANT, Giant.createAttributes().build()) -+ .put(EntityType.GLOW_SQUID, GlowSquid.createAttributes().build()) -+ .put(EntityType.GOAT, Goat.createAttributes().build()) -+ .put(EntityType.GUARDIAN, Guardian.createAttributes().build()) -+ .put(EntityType.HOGLIN, Hoglin.createAttributes().build()) -+ .put(EntityType.HORSE, AbstractHorse.createBaseHorseAttributes().build()) -+ .put(EntityType.HUSK, Zombie.createAttributes().build()) -+ .put(EntityType.ILLUSIONER, Illusioner.createAttributes().build()) -+ .put(EntityType.IRON_GOLEM, IronGolem.createAttributes().build()) -+ .put(EntityType.LLAMA, Llama.createAttributes().build()) -+ .put(EntityType.MAGMA_CUBE, MagmaCube.createAttributes().build()) -+ .put(EntityType.MOOSHROOM, Cow.createAttributes().build()) -+ .put(EntityType.MULE, AbstractChestedHorse.createBaseChestedHorseAttributes().build()) -+ .put(EntityType.OCELOT, Ocelot.createAttributes().build()) -+ .put(EntityType.PANDA, Panda.createAttributes().build()) -+ .put(EntityType.PARROT, Parrot.createAttributes().build()) -+ .put(EntityType.PHANTOM, net.minecraft.world.entity.monster.Phantom.createAttributes().build()) // Purpur -+ .put(EntityType.PIG, Pig.createAttributes().build()) -+ .put(EntityType.PIGLIN, Piglin.createAttributes().build()) -+ .put(EntityType.PIGLIN_BRUTE, PiglinBrute.createAttributes().build()) -+ .put(EntityType.PILLAGER, Pillager.createAttributes().build()) -+ .put(EntityType.PLAYER, Player.createAttributes().build()) -+ .put(EntityType.POLAR_BEAR, PolarBear.createAttributes().build()) -+ .put(EntityType.PUFFERFISH, AbstractFish.createAttributes().build()) -+ .put(EntityType.RABBIT, Rabbit.createAttributes().build()) -+ .put(EntityType.RAVAGER, Ravager.createAttributes().build()) -+ .put(EntityType.SALMON, AbstractFish.createAttributes().build()) -+ .put(EntityType.SHEEP, Sheep.createAttributes().build()) -+ .put(EntityType.SHULKER, Shulker.createAttributes().build()) -+ .put(EntityType.SILVERFISH, Silverfish.createAttributes().build()) -+ .put(EntityType.SKELETON, AbstractSkeleton.createAttributes().build()) -+ .put(EntityType.SKELETON_HORSE, SkeletonHorse.createAttributes().build()) -+ .put(EntityType.SLIME, Monster.createMonsterAttributes().build()) -+ .put(EntityType.SNIFFER, Sniffer.createAttributes().build()) -+ .put(EntityType.SNOW_GOLEM, SnowGolem.createAttributes().build()) -+ .put(EntityType.SPIDER, Spider.createAttributes().build()) -+ .put(EntityType.SQUID, Squid.createAttributes().build()) -+ .put(EntityType.STRAY, AbstractSkeleton.createAttributes().build()) -+ .put(EntityType.STRIDER, Strider.createAttributes().build()) -+ .put(EntityType.TADPOLE, Tadpole.createAttributes().build()) -+ .put(EntityType.TRADER_LLAMA, Llama.createAttributes().build()) -+ .put(EntityType.TROPICAL_FISH, AbstractFish.createAttributes().build()) -+ .put(EntityType.TURTLE, Turtle.createAttributes().build()) -+ .put(EntityType.VEX, Vex.createAttributes().build()) -+ .put(EntityType.VILLAGER, Villager.createAttributes().build()) -+ .put(EntityType.VINDICATOR, Vindicator.createAttributes().build()) -+ .put(EntityType.WARDEN, Warden.createAttributes().build()) -+ .put(EntityType.WANDERING_TRADER, Mob.createMobAttributes().build()) -+ .put(EntityType.WITCH, Witch.createAttributes().build()) -+ .put(EntityType.WITHER, WitherBoss.createAttributes().build()) -+ .put(EntityType.WITHER_SKELETON, AbstractSkeleton.createAttributes().build()) -+ .put(EntityType.WOLF, Wolf.createAttributes().build()) -+ .put(EntityType.ZOGLIN, Zoglin.createAttributes().build()) -+ .put(EntityType.ZOMBIE, Zombie.createAttributes().build()) -+ .put(EntityType.ZOMBIE_HORSE, ZombieHorse.createAttributes().build()) -+ .put(EntityType.ZOMBIE_VILLAGER, Zombie.createAttributes().build()) -+ .put(EntityType.ZOMBIFIED_PIGLIN, ZombifiedPiglin.createAttributes().build()).build(); - - public static AttributeSupplier getSupplier(EntityType type) { - return SUPPLIERS.get(type); +@@ -123,7 +123,7 @@ public class DefaultAttributes { + .put(EntityType.OCELOT, Ocelot.createAttributes().build()) + .put(EntityType.PANDA, Panda.createAttributes().build()) + .put(EntityType.PARROT, Parrot.createAttributes().build()) +- .put(EntityType.PHANTOM, Monster.createMonsterAttributes().build()) ++ .put(EntityType.PHANTOM, net.minecraft.world.entity.monster.Phantom.createAttributes().build()) // Purpur + .put(EntityType.PIG, Pig.createAttributes().build()) + .put(EntityType.PIGLIN, Piglin.createAttributes().build()) + .put(EntityType.PIGLIN_BRUTE, PiglinBrute.createAttributes().build()) diff --git a/src/main/java/net/minecraft/world/entity/ai/attributes/RangedAttribute.java b/src/main/java/net/minecraft/world/entity/ai/attributes/RangedAttribute.java index f0703302e7dbbda88de8c648d20d87c55ed9b1e0..a913ebabaa5f443afa987b972355a8f8d1723c78 100644 --- a/src/main/java/net/minecraft/world/entity/ai/attributes/RangedAttribute.java @@ -3590,6 +3471,19 @@ index f0703302e7dbbda88de8c648d20d87c55ed9b1e0..a913ebabaa5f443afa987b972355a8f8 return Double.isNaN(value) ? this.minValue : Mth.clamp(value, this.minValue, this.maxValue); } } +diff --git a/src/main/java/net/minecraft/world/entity/ai/behavior/AcquirePoi.java b/src/main/java/net/minecraft/world/entity/ai/behavior/AcquirePoi.java +index b5242f2d450f863a3eb774d8a14bb00cbe699a16..4d2b6e69ed98aca98ffc50fefc6e535c1afb759d 100644 +--- a/src/main/java/net/minecraft/world/entity/ai/behavior/AcquirePoi.java ++++ b/src/main/java/net/minecraft/world/entity/ai/behavior/AcquirePoi.java +@@ -82,7 +82,7 @@ public class AcquirePoi { + }; + // Paper start - optimise POI access + java.util.List, BlockPos>> poiposes = new java.util.ArrayList<>(); +- io.papermc.paper.util.PoiAccess.findNearestPoiPositions(poiManager, poiPredicate, predicate2, entity.blockPosition(), 48, 48*48, PoiManager.Occupancy.HAS_SPACE, false, 5, poiposes); ++ io.papermc.paper.util.PoiAccess.findNearestPoiPositions(poiManager, poiPredicate, predicate2, entity.blockPosition(), world.purpurConfig.villagerAcquirePoiSearchRadius, world.purpurConfig.villagerAcquirePoiSearchRadius*world.purpurConfig.villagerAcquirePoiSearchRadius, PoiManager.Occupancy.HAS_SPACE, false, 5, poiposes); // Purpur + Set, BlockPos>> set = new java.util.HashSet<>(poiposes); + // Paper end - optimise POI access + Path path = findPathToPois(entity, set); diff --git a/src/main/java/net/minecraft/world/entity/ai/behavior/HarvestFarmland.java b/src/main/java/net/minecraft/world/entity/ai/behavior/HarvestFarmland.java index d3a2a6dee2d83b3df0ddc521c080f7d72b709461..a1acc479c9d6a838e3180da3ac8a3a02d22db5c1 100644 --- a/src/main/java/net/minecraft/world/entity/ai/behavior/HarvestFarmland.java @@ -3689,23 +3583,23 @@ index 42ae4d293a420f0b8eb476df6389b2e7a693895f..97c20c5b89e6d7e4ed844eff39ee55df } else { DoorBlock blockdoor = (DoorBlock) iblockdata.getBlock(); diff --git a/src/main/java/net/minecraft/world/entity/ai/behavior/ShowTradesToPlayer.java b/src/main/java/net/minecraft/world/entity/ai/behavior/ShowTradesToPlayer.java -index c3e0b1f11b58668f9f24eb421abc340e1b49dfac..d809fa4f96e2c528075f544355397903996ecaf6 100644 +index 18dad0825616c4167a0a7555689ee64910a87e09..6945992491027d43eca4f1ca697ad45ce06ded55 100644 --- a/src/main/java/net/minecraft/world/entity/ai/behavior/ShowTradesToPlayer.java +++ b/src/main/java/net/minecraft/world/entity/ai/behavior/ShowTradesToPlayer.java -@@ -42,6 +42,7 @@ public class ShowTradesToPlayer extends Behavior { +@@ -46,6 +46,7 @@ public class ShowTradesToPlayer extends Behavior { @Override public boolean canStillUse(ServerLevel world, Villager entity, long time) { + if (!entity.level().purpurConfig.villagerDisplayTradeItem) return false; // Purpur - return this.checkExtraStartConditions(world, entity) && this.lookTime > 0 && entity.getBrain().getMemory(MemoryModuleType.INTERACTION_TARGET).isPresent(); - } - + return this.checkExtraStartConditions(world, entity) + && this.lookTime > 0 + && entity.getBrain().getMemory(MemoryModuleType.INTERACTION_TARGET).isPresent(); diff --git a/src/main/java/net/minecraft/world/entity/ai/behavior/TradeWithVillager.java b/src/main/java/net/minecraft/world/entity/ai/behavior/TradeWithVillager.java -index 94fb9bcf601832ee934331c0376de8707b5043c5..44701d0bed85c46e658bc3f2a738126bd748e5c6 100644 +index a866e254b7faf50e2e64829a7e40db62d4d26424..753587e4d9582605951461f2bea37aff3bf28fcd 100644 --- a/src/main/java/net/minecraft/world/entity/ai/behavior/TradeWithVillager.java +++ b/src/main/java/net/minecraft/world/entity/ai/behavior/TradeWithVillager.java -@@ -60,6 +60,12 @@ public class TradeWithVillager extends Behavior { - throwHalfStack(entity, WHEAT_SINGLETON_ARRAY, villager); // Gale - optimize villager data storage +@@ -65,6 +65,12 @@ public class TradeWithVillager extends Behavior { + throwHalfStack(entity, Villager.FOOD_POINTS_KEY_ARRAY, villager); // Gale - optimize villager data storage } + // Purpur start @@ -3718,10 +3612,10 @@ index 94fb9bcf601832ee934331c0376de8707b5043c5..44701d0bed85c46e658bc3f2a738126b if (this.trades != null && entity.getInventory().hasAnyOf(this.trades)) { throwHalfStack(entity, this.trades, villager); diff --git a/src/main/java/net/minecraft/world/entity/ai/behavior/VillagerGoalPackages.java b/src/main/java/net/minecraft/world/entity/ai/behavior/VillagerGoalPackages.java -index cd7a90ec1073b2b452ca70decefe6a594445003b..47672e48c1cae73cffe532d622b296343fc12ef0 100644 +index d2917f9b215919890f28b513601863ccaced17c7..58338e240079f2de1669e8c2ce839451511feafd 100644 --- a/src/main/java/net/minecraft/world/entity/ai/behavior/VillagerGoalPackages.java +++ b/src/main/java/net/minecraft/world/entity/ai/behavior/VillagerGoalPackages.java -@@ -30,8 +30,13 @@ public class VillagerGoalPackages { +@@ -49,8 +49,13 @@ public class VillagerGoalPackages { } public static ImmutableList>> getWorkPackage(VillagerProfession profession, float speed) { @@ -3754,7 +3648,7 @@ index 0cc411dd39d981187c9e9a3c5eb8043b19a09b98..f7032f4ea55f5aca293c2640686238b7 // CraftBukkit end world.broadcastEntityEvent(entityvillager2, (byte) 12); diff --git a/src/main/java/net/minecraft/world/entity/ai/control/MoveControl.java b/src/main/java/net/minecraft/world/entity/ai/control/MoveControl.java -index 03d77c6d4697d4934ca65e3329982f0efe089820..ce7e3e90993b76225dc820a21e04267e488f5f7b 100644 +index ca02566b20dd52a59bc7b150529a1d68bc560ab0..10265fd19c90cea34372a786bb272dbcdd91b993 100644 --- a/src/main/java/net/minecraft/world/entity/ai/control/MoveControl.java +++ b/src/main/java/net/minecraft/world/entity/ai/control/MoveControl.java @@ -29,6 +29,20 @@ public class MoveControl implements Control { @@ -3779,7 +3673,7 @@ index 03d77c6d4697d4934ca65e3329982f0efe089820..ce7e3e90993b76225dc820a21e04267e return this.operation == MoveControl.Operation.MOVE_TO; } diff --git a/src/main/java/net/minecraft/world/entity/ai/control/SmoothSwimmingLookControl.java b/src/main/java/net/minecraft/world/entity/ai/control/SmoothSwimmingLookControl.java -index 7df56705a4a0de2dc4ff7ab133fc26612c219162..384bed4505b6cabb1ae151cd2c4eb5e56f24563f 100644 +index fbfc2f2515ad709b2c1212aef9521e795547d66b..e77bd11af62682d5eca41f6c9e1aed30eb6879ce 100644 --- a/src/main/java/net/minecraft/world/entity/ai/control/SmoothSwimmingLookControl.java +++ b/src/main/java/net/minecraft/world/entity/ai/control/SmoothSwimmingLookControl.java @@ -3,7 +3,7 @@ package net.minecraft.world.entity.ai.control; @@ -3798,8 +3692,8 @@ index 7df56705a4a0de2dc4ff7ab133fc26612c219162..384bed4505b6cabb1ae151cd2c4eb5e5 - public void tick() { + public void vanillaTick() { // Purpur if (this.lookAtCooldown > 0) { - --this.lookAtCooldown; - this.getYRotD().ifPresent((yaw) -> { + this.lookAtCooldown--; + this.getYRotD().ifPresent(yaw -> this.mob.yHeadRot = this.rotateTowards(this.mob.yHeadRot, yaw + 20.0F, this.yMaxRotSpeed)); diff --git a/src/main/java/net/minecraft/world/entity/ai/goal/BreakDoorGoal.java b/src/main/java/net/minecraft/world/entity/ai/goal/BreakDoorGoal.java index a85885ee51df585fa11ae9f8fcd67ff2a71c5a18..d81509e08e70ec5b2f837c9dc66b1254c86854e4 100644 --- a/src/main/java/net/minecraft/world/entity/ai/goal/BreakDoorGoal.java @@ -3836,7 +3730,7 @@ index 4e2c23ccdf4e4a4d65b291dbe20952bae1838bff..0da884a833f6c707fea512e826658c3b this.level.setBlock(blockposition1, Blocks.DIRT.defaultBlockState(), 2); } diff --git a/src/main/java/net/minecraft/world/entity/ai/goal/LlamaFollowCaravanGoal.java b/src/main/java/net/minecraft/world/entity/ai/goal/LlamaFollowCaravanGoal.java -index 21725aee29e9120d1c7e1e19f91c21a73a28844f..3fc9528201fb96d6a0f905afe0b6a82ec88a7235 100644 +index df695b444fa2a993d381e2f197182c3e91a68502..0f4f546cd0eda4bd82b47446ae23ac32da8a9556 100644 --- a/src/main/java/net/minecraft/world/entity/ai/goal/LlamaFollowCaravanGoal.java +++ b/src/main/java/net/minecraft/world/entity/ai/goal/LlamaFollowCaravanGoal.java @@ -22,6 +22,7 @@ public class LlamaFollowCaravanGoal extends Goal { @@ -3845,7 +3739,7 @@ index 21725aee29e9120d1c7e1e19f91c21a73a28844f..3fc9528201fb96d6a0f905afe0b6a82e public boolean canUse() { + if (!this.llama.level().purpurConfig.llamaJoinCaravans || !this.llama.shouldJoinCaravan) return false; // Purpur if (!this.llama.isLeashed() && !this.llama.inCaravan()) { - List list = this.llama.level().getEntities(this.llama, this.llama.getBoundingBox().inflate(9.0D, 4.0D, 9.0D), (entity) -> { + List list = this.llama.level().getEntities(this.llama, this.llama.getBoundingBox().inflate(9.0, 4.0, 9.0), entity -> { EntityType entityType = entity.getType(); @@ -71,6 +72,7 @@ public class LlamaFollowCaravanGoal extends Goal { @@ -3854,7 +3748,7 @@ index 21725aee29e9120d1c7e1e19f91c21a73a28844f..3fc9528201fb96d6a0f905afe0b6a82e + if (!this.llama.shouldJoinCaravan) return false; // Purpur if (this.llama.inCaravan() && this.llama.getCaravanHead().isAlive() && this.firstIsLeashed(this.llama, 0)) { double d = this.llama.distanceToSqr(this.llama.getCaravanHead()); - if (d > 676.0D) { + if (d > 676.0) { diff --git a/src/main/java/net/minecraft/world/entity/ai/goal/RemoveBlockGoal.java b/src/main/java/net/minecraft/world/entity/ai/goal/RemoveBlockGoal.java index 5580a396a56c6e0f364a5368985ee99b9e2be0a8..3facfd6eee17cb0b59425494c966e19833660dd2 100644 --- a/src/main/java/net/minecraft/world/entity/ai/goal/RemoveBlockGoal.java @@ -3882,7 +3776,7 @@ index b0944fa1f3849dd24cd010fa0a6638f5fd7179d1..a3074ec9b430c9d0a0ef33fe353db643 return; } diff --git a/src/main/java/net/minecraft/world/entity/ai/goal/SwellGoal.java b/src/main/java/net/minecraft/world/entity/ai/goal/SwellGoal.java -index e241ae250f4f04a17ef2c583d00b065a4ca56a4c..7b99c3446b50939241d3e220d93e05649f72a6df 100644 +index 137ec75ee803789deb7b1ca93dd9369c9af362b9..ca95d25af3e9a0536868b0c7fd8e7d2ff1154ee3 100644 --- a/src/main/java/net/minecraft/world/entity/ai/goal/SwellGoal.java +++ b/src/main/java/net/minecraft/world/entity/ai/goal/SwellGoal.java @@ -54,6 +54,14 @@ public class SwellGoal extends Goal { @@ -3913,8 +3807,21 @@ index 0d9b194781d152e842c9a4b8d6f23d307b2e4452..00cf59524477ec79d4354cc403fc3e75 } @Override +diff --git a/src/main/java/net/minecraft/world/entity/ai/sensing/NearestBedSensor.java b/src/main/java/net/minecraft/world/entity/ai/sensing/NearestBedSensor.java +index 92731b6b593289e9f583c9b705b219e81fcd8e73..9104d7010bda6f9f73b478c11490ef9c53f76da2 100644 +--- a/src/main/java/net/minecraft/world/entity/ai/sensing/NearestBedSensor.java ++++ b/src/main/java/net/minecraft/world/entity/ai/sensing/NearestBedSensor.java +@@ -56,7 +56,7 @@ public class NearestBedSensor extends Sensor { + // Paper start - optimise POI access + java.util.List, BlockPos>> poiposes = new java.util.ArrayList<>(); + // don't ask me why it's unbounded. ask mojang. +- io.papermc.paper.util.PoiAccess.findAnyPoiPositions(poiManager, type -> type.is(PoiTypes.HOME), predicate, entity.blockPosition(), 48, PoiManager.Occupancy.ANY, false, Integer.MAX_VALUE, poiposes); ++ io.papermc.paper.util.PoiAccess.findAnyPoiPositions(poiManager, type -> type.is(PoiTypes.HOME), predicate, entity.blockPosition(), world.purpurConfig.villagerNearestBedSensorSearchRadius, PoiManager.Occupancy.ANY, false, Integer.MAX_VALUE, poiposes); // Purpur + Path path = AcquirePoi.findPathToPois(entity, new java.util.HashSet<>(poiposes)); + // Paper end - optimise POI access + if (path != null && path.canReach()) { diff --git a/src/main/java/net/minecraft/world/entity/ai/sensing/SecondaryPoiSensor.java b/src/main/java/net/minecraft/world/entity/ai/sensing/SecondaryPoiSensor.java -index 53b0519bbc5d52490040eaf0fe449648f021d0c2..b323157327203f5614d0051284b6bb247a5a564d 100644 +index ce8851c2cacfd3145b1e2c11443140a0759a1b07..9419f230910d0338fc4ac6e2e7b749ee7d5ee362 100644 --- a/src/main/java/net/minecraft/world/entity/ai/sensing/SecondaryPoiSensor.java +++ b/src/main/java/net/minecraft/world/entity/ai/sensing/SecondaryPoiSensor.java @@ -31,6 +31,13 @@ public class SecondaryPoiSensor extends Sensor { @@ -3941,7 +3848,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 29963fbccdd9adadcf46970473ff1fccc68572f0..903063332195af1bf1ef88f9b5c54b807447398f 100644 +index 68bc8699a9389d118411ea7134ea0e0588adf8dc..1731147abd53ca2149683ea593e96523dccc7d7e 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 { @@ -4081,28 +3988,27 @@ index 4f7e6f5c7b38ad19beeb5010b3a385c2efc5ef4a..51a8c84f13268d97b1d052db1efe464d public void readAdditionalSaveData(CompoundTag nbt) { super.readAdditionalSaveData(nbt); diff --git a/src/main/java/net/minecraft/world/entity/animal/AbstractFish.java b/src/main/java/net/minecraft/world/entity/animal/AbstractFish.java -index 2249fc6dd98afb8d52623b5864955fdd3b3fc042..2ccfaab0a02cf5ff9779e250fb79a75a9852e10d 100644 +index 401cffccd3c6adedcbd3986cd13733772953b31b..b8f973505b184cf198b6782a6f423c921c3881a7 100644 --- a/src/main/java/net/minecraft/world/entity/animal/AbstractFish.java +++ b/src/main/java/net/minecraft/world/entity/animal/AbstractFish.java -@@ -94,7 +94,7 @@ public abstract class AbstractFish extends WaterAnimal implements Bucketable { +@@ -94,6 +94,7 @@ public abstract class AbstractFish extends WaterAnimal implements Bucketable { @Override protected void registerGoals() { super.registerGoals(); -- this.goalSelector.addGoal(0, new PanicGoal(this, 1.25D)); + this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - this.goalSelector.addGoal(2, new AvoidEntityGoal<>(this, Player.class, 8.0F, 1.6D, 1.4D, EntitySelector.NO_SPECTATORS::test)); + this.goalSelector.addGoal(0, new PanicGoal(this, 1.25)); + this.goalSelector.addGoal(2, new AvoidEntityGoal<>(this, Player.class, 8.0F, 1.6, 1.4, EntitySelector.NO_SPECTATORS::test)); this.goalSelector.addGoal(4, new AbstractFish.FishSwimGoal(this)); - } -@@ -107,7 +107,7 @@ public abstract class AbstractFish extends WaterAnimal implements Bucketable { +@@ -107,7 +108,7 @@ public abstract class AbstractFish extends WaterAnimal implements Bucketable { @Override public void travel(Vec3 movementInput) { if (this.isEffectiveAi() && this.isInWater()) { - this.moveRelative(0.01F, movementInput); + this.moveRelative(getRider() != null ? getSpeed() : 0.01F, movementInput); // Purpur this.move(MoverType.SELF, this.getDeltaMovement()); - this.setDeltaMovement(this.getDeltaMovement().scale(0.9D)); + this.setDeltaMovement(this.getDeltaMovement().scale(0.9)); if (this.getTarget() == null) { -@@ -166,7 +166,7 @@ public abstract class AbstractFish extends WaterAnimal implements Bucketable { +@@ -168,7 +169,7 @@ public abstract class AbstractFish extends WaterAnimal implements Bucketable { protected void playStepSound(BlockPos pos, BlockState state) { } @@ -4111,7 +4017,7 @@ index 2249fc6dd98afb8d52623b5864955fdd3b3fc042..2ccfaab0a02cf5ff9779e250fb79a75a private final AbstractFish fish; FishMoveControl(AbstractFish owner) { -@@ -174,14 +174,22 @@ public abstract class AbstractFish extends WaterAnimal implements Bucketable { +@@ -176,14 +177,22 @@ public abstract class AbstractFish extends WaterAnimal implements Bucketable { this.fish = owner; } @@ -4127,7 +4033,7 @@ index 2249fc6dd98afb8d52623b5864955fdd3b3fc042..2ccfaab0a02cf5ff9779e250fb79a75a + @Override + public void vanillaTick() { // Purpur if (this.fish.isEyeInFluid(FluidTags.WATER)) { - this.fish.setDeltaMovement(this.fish.getDeltaMovement().add(0.0D, 0.005D, 0.0D)); + this.fish.setDeltaMovement(this.fish.getDeltaMovement().add(0.0, 0.005, 0.0)); } if (this.operation == MoveControl.Operation.MOVE_TO && !this.fish.getNavigation().isDone()) { @@ -5798,10 +5704,10 @@ index 24770540c51fe4831040d6b46b27636d25ebac40..10d6361077a74c5685eca72d12f99e33 if (!this.level().isClientSide) { player.startRiding(this); diff --git a/src/main/java/net/minecraft/world/entity/animal/PolarBear.java b/src/main/java/net/minecraft/world/entity/animal/PolarBear.java -index 01e17bac2358c42fb9455974ab8141e32c4f9161..54b6d780d14c27f24d3d4dc9171818f6256afd5c 100644 +index c9e10d4ce00b711b30de5d346a5ac26e7b441390..2fecdd574b407eeb1d0cd4f1b34ff7931e620540 100644 --- a/src/main/java/net/minecraft/world/entity/animal/PolarBear.java +++ b/src/main/java/net/minecraft/world/entity/animal/PolarBear.java -@@ -60,11 +60,81 @@ public class PolarBear extends Animal implements NeutralMob { +@@ -59,11 +59,81 @@ public class PolarBear extends Animal implements NeutralMob { private int remainingPersistentAngerTime; @Nullable private UUID persistentAngerTarget; @@ -5883,7 +5789,7 @@ index 01e17bac2358c42fb9455974ab8141e32c4f9161..54b6d780d14c27f24d3d4dc9171818f6 @Nullable @Override public AgeableMob getBreedOffspring(ServerLevel world, AgeableMob entity) { -@@ -73,19 +143,27 @@ public class PolarBear extends Animal implements NeutralMob { +@@ -72,19 +142,27 @@ public class PolarBear extends Animal implements NeutralMob { @Override public boolean isFood(ItemStack stack) { @@ -5904,18 +5810,19 @@ index 01e17bac2358c42fb9455974ab8141e32c4f9161..54b6d780d14c27f24d3d4dc9171818f6 + this.goalSelector.addGoal(3, new net.minecraft.world.entity.ai.goal.TemptGoal(this, 1.0D, net.minecraft.world.item.crafting.Ingredient.of(level().purpurConfig.polarBearBreedableItem), false)); + } + // Purpur end - this.goalSelector.addGoal(4, new FollowParentGoal(this, 1.25D)); - this.goalSelector.addGoal(5, new RandomStrollGoal(this, 1.0D)); + this.goalSelector.addGoal(4, new FollowParentGoal(this, 1.25)); + this.goalSelector.addGoal(5, new RandomStrollGoal(this, 1.0)); this.goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 6.0F)); this.goalSelector.addGoal(7, new RandomLookAroundGoal(this)); + this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur this.targetSelector.addGoal(1, new PolarBear.PolarBearHurtByTargetGoal()); this.targetSelector.addGoal(2, new PolarBear.PolarBearAttackPlayersGoal()); this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, Player.class, 10, true, false, this::isAngryAt)); -@@ -202,6 +280,11 @@ public class PolarBear extends Animal implements NeutralMob { +@@ -201,6 +279,12 @@ public class PolarBear extends Animal implements NeutralMob { + if (!this.level().isClientSide) { this.updatePersistentAnger((ServerLevel)this.level(), true); } - ++ + // Purpur start + if (isStanding() && --standTimer <= 0) { + setStanding(false); @@ -5924,7 +5831,7 @@ index 01e17bac2358c42fb9455974ab8141e32c4f9161..54b6d780d14c27f24d3d4dc9171818f6 } @Override -@@ -231,6 +314,7 @@ public class PolarBear extends Animal implements NeutralMob { +@@ -230,6 +314,7 @@ public class PolarBear extends Animal implements NeutralMob { public void setStanding(boolean warning) { this.entityData.set(DATA_STANDING_ID, warning); @@ -6424,7 +6331,7 @@ index 9eab1170cb123d3b60a02314702516704f959ab7..a4f5e54a04311243bf804f579a7ed028 } diff --git a/src/main/java/net/minecraft/world/entity/animal/Squid.java b/src/main/java/net/minecraft/world/entity/animal/Squid.java -index 4f32597c7af34d599f6658fe4962d41624e60419..cba0823bfd10a3e7fd3a7548b9cc11a77ce07ce7 100644 +index 36506dc4b99f9de19a23a99c1bccdcb4e7102e72..432a5b7e4887a6febee36467d6880c24370f750e 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Squid.java +++ b/src/main/java/net/minecraft/world/entity/animal/Squid.java @@ -44,13 +44,66 @@ public class Squid extends WaterAnimal { @@ -6500,10 +6407,10 @@ index 4f32597c7af34d599f6658fe4962d41624e60419..cba0823bfd10a3e7fd3a7548b9cc11a7 if (this.isInWaterOrBubble()) { + if (canFly()) setNoGravity(!wasTouchingWater); // Purpur - if (this.tentacleMovement < (float)Math.PI) { - float f = this.tentacleMovement / (float)Math.PI; - this.tentacleAngle = Mth.sin(f * f * (float)Math.PI) * (float)Math.PI * 0.25F; -@@ -298,10 +352,41 @@ public class Squid extends WaterAnimal { + if (this.tentacleMovement < (float) Math.PI) { + float f = this.tentacleMovement / (float) Math.PI; + this.tentacleAngle = Mth.sin(f * f * (float) Math.PI) * (float) Math.PI * 0.25F; +@@ -292,10 +346,41 @@ public class Squid extends WaterAnimal { @Override public void tick() { @@ -6543,14 +6450,14 @@ index 4f32597c7af34d599f6658fe4962d41624e60419..cba0823bfd10a3e7fd3a7548b9cc11a7 this.squid.setMovementVector(0.0F, 0.0F, 0.0F); - } else if (this.squid.getRandom().nextInt(reducedTickDelay(50)) == 0 || !this.squid.wasTouchingWater || !this.squid.hasMovementVector()) { + } else if (this.squid.getRandom().nextInt(reducedTickDelay(50)) == 0 || !this.squid.isInWater() || !this.squid.hasMovementVector()) { // Purpur - float f = this.squid.getRandom().nextFloat() * ((float)Math.PI * 2F); + float f = this.squid.getRandom().nextFloat() * (float) (Math.PI * 2); float g = Mth.cos(f) * 0.2F; float h = -0.1F + this.squid.getRandom().nextFloat() * 0.2F; diff --git a/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java b/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java -index b05b560b7570e97bc234b75f26233909fcf575b3..87b6f6b10ba6e3d9c6a42298a2019a526a183d90 100644 +index 6e9e86b6d547d7437c990b65718b95ad0d60f020..98205d89aa0cca82863257abfad46ab834385a20 100644 --- a/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java +++ b/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java -@@ -42,6 +42,33 @@ public class TropicalFish extends AbstractSchoolingFish implements VariantHolder +@@ -65,6 +65,33 @@ public class TropicalFish extends AbstractSchoolingFish implements VariantHolder super(type, world); } @@ -7171,10 +7078,10 @@ index 52e5f367bf20427a532f59bc20610f05f88982bd..a215c5a42943fcb97448e3ed67467e61 protected SoundEvent getAmbientSound() { return SoundEvents.CAMEL_AMBIENT; diff --git a/src/main/java/net/minecraft/world/entity/animal/frog/Frog.java b/src/main/java/net/minecraft/world/entity/animal/frog/Frog.java -index d1458cec0313f7317134e7eb8bdabc31cea5df68..819445535895fbf79b99222bc6bf33cbd9089813 100644 +index 791791fa03c402998fa99b5da9e9f969b256bf4e..44b17f1c6367b729d6e8f7f45c5689a12d6b3034 100644 --- a/src/main/java/net/minecraft/world/entity/animal/frog/Frog.java +++ b/src/main/java/net/minecraft/world/entity/animal/frog/Frog.java -@@ -79,16 +79,69 @@ public class Frog extends Animal implements VariantHolder { +@@ -104,16 +104,69 @@ public class Frog extends Animal implements VariantHolder { public final AnimationState croakAnimationState = new AnimationState(); public final AnimationState tongueAnimationState = new AnimationState(); public final AnimationState swimIdleAnimationState = new AnimationState(); @@ -7245,7 +7152,7 @@ index d1458cec0313f7317134e7eb8bdabc31cea5df68..819445535895fbf79b99222bc6bf33cb @Override protected Brain.Provider brainProvider() { return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); -@@ -162,7 +215,7 @@ public class Frog extends Animal implements VariantHolder { +@@ -186,7 +239,7 @@ public class Frog extends Animal implements VariantHolder { private int behaviorTick = 0; // Pufferfish @Override protected void customServerAiStep() { @@ -7254,7 +7161,7 @@ index d1458cec0313f7317134e7eb8bdabc31cea5df68..819445535895fbf79b99222bc6bf33cb this.getBrain().tick((ServerLevel)this.level(), this); FrogAi.updateActivity(this); super.customServerAiStep(); -@@ -345,7 +398,7 @@ public class Frog extends Animal implements VariantHolder { +@@ -372,7 +425,7 @@ public class Frog extends Animal implements VariantHolder { return world.getBlockState(pos.below()).is(BlockTags.FROGS_SPAWNABLE_ON) && isBrightEnoughToSpawn(world, pos); } @@ -7482,7 +7389,7 @@ index 815eb15086976b8f9e03bf8182d9ed50aec14720..3170f9044f18b8c609433ddbd3ef9ac3 } diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Donkey.java b/src/main/java/net/minecraft/world/entity/animal/horse/Donkey.java -index e0dfee0e0ce091d5ae0ec740e939c2c50915c104..72ad12175325091397459e06743875cce6df8d94 100644 +index 8c14f9f2ad383f87c498126f135b460a241da410..42efd14b59a2b7da3409895bdff49e83b6cb2fa5 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/Donkey.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/Donkey.java @@ -15,6 +15,43 @@ public class Donkey extends AbstractChestedHorse { @@ -7530,7 +7437,7 @@ index e0dfee0e0ce091d5ae0ec740e939c2c50915c104..72ad12175325091397459e06743875cc protected SoundEvent getAmbientSound() { return SoundEvents.DONKEY_AMBIENT; diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Horse.java b/src/main/java/net/minecraft/world/entity/animal/horse/Horse.java -index 5f5dc651d570989ec1294c31a14dcfede466b80a..3b1faa63e46a48e83ea672cf6da444a1d7e13270 100644 +index 2181d74ad955197eb4f1925a64914a6197fa9023..eab6efcae632a393924d7245a71c40b57c6e316d 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/Horse.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/Horse.java @@ -40,6 +40,43 @@ public class Horse extends AbstractHorse implements VariantHolder { @@ -7886,7 +7793,7 @@ index 038de19633002e8f7c4b1ead7438cef0163456ce..c80324d79b74fc620568347289f4e396 public boolean isTraderLlama() { return true; diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/ZombieHorse.java b/src/main/java/net/minecraft/world/entity/animal/horse/ZombieHorse.java -index 2f7f1f01c5e99266e66f7b8324fc94d2130ea9a4..813501e8aac1c121569cb996b47f0293d99c7e36 100644 +index 0a6ad1ad18051dc6311a6c4dd97dddf70b012014..9493fa681327aa42751955029e5acac846d9a2a8 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/ZombieHorse.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/ZombieHorse.java @@ -26,6 +26,48 @@ public class ZombieHorse extends AbstractHorse { @@ -7936,7 +7843,7 @@ index 2f7f1f01c5e99266e66f7b8324fc94d2130ea9a4..813501e8aac1c121569cb996b47f0293 + } + public static AttributeSupplier.Builder createAttributes() { - return createBaseHorseAttributes().add(Attributes.MAX_HEALTH, 15.0D).add(Attributes.MOVEMENT_SPEED, (double)0.2F); + return createBaseHorseAttributes().add(Attributes.MAX_HEALTH, 15.0).add(Attributes.MOVEMENT_SPEED, 0.2F); } @@ -76,6 +118,7 @@ public class ZombieHorse extends AbstractHorse { @@ -7994,7 +7901,7 @@ index 817f269d28305ae2d08b3f680d06af74a232e1f1..9962e83e9478db6de3869d53eaa4c4dc double d0 = this.moveControl.getSpeedModifier(); diff --git a/src/main/java/net/minecraft/world/entity/boss/EnderDragonPart.java b/src/main/java/net/minecraft/world/entity/boss/EnderDragonPart.java -index a6f3fba3b02b0b4d2a4e9e5205301c6f52d0188a..4eebfc27ded55e4d764d04f35d3e9c9e0791c89f 100644 +index aa5416157abd155ffadf94f61b77fa36d694699f..1dd1bd40607e6da09abb0315097588aed550c0c5 100644 --- a/src/main/java/net/minecraft/world/entity/boss/EnderDragonPart.java +++ b/src/main/java/net/minecraft/world/entity/boss/EnderDragonPart.java @@ -24,6 +24,13 @@ public class EnderDragonPart extends Entity { @@ -8671,10 +8578,10 @@ index c34701f95580e4cf45fe086115563127432a28c5..2363d9eaad655389c7b7d67d545ef802 if (!itemstack.isEmpty()) { diff --git a/src/main/java/net/minecraft/world/entity/decoration/Painting.java b/src/main/java/net/minecraft/world/entity/decoration/Painting.java -index d9016807bc21c38a5c38170e1335c79b39355bcb..62cdc36a21c0203ed98d2946a1efdf549a5ca3ea 100644 +index fee2269b241cbfb10bbbb76b404aa5ef3997dfe0..af07901daaf6a0e5cd7e4b1e07fb491566807932 100644 --- a/src/main/java/net/minecraft/world/entity/decoration/Painting.java +++ b/src/main/java/net/minecraft/world/entity/decoration/Painting.java -@@ -121,7 +121,7 @@ public class Painting extends HangingEntity implements VariantHolder(this, Player.class, true)); } public static AttributeSupplier.Builder createAttributes() { -- return Monster.createMonsterAttributes().add(Attributes.ATTACK_DAMAGE, 6.0D).add(Attributes.MOVEMENT_SPEED, (double)0.23F).add(Attributes.FOLLOW_RANGE, 48.0D); -+ return Monster.createMonsterAttributes().add(Attributes.ATTACK_DAMAGE, 6.0D).add(Attributes.MOVEMENT_SPEED, (double)0.23F).add(Attributes.FOLLOW_RANGE, 48.0D).add(Attributes.FLYING_SPEED, 0.6D); // Purpur +- return Monster.createMonsterAttributes().add(Attributes.ATTACK_DAMAGE, 6.0).add(Attributes.MOVEMENT_SPEED, 0.23F).add(Attributes.FOLLOW_RANGE, 48.0); ++ return Monster.createMonsterAttributes().add(Attributes.ATTACK_DAMAGE, 6.0).add(Attributes.MOVEMENT_SPEED, 0.23F).add(Attributes.FOLLOW_RANGE, 48.0).add(Attributes.FLYING_SPEED, 0.6); // Purpur } @Override -@@ -101,11 +148,19 @@ public class Blaze extends Monster { +@@ -111,11 +158,19 @@ public class Blaze extends Monster { @Override public boolean isSensitiveToWater() { @@ -8967,7 +8874,7 @@ index 17aa7676ab624440651850bbe5689f8a6c9dbeed..a8b58469fd8a1ed4ec0ce443cf055579 + } + // Purpur end + - --this.nextHeightOffsetChangeTick; + this.nextHeightOffsetChangeTick--; if (this.nextHeightOffsetChangeTick <= 0) { this.nextHeightOffsetChangeTick = 100; diff --git a/src/main/java/net/minecraft/world/entity/monster/CaveSpider.java b/src/main/java/net/minecraft/world/entity/monster/CaveSpider.java @@ -9766,7 +9673,7 @@ index c135bc245f59a1af706f98b9d140dee77016b12f..640f0c378a18cf0a820ad544bb3b172b if (this.floatDuration-- <= 0) { this.floatDuration += this.ghast.getRandom().nextInt(5) + 2; diff --git a/src/main/java/net/minecraft/world/entity/monster/Giant.java b/src/main/java/net/minecraft/world/entity/monster/Giant.java -index 793c72bb7b86e404926085629121d6cad19a2740..d13eed85d5399cd6991b3ad90f05a5805a3a2678 100644 +index a329395dd8ff2d5428de19018111373806fc8796..20d6fd08cc7b5964f74b7dd99ee117ac30273426 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Giant.java +++ b/src/main/java/net/minecraft/world/entity/monster/Giant.java @@ -1,18 +1,123 @@ @@ -10143,7 +10050,7 @@ index fb84b35e34063075e69e00e430bc00e7c3b9d62c..a8b3431c67442c5440b063426a1adc42 this.targetSelector.addGoal(2, (new NearestAttackableTargetGoal<>(this, Player.class, true)).setUnseenMemoryTicks(300)); this.targetSelector.addGoal(3, (new NearestAttackableTargetGoal<>(this, AbstractVillager.class, false)).setUnseenMemoryTicks(300)); diff --git a/src/main/java/net/minecraft/world/entity/monster/MagmaCube.java b/src/main/java/net/minecraft/world/entity/monster/MagmaCube.java -index 2858ea5562d06c11e5c7337a2b123f9be7a3f62e..1ad97267394d3717b1871336193cdc91f3ffb276 100644 +index c4b4ff79bfdf9e34bf73a7760369e24b28dbbd70..1bfd5ef9ce8a07375ff215d092368c3f5104ab13 100644 --- a/src/main/java/net/minecraft/world/entity/monster/MagmaCube.java +++ b/src/main/java/net/minecraft/world/entity/monster/MagmaCube.java @@ -25,6 +25,58 @@ public class MagmaCube extends Slime { @@ -10203,7 +10110,7 @@ index 2858ea5562d06c11e5c7337a2b123f9be7a3f62e..1ad97267394d3717b1871336193cdc91 + } + public static AttributeSupplier.Builder createAttributes() { - return Monster.createMonsterAttributes().add(Attributes.MOVEMENT_SPEED, (double)0.2F); + return Monster.createMonsterAttributes().add(Attributes.MOVEMENT_SPEED, 0.2F); } @@ -70,11 +122,12 @@ public class MagmaCube extends Slime { } @@ -10220,10 +10127,10 @@ index 2858ea5562d06c11e5c7337a2b123f9be7a3f62e..1ad97267394d3717b1871336193cdc91 @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/Monster.java b/src/main/java/net/minecraft/world/entity/monster/Monster.java -index fbca4d6bc84e8be359b989ef089469838f896910..1be6f724fa6447fe733c8374ac295c6d4db6eb87 100644 +index 759839e912c54598b257ad738481364940f88a18..e60e6b3e5ae5a468cfe649ed2222412f3bc8b268 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Monster.java +++ b/src/main/java/net/minecraft/world/entity/monster/Monster.java -@@ -89,6 +89,14 @@ public abstract class Monster extends PathfinderMob implements Enemy { +@@ -88,6 +88,14 @@ public abstract class Monster extends PathfinderMob implements Enemy { } public static boolean isDarkEnoughToSpawn(ServerLevelAccessor world, BlockPos pos, RandomSource random) { @@ -11359,7 +11266,7 @@ index 7618364e5373fe17cfe45a5a4ee9ab25e591581c..b44ffeb4cc0ef63fdd25683f60c5a20f this.targetSelector.addGoal(2, new Spider.SpiderTargetGoal<>(this, Player.class)); this.targetSelector.addGoal(3, new Spider.SpiderTargetGoal<>(this, IronGolem.class)); diff --git a/src/main/java/net/minecraft/world/entity/monster/Stray.java b/src/main/java/net/minecraft/world/entity/monster/Stray.java -index 8185cef34b9300561a00f9e62b98f1aa818a3f5a..e01c91385935b71bb9aa7259b95cb963140e8c94 100644 +index 207a649d737adff440bd3f7cba15b0dbca338a35..18c0cf991c2e8418d7fdd4c8dbd7487a301e890d 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Stray.java +++ b/src/main/java/net/minecraft/world/entity/monster/Stray.java @@ -21,6 +21,38 @@ public class Stray extends AbstractSkeleton { @@ -11624,10 +11531,10 @@ index f443006c1e32feee97b32312814e2447a50c45e2..834abf1160034543fe3e89fa1c8d4bb5 Vec3 vec3d1 = Vex.this.getDeltaMovement(); diff --git a/src/main/java/net/minecraft/world/entity/monster/Vindicator.java b/src/main/java/net/minecraft/world/entity/monster/Vindicator.java -index a6af5ac9d09834940d3dd4c80b16450b90484edb..ee9d5933f74584452a1b27a392e7d36dac5b9bc9 100644 +index 0ee020848cdfd0c069f1e8d3a9516a339d82467c..960b5e2c290f82501384f79d4653f47bedf926fb 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Vindicator.java +++ b/src/main/java/net/minecraft/world/entity/monster/Vindicator.java -@@ -58,14 +58,48 @@ public class Vindicator extends AbstractIllager { +@@ -56,14 +56,48 @@ public class Vindicator extends AbstractIllager { super(type, world); } @@ -11671,12 +11578,12 @@ index a6af5ac9d09834940d3dd4c80b16450b90484edb..ee9d5933f74584452a1b27a392e7d36d this.goalSelector.addGoal(1, new Vindicator.VindicatorBreakDoorGoal(this)); this.goalSelector.addGoal(2, new AbstractIllager.RaiderOpenDoorGoal(this)); this.goalSelector.addGoal(3, new Raider.HoldGroundAttackGoal(this, 10.0F)); - this.goalSelector.addGoal(4, new MeleeAttackGoal(this, 1.0D, false)); + this.goalSelector.addGoal(4, new MeleeAttackGoal(this, 1.0, false)); + this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - this.targetSelector.addGoal(1, (new HurtByTargetGoal(this, Raider.class)).setAlertOthers()); + this.targetSelector.addGoal(1, new HurtByTargetGoal(this, Raider.class).setAlertOthers()); this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractVillager.class, true)); -@@ -130,6 +164,12 @@ public class Vindicator extends AbstractIllager { +@@ -136,6 +170,12 @@ public class Vindicator extends AbstractIllager { RandomSource randomSource = world.getRandom(); this.populateDefaultEquipmentSlots(randomSource, difficulty); this.populateDefaultEquipmentEnchantments(randomSource, difficulty); @@ -11789,10 +11696,10 @@ index 20a65c11ededcd7170704b70118da6200151fbab..e97cb4e166c2e9ac6d93ed5b15350758 protected void registerGoals() { this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractPiglin.class, true)); diff --git a/src/main/java/net/minecraft/world/entity/monster/Zoglin.java b/src/main/java/net/minecraft/world/entity/monster/Zoglin.java -index 3e79562f51efbac51785fa0998d6a1a6e3036939..4f242ba9131f341606af13ac543af8a0d7ed5e30 100644 +index 6c1a402e45d7b224c41696bb8bc0e09da076ae4d..ff5839b56ceb59a06ad0de950915a432f7decfb6 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zoglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zoglin.java -@@ -69,6 +69,38 @@ public class Zoglin extends Monster implements Enemy, HoglinBase { +@@ -82,6 +82,38 @@ public class Zoglin extends Monster implements Enemy, HoglinBase { this.xpReward = 5; } @@ -11831,7 +11738,7 @@ index 3e79562f51efbac51785fa0998d6a1a6e3036939..4f242ba9131f341606af13ac543af8a0 @Override protected Brain.Provider brainProvider() { return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); -@@ -200,6 +232,7 @@ public class Zoglin extends Monster implements Enemy, HoglinBase { +@@ -241,6 +273,7 @@ public class Zoglin extends Monster implements Enemy, HoglinBase { @Override protected void customServerAiStep() { @@ -12202,10 +12109,10 @@ index fbabbd0808304f5d0d12f987d00c9e43a89fb1c9..feba8a264bae656244f60296d0511a80 @Nullable diff --git a/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java b/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java -index f270c54028867ae0026bba3f214c3da6d015befb..169d21552ad75a8854c4209d53996e95feed7cbe 100644 +index fde1a076d1a490cf7bdea7f89a8714b4661a0d7d..ae1d7f36aa818bf8ee073f062117566f7f8db803 100644 --- a/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java -@@ -69,6 +69,43 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { +@@ -92,6 +92,43 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { this.xpReward = 5; } @@ -12249,7 +12156,7 @@ index f270c54028867ae0026bba3f214c3da6d015befb..169d21552ad75a8854c4209d53996e95 @Override public boolean canBeLeashed(Player player) { return !this.isLeashed(); -@@ -131,7 +168,7 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { +@@ -158,7 +195,7 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { private int behaviorTick; // Pufferfish @Override protected void customServerAiStep() { @@ -12360,10 +12267,10 @@ index 4f4f557b7f4232ec3b90dda43c6bed30521318ba..dd4313e0507d3adda0ec84c79f1af13e piglin.getBrain().eraseMemory(MemoryModuleType.WALK_TARGET); piglin.getNavigation().stop(); diff --git a/src/main/java/net/minecraft/world/entity/monster/piglin/PiglinBrute.java b/src/main/java/net/minecraft/world/entity/monster/piglin/PiglinBrute.java -index 5aab051998b67b7ba95cbf568de60e325b905eab..1805d4e15328fa99595641ea64fc2e3e659c555e 100644 +index 76916f1f23c274f615aeccb4dc48649483cdcdb5..44fd639409169838ebc96342fa85d5b2bf8ae9bb 100644 --- a/src/main/java/net/minecraft/world/entity/monster/piglin/PiglinBrute.java +++ b/src/main/java/net/minecraft/world/entity/monster/piglin/PiglinBrute.java -@@ -41,6 +41,38 @@ public class PiglinBrute extends AbstractPiglin { +@@ -63,6 +63,38 @@ public class PiglinBrute extends AbstractPiglin { this.xpReward = 20; } @@ -12400,9 +12307,9 @@ index 5aab051998b67b7ba95cbf568de60e325b905eab..1805d4e15328fa99595641ea64fc2e3e + } + public static AttributeSupplier.Builder createAttributes() { - return Monster.createMonsterAttributes().add(Attributes.MAX_HEALTH, 50.0D).add(Attributes.MOVEMENT_SPEED, (double)0.35F).add(Attributes.ATTACK_DAMAGE, 7.0D); + return Monster.createMonsterAttributes().add(Attributes.MAX_HEALTH, 50.0).add(Attributes.MOVEMENT_SPEED, 0.35F).add(Attributes.ATTACK_DAMAGE, 7.0); } -@@ -85,6 +117,7 @@ public class PiglinBrute extends AbstractPiglin { +@@ -113,6 +145,7 @@ public class PiglinBrute extends AbstractPiglin { @Override protected void customServerAiStep() { @@ -12483,10 +12390,10 @@ index 4e6c2f6b2e54a4c126e9a026b9cad05ce835ad66..69553b5b3c56998e4ae40876b1458929 // CraftBukkit start private CraftMerchant craftMerchant; diff --git a/src/main/java/net/minecraft/world/entity/npc/CatSpawner.java b/src/main/java/net/minecraft/world/entity/npc/CatSpawner.java -index 5f407535298a31a34cfe114dd863fd6a9b977707..29c7e33fe961020e5a0007287fe9b6631689f1b8 100644 +index 5d1610eddcaf0cf65c726a5438b42e53bab85332..4c7523a8df9124c30dbb569259c8b66497eff9db 100644 --- a/src/main/java/net/minecraft/world/entity/npc/CatSpawner.java +++ b/src/main/java/net/minecraft/world/entity/npc/CatSpawner.java -@@ -30,7 +30,7 @@ public class CatSpawner implements CustomSpawner { +@@ -28,7 +28,7 @@ public class CatSpawner implements CustomSpawner { if (this.nextTick > 0) { return 0; } else { @@ -12495,35 +12402,30 @@ index 5f407535298a31a34cfe114dd863fd6a9b977707..29c7e33fe961020e5a0007287fe9b663 Player player = world.getRandomPlayer(); if (player == null) { return 0; -@@ -63,11 +63,15 @@ public class CatSpawner implements CustomSpawner { - } +@@ -62,8 +62,12 @@ public class CatSpawner implements CustomSpawner { private int spawnInVillage(ServerLevel world, BlockPos pos) { -- int i = 48; + int i = 48; +- if (world.getPoiManager().getCountInRange(entry -> entry.is(PoiTypes.HOME), pos, 48, PoiManager.Occupancy.IS_OCCUPIED) > 4L) { +- List list = world.getEntitiesOfClass(Cat.class, new AABB(pos).inflate(48.0, 8.0, 48.0)); + // Purpur start + int range = world.purpurConfig.catSpawnVillageScanRange; + if (range <= 0) return 0; -+ - if (world.getPoiManager().getCountInRange((entry) -> { - return entry.is(PoiTypes.HOME); -- }, pos, 48, PoiManager.Occupancy.IS_OCCUPIED) > 4L) { -- List list = world.getEntitiesOfClass(Cat.class, (new AABB(pos)).inflate(48.0D, 8.0D, 48.0D)); -+ }, pos, range, PoiManager.Occupancy.IS_OCCUPIED) > 4L) { -+ List list = world.getEntitiesOfClass(Cat.class, (new AABB(pos)).inflate(range, 8.0D, range)); ++ if (world.getPoiManager().getCountInRange(entry -> entry.is(PoiTypes.HOME), pos, range, PoiManager.Occupancy.IS_OCCUPIED) > 4L) { ++ List list = world.getEntitiesOfClass(Cat.class, new AABB(pos).inflate(range, 8.0, range)); + // Purpur end if (list.size() < 5) { return this.spawnCat(pos, world); } -@@ -77,8 +81,11 @@ public class CatSpawner implements CustomSpawner { - } +@@ -74,7 +78,11 @@ public class CatSpawner implements CustomSpawner { private int spawnInHut(ServerLevel world, BlockPos pos) { -- int i = 16; -- List list = world.getEntitiesOfClass(Cat.class, (new AABB(pos)).inflate(16.0D, 8.0D, 16.0D)); + int i = 16; +- List list = world.getEntitiesOfClass(Cat.class, new AABB(pos).inflate(16.0, 8.0, 16.0)); + // Purpur start + int range = world.purpurConfig.catSpawnSwampHutScanRange; + if (range <= 0) return 0; -+ List list = world.getEntitiesOfClass(Cat.class, (new AABB(pos)).inflate(range, 8.0D, range)); ++ List list = world.getEntitiesOfClass(Cat.class, new AABB(pos).inflate(range, 8.0, range)); + // Purpur end return list.size() < 1 ? this.spawnCat(pos, world) : 0; } @@ -12741,18 +12643,18 @@ index 34812d4ab115f31a6ad1cf8cbc345dda4339c075..248ef4e472d569395eda57298298f788 this.brain.setMemory(MemoryModuleType.LAST_SLEPT, this.level().getGameTime()); // CraftBukkit - decompile error this.brain.eraseMemory(MemoryModuleType.WALK_TARGET); diff --git a/src/main/java/net/minecraft/world/entity/npc/VillagerProfession.java b/src/main/java/net/minecraft/world/entity/npc/VillagerProfession.java -index 95197b601d93c30a7645d67c89c7608fc00a8de6..b571731bbce25f17568370bb523cb9b0293a2f01 100644 +index 3821c02187ad04b20cdf1e719a0deeabbf91007d..8f36f113e8eb3236ce53ad9cce320c3d6253d248 100644 --- a/src/main/java/net/minecraft/world/entity/npc/VillagerProfession.java +++ b/src/main/java/net/minecraft/world/entity/npc/VillagerProfession.java -@@ -26,7 +26,7 @@ public record VillagerProfession(String name, Predicate> heldJob +@@ -31,7 +31,7 @@ public record VillagerProfession( public static final VillagerProfession ARMORER = register("armorer", PoiTypes.ARMORER, SoundEvents.VILLAGER_WORK_ARMORER); public static final VillagerProfession BUTCHER = register("butcher", PoiTypes.BUTCHER, SoundEvents.VILLAGER_WORK_BUTCHER); public static final VillagerProfession CARTOGRAPHER = register("cartographer", PoiTypes.CARTOGRAPHER, SoundEvents.VILLAGER_WORK_CARTOGRAPHER); - public static final VillagerProfession CLERIC = register("cleric", PoiTypes.CLERIC, SoundEvents.VILLAGER_WORK_CLERIC); + public static final VillagerProfession CLERIC = register("cleric", PoiTypes.CLERIC, ImmutableSet.of(Items.NETHER_WART), ImmutableSet.of(Blocks.SOUL_SAND), SoundEvents.VILLAGER_WORK_CLERIC); // Purpur - public static final VillagerProfession FARMER = register("farmer", PoiTypes.FARMER, new Item[] {Items.WHEAT, Items.WHEAT_SEEDS, Items.BEETROOT_SEEDS, Items.BONE_MEAL}, Blocks.FARMLAND, SoundEvents.VILLAGER_WORK_FARMER); // Gale - optimize villager data storage - public static final VillagerProfession FISHERMAN = register("fisherman", PoiTypes.FISHERMAN, SoundEvents.VILLAGER_WORK_FISHERMAN); - public static final VillagerProfession FLETCHER = register("fletcher", PoiTypes.FLETCHER, SoundEvents.VILLAGER_WORK_FLETCHER); + public static final VillagerProfession FARMER = register( + "farmer", + PoiTypes.FARMER, diff --git a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java index 8d1cc1a644415be251f469ab1cb2ebc09fe5c3eb..b133c186d2d1412aa623ba3db68091bc69c282a5 100644 --- a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java @@ -13009,18 +12911,6 @@ index c300b272c820786c8c4b9d83e184c5969468e1e0..fc840fff5fe2dc33986f8e5d3a60c3c8 // Paper start - username validation overriding 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 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 - Improve exact choice recipe ingredients; if an exact ingredient, don't include it - this.put(i, j); - } -- - } - - 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 488a98e20b4f405d1ce4a224d2d2b5151dec369b..609695ef44fa46bd9a0418e9ac5fe3d105daa505 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java @@ -13488,7 +13378,7 @@ index 9967ba762567631f2bdb1e4f8fe16a13ea927b46..6c945ae8fe8b1517e312c688f829fab4 FoodProperties(int hunger, float saturationModifier, boolean meat, boolean alwaysEdible, boolean snack, List> statusEffects) { diff --git a/src/main/java/net/minecraft/world/food/Foods.java b/src/main/java/net/minecraft/world/food/Foods.java -index b16d9e2eaa589f19c563ee70b1a56d67dbcdecb0..71beab673f04cd051c46ea37f8c847316885d38d 100644 +index 4569cf30b33167a415256a8542820557ad38f89e..e21efb231ddbd9438139084d5ec5e53ae584e5c8 100644 --- a/src/main/java/net/minecraft/world/food/Foods.java +++ b/src/main/java/net/minecraft/world/food/Foods.java @@ -4,6 +4,9 @@ import net.minecraft.world.effect.MobEffectInstance; @@ -13498,9 +13388,9 @@ index b16d9e2eaa589f19c563ee70b1a56d67dbcdecb0..71beab673f04cd051c46ea37f8c84731 + public static final java.util.Map ALL_PROPERTIES = new java.util.HashMap<>(); // Purpur + public static final java.util.Map DEFAULT_PROPERTIES = new java.util.HashMap<>(); // Purpur + - public static final FoodProperties APPLE = (new FoodProperties.Builder()).nutrition(4).saturationMod(0.3F).build(); - 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(); + public static final FoodProperties APPLE = new FoodProperties.Builder().nutrition(4).saturationMod(0.3F).build(); + 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 48f634a7521d31c1e9dfd3cfc83139d428dbd37a..fa185a8145843edf44fc0aeedb6c36b2b13263ae 100644 --- a/src/main/java/net/minecraft/world/inventory/AbstractContainerMenu.java @@ -13747,7 +13637,7 @@ index 0dbfd23bbfc6ad203f048142f8c90ef741849fe1..9a80427d2bb470b6b1638e59aba57216 return new ChestMenu(MenuType.GENERIC_9x6, syncId, playerInventory, inventory, 6); } diff --git a/src/main/java/net/minecraft/world/inventory/EnchantmentMenu.java b/src/main/java/net/minecraft/world/inventory/EnchantmentMenu.java -index 343f44db579839eb61376f876b5eff2e615dc2e5..849b6a30d412d10f1e2e6e88f2d8d990e4a720e4 100644 +index e6935b6632c7a7e07f4da459c95f564356242f98..1a686780e5aadcbdcfceb770ce8e283b38115209 100644 --- a/src/main/java/net/minecraft/world/inventory/EnchantmentMenu.java +++ b/src/main/java/net/minecraft/world/inventory/EnchantmentMenu.java @@ -40,6 +40,12 @@ import org.bukkit.event.enchantment.PrepareItemEnchantEvent; @@ -13804,7 +13694,7 @@ index 343f44db579839eb61376f876b5eff2e615dc2e5..849b6a30d412d10f1e2e6e88f2d8d990 int j; for (j = 0; j < 3; ++j) { -@@ -344,6 +377,7 @@ public class EnchantmentMenu extends AbstractContainerMenu { +@@ -351,6 +384,7 @@ public class EnchantmentMenu extends AbstractContainerMenu { public void removed(net.minecraft.world.entity.player.Player player) { super.removed(player); this.access.execute((world, blockposition) -> { @@ -13971,10 +13861,10 @@ index 7cffc64573008502bdd14ae4906fe51166b12fb3..1feafdbb48cf760cb6ebf95d5be2c32b world.playSound((Player) null, entityarmorstand.getX(), entityarmorstand.getY(), entityarmorstand.getZ(), SoundEvents.ARMOR_STAND_PLACE, SoundSource.BLOCKS, 0.75F, 0.8F); entityarmorstand.gameEvent(GameEvent.ENTITY_PLACE, context.getPlayer()); diff --git a/src/main/java/net/minecraft/world/item/AxeItem.java b/src/main/java/net/minecraft/world/item/AxeItem.java -index 2e75fd06e9e379eb95ebfe55086ffc327706ab2f..2918b1aca8fae6a319881a631dc727b6d375a33c 100644 +index 4f8689e8cbc8b6b9f44168126b95cc864a383c9e..b05bb4caf57965b82d841f52d6ea27985a5efc84 100644 --- a/src/main/java/net/minecraft/world/item/AxeItem.java +++ b/src/main/java/net/minecraft/world/item/AxeItem.java -@@ -33,13 +33,15 @@ public class AxeItem extends DiggerItem { +@@ -55,13 +55,15 @@ public class AxeItem extends DiggerItem { Level level = context.getLevel(); BlockPos blockPos = context.getClickedPos(); Player player = context.getPlayer(); @@ -13992,7 +13882,7 @@ index 2e75fd06e9e379eb95ebfe55086ffc327706ab2f..2918b1aca8fae6a319881a631dc727b6 return InteractionResult.PASS; } // Paper end -@@ -47,35 +49,40 @@ public class AxeItem extends DiggerItem { +@@ -69,32 +71,41 @@ public class AxeItem extends DiggerItem { CriteriaTriggers.ITEM_USED_ON_BLOCK.trigger((ServerPlayer)player, blockPos, itemStack); } @@ -14008,9 +13898,7 @@ index 2e75fd06e9e379eb95ebfe55086ffc327706ab2f..2918b1aca8fae6a319881a631dc727b6 + level.gameEvent(GameEvent.BLOCK_CHANGE, blockPos, GameEvent.Context.of(player, state)); + // Purpur end if (player != null) { - itemStack.hurtAndBreak(1, player, (p) -> { - p.broadcastBreakEvent(context.getHand()); - }); + itemStack.hurtAndBreak(1, player, p -> p.broadcastBreakEvent(context.getHand())); } - return InteractionResult.sidedSuccess(level.isClientSide); @@ -14035,10 +13923,12 @@ index 2e75fd06e9e379eb95ebfe55086ffc327706ab2f..2918b1aca8fae6a319881a631dc727b6 world.levelEvent(player, 3005, pos, 0); return optional2; } else { -- Optional optional3 = Optional.ofNullable(HoneycombItem.WAX_OFF_BY_BLOCK.get().get(state.getBlock())).map((block) -> { -- return block.withPropertiesOf(state); -- }); -+ Optional optional3 = Optional.ofNullable(world.purpurConfig.axeWaxables.get(state.getBlock())); // Purpur +- Optional optional3 = Optional.ofNullable(HoneycombItem.WAX_OFF_BY_BLOCK.get().get(state.getBlock())) +- .map(block -> block.withPropertiesOf(state)); ++ // Purpur start ++ Optional optional3 = Optional.ofNullable(world.purpurConfig.axeWaxables.get(state.getBlock())); ++ // .map(block -> block.withPropertiesOf(state)); ++ // Purpur end if (optional3.isPresent()) { - world.playSound(player, pos, SoundEvents.AXE_WAX_OFF, SoundSource.BLOCKS, 1.0F, 1.0F); + world.playSound(HoneycombItem.WAX_OFF_BY_BLOCK.get().containsKey(state.getBlock()) ? player : null, pos, SoundEvents.AXE_WAX_OFF, SoundSource.BLOCKS, 1.0F, 1.0F); // Purpur - force sound @@ -14212,10 +14102,10 @@ index f3a428f80c265639250114498b10067b4bf1ada1..211d8e59a9b3460b346e5f8cf581df70 if (!itemstack1.isEmpty()) { if (i == 0) { diff --git a/src/main/java/net/minecraft/world/item/DyeColor.java b/src/main/java/net/minecraft/world/item/DyeColor.java -index 88e1c2431d51d8cdc3d555b711e506648225d289..ac8735cc9d127fc1f867b40d4000c033ef73bb83 100644 +index 52ff8331f2859ee4bf39bf2fa6631bed7eed2f18..848a36a740576a0dd9e4ad50d1dd3ff07bd1d537 100644 --- a/src/main/java/net/minecraft/world/item/DyeColor.java +++ b/src/main/java/net/minecraft/world/item/DyeColor.java -@@ -103,4 +103,10 @@ public enum DyeColor implements StringRepresentable { +@@ -101,4 +101,10 @@ public enum DyeColor implements StringRepresentable { public String getSerializedName() { return this.name; } @@ -14275,7 +14165,7 @@ index 8c8cf8705107c95d9a4eab28b5845ae13c4ffb3c..8031e38c66468676b3b4a7443d6678ee // 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 0821c06a4c66edc8fcee09fc192335a588d2944b..56d7c05c93bc074f6caba51b1741f25d6f0861cd 100644 +index e1c8b24a92ea63a645406522a3c2fb5efd87f01a..0f6c1716103514dedf46e7068fd79e8b9b94e15d 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; @@ -14286,8 +14176,8 @@ index 0821c06a4c66edc8fcee09fc192335a588d2944b..56d7c05c93bc074f6caba51b1741f25d import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.projectile.FireworkRocketEntity; import net.minecraft.world.item.context.UseOnContext; -@@ -69,6 +70,14 @@ public class FireworkRocketItem extends Item { - com.destroystokyo.paper.event.player.PlayerElytraBoostEvent event = new com.destroystokyo.paper.event.player.PlayerElytraBoostEvent((org.bukkit.entity.Player) user.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemStack), (org.bukkit.entity.Firework) fireworkRocketEntity.getBukkitEntity()); +@@ -76,6 +77,14 @@ public class FireworkRocketItem extends Item { + com.destroystokyo.paper.event.player.PlayerElytraBoostEvent event = new com.destroystokyo.paper.event.player.PlayerElytraBoostEvent((org.bukkit.entity.Player) user.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemStack), (org.bukkit.entity.Firework) fireworkRocketEntity.getBukkitEntity(), org.bukkit.craftbukkit.CraftEquipmentSlot.getHand(hand)); if (event.callEvent() && world.addFreshEntity(fireworkRocketEntity)) { user.awardStat(Stats.ITEM_USED.get(this)); + // Purpur start @@ -14327,10 +14217,10 @@ index b2ad6d230de2c29f371178bccde1111c7532ee70..6667926519a0f1c151e53f59cce36e74 if (((HangingEntity) object).survives()) { diff --git a/src/main/java/net/minecraft/world/item/HoeItem.java b/src/main/java/net/minecraft/world/item/HoeItem.java -index 180aec596110309aade13d2080f8824d152b07cb..552c31c0f3746dd35388395036e70a925bf00bd4 100644 +index 9e5695eabd4c3ea165121b22fff93f09b170bc6b..18cbcfcd331f7b7a112383311e3e2b9984857028 100644 --- a/src/main/java/net/minecraft/world/item/HoeItem.java +++ b/src/main/java/net/minecraft/world/item/HoeItem.java -@@ -34,15 +34,23 @@ public class HoeItem extends DiggerItem { +@@ -45,15 +45,23 @@ public class HoeItem extends DiggerItem { public InteractionResult useOn(UseOnContext context) { Level level = context.getLevel(); BlockPos blockPos = context.getClickedPos(); @@ -14361,7 +14251,7 @@ index 180aec596110309aade13d2080f8824d152b07cb..552c31c0f3746dd35388395036e70a92 if (!level.isClientSide) { consumer.accept(context); if (player != null) { -@@ -52,7 +60,7 @@ public class HoeItem extends DiggerItem { +@@ -61,7 +69,7 @@ public class HoeItem extends DiggerItem { } } @@ -14452,7 +14342,7 @@ index a39201ea35edb1be068ff7269dcee614d0477050..d997e54428902fda805c3a79d8b112c7 this.getOrCreateTag().put(key, element); } diff --git a/src/main/java/net/minecraft/world/item/Items.java b/src/main/java/net/minecraft/world/item/Items.java -index f692149d91b525bda6dc79d489d7496ea24037e8..cf68dca4096556b0c2594c76fcf113419e56dae0 100644 +index b43598ee4035d9c53a40629dd4021b58c04132c8..c2c58a0788bfda5c1775194cbb9ddb406b882292 100644 --- a/src/main/java/net/minecraft/world/item/Items.java +++ b/src/main/java/net/minecraft/world/item/Items.java @@ -316,7 +316,7 @@ public class Items { @@ -14464,16 +14354,16 @@ index f692149d91b525bda6dc79d489d7496ea24037e8..cf68dca4096556b0c2594c76fcf11341 public static final Item CHEST = registerBlock(Blocks.CHEST); public static final Item CRAFTING_TABLE = registerBlock(Blocks.CRAFTING_TABLE); public static final Item FARMLAND = registerBlock(Blocks.FARMLAND); -@@ -1224,7 +1224,7 @@ public class Items { - public static final Item LANTERN = registerBlock(Blocks.LANTERN); - public static final Item SOUL_LANTERN = registerBlock(Blocks.SOUL_LANTERN); - public static final Item SWEET_BERRIES = registerItem("sweet_berries", new ItemNameBlockItem(Blocks.SWEET_BERRY_BUSH, (new Item.Properties()).food(Foods.SWEET_BERRIES))); -- public static final Item GLOW_BERRIES = registerItem("glow_berries", new ItemNameBlockItem(Blocks.CAVE_VINES, (new Item.Properties()).food(Foods.GLOW_BERRIES))); -+ public static final Item GLOW_BERRIES = registerItem("glow_berries", new org.purpurmc.purpur.item.GlowBerryItem(Blocks.CAVE_VINES, (new Item.Properties()).food(Foods.GLOW_BERRIES))); // Purpur +@@ -1535,7 +1535,7 @@ public class Items { + "sweet_berries", new ItemNameBlockItem(Blocks.SWEET_BERRY_BUSH, new Item.Properties().food(Foods.SWEET_BERRIES)) + ); + public static final Item GLOW_BERRIES = registerItem( +- "glow_berries", new ItemNameBlockItem(Blocks.CAVE_VINES, new Item.Properties().food(Foods.GLOW_BERRIES)) ++ "glow_berries", new org.purpurmc.purpur.item.GlowBerryItem(Blocks.CAVE_VINES, new Item.Properties().food(Foods.GLOW_BERRIES)) // Purpur + ); public static final Item CAMPFIRE = registerBlock(Blocks.CAMPFIRE); public static final Item SOUL_CAMPFIRE = registerBlock(Blocks.SOUL_CAMPFIRE); - public static final Item SHROOMLIGHT = registerBlock(Blocks.SHROOMLIGHT); -@@ -1367,6 +1367,13 @@ public class Items { +@@ -1715,6 +1715,13 @@ public class Items { ((BlockItem)item).registerBlocks(Item.BY_BLOCK, item); } @@ -14559,10 +14449,10 @@ index a0b3c2d3b3f86ecd6cb80ff767839d29ca4f4f68..61b4430d6dd73b5406c4879e41ff80a1 ((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 +index 9aba0211f37501bbd19b583d22fa83eae32390d9..f44e28bf44b9d39267d21eaf6a025b5f28f3cd72 100644 --- a/src/main/java/net/minecraft/world/item/ShovelItem.java +++ b/src/main/java/net/minecraft/world/item/ShovelItem.java -@@ -37,9 +37,12 @@ public class ShovelItem extends DiggerItem { +@@ -46,9 +46,12 @@ public class ShovelItem extends DiggerItem { BlockState blockState2 = FLATTENABLES.get(blockState.getBlock()); BlockState blockState3 = null; Runnable afterAction = null; // Paper @@ -14578,7 +14468,7 @@ index 21212462e6b415e96536a27b2c009d1562f18946..193bcb12152347f5f02ce18b01ba918e } else if (blockState.getBlock() instanceof CampfireBlock && blockState.getValue(CampfireBlock.LIT)) { afterAction = () -> { // Paper if (!level.isClientSide()) { -@@ -68,7 +71,7 @@ public class ShovelItem extends DiggerItem { +@@ -75,7 +78,7 @@ public class ShovelItem extends DiggerItem { } } @@ -14635,7 +14525,7 @@ index f47f793c62a919fb65c081ddb82d597a978d3b20..3bbb44ae3da68afbd6012df68dee277a 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 fa876ddf54780728e7f3ecfe02aa8a16b8ef6f8d..dcd6f241271beecf9601e34547225d7921958c20 100644 +index a792c7b7a6179aa88fc473b27ef0ca13bd91a395..95f9dd3f8fbf593fd6898335454951868c867a06 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 { @@ -14659,10 +14549,10 @@ index fa876ddf54780728e7f3ecfe02aa8a16b8ef6f8d..dcd6f241271beecf9601e34547225d79 // CraftBukkit 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; +@@ -128,6 +136,14 @@ public class TridentItem extends Item implements Vanishable { f3 *= f6 / f5; f4 *= f6 / f5; + org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerRiptideEvent(entityhuman, stack, f2, f3, f4); // CraftBukkit + + // Purpur start + ItemStack chestItem = entityhuman.getItemBySlot(EquipmentSlot.CHEST); @@ -14700,7 +14590,7 @@ index 7c29750e534eae4266bf7a63c50e3827401d6569..e8e9a3370ba07dc0ca47c8352f6f04a4 int i = aitemstack.length; diff --git a/src/main/java/net/minecraft/world/item/enchantment/ArrowInfiniteEnchantment.java b/src/main/java/net/minecraft/world/item/enchantment/ArrowInfiniteEnchantment.java -index 518d85a13c37a2f7d32ca0718323181048559986..27512787b37381a5236b1b473e9ce3f06df8e2d0 100644 +index 04c39359585d909dedbdfd78f6cbdc06b926607a..127950c54ae057b3d0eb62e8f81d5eef6f11a36c 100644 --- a/src/main/java/net/minecraft/world/item/enchantment/ArrowInfiniteEnchantment.java +++ b/src/main/java/net/minecraft/world/item/enchantment/ArrowInfiniteEnchantment.java @@ -7,6 +7,14 @@ public class ArrowInfiniteEnchantment extends Enchantment { @@ -14722,15 +14612,15 @@ index 518d85a13c37a2f7d32ca0718323181048559986..27512787b37381a5236b1b473e9ce3f0 @Override public boolean checkCompatibility(Enchantment other) { -- return other instanceof MendingEnchantment ? false : super.checkCompatibility(other); -+ return other instanceof MendingEnchantment ? org.purpurmc.purpur.PurpurConfig.allowInfinityMending : super.checkCompatibility(other); +- return !(other instanceof MendingEnchantment) && super.checkCompatibility(other); ++ return !(other instanceof MendingEnchantment) && super.checkCompatibility(other) || other instanceof MendingEnchantment && org.purpurmc.purpur.PurpurConfig.allowInfinityMending; // Purpur } } diff --git a/src/main/java/net/minecraft/world/item/enchantment/EnchantmentCategory.java b/src/main/java/net/minecraft/world/item/enchantment/EnchantmentCategory.java -index 246516e67db0b8b197b287c067d5a0163d8bde22..fc2c35f57436371cb0111aedfd289ac95d506d07 100644 +index afd74b274aa46b1e2187935ebeb2a8824a133867..4f8d8665cb90b746dc59913ec270839c4e5dba91 100644 --- a/src/main/java/net/minecraft/world/item/enchantment/EnchantmentCategory.java +++ b/src/main/java/net/minecraft/world/item/enchantment/EnchantmentCategory.java -@@ -121,6 +121,20 @@ public enum EnchantmentCategory { +@@ -113,6 +113,20 @@ public enum EnchantmentCategory { public boolean canEnchant(Item item) { return item instanceof Vanishable || Block.byItem(item) instanceof Vanishable || BREAKABLE.canEnchant(item); } @@ -14752,10 +14642,10 @@ index 246516e67db0b8b197b287c067d5a0163d8bde22..fc2c35f57436371cb0111aedfd289ac9 public abstract boolean canEnchant(Item item); diff --git a/src/main/java/net/minecraft/world/item/enchantment/EnchantmentHelper.java b/src/main/java/net/minecraft/world/item/enchantment/EnchantmentHelper.java -index ecf640b00007a386290f8dfe9935a8aa610079fd..1eec84e217f6dc929091fa7451cd235ef3623822 100644 +index 496a9b9b095bd322fba8229a5d47e2a0107aeb96..8ffa04b583da86a9aa6cabe7d978373825b82b32 100644 --- a/src/main/java/net/minecraft/world/item/enchantment/EnchantmentHelper.java +++ b/src/main/java/net/minecraft/world/item/enchantment/EnchantmentHelper.java -@@ -46,7 +46,7 @@ public class EnchantmentHelper { +@@ -47,7 +47,7 @@ public class EnchantmentHelper { } public static int getEnchantmentLevel(CompoundTag nbt) { @@ -14764,7 +14654,7 @@ index ecf640b00007a386290f8dfe9935a8aa610079fd..1eec84e217f6dc929091fa7451cd235e } @Nullable -@@ -278,6 +278,29 @@ public class EnchantmentHelper { +@@ -266,6 +266,29 @@ public class EnchantmentHelper { return getItemEnchantmentLevel(Enchantments.CHANNELING, stack) > 0; } @@ -14792,8 +14682,8 @@ index ecf640b00007a386290f8dfe9935a8aa610079fd..1eec84e217f6dc929091fa7451cd235e + // Purpur end + @Nullable - public static Map.Entry getRandomItemWith(Enchantment enchantment, LivingEntity entity) { - return getRandomItemWith(enchantment, entity, (stack) -> { + public static Entry getRandomItemWith(Enchantment enchantment, LivingEntity entity) { + return getRandomItemWith(enchantment, entity, stack -> true); diff --git a/src/main/java/net/minecraft/world/item/enchantment/LootBonusEnchantment.java b/src/main/java/net/minecraft/world/item/enchantment/LootBonusEnchantment.java index 7f1ffc0ac402fcf0ec086986e959ecc9f78dde03..1351d52374d1c2367932e5ecd5f4637955fb14c9 100644 --- a/src/main/java/net/minecraft/world/item/enchantment/LootBonusEnchantment.java @@ -14844,17 +14734,17 @@ index 65c3e91ac4541c0150057dc9f012eb1ee566516e..40c199812ecf7b16fe5a17c18cb0d6d3 } diff --git a/src/main/java/net/minecraft/world/level/EntityGetter.java b/src/main/java/net/minecraft/world/level/EntityGetter.java -index ed84c87a3f76bc0254c1abb189e6b8b808823465..5bc68b1ef33f297e9a4b1bdd7d69f86a46ad6fbd 100644 +index ea0aee88c7d901034427db201c1b2430f8a1d522..1f28bfb435c1e4d97da713f96c452abab3fda91a 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 { +@@ -192,7 +192,7 @@ public interface EntityGetter { default boolean hasNearbyAlivePlayer(double x, double y, double z, double range) { - for(Player player : this.players()) { + for (Player player : this.players()) { - if (EntitySelector.NO_SPECTATORS.test(player) && EntitySelector.LIVING_ENTITY_STILL_ALIVE.test(player)) { -+ if (EntitySelector.NO_SPECTATORS.test(player) && EntitySelector.LIVING_ENTITY_STILL_ALIVE.test(player) && EntitySelector.notAfk.test(player)) { ++ if (EntitySelector.NO_SPECTATORS.test(player) && EntitySelector.LIVING_ENTITY_STILL_ALIVE.test(player) && EntitySelector.notAfk.test(player)) { // Purpur double d = player.distanceToSqr(x, y, z); - if (range < 0.0D || d < range * range) { + if (range < 0.0 || 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 e2cb206841b346ace1f392d63790fcec03d57076..392b48f4cb7645282bd5eb1fceb947179325289b 100644 @@ -14899,7 +14789,7 @@ index e2cb206841b346ace1f392d63790fcec03d57076..392b48f4cb7645282bd5eb1fceb94717 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 33cbba9f92cfbb6508dd8e2c5e35c63a49cdd85c..7583ce583b06306930cbae49b0386a6630bb916f 100644 +index f239b14fd9c884dc7905a9e0456c2198bf1205e6..52fcce3b1c01c221becadc39334dc3b1de12e688 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java @@ -175,6 +175,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { @@ -14998,7 +14888,7 @@ index ffa5f8be4aefb451352e1c6db84f36adca3a044d..88b13e6eeec956c10b486e4811b1e0da if (entityhuman != null) { double d2 = entityhuman.distanceToSqr(d0, (double) i, d1); diff --git a/src/main/java/net/minecraft/world/level/block/AnvilBlock.java b/src/main/java/net/minecraft/world/level/block/AnvilBlock.java -index 9fca247f51e8b4d445f61ab5c16faf3928626deb..583bb1282fedcab75dbe4359a9f53b76a538d903 100644 +index 18d2ff1baa2db0b97f2565eac006fbc4e81022fa..58d29c89e8e54fac143982c40c9aecc855b6cfd5 100644 --- a/src/main/java/net/minecraft/world/level/block/AnvilBlock.java +++ b/src/main/java/net/minecraft/world/level/block/AnvilBlock.java @@ -62,6 +62,54 @@ public class AnvilBlock extends FallingBlock { @@ -15057,7 +14947,7 @@ index 9fca247f51e8b4d445f61ab5c16faf3928626deb..583bb1282fedcab75dbe4359a9f53b76 return InteractionResult.SUCCESS; } else { diff --git a/src/main/java/net/minecraft/world/level/block/AzaleaBlock.java b/src/main/java/net/minecraft/world/level/block/AzaleaBlock.java -index 3ecc92439fc85d224ff52f41c5e34079e042a5e6..2336fea8c65d64a77a1afa4b8b976fb0d7da00eb 100644 +index 85484d061090d989de8246df81f8e9e5f8906072..472e5d52e948d172b678b0f8e60b442b4d65bb5b 100644 --- a/src/main/java/net/minecraft/world/level/block/AzaleaBlock.java +++ b/src/main/java/net/minecraft/world/level/block/AzaleaBlock.java @@ -49,6 +49,20 @@ public class AzaleaBlock extends BushBlock implements BonemealableBlock { @@ -15082,10 +14972,10 @@ index 3ecc92439fc85d224ff52f41c5e34079e042a5e6..2336fea8c65d64a77a1afa4b8b976fb0 } diff --git a/src/main/java/net/minecraft/world/level/block/BaseCoralPlantTypeBlock.java b/src/main/java/net/minecraft/world/level/block/BaseCoralPlantTypeBlock.java -index 2a65c7b859b1126dbac9819a01ca2652e20498a9..3192edee23b899107b17e354ddfb3159ac2ef429 100644 +index ffcb4849d83e0f02adbb106f4543bb4898678267..700108e84cf3836a0542c5e04856a9fe254794e9 100644 --- a/src/main/java/net/minecraft/world/level/block/BaseCoralPlantTypeBlock.java +++ b/src/main/java/net/minecraft/world/level/block/BaseCoralPlantTypeBlock.java -@@ -39,6 +39,7 @@ public abstract class BaseCoralPlantTypeBlock extends Block implements SimpleWat +@@ -38,6 +38,7 @@ public abstract class BaseCoralPlantTypeBlock extends Block implements SimpleWat } protected static boolean scanForWater(BlockState state, BlockGetter world, BlockPos pos) { @@ -15268,29 +15158,25 @@ index 154b5a8520b13928686c6eb0e2481c3dd1d1de28..8c242b67f162a40311d7d987fd76771c public void updateEntityAfterFallOn(BlockGetter world, Entity entity) { diff --git a/src/main/java/net/minecraft/world/level/block/Blocks.java b/src/main/java/net/minecraft/world/level/block/Blocks.java -index 9a2de546dc2af2ad4bf5d32ca6583f0e1f3f70d8..3d48293c34fa37ba5091c6058dadb32a8f74a009 100644 +index e7c8313cafc25858ac002e3c45e63db9e8cefee9..04eace0873f1133ccca9696282948dc7ebc6f398 100644 --- a/src/main/java/net/minecraft/world/level/block/Blocks.java +++ b/src/main/java/net/minecraft/world/level/block/Blocks.java -@@ -1145,8 +1145,8 @@ public class Blocks { - public static final Block CAVE_VINES = register("cave_vines", new CaveVinesBlock(BlockBehaviour.Properties.of().mapColor(MapColor.PLANT).randomTicks().noCollission().lightLevel(CaveVines.emission(14)).instabreak().sound(SoundType.CAVE_VINES).pushReaction(PushReaction.DESTROY))); - public static final Block CAVE_VINES_PLANT = register("cave_vines_plant", new CaveVinesPlantBlock(BlockBehaviour.Properties.of().mapColor(MapColor.PLANT).noCollission().lightLevel(CaveVines.emission(14)).instabreak().sound(SoundType.CAVE_VINES).pushReaction(PushReaction.DESTROY))); - public static final Block SPORE_BLOSSOM = register("spore_blossom", new SporeBlossomBlock(BlockBehaviour.Properties.of().mapColor(MapColor.PLANT).instabreak().noCollission().sound(SoundType.SPORE_BLOSSOM).pushReaction(PushReaction.DESTROY))); -- public static final Block AZALEA = register("azalea", new AzaleaBlock(BlockBehaviour.Properties.of().mapColor(MapColor.PLANT).forceSolidOff().instabreak().sound(SoundType.AZALEA).noOcclusion().pushReaction(PushReaction.DESTROY))); -- public static final Block FLOWERING_AZALEA = register("flowering_azalea", new AzaleaBlock(BlockBehaviour.Properties.of().mapColor(MapColor.PLANT).forceSolidOff().instabreak().sound(SoundType.FLOWERING_AZALEA).noOcclusion().pushReaction(PushReaction.DESTROY))); -+ public static final Block AZALEA = register("azalea", new AzaleaBlock(BlockBehaviour.Properties.of().mapColor(MapColor.PLANT).forceSolidOff().randomTicks().instabreak().sound(SoundType.AZALEA).noOcclusion().pushReaction(PushReaction.DESTROY))); // Purpur -+ public static final Block FLOWERING_AZALEA = register("flowering_azalea", new AzaleaBlock(BlockBehaviour.Properties.of().mapColor(MapColor.PLANT).forceSolidOff().randomTicks().instabreak().sound(SoundType.FLOWERING_AZALEA).noOcclusion().pushReaction(PushReaction.DESTROY))); // Purpur - public static final Block MOSS_CARPET = register("moss_carpet", new CarpetBlock(BlockBehaviour.Properties.of().mapColor(MapColor.COLOR_GREEN).strength(0.1F).sound(SoundType.MOSS_CARPET).pushReaction(PushReaction.DESTROY))); - public static final Block PINK_PETALS = register("pink_petals", new PinkPetalsBlock(BlockBehaviour.Properties.of().mapColor(MapColor.PLANT).noCollission().sound(SoundType.PINK_PETALS).pushReaction(PushReaction.DESTROY))); - public static final Block MOSS_BLOCK = register("moss_block", new MossBlock(BlockBehaviour.Properties.of().mapColor(MapColor.COLOR_GREEN).strength(0.1F).sound(SoundType.MOSS).pushReaction(PushReaction.DESTROY))); -@@ -1215,7 +1215,7 @@ public class Blocks { - } - - private static Boolean ocelotOrParrot(BlockState state, BlockGetter world, BlockPos pos, EntityType type) { -- return (boolean)type == EntityType.OCELOT || type == EntityType.PARROT; -+ return type == EntityType.OCELOT || type == EntityType.PARROT; // Purpur - decompile error - } - - private static Block bed(DyeColor color) { +@@ -7380,6 +7380,7 @@ public class Blocks { + BlockBehaviour.Properties.of() + .mapColor(MapColor.PLANT) + .forceSolidOff() ++ .randomTicks() // Purpur + .instabreak() + .sound(SoundType.AZALEA) + .noOcclusion() +@@ -7392,6 +7393,7 @@ public class Blocks { + BlockBehaviour.Properties.of() + .mapColor(MapColor.PLANT) + .forceSolidOff() ++ .randomTicks() // Purpur + .instabreak() + .sound(SoundType.FLOWERING_AZALEA) + .noOcclusion() diff --git a/src/main/java/net/minecraft/world/level/block/BushBlock.java b/src/main/java/net/minecraft/world/level/block/BushBlock.java index bed3d9c781c7d3ca260027b4737970889a54689c..db1941ed32d141327a8b11e54b3ff9900072ad36 100644 --- a/src/main/java/net/minecraft/world/level/block/BushBlock.java @@ -15443,7 +15329,7 @@ index 47b6b83842201620bd6620f5acf11bb14334e35d..b4d2499ae39fd3f14b2600a9663ea8a8 @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 1ec8c2d24ec8468d20f322d67143b9454ff266eb..558f243ee0923af9a8cb9e1bb6f4a0e5c8341fe4 100644 +index bdd9f38dcb16b74c5916b75713dbe5082b32497d..65bae6630a11aa1d8d1b08d1f8e2519545ad850c 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 @@ -15642,7 +15528,7 @@ index 7f365143ce5c62e734eceb855ba0a02ab3a99b27..bbb266cbe23da2573d3dfb3a6edd5746 BlockPos blockposition1 = pos.offset(world.random.nextInt(16) - world.random.nextInt(16), world.random.nextInt(8) - world.random.nextInt(8), world.random.nextInt(16) - world.random.nextInt(16)); diff --git a/src/main/java/net/minecraft/world/level/block/EnchantmentTableBlock.java b/src/main/java/net/minecraft/world/level/block/EnchantmentTableBlock.java -index 790cf30c2bfd4e2530ff563dfcf05e25554248b3..ba69e9b37ce9f2d8b439d471e6de770da38d6971 100644 +index f2157de3b52095657401a780a467da1f816eff98..b19461aafdb281a4eb6db6701fe7f97572ca321c 100644 --- a/src/main/java/net/minecraft/world/level/block/EnchantmentTableBlock.java +++ b/src/main/java/net/minecraft/world/level/block/EnchantmentTableBlock.java @@ -30,6 +30,8 @@ import net.minecraft.world.level.pathfinder.PathComputationType; @@ -15654,7 +15540,7 @@ index 790cf30c2bfd4e2530ff563dfcf05e25554248b3..ba69e9b37ce9f2d8b439d471e6de770d public class EnchantmentTableBlock extends BaseEntityBlock { public static final MapCodec CODEC = simpleCodec(EnchantmentTableBlock::new); -@@ -128,4 +130,18 @@ public class EnchantmentTableBlock extends BaseEntityBlock { +@@ -137,4 +139,18 @@ public class EnchantmentTableBlock extends BaseEntityBlock { public boolean isPathfindable(BlockState state, BlockGetter world, BlockPos pos, PathComputationType type) { return false; } @@ -15693,44 +15579,54 @@ index 4ba24bced9a2de4616a0418857d3738e0e322ea0..6660bea735dda46ab9493601f1f53b8e ServerLevel worldserver = ((ServerLevel) world).getServer().getLevel(resourcekey); diff --git a/src/main/java/net/minecraft/world/level/block/EnderChestBlock.java b/src/main/java/net/minecraft/world/level/block/EnderChestBlock.java -index ddca14f1224327a738415fb8b37398d8df0aa9c8..fe3236295790b9e250486835176cae810160c33a 100644 +index 280041cc5f2a630571d9f4c8610c46e175ccf0c1..33511748479d233be0033616715661634f1275e1 100644 --- a/src/main/java/net/minecraft/world/level/block/EnderChestBlock.java +++ b/src/main/java/net/minecraft/world/level/block/EnderChestBlock.java -@@ -92,6 +92,34 @@ public class EnderChestBlock extends AbstractChestBlock i +@@ -92,7 +92,7 @@ public class EnderChestBlock extends AbstractChestBlock i EnderChestBlockEntity enderChestBlockEntity = (EnderChestBlockEntity)blockEntity; playerEnderChestContainer.setActiveChest(enderChestBlockEntity); - player.openMenu(new SimpleMenuProvider((syncId, inventory, playerx) -> { -+ // Purpur start -+ if (org.purpurmc.purpur.PurpurConfig.enderChestSixRows) { -+ if (org.purpurmc.purpur.PurpurConfig.enderChestPermissionRows) { -+ org.bukkit.craftbukkit.entity.CraftHumanEntity bukkitPlayer = player.getBukkitEntity(); -+ if (bukkitPlayer.hasPermission("purpur.enderchest.rows.six")) { -+ player.sixRowEnderchestSlotCount = 54; -+ return ChestMenu.sixRows(syncId, inventory, playerEnderChestContainer); -+ } else if (bukkitPlayer.hasPermission("purpur.enderchest.rows.five")) { -+ player.sixRowEnderchestSlotCount = 45; -+ return ChestMenu.fiveRows(syncId, inventory, playerEnderChestContainer); -+ } else if (bukkitPlayer.hasPermission("purpur.enderchest.rows.four")) { -+ player.sixRowEnderchestSlotCount = 36; -+ return ChestMenu.fourRows(syncId, inventory, playerEnderChestContainer); -+ } else if (bukkitPlayer.hasPermission("purpur.enderchest.rows.three")) { -+ player.sixRowEnderchestSlotCount = 27; -+ return ChestMenu.threeRows(syncId, inventory, playerEnderChestContainer); -+ } else if (bukkitPlayer.hasPermission("purpur.enderchest.rows.two")) { -+ player.sixRowEnderchestSlotCount = 18; -+ return ChestMenu.twoRows(syncId, inventory, playerEnderChestContainer); -+ } else if (bukkitPlayer.hasPermission("purpur.enderchest.rows.one")) { -+ player.sixRowEnderchestSlotCount = 9; -+ return ChestMenu.oneRow(syncId, inventory, playerEnderChestContainer); -+ } -+ } -+ player.sixRowEnderchestSlotCount = -1; -+ return ChestMenu.sixRows(syncId, inventory, playerEnderChestContainer); -+ } -+ // Purpur end - return ChestMenu.threeRows(syncId, inventory, playerEnderChestContainer); - }, CONTAINER_TITLE)); + player.openMenu( +- new SimpleMenuProvider((syncId, inventory, playerx) -> ChestMenu.threeRows(syncId, inventory, playerEnderChestContainer), CONTAINER_TITLE) ++ new SimpleMenuProvider((syncId, inventory, playerx) -> org.purpurmc.purpur.PurpurConfig.enderChestSixRows ? getEnderChestSixRows(syncId, inventory, player, playerEnderChestContainer) : ChestMenu.threeRows(syncId, inventory, playerEnderChestContainer), CONTAINER_TITLE) // Purpur + ); player.awardStat(Stats.OPEN_ENDERCHEST); + PiglinAi.angerNearbyPiglins(player, true); +@@ -103,6 +103,35 @@ public class EnderChestBlock extends AbstractChestBlock i + } + } + ++ // Purpur start ++ private ChestMenu getEnderChestSixRows(int syncId, net.minecraft.world.entity.player.Inventory inventory, Player player, PlayerEnderChestContainer playerEnderChestContainer) { ++ if (org.purpurmc.purpur.PurpurConfig.enderChestPermissionRows) { ++ org.bukkit.craftbukkit.entity.CraftHumanEntity bukkitPlayer = player.getBukkitEntity(); ++ if (bukkitPlayer.hasPermission("purpur.enderchest.rows.six")) { ++ player.sixRowEnderchestSlotCount = 54; ++ return ChestMenu.sixRows(syncId, inventory, playerEnderChestContainer); ++ } else if (bukkitPlayer.hasPermission("purpur.enderchest.rows.five")) { ++ player.sixRowEnderchestSlotCount = 45; ++ return ChestMenu.fiveRows(syncId, inventory, playerEnderChestContainer); ++ } else if (bukkitPlayer.hasPermission("purpur.enderchest.rows.four")) { ++ player.sixRowEnderchestSlotCount = 36; ++ return ChestMenu.fourRows(syncId, inventory, playerEnderChestContainer); ++ } else if (bukkitPlayer.hasPermission("purpur.enderchest.rows.three")) { ++ player.sixRowEnderchestSlotCount = 27; ++ return ChestMenu.threeRows(syncId, inventory, playerEnderChestContainer); ++ } else if (bukkitPlayer.hasPermission("purpur.enderchest.rows.two")) { ++ player.sixRowEnderchestSlotCount = 18; ++ return ChestMenu.twoRows(syncId, inventory, playerEnderChestContainer); ++ } else if (bukkitPlayer.hasPermission("purpur.enderchest.rows.one")) { ++ player.sixRowEnderchestSlotCount = 9; ++ return ChestMenu.oneRow(syncId, inventory, playerEnderChestContainer); ++ } ++ } ++ player.sixRowEnderchestSlotCount = -1; ++ return ChestMenu.sixRows(syncId, inventory, playerEnderChestContainer); ++ } ++ // Purpur end ++ + @Override + public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return new EnderChestBlockEntity(pos, state); 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 6e4c852c93f2418ea69e485ed3a10cbe3a6e3bd2..0c39126ce51439cce05747161aba43bce33a12d8 100644 --- a/src/main/java/net/minecraft/world/level/block/FarmBlock.java @@ -15876,7 +15772,7 @@ index 9c8c1df5187daefb1c8098b4d4a0976c71a7bbfd..cf4c1097d54c84b309ab02e9892d1b9e } else { world.setBlockAndUpdate(pos, IceBlock.meltsInto()); diff --git a/src/main/java/net/minecraft/world/level/block/KelpBlock.java b/src/main/java/net/minecraft/world/level/block/KelpBlock.java -index 4dbacee1930bc3955ce431e1d32353588b47afc9..a53c6ab63fd10ac94292836120152f54f23c1e13 100644 +index 1b83d44291029ce978187467832595b6dfd76dd5..69f2c6cae089aa7e1306c9dbe83d4ff582ec777c 100644 --- a/src/main/java/net/minecraft/world/level/block/KelpBlock.java +++ b/src/main/java/net/minecraft/world/level/block/KelpBlock.java @@ -72,4 +72,11 @@ public class KelpBlock extends GrowingPlantHeadBlock implements LiquidBlockConta @@ -16116,7 +16012,7 @@ index 09c61eb5ba129e9630a756b452ef6aa61745c533..837c8399b2f490d98ca556e66018bfd4 @Override diff --git a/src/main/java/net/minecraft/world/level/block/SlabBlock.java b/src/main/java/net/minecraft/world/level/block/SlabBlock.java -index adc7eba4bb5e8f7c507a16cdbd7497338a7658cf..512c528e0f2f3aa0da0253698a0189415329265a 100644 +index 481611d1759c161925524a8756060fb2cc0c0bf4..04852b896fc57028a970cce04d15c304749b592d 100644 --- a/src/main/java/net/minecraft/world/level/block/SlabBlock.java +++ b/src/main/java/net/minecraft/world/level/block/SlabBlock.java @@ -138,4 +138,25 @@ public class SlabBlock extends Block implements SimpleWaterloggedBlock { @@ -16269,7 +16165,7 @@ index 8f3cca228f8ec1ea9379fa43af4baa7b18012dd2..7e87b4299979c9e46abb582da7a8e54a if (!iblockdata.is(Blocks.KELP) && !iblockdata.is(Blocks.KELP_PLANT) && !iblockdata.is(Blocks.SEAGRASS) && !iblockdata.is(Blocks.TALL_SEAGRASS)) { return false; diff --git a/src/main/java/net/minecraft/world/level/block/StonecutterBlock.java b/src/main/java/net/minecraft/world/level/block/StonecutterBlock.java -index 77ae7b8ab24935d046cce1f8f7f476310876f9df..579abfbe791052507b15c14d8c81e39b2fdd6520 100644 +index 7c41b940dd915a27856f6fa6f9e536e296deeb53..51ba321172acc9908aac456f8209dd6af6987aa8 100644 --- a/src/main/java/net/minecraft/world/level/block/StonecutterBlock.java +++ b/src/main/java/net/minecraft/world/level/block/StonecutterBlock.java @@ -99,4 +99,14 @@ public class StonecutterBlock extends Block { @@ -16382,7 +16278,7 @@ index b4646e26965e0f1f26c5019e7c6a13fdf22bdb47..9a76665c6369b4106d152370dc3d2f56 } } diff --git a/src/main/java/net/minecraft/world/level/block/TwistingVinesBlock.java b/src/main/java/net/minecraft/world/level/block/TwistingVinesBlock.java -index b4f75d034fbaea8ca68c1b5c5715773e0b8a9036..d05939c4b2ae42a09ee9e97431e83babfc8ed76c 100644 +index 6342bb11a162b9e6d9475c5989b1670d77e8f0fb..f8be92512446d3f0e5f0f21222bbefd04ab2838a 100644 --- a/src/main/java/net/minecraft/world/level/block/TwistingVinesBlock.java +++ b/src/main/java/net/minecraft/world/level/block/TwistingVinesBlock.java @@ -34,4 +34,11 @@ public class TwistingVinesBlock extends GrowingPlantHeadBlock { @@ -16398,7 +16294,7 @@ index b4f75d034fbaea8ca68c1b5c5715773e0b8a9036..d05939c4b2ae42a09ee9e97431e83bab + // Purpur end } diff --git a/src/main/java/net/minecraft/world/level/block/WeepingVinesBlock.java b/src/main/java/net/minecraft/world/level/block/WeepingVinesBlock.java -index 98e62d2cd3c106753c3be4a217e9107397d388ab..6a1fd51423c17cd1498cb313fa52314daaca0a29 100644 +index 3dec5a082606ee35a8c8d7f746480262d6a189c5..b2f6ccae9576c176263e51a232e17a08d54543b3 100644 --- a/src/main/java/net/minecraft/world/level/block/WeepingVinesBlock.java +++ b/src/main/java/net/minecraft/world/level/block/WeepingVinesBlock.java @@ -34,4 +34,11 @@ public class WeepingVinesBlock extends GrowingPlantHeadBlock { @@ -16831,7 +16727,7 @@ index 37e0b762b86e74f607a4541ecb7b24ad7a591d0e..7e3edd41f3a39ef14382e18b20af21e6 }); diff --git a/src/main/java/net/minecraft/world/level/block/entity/EnchantmentTableBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/EnchantmentTableBlockEntity.java -index 65e1381bb2d10bd212463feb602c60f8fdb9ade1..b7370e64fd0d50e8725d7d5afc30af2e8bc8455d 100644 +index 4d1a895f3749bdcb132de199e81a9d93330c0ee6..5978f6bee32d31db8dd6af5c22ff0282fd81416a 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/EnchantmentTableBlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/EnchantmentTableBlockEntity.java @@ -24,6 +24,7 @@ public class EnchantmentTableBlockEntity extends BlockEntity implements Nameable @@ -16847,17 +16743,17 @@ index 65e1381bb2d10bd212463feb602c60f8fdb9ade1..b7370e64fd0d50e8725d7d5afc30af2e nbt.putString("CustomName", Component.Serializer.toJson(this.name)); } + nbt.putInt("Purpur.Lapis", this.lapis); // Purpur - } -@@ -44,6 +46,7 @@ public class EnchantmentTableBlockEntity extends BlockEntity implements Nameable + @Override +@@ -43,6 +45,7 @@ public class EnchantmentTableBlockEntity extends BlockEntity implements Nameable if (nbt.contains("CustomName", 8)) { this.name = io.papermc.paper.util.MCUtil.getBaseComponentFromNbt("CustomName", nbt); // Paper - Catch ParseException } + this.lapis = nbt.getInt("Purpur.Lapis"); // Purpur - } + public static void bookAnimationTick(Level world, BlockPos pos, BlockState state, EnchantmentTableBlockEntity blockEntity) { @@ -117,4 +120,14 @@ public class EnchantmentTableBlockEntity extends BlockEntity implements Nameable public Component getCustomName() { return this.name; @@ -16960,10 +16856,10 @@ index 610f1d50b91ffe4b84026681cf65b237bb1d4931..5717b1c2fd5b16d439499296edd35d72 blockEntity.teleportCooldown = 100; diff --git a/src/main/java/net/minecraft/world/level/block/piston/PistonStructureResolver.java b/src/main/java/net/minecraft/world/level/block/piston/PistonStructureResolver.java -index 744d91546d1a810f60a43c15ed74b4158f341a4a..354538daefa603f6df5a139b6bff87dbb4cef178 100644 +index 205e223c356634bd6bc6bd58c6f0b7fda61a6f5f..bea05cb928d540a2f19b51bb7352d032b2dd69cd 100644 --- a/src/main/java/net/minecraft/world/level/block/piston/PistonStructureResolver.java +++ b/src/main/java/net/minecraft/world/level/block/piston/PistonStructureResolver.java -@@ -86,7 +86,7 @@ public class PistonStructureResolver { +@@ -81,7 +81,7 @@ public class PistonStructureResolver { return true; } else { int i = 1; @@ -16971,17 +16867,17 @@ index 744d91546d1a810f60a43c15ed74b4158f341a4a..354538daefa603f6df5a139b6bff87db + if (i + this.toPush.size() > this.level.purpurConfig.pistonBlockPushLimit) { // Purpur return false; } else { - while(isSticky(blockState)) { -@@ -98,7 +98,7 @@ public class PistonStructureResolver { + while (isSticky(blockState)) { +@@ -95,7 +95,7 @@ public class PistonStructureResolver { + break; } - ++i; -- if (i + this.toPush.size() > 12) { -+ if (i + this.toPush.size() > this.level.purpurConfig.pistonBlockPushLimit) { // Purpur +- if (++i + this.toPush.size() > 12) { ++ if (++i + this.toPush.size() > this.level.purpurConfig.pistonBlockPushLimit) { // Purpur return false; } } -@@ -142,7 +142,7 @@ public class PistonStructureResolver { +@@ -140,7 +140,7 @@ public class PistonStructureResolver { return true; } @@ -17013,10 +16909,10 @@ index 2892e586146cbc560f0bcf4b9af6d0575cb0a82e..d38d8fc7ef22fb68e867cc29dab1171c protected ResourceLocation drops; diff --git a/src/main/java/net/minecraft/world/level/chunk/storage/EntityStorage.java b/src/main/java/net/minecraft/world/level/chunk/storage/EntityStorage.java -index 23dc37ff1f92951817864963bf93220d5aae91bb..af563ffb67c43b50555951fe1b5e4320d429a7f1 100644 +index 995fbfa225efe40274c20608b9b30b8afa847698..c70f04cdee1e8ba6f8a15c9e38edbe0023b5ab96 100644 --- a/src/main/java/net/minecraft/world/level/chunk/storage/EntityStorage.java +++ b/src/main/java/net/minecraft/world/level/chunk/storage/EntityStorage.java -@@ -112,6 +112,7 @@ public class EntityStorage implements EntityPersistentStorage { +@@ -111,6 +111,7 @@ public class EntityStorage implements EntityPersistentStorage { ListTag listTag = new ListTag(); final java.util.Map, Integer> savedEntityCounts = new java.util.HashMap<>(); // Paper - Entity load/save limit per chunk entities.forEach((entity) -> { // diff here: use entities parameter @@ -17113,10 +17009,10 @@ index 3bb4a9a1a6249e8ba2de237f801210e7f4fd5825..2d492d849ff73a738dfbcb16507feb89 protected boolean canConvertToSource(Level world) { return world.getGameRules().getBoolean(GameRules.RULE_LAVA_SOURCE_CONVERSION); diff --git a/src/main/java/net/minecraft/world/level/material/WaterFluid.java b/src/main/java/net/minecraft/world/level/material/WaterFluid.java -index cde93efaecd42b9081405638af3ba91cb5e184c9..c664fd77dd865037293a3e86699fd1fa6b703882 100644 +index 109f71401c65f476ccf6813137386fc9fef10254..9dcdb2f4001115db0c26fdbf86531dbe6098485d 100644 --- a/src/main/java/net/minecraft/world/level/material/WaterFluid.java +++ b/src/main/java/net/minecraft/world/level/material/WaterFluid.java -@@ -64,6 +64,13 @@ public abstract class WaterFluid extends FlowingFluid { +@@ -80,6 +80,13 @@ public abstract class WaterFluid extends FlowingFluid { return world.getGameRules().getBoolean(GameRules.RULE_WATER_SOURCE_CONVERSION); } @@ -17131,19 +17027,19 @@ 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 70c7c735fdd0c1b66243915622e47eab8a57e7cc..996bd26e95e766ce4ca7e61d060881feb9dd4a89 100644 +index 1cd7f0f1c7d62552e6609997c83f3df8dae13316..a6f745d21d982dfcbfb458472a7b2a8867d13504 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 { - } - - if (blockPathTypes != BlockPathTypes.WALKABLE && (!this.isAmphibious() || blockPathTypes != BlockPathTypes.WATER)) { -- if ((node == null || node.costMalus < 0.0F) && maxYStep > 0 && (blockPathTypes != BlockPathTypes.FENCE || this.canWalkOverFences()) && blockPathTypes != BlockPathTypes.UNPASSABLE_RAIL && blockPathTypes != BlockPathTypes.TRAPDOOR && blockPathTypes != BlockPathTypes.POWDER_SNOW) { -+ if ((node == null || node.costMalus < 0.0F) && maxYStep > 0 && (blockPathTypes != BlockPathTypes.FENCE || this.canWalkOverFences()) && (this.mob.level().purpurConfig.mobsIgnoreRails || blockPathTypes != BlockPathTypes.UNPASSABLE_RAIL) && blockPathTypes != BlockPathTypes.TRAPDOOR && blockPathTypes != BlockPathTypes.POWDER_SNOW) { // Purpur +@@ -259,7 +259,7 @@ public class WalkNodeEvaluator extends NodeEvaluator { + if ((node == null || node.costMalus < 0.0F) + && maxYStep > 0 + && (blockPathTypes != BlockPathTypes.FENCE || this.canWalkOverFences()) +- && blockPathTypes != BlockPathTypes.UNPASSABLE_RAIL ++ && (this.mob.level().purpurConfig.mobsIgnoreRails || blockPathTypes != BlockPathTypes.UNPASSABLE_RAIL) // Purpur + && blockPathTypes != BlockPathTypes.TRAPDOOR + && blockPathTypes != BlockPathTypes.POWDER_SNOW) { node = this.findAcceptedNode(x, y + 1, z, maxYStep - 1, prevFeetY, direction, nodeType); - if (node != null && (node.type == BlockPathTypes.OPEN || node.type == BlockPathTypes.WALKABLE) && this.mob.getBbWidth() < 1.0F) { - double g = (double)(x - direction.getStepX()) + 0.5D; -@@ -471,7 +471,7 @@ public class WalkNodeEvaluator extends NodeEvaluator { +@@ -475,7 +475,7 @@ public class WalkNodeEvaluator extends NodeEvaluator { return BlockPathTypes.BLOCKED; } else { // Paper end - Do not load chunks during pathfinding @@ -17152,15 +17048,15 @@ index 70c7c735fdd0c1b66243915622e47eab8a57e7cc..996bd26e95e766ce4ca7e61d060881fe return BlockPathTypes.DANGER_OTHER; } -@@ -504,7 +504,7 @@ public class WalkNodeEvaluator extends NodeEvaluator { - } else if (!blockState.is(BlockTags.TRAPDOORS) && !blockState.is(Blocks.LILY_PAD) && !blockState.is(Blocks.BIG_DRIPLEAF)) { - if (blockState.is(Blocks.POWDER_SNOW)) { - return BlockPathTypes.POWDER_SNOW; -- } else if (!blockState.is(Blocks.CACTUS) && !blockState.is(Blocks.SWEET_BERRY_BUSH)) { -+ } else if (!blockState.is(Blocks.CACTUS) && !blockState.is(Blocks.SWEET_BERRY_BUSH) && !blockState.is(Blocks.STONECUTTER)) { // Purpur - if (blockState.is(Blocks.HONEY_BLOCK)) { - return BlockPathTypes.STICKY_HONEY; - } else if (blockState.is(Blocks.COCOA)) { +@@ -509,7 +509,7 @@ public class WalkNodeEvaluator extends NodeEvaluator { + return BlockPathTypes.TRAPDOOR; + } else if (blockState.is(Blocks.POWDER_SNOW)) { + return BlockPathTypes.POWDER_SNOW; +- } else if (blockState.is(Blocks.CACTUS) || blockState.is(Blocks.SWEET_BERRY_BUSH)) { ++ } else if (blockState.is(Blocks.CACTUS) || blockState.is(Blocks.SWEET_BERRY_BUSH) || blockState.is(Blocks.STONECUTTER)) { // Purpur + return BlockPathTypes.DAMAGE_OTHER; + } else if (blockState.is(Blocks.HONEY_BLOCK)) { + return BlockPathTypes.STICKY_HONEY; 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 912cee9ec45876f831ca230b59a1be3b48ce6aa5..46910a3bdacc9df1835e16b300f9e107744d2660 100644 --- a/src/main/java/net/minecraft/world/level/portal/PortalShape.java @@ -17205,12 +17101,12 @@ index 3fb1e558c3510243c94981211f9a0e5e0ef1895b..e5177e5ffcac360f935f2139db4554c6 if (context.hasParam(LootContextParams.LOOTING_MOD)) { i = context.getParamOrNull(LootContextParams.LOOTING_MOD); diff --git a/src/main/java/net/minecraft/world/phys/AABB.java b/src/main/java/net/minecraft/world/phys/AABB.java -index 67d595f75e0c3bffdb27b85b25ccd1f0bf1427d5..4d0c524af87d05dbd4a923ad6c40e1f26149e921 100644 +index 92394960fc76886f393cba02ac33c57739a4b383..494808b7bc2fb296b78e229ce138a937b7ac2c59 100644 --- a/src/main/java/net/minecraft/world/phys/AABB.java +++ b/src/main/java/net/minecraft/world/phys/AABB.java -@@ -374,4 +374,10 @@ public class AABB { +@@ -502,4 +502,10 @@ public class AABB { public static AABB ofSize(Vec3 center, double dx, double dy, double dz) { - return new AABB(center.x - dx / 2.0D, center.y - dy / 2.0D, center.z - dz / 2.0D, center.x + dx / 2.0D, center.y + dy / 2.0D, center.z + dz / 2.0D); + return new AABB(center.x - dx / 2.0, center.y - dy / 2.0, center.z - dz / 2.0, center.x + dx / 2.0, center.y + dy / 2.0, center.z + dz / 2.0); } + + // Purpur - tuinity added method @@ -17598,10 +17494,10 @@ index 8ecf6ffa93610261d27fafadfff016a2d6047c90..f4fb23ebdd35e23b022bdd78421dec6d + // Purpur end } diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -index c9d276124bd14aafcd1a29991081b7668fe636b6..593119cefb6664f2b0b03b684103440b27696e37 100644 +index 4a11314df1a6d068c5abf12677b9bfd11ea7c66c..43aea7cf6e2398effdaed765559942031f049fd3 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -@@ -2388,6 +2388,48 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -2408,6 +2408,48 @@ public class CraftWorld extends CraftRegionAccessor implements World { return (this.getHandle().getDragonFight() == null) ? null : new CraftDragonBattle(this.getHandle().getDragonFight()); } @@ -17804,7 +17700,7 @@ 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 5b7579395e61684592758f408d61cffe57f8b21d..015ea2ecac493c88f45d6ad66c2ef346252b4ec8 100644 +index a151b5d7c6e41b08e57c806bc43e067af48263ed..40d385c7865726545bb66f9a1856ed4e73e60202 100644 --- a/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java +++ b/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java @@ -71,6 +71,8 @@ public class CraftEnchantment extends Enchantment implements Handleable= -1f, "Speed value (%s) need to be between -1f and 1f", value); } -@@ -3427,4 +3458,70 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -3425,4 +3456,70 @@ public class CraftPlayer extends CraftHumanEntity implements Player { public void setSendViewDistance(final int viewDistance) { this.getHandle().setSendViewDistance(viewDistance); } @@ -18256,10 +18152,10 @@ 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 cb3e9672f375a1a660757a05362729ddb5ca7504..f587c8defaf55ffa77d90deb8b9a3975e8f90ef9 100644 +index c0823c612de9dc2a64cc797f061eef25c5f31359..b82a6143526bd1d4ecd4591c1253cdb0b913fe09 100644 --- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java -@@ -592,6 +592,15 @@ public class CraftEventFactory { +@@ -593,6 +593,15 @@ public class CraftEventFactory { // Paper end craftServer.getPluginManager().callEvent(event); @@ -18275,7 +18171,7 @@ index cb3e9672f375a1a660757a05362729ddb5ca7504..f587c8defaf55ffa77d90deb8b9a3975 return event; } -@@ -1123,7 +1132,7 @@ public class CraftEventFactory { +@@ -1124,7 +1133,7 @@ public class CraftEventFactory { return CraftEventFactory.callEntityDamageEvent(source.getDirectBlock(), entity, DamageCause.LAVA, bukkitDamageSource, modifiers, modifierFunctions, cancelled); } else if (source.getDirectBlock() != null) { DamageCause cause; @@ -18284,7 +18180,7 @@ index cb3e9672f375a1a660757a05362729ddb5ca7504..f587c8defaf55ffa77d90deb8b9a3975 cause = DamageCause.CONTACT; } else if (source.is(DamageTypes.HOT_FLOOR)) { cause = DamageCause.HOT_FLOOR; -@@ -1181,6 +1190,7 @@ public class CraftEventFactory { +@@ -1182,6 +1191,7 @@ public class CraftEventFactory { EntityDamageEvent event; if (damager != null) { event = new EntityDamageByEntityEvent(damager.getBukkitEntity(), damagee.getBukkitEntity(), cause, bukkitDamageSource, modifiers, modifierFunctions, critical); @@ -19164,10 +19060,10 @@ index 0000000000000000000000000000000000000000..0c8bcfbe35f9133a32a31163e5bf2f04 +} 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..7459ca7b724634a191498bf05e345c7e97fbe901 +index 0000000000000000000000000000000000000000..d15d8984cd53bec826fa2507b91acff10d9711cf --- /dev/null +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -0,0 +1,3285 @@ +@@ -0,0 +1,3289 @@ +package org.purpurmc.purpur; + +import net.minecraft.core.registries.BuiltInRegistries; @@ -22051,6 +21947,8 @@ index 0000000000000000000000000000000000000000..7459ca7b724634a191498bf05e345c7e + public boolean villagerDisplayTradeItem = true; + public int villagerSpawnIronGolemRadius = 0; + public int villagerSpawnIronGolemLimit = 0; ++ public int villagerAcquirePoiSearchRadius = 48; ++ public int villagerNearestBedSensorSearchRadius = 48; + private void villagerSettings() { + villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); + villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); @@ -22087,6 +21985,8 @@ index 0000000000000000000000000000000000000000..7459ca7b724634a191498bf05e345c7e + 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); ++ villagerAcquirePoiSearchRadius = getInt("mobs.villager.search-radius.acquire-poi", villagerAcquirePoiSearchRadius); ++ villagerNearestBedSensorSearchRadius = getInt("mobs.villager.search-radius.nearest-bed-sensor", villagerNearestBedSensorSearchRadius); + } + + public boolean vindicatorRidable = false; @@ -24732,7 +24632,7 @@ index 0000000000000000000000000000000000000000..b7586f494528f30eb0da82420d3bcf5b + } +} diff --git a/src/main/java/org/spigotmc/ActivationRange.java b/src/main/java/org/spigotmc/ActivationRange.java -index 0735af396aa89b6ea7d5565d91f070fac90f7da1..c6c58c398b2ce4741301afaa04d2ba2dbee475d4 100644 +index df50c32482067368b11d2928bd353f4fbe595afe..9edb1e43dc9c55202443ef5f893d8e2bd0301de3 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; @@ -24743,7 +24643,7 @@ index 0735af396aa89b6ea7d5565d91f070fac90f7da1..c6c58c398b2ce4741301afaa04d2ba2d import net.minecraft.world.entity.animal.WaterAnimal; import net.minecraft.world.entity.animal.horse.Llama; import net.minecraft.world.entity.boss.EnderDragonPart; -@@ -217,6 +218,7 @@ public class ActivationRange +@@ -219,6 +220,7 @@ public class ActivationRange continue; } @@ -24751,7 +24651,7 @@ index 0735af396aa89b6ea7d5565d91f070fac90f7da1..c6c58c398b2ce4741301afaa04d2ba2d // Paper start int worldHeight = world.getHeight(); ActivationRange.maxBB = player.getBoundingBox().inflate( maxRange, worldHeight, maxRange ); -@@ -414,6 +416,7 @@ public class ActivationRange +@@ -416,6 +418,7 @@ public class ActivationRange */ public static boolean checkIfActive(Entity entity) { diff --git a/patches/server/0013-Remove-Timings.patch b/patches/server/0013-Remove-Timings.patch index ac3bbb1e..d3d264c1 100644 --- a/patches/server/0013-Remove-Timings.patch +++ b/patches/server/0013-Remove-Timings.patch @@ -829,7 +829,7 @@ index b66a7d4aab887309579154815a0d4abf9de506b0..78cb9d7da9bb025ea362028fdc9d0317 return executedUnloadTask | canSaveChunk | canSaveEntities | canSavePOI ? new SaveStat(executedUnloadTask || canSaveChunk, canSaveEntities, canSavePOI): null; } diff --git a/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java b/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java -index 83ecb6402ddedd4a613afef7d3a9ad5a5ac6ae30..a1c8ee38255cdd04e35e3ae8c9126b50c81c792a 100644 +index 2e83fd8f0fd067d6585d66d7b419a39769eee312..c3e6102d1335ec99d1f8f8d6159e1606a1082828 100644 --- a/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java +++ b/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java @@ -1,7 +1,7 @@ @@ -923,22 +923,21 @@ index dab211c458311869c61779305580a1c7da830f71..0ddcf3652a2cc9e0cc28f672f103ec7e @Override diff --git a/src/main/java/net/minecraft/network/protocol/PacketUtils.java b/src/main/java/net/minecraft/network/protocol/PacketUtils.java -index 3e2d5dcd62775b6ed7c0ce0ba51a71b635b1d644..deca974c2a82bc341fe23ea46f61f42f04432755 100644 +index 83302c252f54481f239522e5c6861ccfe233070a..070231080052ef3d0da179a8ed8b754ed6f8dd11 100644 --- a/src/main/java/net/minecraft/network/protocol/PacketUtils.java +++ b/src/main/java/net/minecraft/network/protocol/PacketUtils.java -@@ -49,8 +49,8 @@ public class PacketUtils { +@@ -49,8 +49,7 @@ public class PacketUtils { try { // Paper - detailed watchdog information - if (MinecraftServer.getServer().hasStopped() || (listener instanceof ServerCommonPacketListenerImpl && ((ServerCommonPacketListenerImpl) listener).processedDisconnect)) return; // CraftBukkit, MC-142590 + if (listener instanceof ServerCommonPacketListenerImpl serverCommonPacketListener && serverCommonPacketListener.processedDisconnect) return; // CraftBukkit - Don't handle sync packets for kicked players if (listener.shouldHandleMessage(packet)) { - co.aikar.timings.Timing timing = co.aikar.timings.MinecraftTimings.getPacketTiming(packet); // Paper - timings - try (co.aikar.timings.Timing ignored = timing.startTiming()) { // Paper - timings -+ + try { packet.handle(listener); } 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 5db1dd834ec47c7a510e86f8eaffde03277a5442..49105918ec09e9c9db49035fc03a6502bb4a951f 100644 +index 5c4272a9f25adad0dc21b03e8652a98b1fe2ddf1..8767b09e1b7e4626e2051535648cc45e129d7613 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; @@ -1346,7 +1345,7 @@ index 6587ce30d88983cb42822e6ff3e012047d3ce16d..93ec0bdece165e5a5058f9a7ed2fd67d } diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index 0c376236d0cbc6033865f25db592c42a0d3d30d7..165b9f9ede6eec3e5667a2e653988f0e69ddb09f 100644 +index 9eb2bc23a2e7dce3594d67ec97ba120824a80ab1..a04ea23c295b493984eb841253fcb0eb4ad26342 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 @@ @@ -1626,10 +1625,10 @@ index a9e2a758669550530eb29475ba99fe42e520f6ae..d617e803f47219621b6b3b42c3bb7f30 } diff --git a/src/main/java/net/minecraft/world/entity/ai/behavior/Behavior.java b/src/main/java/net/minecraft/world/entity/ai/behavior/Behavior.java -index 1e71cde7cb7654f1c21ae5e27e2fad7b58f593eb..358415f32a40b355f7bf397f2e197eca726547ec 100644 +index 03092417cd8ab5c6d266f3af9f20f47b34cfaba3..ffa4965ef1290a65d5c0261821e360d48fbad7d9 100644 --- a/src/main/java/net/minecraft/world/entity/ai/behavior/Behavior.java +++ b/src/main/java/net/minecraft/world/entity/ai/behavior/Behavior.java -@@ -13,9 +13,8 @@ public abstract class Behavior implements BehaviorContro +@@ -14,10 +14,9 @@ public abstract class Behavior implements BehaviorContro private long endTimestamp; private final int minDuration; private final int maxDuration; @@ -1637,10 +1636,12 @@ index 1e71cde7cb7654f1c21ae5e27e2fad7b58f593eb..358415f32a40b355f7bf397f2e197eca + // Paper start - configurable behavior tick rate private final String configKey; - private final co.aikar.timings.Timing timing; - // Paper end - configurable behavior tick rate and timings +- // Paper end - configurable behavior tick rate and timings ++ // Paper end - configurable behavior tick rate public Behavior(Map, MemoryStatus> requiredMemoryState) { -@@ -30,14 +29,13 @@ public abstract class Behavior implements BehaviorContro + this(requiredMemoryState, 60); +@@ -31,15 +30,14 @@ public abstract class Behavior implements BehaviorContro this.minDuration = minRunTime; this.maxDuration = maxRunTime; this.entryCondition = requiredMemoryState; @@ -1653,10 +1654,24 @@ index 1e71cde7cb7654f1c21ae5e27e2fad7b58f593eb..358415f32a40b355f7bf397f2e197eca } this.configKey = key.toLowerCase(java.util.Locale.ROOT); - this.timing = co.aikar.timings.MinecraftTimings.getBehaviorTimings(configKey); - // Paper end - configurable behavior tick rate and timings +- // Paper end - configurable behavior tick rate and timings ++ // Paper end - configurable behavior tick rate } -@@ -58,9 +56,7 @@ public abstract class Behavior implements BehaviorContro + @Override +@@ -49,19 +47,17 @@ public abstract class Behavior implements BehaviorContro + + @Override + public final boolean tryStart(ServerLevel world, E entity, long time) { +- // Paper start - configurable behavior tick rate and timings ++ // Paper start - configurable behavior tick rate + int tickRate = java.util.Objects.requireNonNullElse(world.paperConfig().tickRates.behavior.get(entity.getType(), this.configKey), -1); + if (tickRate > -1 && time < this.endTimestamp + tickRate) { + return false; + } +- // Paper end - configurable behavior tick rate and timings ++ // Paper end - configurable behavior tick rate + if (this.hasRequiredMemories(entity) && this.checkExtraStartConditions(world, entity)) { this.status = Behavior.Status.RUNNING; int i = this.minDuration + world.getRandom().nextInt(this.maxDuration + 1 - this.minDuration); this.endTimestamp = time + (long)i; @@ -1666,7 +1681,7 @@ index 1e71cde7cb7654f1c21ae5e27e2fad7b58f593eb..358415f32a40b355f7bf397f2e197eca return true; } else { return false; -@@ -72,14 +68,11 @@ public abstract class Behavior implements BehaviorContro +@@ -73,13 +69,11 @@ public abstract class Behavior implements BehaviorContro @Override public final void tickOrStop(ServerLevel world, E entity, long time) { @@ -1677,16 +1692,15 @@ index 1e71cde7cb7654f1c21ae5e27e2fad7b58f593eb..358415f32a40b355f7bf397f2e197eca this.doStop(world, entity, time); } - this.timing.stopTiming(); // Paper - behavior timings -- } protected void tick(ServerLevel world, E entity, long time) { diff --git a/src/main/java/net/minecraft/world/entity/ai/sensing/Sensor.java b/src/main/java/net/minecraft/world/entity/ai/sensing/Sensor.java -index fcdb9bde8e1605e30dde3e580491522d4b62cdc0..4de18d00cc464313b777874430da3f5595f9c202 100644 +index 9e90cb2f51d1bacacb287e912d14ab9152523205..57665076cbc6b1b506f38080c0c9612ea18d944a 100644 --- a/src/main/java/net/minecraft/world/entity/ai/sensing/Sensor.java +++ b/src/main/java/net/minecraft/world/entity/ai/sensing/Sensor.java -@@ -19,20 +19,18 @@ public abstract class Sensor { - private static final TargetingConditions ATTACK_TARGET_CONDITIONS_IGNORE_INVISIBILITY_AND_LINE_OF_SIGHT = TargetingConditions.forCombat().range(16.0D).ignoreLineOfSight().ignoreInvisibilityTesting(); +@@ -26,20 +26,18 @@ public abstract class Sensor { + .ignoreInvisibilityTesting(); private final int scanRate; private long timeToTick; - // Paper start - configurable sensor tick rate and timings @@ -1708,7 +1722,7 @@ index fcdb9bde8e1605e30dde3e580491522d4b62cdc0..4de18d00cc464313b777874430da3f55 // Paper end this.scanRate = senseInterval; this.timeToTick = (long)RANDOM.nextInt(senseInterval); -@@ -44,12 +42,10 @@ public abstract class Sensor { +@@ -51,12 +49,10 @@ public abstract class Sensor { public final void tick(ServerLevel world, E entity) { if (--this.timeToTick <= 0L) { @@ -1720,10 +1734,10 @@ index fcdb9bde8e1605e30dde3e580491522d4b62cdc0..4de18d00cc464313b777874430da3f55 this.doTick(world, entity); - this.timing.stopTiming(); // Paper - sensor timings } - } + diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index 7583ce583b06306930cbae49b0386a6630bb916f..ff05efe0b78defe3d25905b6a2984bdb646fcff3 100644 +index 52fcce3b1c01c221becadc39334dc3b1de12e688..138c14ced11354e67b84956bdd02f90c1bed409e 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java @@ -176,7 +176,6 @@ public abstract class Level implements LevelAccessor, AutoCloseable { @@ -1827,7 +1841,7 @@ index 07a83e06e9cb6e30c600445809e49a3fd23a391a..171feda35239281b0ec2416485bead19 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 3d0b8761866046ae7ee6b5777fb098ce786abd94..221a4a3fbeac621ec593c7ba44b83f4b247a5589 100644 +index 3efdd1513089c663aa5c33eace0b31a599eca2eb..f52b314dd0ed83682b6a60c66b21eefd2cefb793 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 { @@ -1854,7 +1868,7 @@ index 3d0b8761866046ae7ee6b5777fb098ce786abd94..221a4a3fbeac621ec593c7ba44b83f4b BlockState iblockdata = LevelChunk.this.getBlockState(blockposition); if (this.blockEntity.getType().isValid(iblockdata)) { -@@ -1185,14 +1182,9 @@ public class LevelChunk extends ChunkAccess { +@@ -1190,14 +1187,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))); // Paper - ServerExceptionEvent LevelChunk.this.removeBlockEntity(this.getPos()); // Paper end - Prevent block entity and entity crashes @@ -1882,7 +1896,7 @@ index f4fb23ebdd35e23b022bdd78421dec6d86342260..3c3b98d13587ce21bffa14a79aed963a 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 419618b06f2e8b03bea0ee772b4f96cde543a1c6..ee166ad76bd2c143e04e4bf6bd9991bc90ab99a5 100644 +index bac135289e34c69ff0d02ff23b8a95d72505e1bc..dcb6ccda0b46dc271be305c93df5c7db574bc07b 100644 --- a/src/main/java/org/bukkit/craftbukkit/Main.java +++ b/src/main/java/org/bukkit/craftbukkit/Main.java @@ -373,8 +373,6 @@ public class Main { @@ -2035,7 +2049,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 050d6820efd55f73bf8aba915f6fb461bc884378..48ba783a9525cc86a9f648ed2504b0223e4b512c 100644 +index 53b73cac093797de47a9e61a5fdab44aced54ebb..aff95d844d810fb145b7587fef28df66e47d6530 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java +++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java @@ -214,12 +214,6 @@ public final class CraftMagicNumbers implements UnsafeValues { @@ -2051,7 +2065,7 @@ index 050d6820efd55f73bf8aba915f6fb461bc884378..48ba783a9525cc86a9f648ed2504b022 public static byte toLegacyData(BlockState data) { return CraftLegacy.toLegacyData(data); -@@ -490,10 +484,6 @@ public final class CraftMagicNumbers implements UnsafeValues { +@@ -495,10 +489,6 @@ public final class CraftMagicNumbers implements UnsafeValues { return new CraftDamageSourceBuilder(damageType); } // Paper start @@ -2269,7 +2283,7 @@ index 139d946346594d2a59a8b2930c4eae794c880dbc..00000000000000000000000000000000 - -} diff --git a/src/main/java/org/spigotmc/ActivationRange.java b/src/main/java/org/spigotmc/ActivationRange.java -index c6c58c398b2ce4741301afaa04d2ba2dbee475d4..67e33ce28e3a775b6611334471061f72cae18cae 100644 +index 9edb1e43dc9c55202443ef5f893d8e2bd0301de3..f5822d9778ebf8256d6e184d6c21335830bcf045 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; @@ -2280,7 +2294,7 @@ index c6c58c398b2ce4741301afaa04d2ba2dbee475d4..67e33ce28e3a775b6611334471061f72 import net.minecraft.world.entity.schedule.Activity; import net.minecraft.world.level.Level; import net.minecraft.world.phys.AABB; -@@ -184,7 +183,6 @@ public class ActivationRange +@@ -186,7 +185,6 @@ public class ActivationRange */ public static void activateEntities(Level world) { @@ -2288,7 +2302,7 @@ index c6c58c398b2ce4741301afaa04d2ba2dbee475d4..67e33ce28e3a775b6611334471061f72 final int miscActivationRange = world.spigotConfig.miscActivationRange; final int raiderActivationRange = world.spigotConfig.raiderActivationRange; final int animalActivationRange = world.spigotConfig.animalActivationRange; -@@ -263,7 +261,6 @@ public class ActivationRange +@@ -265,7 +263,6 @@ public class ActivationRange } // Paper end } diff --git a/patches/server/0014-Bump-Dependencies.patch b/patches/server/0014-Bump-Dependencies.patch index 6fb4e3ac..48fa78e2 100644 --- a/patches/server/0014-Bump-Dependencies.patch +++ b/patches/server/0014-Bump-Dependencies.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Bump Dependencies diff --git a/build.gradle.kts b/build.gradle.kts -index 140638a117d9306bd08ed4fbcc4ea123adac4901..2e02cf5a4706721f0d00da7f7fa189e671acc769 100644 +index 0d72b6e0a9d9c12b7d4555aa85dcedde9123c5c1..a2eae367d6c0c031f2f29b86ead486c31dd0118c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -32,9 +32,9 @@ dependencies { @@ -32,20 +32,19 @@ index 140638a117d9306bd08ed4fbcc4ea123adac4901..2e02cf5a4706721f0d00da7f7fa189e6 runtimeOnly(log4jPlugins.output) alsoShade(log4jPlugins.output) - implementation("io.netty:netty-codec-haproxy:4.1.97.Final") // Paper - Add support for proxy protocol -+ implementation("io.netty:netty-codec-haproxy:4.1.107.Final") // Paper - Add support for proxy protocol ++ implementation("io.netty:netty-codec-haproxy:4.1.109.Final") // Paper - Add support for proxy protocol // Paper end - implementation("org.apache.logging.log4j:log4j-iostreams:2.19.0") // Paper - remove exclusion -- implementation("org.ow2.asm:asm-commons:9.5") + implementation("org.apache.logging.log4j:log4j-iostreams:2.23.1") // Paper - remove exclusion -+ implementation("org.ow2.asm:asm-commons:9.7") + implementation("org.ow2.asm:asm-commons:9.7") implementation("org.spongepowered:configurate-yaml:4.2.0-SNAPSHOT") // Paper - config files implementation("commons-lang:commons-lang:2.6") - implementation("net.fabricmc:mapping-io:0.5.0") // Paper - needed to read mappings for stacktrace deobfuscation - runtimeOnly("org.xerial:sqlite-jdbc:3.42.0.1") - runtimeOnly("com.mysql:mysql-connector-j:8.2.0") - runtimeOnly("com.lmax:disruptor:3.4.4") // Paper -+ implementation("net.fabricmc:mapping-io:0.5.1") // Paper - needed to read mappings for stacktrace deobfuscation -+ runtimeOnly("org.xerial:sqlite-jdbc:3.45.2.0") // Leaf - Bump Dependencies ++ implementation("net.fabricmc:mapping-io:0.6.1") // Paper - needed to read mappings for stacktrace deobfuscation ++ runtimeOnly("org.xerial:sqlite-jdbc:3.45.3.0") + runtimeOnly("com.mysql:mysql-connector-j:8.3.0") + runtimeOnly("com.lmax:disruptor:3.4.4") // Paper // Leaf - Bump Dependencies - Waiting Log4j 3.x to support disruptor 4.0.0 // Paper start - Use Velocity cipher @@ -64,16 +63,14 @@ index 140638a117d9306bd08ed4fbcc4ea123adac4901..2e02cf5a4706721f0d00da7f7fa189e6 - testImplementation("io.github.classgraph:classgraph:4.8.47") // Paper - mob goal test - testImplementation("org.junit.jupiter:junit-jupiter:5.10.0") + // Leaf start - Bump Dependencies -+ testImplementation("io.github.classgraph:classgraph:4.8.168") // Paper - mob goal test ++ testImplementation("io.github.classgraph:classgraph:4.8.170") // Paper - mob goal test + testImplementation("org.junit.jupiter:junit-jupiter:5.10.2") 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.11.0") -+ testImplementation("org.ow2.asm:asm-tree:9.7") + testImplementation("org.mockito:mockito-core:5.11.0") + testImplementation("org.ow2.asm:asm-tree:9.7") testImplementation("org.junit-pioneer:junit-pioneer:2.2.0") // Paper - CartesianTest + -+ implementation("io.netty:netty-all:4.1.107.Final") ++ implementation("io.netty:netty-all:4.1.109.Final") + // Leaf end } diff --git a/patches/server/0019-KeYi-Player-Skull-API.patch b/patches/server/0019-KeYi-Player-Skull-API.patch index dbd7c5b9..126e1a0d 100644 --- a/patches/server/0019-KeYi-Player-Skull-API.patch +++ b/patches/server/0019-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 d6122c121d6e18d276fb78865c6a680e9afc3378..ce70f01611181e8f4c7324c7b9f9944a8605c710 100644 +index f3ae9a2d594a90c128402af57bc9536a136e7395..be00b95e723952c61c6f8ae01b61e4f5e1c77bdf 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 d6122c121d6e18d276fb78865c6a680e9afc3378..ce70f01611181e8f4c7324c7b9f9944a import org.bukkit.map.MapCursor; import org.bukkit.map.MapView; import org.bukkit.metadata.MetadataValue; -@@ -3524,4 +3530,27 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -3522,4 +3528,27 @@ 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/0022-Carpet-Fixes-Optimized-getBiome-method.patch b/patches/server/0022-Carpet-Fixes-Optimized-getBiome-method.patch index f6b83ddb..700bb632 100644 --- a/patches/server/0022-Carpet-Fixes-Optimized-getBiome-method.patch +++ b/patches/server/0022-Carpet-Fixes-Optimized-getBiome-method.patch @@ -10,7 +10,7 @@ Optimized the getBiome call to be 25% - 75% faster This is a fully vanilla optimization. diff --git a/src/main/java/net/minecraft/world/level/biome/BiomeManager.java b/src/main/java/net/minecraft/world/level/biome/BiomeManager.java -index 5695c5116c8a338b2e41aafcb2dc9f2146856970..08895c4d8e2d179ca8ed77377e31420d7229fb9b 100644 +index 01352cc83b25eb0e30b7e0ff521fc7c1b3d5155b..bd9c58b0086ea6ba5a73b41e805d4c9af4dc357d 100644 --- a/src/main/java/net/minecraft/world/level/biome/BiomeManager.java +++ b/src/main/java/net/minecraft/world/level/biome/BiomeManager.java @@ -14,6 +14,7 @@ public class BiomeManager { @@ -31,22 +31,22 @@ index 5695c5116c8a338b2e41aafcb2dc9f2146856970..08895c4d8e2d179ca8ed77377e31420d - int l = i >> 2; - int m = j >> 2; - int n = k >> 2; -- double d = (double)(i & 3) / 4.0D; -- double e = (double)(j & 3) / 4.0D; -- double f = (double)(k & 3) / 4.0D; +- double d = (double)(i & 3) / 4.0; +- double e = (double)(j & 3) / 4.0; +- double f = (double)(k & 3) / 4.0; - int o = 0; - double g = Double.POSITIVE_INFINITY; - -- for(int p = 0; p < 8; ++p) { +- for (int p = 0; p < 8; p++) { - boolean bl = (p & 4) == 0; - boolean bl2 = (p & 2) == 0; - boolean bl3 = (p & 1) == 0; - int q = bl ? l : l + 1; - int r = bl2 ? m : m + 1; - int s = bl3 ? n : n + 1; -- double h = bl ? d : d - 1.0D; -- double t = bl2 ? e : e - 1.0D; -- double u = bl3 ? f : f - 1.0D; +- double h = bl ? d : d - 1.0; +- double t = bl2 ? e : e - 1.0; +- double u = bl3 ? f : f - 1.0; - double v = getFiddledDistance(this.biomeZoomSeed, q, r, s, h, t, u); - if (g > v) { - o = p; @@ -58,21 +58,21 @@ index 5695c5116c8a338b2e41aafcb2dc9f2146856970..08895c4d8e2d179ca8ed77377e31420d + int x = xMinus2 >> 2; // BlockPos to BiomePos + int y = yMinus2 >> 2; + int z = zMinus2 >> 2; -+ double quartX = (double) (xMinus2 & 3) / 4.0D; // quartLocal divided by 4 -+ double quartY = (double) (yMinus2 & 3) / 4.0D; // 0/4, 1/4, 2/4, 3/4 -+ double quartZ = (double) (zMinus2 & 3) / 4.0D; // [0, 0.25, 0.5, 0.75] ++ double quartX = (double) (xMinus2 & 3) / 4.0; // quartLocal divided by 4 ++ double quartY = (double) (yMinus2 & 3) / 4.0; // 0/4, 1/4, 2/4, 3/4 ++ double quartZ = (double) (zMinus2 & 3) / 4.0; // [0, 0.25, 0.5, 0.75] + int smallestX = 0; + double smallestDist = Double.POSITIVE_INFINITY; + for (int biomeX = 0; biomeX < 8; ++biomeX) { + boolean everyOtherQuad = (biomeX & 4) == 0; // 1 1 1 1 0 0 0 0 + boolean everyOtherPair = (biomeX & 2) == 0; // 1 1 0 0 1 1 0 0 + boolean everyOther = (biomeX & 1) == 0; // 1 0 1 0 1 0 1 0 -+ double quartXX = everyOtherQuad ? quartX : quartX - 1.0D; //[-1.0,-0.75,-0.5,-0.25,0.0,0.25,0.5,0.75] -+ double quartYY = everyOtherPair ? quartY : quartY - 1.0D; -+ double quartZZ = everyOther ? quartZ : quartZ - 1.0D; ++ double quartXX = everyOtherQuad ? quartX : quartX - 1.0; //[-1.0,-0.75,-0.5,-0.25,0.0,0.25,0.5,0.75] ++ double quartYY = everyOtherPair ? quartY : quartY - 1.0; ++ double quartZZ = everyOther ? quartZ : quartZ - 1.0; + + //This code block is new -+ double maxQuartYY = 0.0D, maxQuartZZ = 0.0D; ++ double maxQuartYY = 0.0, maxQuartZZ = 0.0; + if (biomeX != 0) { + maxQuartYY = Mth.square(Math.max(quartYY + maxOffset, Math.abs(quartYY - maxOffset))); + maxQuartZZ = Mth.square(Math.max(quartZZ + maxOffset, Math.abs(quartZZ - maxOffset))); diff --git a/patches/server/0030-Leaves-Jade-Protocol.patch b/patches/server/0030-Leaves-Jade-Protocol.patch index fec9ccf0..fe549af9 100644 --- a/patches/server/0030-Leaves-Jade-Protocol.patch +++ b/patches/server/0030-Leaves-Jade-Protocol.patch @@ -22,11 +22,11 @@ index 93e321a0b8fdce12968f03b3cfe6724ae564b823..cd696f6bb7f77338dd289c7c2d6bdf23 } diff --git a/src/main/java/net/minecraft/world/level/block/entity/trialspawner/TrialSpawnerData.java b/src/main/java/net/minecraft/world/level/block/entity/trialspawner/TrialSpawnerData.java -index 7292e68199d244990efa8475fb40b94fe72323c0..3c234bfcecd6d93f8ff9b1abc6dfc72c26fa30f0 100644 +index d624c5ebbbe88c5fc2a4b8521f71ac00f05d58cf..bc9a9a177e15570ad29bac0080dc341fc0277396 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/trialspawner/TrialSpawnerData.java +++ b/src/main/java/net/minecraft/world/level/block/entity/trialspawner/TrialSpawnerData.java -@@ -50,7 +50,7 @@ public class TrialSpawnerData { - }); +@@ -45,7 +45,7 @@ public class TrialSpawnerData { + ); protected final Set detectedPlayers = new HashSet<>(); protected final Set currentMobs = new HashSet<>(); - protected long cooldownEndsAt; diff --git a/patches/server/0037-Sync-with-Gale-s-Optimize-villager-data-storage.patc.patch b/patches/server/0037-Sync-with-Gale-s-Optimize-villager-data-storage.patc.patch index a5da167a..27c8302e 100644 --- a/patches/server/0037-Sync-with-Gale-s-Optimize-villager-data-storage.patc.patch +++ b/patches/server/0037-Sync-with-Gale-s-Optimize-villager-data-storage.patc.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Sync with Gale's Optimize-villager-data-storage.patch diff --git a/src/main/java/net/minecraft/world/entity/ai/behavior/TradeWithVillager.java b/src/main/java/net/minecraft/world/entity/ai/behavior/TradeWithVillager.java -index 44701d0bed85c46e658bc3f2a738126bd748e5c6..429dd3c399db2d327e471e3a689a45cbf3dd1e7e 100644 +index 753587e4d9582605951461f2bea37aff3bf28fcd..77fb2b0c4b9defaa16a2f89b194e8f5084ade12c 100644 --- a/src/main/java/net/minecraft/world/entity/ai/behavior/TradeWithVillager.java +++ b/src/main/java/net/minecraft/world/entity/ai/behavior/TradeWithVillager.java @@ -22,6 +22,7 @@ public class TradeWithVillager extends Behavior { @@ -16,7 +16,7 @@ index 44701d0bed85c46e658bc3f2a738126bd748e5c6..429dd3c399db2d327e471e3a689a45cb private @NotNull Item @Nullable [] trades = null; // Gale end - optimize villager data storage -@@ -62,7 +63,7 @@ public class TradeWithVillager extends Behavior { +@@ -67,7 +68,7 @@ public class TradeWithVillager extends Behavior { // Purpur start if (world.purpurConfig.villagerClericsFarmWarts && world.purpurConfig.villagerClericFarmersThrowWarts && entity.getVillagerData().getProfession() == VillagerProfession.CLERIC && entity.getInventory().countItem(Items.NETHER_WART) > Items.NETHER_WART.getMaxStackSize() / 2) { @@ -26,15 +26,15 @@ index 44701d0bed85c46e658bc3f2a738126bd748e5c6..429dd3c399db2d327e471e3a689a45cb // Purpur end diff --git a/src/main/java/net/minecraft/world/entity/npc/VillagerProfession.java b/src/main/java/net/minecraft/world/entity/npc/VillagerProfession.java -index b571731bbce25f17568370bb523cb9b0293a2f01..5c685a52daaf86f8df47abe6824792f87c8eb246 100644 +index 8f36f113e8eb3236ce53ad9cce320c3d6253d248..ebe79d9ad2934b53085c8a720fdfca0a6eda05ca 100644 --- a/src/main/java/net/minecraft/world/entity/npc/VillagerProfession.java +++ b/src/main/java/net/minecraft/world/entity/npc/VillagerProfession.java -@@ -26,7 +26,7 @@ public record VillagerProfession(String name, Predicate> heldJob +@@ -31,7 +31,7 @@ public record VillagerProfession( public static final VillagerProfession ARMORER = register("armorer", PoiTypes.ARMORER, SoundEvents.VILLAGER_WORK_ARMORER); public static final VillagerProfession BUTCHER = register("butcher", PoiTypes.BUTCHER, SoundEvents.VILLAGER_WORK_BUTCHER); public static final VillagerProfession CARTOGRAPHER = register("cartographer", PoiTypes.CARTOGRAPHER, SoundEvents.VILLAGER_WORK_CARTOGRAPHER); - public static final VillagerProfession CLERIC = register("cleric", PoiTypes.CLERIC, ImmutableSet.of(Items.NETHER_WART), ImmutableSet.of(Blocks.SOUL_SAND), SoundEvents.VILLAGER_WORK_CLERIC); // Purpur + public static final VillagerProfession CLERIC = register("cleric", PoiTypes.CLERIC, new Item[] {Items.NETHER_WART}, Blocks.SOUL_SAND, SoundEvents.VILLAGER_WORK_CLERIC); // Purpur // Leaf - sync with Gale's Optimize-villager-data-storage.patch - public static final VillagerProfession FARMER = register("farmer", PoiTypes.FARMER, new Item[] {Items.WHEAT, Items.WHEAT_SEEDS, Items.BEETROOT_SEEDS, Items.BONE_MEAL}, Blocks.FARMLAND, SoundEvents.VILLAGER_WORK_FARMER); // Gale - optimize villager data storage - public static final VillagerProfession FISHERMAN = register("fisherman", PoiTypes.FISHERMAN, SoundEvents.VILLAGER_WORK_FISHERMAN); - public static final VillagerProfession FLETCHER = register("fletcher", PoiTypes.FLETCHER, SoundEvents.VILLAGER_WORK_FLETCHER); + public static final VillagerProfession FARMER = register( + "farmer", + PoiTypes.FARMER, diff --git a/patches/server/0039-Petal-Async-Pathfinding.patch b/patches/server/0039-Petal-Async-Pathfinding.patch index 69abf34a..c7b9ec21 100644 --- a/patches/server/0039-Petal-Async-Pathfinding.patch +++ b/patches/server/0039-Petal-Async-Pathfinding.patch @@ -27,7 +27,7 @@ index ab442ad33124c75c261752d14d0ee209a673209e..4954cdcb642670d876dceb7b7bb3651c } diff --git a/src/main/java/net/minecraft/world/entity/ai/behavior/AcquirePoi.java b/src/main/java/net/minecraft/world/entity/ai/behavior/AcquirePoi.java -index aed7e9affaae1e0d1e3324a41e5818435f76fd0f..84b5552436b22ecfd2b88c6609ce8e583632cda7 100644 +index 4d2b6e69ed98aca98ffc50fefc6e535c1afb759d..74cd04a4e197e7d3dcf8986e77ed9a96acce01e4 100644 --- a/src/main/java/net/minecraft/world/entity/ai/behavior/AcquirePoi.java +++ b/src/main/java/net/minecraft/world/entity/ai/behavior/AcquirePoi.java @@ -7,7 +7,6 @@ import java.util.HashSet; @@ -46,57 +46,55 @@ index aed7e9affaae1e0d1e3324a41e5818435f76fd0f..84b5552436b22ecfd2b88c6609ce8e58 public class AcquirePoi { public static final int SCAN_RANGE = 48; -@@ -77,6 +77,40 @@ public class AcquirePoi { - io.papermc.paper.util.PoiAccess.findNearestPoiPositions(poiManager, poiPredicate, predicate2, entity.blockPosition(), 48, 48*48, PoiManager.Occupancy.HAS_SPACE, false, 5, poiposes); - Set, BlockPos>> set = new java.util.HashSet<>(poiposes); - // Paper end - optimise POI access -+ // Kaiiju start - petal - Async path processing -+ if (org.dreeam.leaf.config.modules.async.AsyncPathfinding.enabled) { -+ // await on path async -+ Path possiblePath = findPathToPois(entity, set); +@@ -85,6 +85,38 @@ public class AcquirePoi { + io.papermc.paper.util.PoiAccess.findNearestPoiPositions(poiManager, poiPredicate, predicate2, entity.blockPosition(), world.purpurConfig.villagerAcquirePoiSearchRadius, world.purpurConfig.villagerAcquirePoiSearchRadius*world.purpurConfig.villagerAcquirePoiSearchRadius, PoiManager.Occupancy.HAS_SPACE, false, 5, poiposes); // Purpur + Set, BlockPos>> set = new java.util.HashSet<>(poiposes); + // Paper end - optimise POI access ++ // Kaiiju start - petal - Async path processing ++ if (org.dreeam.leaf.config.modules.async.AsyncPathfinding.enabled) { ++ // await on path async ++ Path possiblePath = findPathToPois(entity, set); + -+ // wait on the path to be processed -+ AsyncPathProcessor.awaitProcessing(entity, possiblePath, path -> { -+ // read canReach check -+ if (path == null || !path.canReach()) { -+ for(Pair, BlockPos> pair : set) { -+ long2ObjectMap.computeIfAbsent( -+ pair.getSecond().asLong(), -+ (m) -> new JitteredLinearRetry(entity.level().random, time) -+ ); -+ } -+ return; -+ } -+ BlockPos blockPos = path.getTarget(); -+ poiManager.getType(blockPos).ifPresent((poiType) -> { -+ poiManager.take(poiPredicate, -+ (holder, blockPos2) -> blockPos2.equals(blockPos), -+ blockPos, -+ 1 -+ ); -+ queryResult.set(GlobalPos.of(world.dimension(), blockPos)); -+ entityStatus.ifPresent((status) -> { -+ world.broadcastEntityEvent(entity, status); -+ }); -+ long2ObjectMap.clear(); -+ DebugPackets.sendPoiTicketCountPacket(world, blockPos); -+ }); -+ }); -+ } else { -+ // Kaiiju end - Path path = findPathToPois(entity, set); - if (path != null && path.canReach()) { - BlockPos blockPos = path.getTarget(); -@@ -98,6 +132,7 @@ public class AcquirePoi { - }); - } - } -+ } // Kaiiju - Async path processing ++ // wait on the path to be processed ++ AsyncPathProcessor.awaitProcessing(entity, possiblePath, path -> { ++ // read canReach check ++ if (path == null || !path.canReach()) { ++ for (Pair, BlockPos> pair : set) { ++ long2ObjectMap.computeIfAbsent( ++ pair.getSecond().asLong(), ++ (m) -> new JitteredLinearRetry(entity.level().random, time) ++ ); ++ } ++ return; ++ } ++ BlockPos blockPos = path.getTarget(); ++ poiManager.getType(blockPos).ifPresent((poiType) -> { ++ poiManager.take(poiPredicate, ++ (holder, blockPos2) -> blockPos2.equals(blockPos), ++ blockPos, ++ 1 ++ ); ++ queryResult.set(GlobalPos.of(world.dimension(), blockPos)); ++ entityStatus.ifPresent((status) -> world.broadcastEntityEvent(entity, status)); ++ long2ObjectMap.clear(); ++ DebugPackets.sendPoiTicketCountPacket(world, blockPos); ++ }); ++ }); ++ } else { ++ // Kaiiju end + Path path = findPathToPois(entity, set); + if (path != null && path.canReach()) { + BlockPos blockPos = path.getTarget(); +@@ -102,6 +134,7 @@ public class AcquirePoi { + ); + } + } ++ } // Kaiiju - Async path processing - return true; - } + return true; + } diff --git a/src/main/java/net/minecraft/world/entity/ai/behavior/MoveToTargetSink.java b/src/main/java/net/minecraft/world/entity/ai/behavior/MoveToTargetSink.java -index 1ab77f3518d1df30f66ae44d7d4fa69e5b32d93a..e37ecae581e3723e36808fe51bcee9034b69b803 100644 +index 2a7a26ca447cc78f24e61a2bf557411c31eb16b2..4010cb7ad8897995c8b850f9279aad2a2b58d4eb 100644 --- a/src/main/java/net/minecraft/world/entity/ai/behavior/MoveToTargetSink.java +++ b/src/main/java/net/minecraft/world/entity/ai/behavior/MoveToTargetSink.java @@ -21,6 +21,7 @@ public class MoveToTargetSink extends Behavior { @@ -107,7 +105,7 @@ index 1ab77f3518d1df30f66ae44d7d4fa69e5b32d93a..e37ecae581e3723e36808fe51bcee903 @Nullable private BlockPos lastTargetPos; private float speedModifier; -@@ -42,9 +43,10 @@ public class MoveToTargetSink extends Behavior { +@@ -53,9 +54,10 @@ public class MoveToTargetSink extends Behavior { Brain brain = entity.getBrain(); WalkTarget walkTarget = brain.getMemory(MemoryModuleType.WALK_TARGET).get(); boolean bl = this.reachedTarget(entity, walkTarget); @@ -119,7 +117,7 @@ index 1ab77f3518d1df30f66ae44d7d4fa69e5b32d93a..e37ecae581e3723e36808fe51bcee903 } else { brain.eraseMemory(MemoryModuleType.WALK_TARGET); if (bl) { -@@ -58,6 +60,7 @@ public class MoveToTargetSink extends Behavior { +@@ -69,6 +71,7 @@ public class MoveToTargetSink extends Behavior { @Override protected boolean canStillUse(ServerLevel world, Mob entity, long time) { @@ -127,7 +125,7 @@ index 1ab77f3518d1df30f66ae44d7d4fa69e5b32d93a..e37ecae581e3723e36808fe51bcee903 if (this.path != null && this.lastTargetPos != null) { Optional optional = entity.getBrain().getMemory(MemoryModuleType.WALK_TARGET); boolean bl = optional.map(MoveToTargetSink::isWalkTargetSpectator).orElse(false); -@@ -82,12 +85,68 @@ public class MoveToTargetSink extends Behavior { +@@ -95,12 +98,68 @@ public class MoveToTargetSink extends Behavior { @Override protected void start(ServerLevel serverLevel, Mob mob, long l) { @@ -196,9 +194,9 @@ index 1ab77f3518d1df30f66ae44d7d4fa69e5b32d93a..e37ecae581e3723e36808fe51bcee903 Path path = mob.getNavigation().getPath(); Brain brain = mob.getBrain(); if (this.path != path) { -@@ -103,7 +162,23 @@ public class MoveToTargetSink extends Behavior { +@@ -116,7 +175,23 @@ public class MoveToTargetSink extends Behavior { + this.start(serverLevel, mob, l); } - } + } // Kaiiju - async path processing + } @@ -221,7 +219,7 @@ index 1ab77f3518d1df30f66ae44d7d4fa69e5b32d93a..e37ecae581e3723e36808fe51bcee903 private boolean tryComputePath(Mob entity, WalkTarget walkTarget, long time) { BlockPos blockPos = walkTarget.getTarget().currentBlockPosition(); diff --git a/src/main/java/net/minecraft/world/entity/ai/behavior/SetClosestHomeAsWalkTarget.java b/src/main/java/net/minecraft/world/entity/ai/behavior/SetClosestHomeAsWalkTarget.java -index 271efbb027f6f5d69ac5bc5dc51102a1eb00ab31..08aa5cef303924c537f83b431b275853e652b5ba 100644 +index 6802e0c4d331c7125114dd86409f6a110465ab82..fb936e7c05f56b7c430b9b725c651fa85ea42c20 100644 --- a/src/main/java/net/minecraft/world/entity/ai/behavior/SetClosestHomeAsWalkTarget.java +++ b/src/main/java/net/minecraft/world/entity/ai/behavior/SetClosestHomeAsWalkTarget.java @@ -20,6 +20,7 @@ import net.minecraft.world.entity.ai.village.poi.PoiTypes; @@ -232,56 +230,56 @@ index 271efbb027f6f5d69ac5bc5dc51102a1eb00ab31..08aa5cef303924c537f83b431b275853 public class SetClosestHomeAsWalkTarget { private static final int CACHE_TIMEOUT = 40; -@@ -57,6 +58,26 @@ public class SetClosestHomeAsWalkTarget { - Set, BlockPos>> set = poiManager.findAllWithType((poiType) -> { - return poiType.is(PoiTypes.HOME); - }, predicate, entity.blockPosition(), 48, PoiManager.Occupancy.ANY).collect(Collectors.toSet()); -+ // Kaiiju start - petal - Async path processing -+ if (org.dreeam.leaf.config.modules.async.AsyncPathfinding.enabled) { -+ // await on path async -+ Path possiblePath = AcquirePoi.findPathToPois(entity, set); +@@ -60,6 +61,26 @@ public class SetClosestHomeAsWalkTarget { + poiType -> poiType.is(PoiTypes.HOME), predicate, entity.blockPosition(), 48, PoiManager.Occupancy.ANY + ) + .collect(Collectors.toSet()); ++ // Kaiiju start - petal - Async path processing ++ if (org.dreeam.leaf.config.modules.async.AsyncPathfinding.enabled) { ++ // await on path async ++ Path possiblePath = AcquirePoi.findPathToPois(entity, set); + -+ // wait on the path to be processed -+ AsyncPathProcessor.awaitProcessing(entity, possiblePath, path -> { -+ if (path == null || !path.canReach() || mutableInt.getValue() < 5) { // read canReach check -+ long2LongMap.long2LongEntrySet().removeIf((entry) -> entry.getLongValue() < mutableLong.getValue()); -+ return; -+ } -+ BlockPos blockPos = path.getTarget(); -+ Optional> optional2 = poiManager.getType(blockPos); -+ if (optional2.isPresent()) { -+ walkTarget.set(new WalkTarget(blockPos, speed, 1)); -+ DebugPackets.sendPoiTicketCountPacket(world, blockPos); -+ } -+ }); -+ } else { -+ // Kaiiju end - Path path = AcquirePoi.findPathToPois(entity, set); - if (path != null && path.canReach()) { - BlockPos blockPos = path.getTarget(); -@@ -70,6 +91,7 @@ public class SetClosestHomeAsWalkTarget { - return entry.getLongValue() < mutableLong.getValue(); - }); - } -+ } // Kaiiju - async path processing ++ // wait on the path to be processed ++ AsyncPathProcessor.awaitProcessing(entity, possiblePath, path -> { ++ if (path == null || !path.canReach() || mutableInt.getValue() < 5) { // read canReach check ++ long2LongMap.long2LongEntrySet().removeIf((entry) -> entry.getLongValue() < mutableLong.getValue()); ++ return; ++ } ++ BlockPos blockPos = path.getTarget(); ++ Optional> optional2 = poiManager.getType(blockPos); ++ if (optional2.isPresent()) { ++ walkTarget.set(new WalkTarget(blockPos, speed, 1)); ++ DebugPackets.sendPoiTicketCountPacket(world, blockPos); ++ } ++ }); ++ } else { ++ // Kaiiju end + Path path = AcquirePoi.findPathToPois(entity, set); + if (path != null && path.canReach()) { + BlockPos blockPos = path.getTarget(); +@@ -71,6 +92,7 @@ public class SetClosestHomeAsWalkTarget { + } else if (mutableInt.getValue() < 5) { + long2LongMap.long2LongEntrySet().removeIf(entry -> entry.getLongValue() < mutableLong.getValue()); + } ++ } // Kaiiju - async path processing - return true; - } else { + return true; + } else { diff --git a/src/main/java/net/minecraft/world/entity/ai/goal/DoorInteractGoal.java b/src/main/java/net/minecraft/world/entity/ai/goal/DoorInteractGoal.java -index 6771f2dc974317b6b152288bf41d1a95bc78a8e4..7a641747b17164b09bb8483cda7f69d11741a94a 100644 +index 74aca307b4ebffe4e33c4fca3e07c23ca87622ac..37e61aa259f573cc5b5844026af99f3c72945f34 100644 --- a/src/main/java/net/minecraft/world/entity/ai/goal/DoorInteractGoal.java +++ b/src/main/java/net/minecraft/world/entity/ai/goal/DoorInteractGoal.java -@@ -57,7 +57,7 @@ public abstract class DoorInteractGoal extends Goal { +@@ -56,7 +56,7 @@ public abstract class DoorInteractGoal extends Goal { } else { GroundPathNavigation groundPathNavigation = (GroundPathNavigation)this.mob.getNavigation(); Path path = groundPathNavigation.getPath(); - if (path != null && !path.isDone() && groundPathNavigation.canOpenDoors()) { + if (path != null && path.isProcessed() && !path.isDone() && groundPathNavigation.canOpenDoors()) { // Kaiiju - async pathfinding - ensure path is processed - for(int i = 0; i < Math.min(path.getNextNodeIndex() + 2, path.getNodeCount()); ++i) { + for (int i = 0; i < Math.min(path.getNextNodeIndex() + 2, path.getNodeCount()); i++) { Node node = path.getNode(i); this.doorPos = new BlockPos(node.x, node.y + 1, node.z); diff --git a/src/main/java/net/minecraft/world/entity/ai/navigation/AmphibiousPathNavigation.java b/src/main/java/net/minecraft/world/entity/ai/navigation/AmphibiousPathNavigation.java -index 9d3b32c852d660356e0f16d4cc10072b1c603e64..fa843dd6fb4af72ab212d1d3d8440649240dc162 100644 +index ee38e447a810094d2253b85714b74282a4b4c2bc..abcb8a48cf162dd7bf553097ca045b919e7c408a 100644 --- a/src/main/java/net/minecraft/world/entity/ai/navigation/AmphibiousPathNavigation.java +++ b/src/main/java/net/minecraft/world/entity/ai/navigation/AmphibiousPathNavigation.java @@ -6,16 +6,34 @@ import net.minecraft.world.level.Level; @@ -320,7 +318,7 @@ index 9d3b32c852d660356e0f16d4cc10072b1c603e64..fa843dd6fb4af72ab212d1d3d8440649 } 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 e35c38feb62c3345d82636081decc09db9f061ab..7c5a9cbff031c0f78c50f3e31c0cea661e3c83aa 100644 +index a3e0c5af4cc9323c02e88e768cbda9e46854aea1..44ef3262c91c25c956500e1e460e383c6fb60b62 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 +365,7 @@ index e35c38feb62c3345d82636081decc09db9f061ab..7c5a9cbff031c0f78c50f3e31c0cea66 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 47de460ff5435ea6712c800c77093126908d0fce..278f05d3d27d32e94e049f50d63965a3351619fe 100644 +index 74ae984ac41bcdd2cc45f1bec461cdc5f69977c6..2cf7e2d42a830c1b1cfd3bafd7b22803572e12bd 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 +405,7 @@ index 47de460ff5435ea6712c800c77093126908d0fce..278f05d3d27d32e94e049f50d63965a3 } 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 33983ed67ad6b0d25d2ae00e03415bda940584eb..89b97f322ba32b24e87d850143f4434a7e00699a 100644 +index cf57d0f4636ec3f93992626f06fe9c10c7cac19a..54d4260636409bcb06aaf850d7de653bdb12f177 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 +417,7 @@ index 33983ed67ad6b0d25d2ae00e03415bda940584eb..89b97f322ba32b24e87d850143f4434a public abstract class PathNavigation { private static final int MAX_TIME_RECOMPUTE = 20; -@@ -153,6 +155,10 @@ public abstract class PathNavigation { +@@ -152,6 +154,10 @@ public abstract class PathNavigation { return null; } else if (!this.canUpdatePath()) { return null; @@ -430,7 +428,7 @@ index 33983ed67ad6b0d25d2ae00e03415bda940584eb..89b97f322ba32b24e87d850143f4434a } else if (this.path != null && !this.path.isDone() && positions.contains(this.targetPos)) { return this.path; } else { -@@ -177,11 +183,29 @@ public abstract class PathNavigation { +@@ -176,11 +182,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 +458,7 @@ index 33983ed67ad6b0d25d2ae00e03415bda940584eb..89b97f322ba32b24e87d850143f4434a return path; } -@@ -228,8 +252,8 @@ public abstract class PathNavigation { +@@ -227,8 +251,8 @@ public abstract class PathNavigation { if (this.isDone()) { return false; } else { @@ -471,7 +469,7 @@ index 33983ed67ad6b0d25d2ae00e03415bda940584eb..89b97f322ba32b24e87d850143f4434a return false; } else { this.speedModifier = speed; -@@ -252,6 +276,7 @@ public abstract class PathNavigation { +@@ -251,6 +275,7 @@ public abstract class PathNavigation { if (this.hasDelayedRecomputation) { this.recomputePath(); } @@ -479,7 +477,7 @@ index 33983ed67ad6b0d25d2ae00e03415bda940584eb..89b97f322ba32b24e87d850143f4434a if (!this.isDone()) { if (this.canUpdatePath()) { -@@ -278,6 +303,7 @@ public abstract class PathNavigation { +@@ -277,6 +302,7 @@ public abstract class PathNavigation { } protected void followThePath() { @@ -494,10 +492,10 @@ index 33983ed67ad6b0d25d2ae00e03415bda940584eb..89b97f322ba32b24e87d850143f4434a - } else if (this.path != null && !this.path.isDone() && this.path.getNodeCount() != 0) { + } else if (this.path != null && this.path.isProcessed() && !this.path.isDone() && this.path.getNodeCount() != 0) { // Kaiiju - petal - Skip if not processed Node node = this.path.getEndNode(); - Vec3 vec3 = new Vec3(((double)node.x + this.mob.getX()) / 2.0D, ((double)node.y + this.mob.getY()) / 2.0D, ((double)node.z + this.mob.getZ()) / 2.0D); + Vec3 vec3 = new Vec3(((double)node.x + this.mob.getX()) / 2.0, ((double)node.y + this.mob.getY()) / 2.0, ((double)node.z + this.mob.getZ()) / 2.0); return pos.closerToCenterThan(vec3, (double)(this.path.getNodeCount() - this.path.getNextNodeIndex())); diff --git a/src/main/java/net/minecraft/world/entity/ai/navigation/WaterBoundPathNavigation.java b/src/main/java/net/minecraft/world/entity/ai/navigation/WaterBoundPathNavigation.java -index ee8543afbbd681bf327a353530a7a635aa5ef592..8442ca52fe7fff47c3cc24ebb6d40e4f40bb85f3 100644 +index ce7398a617abe6e800c1e014b3ac5c970eb15c8a..0ccd291a2ed58d7a065f753a0211375203f87d18 100644 --- a/src/main/java/net/minecraft/world/entity/ai/navigation/WaterBoundPathNavigation.java +++ b/src/main/java/net/minecraft/world/entity/ai/navigation/WaterBoundPathNavigation.java @@ -7,6 +7,8 @@ import net.minecraft.world.level.Level; @@ -537,7 +535,7 @@ index ee8543afbbd681bf327a353530a7a635aa5ef592..8442ca52fe7fff47c3cc24ebb6d40e4f } diff --git a/src/main/java/net/minecraft/world/entity/ai/sensing/NearestBedSensor.java b/src/main/java/net/minecraft/world/entity/ai/sensing/NearestBedSensor.java -index 8db20db72cd51046213625fac46c35854c59ec5d..dbe9d592aa8b7c64ed375cfb8d135c6f84e0bd75 100644 +index 9104d7010bda6f9f73b478c11490ef9c53f76da2..c7b6f77f368518b62326f6b25979d1bd180feae0 100644 --- a/src/main/java/net/minecraft/world/entity/ai/sensing/NearestBedSensor.java +++ b/src/main/java/net/minecraft/world/entity/ai/sensing/NearestBedSensor.java @@ -7,7 +7,7 @@ import it.unimi.dsi.fastutil.longs.Long2LongOpenHashMap; @@ -560,7 +558,7 @@ index 8db20db72cd51046213625fac46c35854c59ec5d..dbe9d592aa8b7c64ed375cfb8d135c6f @@ -57,6 +58,25 @@ public class NearestBedSensor extends Sensor { java.util.List, BlockPos>> poiposes = new java.util.ArrayList<>(); // don't ask me why it's unbounded. ask mojang. - io.papermc.paper.util.PoiAccess.findAnyPoiPositions(poiManager, type -> type.is(PoiTypes.HOME), predicate, entity.blockPosition(), 48, PoiManager.Occupancy.ANY, false, Integer.MAX_VALUE, poiposes); + io.papermc.paper.util.PoiAccess.findAnyPoiPositions(poiManager, type -> type.is(PoiTypes.HOME), predicate, entity.blockPosition(), world.purpurConfig.villagerNearestBedSensorSearchRadius, PoiManager.Occupancy.ANY, false, Integer.MAX_VALUE, poiposes); // Purpur + // Kaiiju start - await on async path processing + if (org.dreeam.leaf.config.modules.async.AsyncPathfinding.enabled) { + Path possiblePath = AcquirePoi.findPathToPois(entity, new java.util.HashSet<>(poiposes)); @@ -583,14 +581,14 @@ index 8db20db72cd51046213625fac46c35854c59ec5d..dbe9d592aa8b7c64ed375cfb8d135c6f Path path = AcquirePoi.findPathToPois(entity, new java.util.HashSet<>(poiposes)); // Paper end - optimise POI access if (path != null && path.canReach()) { -@@ -70,6 +90,7 @@ public class NearestBedSensor extends Sensor { - return entry.getLongValue() < this.lastUpdate; - }); +@@ -68,6 +88,7 @@ public class NearestBedSensor extends Sensor { + } else if (this.triedCount < 5) { + this.batchCache.long2LongEntrySet().removeIf(entry -> entry.getLongValue() < this.lastUpdate); } + } // Kaiiju - async path processing - } } + } 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 997ab942be9f742804041b07d607e7dd6473ba96..9ef7be84999ab0ec39d2b58a48cdaebf42db10c9 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Bee.java @@ -614,7 +612,7 @@ index 997ab942be9f742804041b07d607e7dd6473ba96..9ef7be84999ab0ec39d2b58a48cdaebf } } diff --git a/src/main/java/net/minecraft/world/entity/animal/frog/Frog.java b/src/main/java/net/minecraft/world/entity/animal/frog/Frog.java -index 819445535895fbf79b99222bc6bf33cbd9089813..2957a7617acae18e23d8ffb90ed5c790681da9c1 100644 +index 44b17f1c6367b729d6e8f7f45c5689a12d6b3034..bde190fd608262fcf9eb272316c4984c918252ed 100644 --- a/src/main/java/net/minecraft/world/entity/animal/frog/Frog.java +++ b/src/main/java/net/minecraft/world/entity/animal/frog/Frog.java @@ -41,7 +41,6 @@ import net.minecraft.world.entity.VariantHolder; @@ -634,7 +632,7 @@ index 819445535895fbf79b99222bc6bf33cbd9089813..2957a7617acae18e23d8ffb90ed5c790 public class Frog extends Animal implements VariantHolder { public static final Ingredient TEMPTATION_ITEM = Ingredient.of(Items.SLIME_BALL); -@@ -434,6 +435,17 @@ public class Frog extends Animal implements VariantHolder { +@@ -467,6 +468,17 @@ public class Frog extends Animal implements VariantHolder { super(frog, world); } @@ -652,7 +650,7 @@ index 819445535895fbf79b99222bc6bf33cbd9089813..2957a7617acae18e23d8ffb90ed5c790 @Override public boolean canCutCorner(BlockPathTypes nodeType) { return nodeType != BlockPathTypes.WATER_BORDER && super.canCutCorner(nodeType); -@@ -443,6 +455,11 @@ public class Frog extends Animal implements VariantHolder { +@@ -476,6 +488,11 @@ public class Frog extends Animal implements VariantHolder { protected PathFinder createPathFinder(int range) { this.nodeEvaluator = new Frog.FrogNodeEvaluator(true); this.nodeEvaluator.setCanPassDoors(true); @@ -747,10 +745,10 @@ index 07fa613d75f3659145945245926e9068057e3ed2..df0d0868c11c26b2cadc1a07196a0191 @Override protected float distance(Node a, Node b) { diff --git a/src/main/java/net/minecraft/world/level/block/ShulkerBoxBlock.java b/src/main/java/net/minecraft/world/level/block/ShulkerBoxBlock.java -index 42407c5c0c09cd9d19bc7af92af8868bb038c686..8e7f7e4057940865a92d43fa081e9d41df02a52b 100644 +index 62ded304c08678750ae8c56c7de876ac5f39940b..4989b597b451e60da38f6e5ec4f790104775ce3e 100644 --- a/src/main/java/net/minecraft/world/level/block/ShulkerBoxBlock.java +++ b/src/main/java/net/minecraft/world/level/block/ShulkerBoxBlock.java -@@ -254,8 +254,13 @@ public class ShulkerBoxBlock extends BaseEntityBlock { +@@ -243,8 +243,13 @@ public class ShulkerBoxBlock extends BaseEntityBlock { @Override public VoxelShape getShape(BlockState state, BlockGetter world, BlockPos pos, CollisionContext context) { @@ -765,7 +763,7 @@ index 42407c5c0c09cd9d19bc7af92af8868bb038c686..8e7f7e4057940865a92d43fa081e9d41 @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 3049edb5a8b5967e5242a3896b23665888eb3472..0da9acd785cf785d82be7aab0a1e2bfd70c62998 100644 +index d9d0fff9962131808d54cca20f209df50b8e4af1..f2dcbb40ed43e6ddf6f3dc27fcff04f7962312aa 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 { @@ -784,9 +782,9 @@ index 3049edb5a8b5967e5242a3896b23665888eb3472..0da9acd785cf785d82be7aab0a1e2bfd + // Kaiiju end + public void advance() { - ++this.nextNodeIndex; + this.nextNodeIndex++; } -@@ -101,6 +112,7 @@ public class Path { +@@ -100,6 +111,7 @@ public class Path { } public boolean sameAs(@Nullable Path o) { @@ -795,7 +793,7 @@ index 3049edb5a8b5967e5242a3896b23665888eb3472..0da9acd785cf785d82be7aab0a1e2bfd 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 61d5fe8e5344a6cb94d427859488c34821c8a3f6..ae9e47036c5de04383ea798f6c3899686f2243cb 100644 +index ad8b94cd37eb00c50af5b9c51c35b098a9ad67a3..d36cb87bd9d1b2127f404130127864f44852170e 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 @@ @@ -912,16 +910,16 @@ index 61d5fe8e5344a6cb94d427859488c34821c8a3f6..ae9e47036c5de04383ea798f6c389968 // Set set = positions.keySet(); startNode.g = 0.0F; startNode.h = this.getBestH(startNode, positions); // Paper - optimize collection -@@ -88,7 +131,7 @@ public class PathFinder { +@@ -87,7 +130,7 @@ public class PathFinder { } if (!(node.distanceTo(startNode) >= followRange)) { - int k = this.nodeEvaluator.getNeighbors(this.neighbors, node); + int k = nodeEvaluator.getNeighbors(this.neighbors, node); // Kaiiju - petal - use provided nodeEvaluator - for(int l = 0; l < k; ++l) { + for (int l = 0; l < k; l++) { Node node2 = this.neighbors[l]; -@@ -120,6 +163,7 @@ public class PathFinder { +@@ -119,6 +162,7 @@ public class PathFinder { if (best == null || comparator.compare(path, best) < 0) best = path; } @@ -930,7 +928,7 @@ index 61d5fe8e5344a6cb94d427859488c34821c8a3f6..ae9e47036c5de04383ea798f6c389968 // 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 +index 074e9c7f58adebadc3076bfc4b63adea8b1d521d..3cb00814eb7e248104e9a6bd016b6c342ba83220 100644 --- a/src/main/java/net/minecraft/world/level/pathfinder/SwimNodeEvaluator.java +++ b/src/main/java/net/minecraft/world/level/pathfinder/SwimNodeEvaluator.java @@ -16,7 +16,7 @@ import net.minecraft.world.level.block.state.BlockState; diff --git a/patches/server/0040-Petal-Multithreaded-Tracker.patch b/patches/server/0040-Petal-Multithreaded-Tracker.patch index 204d0024..7a636021 100644 --- a/patches/server/0040-Petal-Multithreaded-Tracker.patch +++ b/patches/server/0040-Petal-Multithreaded-Tracker.patch @@ -191,7 +191,7 @@ index 546028b42544bd62578e415faa245559a373a289..29ea09f27f4b0a7f1ab6075e68c73798 // Paper start - remove allocation of Vec3D here // Vec3 vec3d = player.position().subtract(this.entity.position()); diff --git a/src/main/java/net/minecraft/server/level/ServerBossEvent.java b/src/main/java/net/minecraft/server/level/ServerBossEvent.java -index ca42c2642a729b90d22b968af7258f3aee72e14b..fe03f0f55de978721a9d3d8446bdead2ec82f70d 100644 +index 4f91107f9ae42f96c060c310596db9aa869a8dbc..faad96f04af2e368f0276ade417dd1ba7841270b 100644 --- a/src/main/java/net/minecraft/server/level/ServerBossEvent.java +++ b/src/main/java/net/minecraft/server/level/ServerBossEvent.java @@ -13,7 +13,7 @@ import net.minecraft.util.Mth; @@ -263,10 +263,10 @@ index 515e3f444e317de1d82421ad414c1ac10d4668ab..60e8bfc89cfb92e2f7d4860b11c16b3b set.clear(); diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index 165b9f9ede6eec3e5667a2e653988f0e69ddb09f..0526ec7809f4937af85494679317f5fcbb6d8893 100644 +index a04ea23c295b493984eb841253fcb0eb4ad26342..667e2f0ce65c457fc656983e305be7e5d91718f1 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java -@@ -2633,7 +2633,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -2644,7 +2644,7 @@ public class ServerLevel extends Level implements WorldGenLevel { @Override public LevelEntityGetter getEntities() { diff --git a/patches/server/0041-Petal-reduce-work-done-by-game-event-system.patch b/patches/server/0041-Petal-reduce-work-done-by-game-event-system.patch index f27f77e6..c6e84657 100644 --- a/patches/server/0041-Petal-reduce-work-done-by-game-event-system.patch +++ b/patches/server/0041-Petal-reduce-work-done-by-game-event-system.patch @@ -38,7 +38,7 @@ index 83481539e058e5f428d9951e409fed62ef159e5c..ef2b60aa7686c92d27ce146ef320e05e LivingEntity entityliving1 = deadEntity.getLastHurtByMob(); 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 221a4a3fbeac621ec593c7ba44b83f4b247a5589..2b2a40a4b33d4cafa521c607c06b13ce9f04acfb 100644 +index f52b314dd0ed83682b6a60c66b21eefd2cefb793..3a13de668a90d50b18214a91fd92d8b287bd76da 100644 --- a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java +++ b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java @@ -80,7 +80,18 @@ public class LevelChunk extends ChunkAccess { @@ -107,7 +107,7 @@ index 221a4a3fbeac621ec593c7ba44b83f4b247a5589..2b2a40a4b33d4cafa521c607c06b13ce private void removeBlockEntityTicker(BlockPos pos) { diff --git a/src/main/java/net/minecraft/world/level/gameevent/EuclideanGameEventListenerRegistry.java b/src/main/java/net/minecraft/world/level/gameevent/EuclideanGameEventListenerRegistry.java -index f30b2e964acdf44014065bd491a577040e61a2c2..7a69c96f255f0b925445dfb6790d27711fbf2b89 100644 +index 95c840f9bee51adef9bb00da5f53a5b011c0575e..1259d5d2ce58dd24b77a01d175a2037c17ed7791 100644 --- a/src/main/java/net/minecraft/world/level/gameevent/EuclideanGameEventListenerRegistry.java +++ b/src/main/java/net/minecraft/world/level/gameevent/EuclideanGameEventListenerRegistry.java @@ -13,8 +13,8 @@ import net.minecraft.world.phys.Vec3; @@ -139,16 +139,16 @@ index f30b2e964acdf44014065bd491a577040e61a2c2..7a69c96f255f0b925445dfb6790d2771 } else { this.listeners.remove(listener); } -@@ -66,7 +66,7 @@ public class EuclideanGameEventListenerRegistry implements GameEventListenerRegi +@@ -65,7 +65,7 @@ public class EuclideanGameEventListenerRegistry implements GameEventListenerRegi - while(iterator.hasNext()) { + while (iterator.hasNext()) { GameEventListener gameEventListener = iterator.next(); - if (this.listenersToRemove.remove(gameEventListener)) { + if (false) { // Leaf - petal - Disallow concurrent modification iterator.remove(); } else { Optional optional = getPostableListenerPosition(this.level, pos, gameEventListener); -@@ -80,6 +80,8 @@ public class EuclideanGameEventListenerRegistry implements GameEventListenerRegi +@@ -79,6 +79,8 @@ public class EuclideanGameEventListenerRegistry implements GameEventListenerRegi this.processing = false; } @@ -157,7 +157,7 @@ index f30b2e964acdf44014065bd491a577040e61a2c2..7a69c96f255f0b925445dfb6790d2771 if (!this.listenersToAdd.isEmpty()) { this.listeners.addAll(this.listenersToAdd); this.listenersToAdd.clear(); -@@ -89,6 +91,8 @@ public class EuclideanGameEventListenerRegistry implements GameEventListenerRegi +@@ -88,6 +90,8 @@ public class EuclideanGameEventListenerRegistry implements GameEventListenerRegi this.listeners.removeAll(this.listenersToRemove); this.listenersToRemove.clear(); } diff --git a/patches/server/0045-Faster-Natural-Spawning.patch b/patches/server/0045-Faster-Natural-Spawning.patch index 22f63695..1b8848b3 100644 --- a/patches/server/0045-Faster-Natural-Spawning.patch +++ b/patches/server/0045-Faster-Natural-Spawning.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Faster Natural Spawning diff --git a/src/main/java/net/minecraft/util/RandomSource.java b/src/main/java/net/minecraft/util/RandomSource.java -index ff1ad1024419182f7f3de578442c1c033d4c9ebb..5e51a1c79811291a740ad4d5e79a7d672f4a2ab6 100644 +index 9c6f5b55b1f1376fa75e216cd366ee47c79fafc4..7762c8186035fdf60e11d9f1844516b61f442206 100644 --- a/src/main/java/net/minecraft/util/RandomSource.java +++ b/src/main/java/net/minecraft/util/RandomSource.java -@@ -16,6 +16,12 @@ public interface RandomSource { +@@ -15,6 +15,12 @@ public interface RandomSource { return create(RandomSupport.generateUniqueSeed()); } @@ -18,11 +18,11 @@ index ff1ad1024419182f7f3de578442c1c033d4c9ebb..5e51a1c79811291a740ad4d5e79a7d67 + } + // Leaf end + - /** @deprecated */ @Deprecated static RandomSource createThreadSafe() { + return new ThreadSafeLegacyRandomSource(RandomSupport.generateUniqueSeed()); diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index 14668a88d741de97817cdd7845dc9582610f590d..e3f64fdfddb47b6bcdd3bf1ed7d31d540a555c90 100644 +index 998f1fbd581acc3fb654d539ebb25dcea5f110e0..ba6ae356130f0147f3cc7886537c52b14926521f 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java @@ -126,6 +126,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { @@ -55,7 +55,7 @@ index 31003588de8bef9952a688c486049077328e89a3..9c4a8b6a4371bf8b1af05fb180b8fee0 } diff --git a/src/main/java/net/minecraft/world/level/levelgen/RandomSupport.java b/src/main/java/net/minecraft/world/level/levelgen/RandomSupport.java -index 36f9d68b70fbd1cd3790a9bb5a729a11da8cbf83..458ef9e6f68f89f34a9e1bd74b50d52eeb93342e 100644 +index 4327bee689e986561d126d6018d3fee7d2623176..e2958cbcac0433ae5be186699ce5f9b57cf7e95c 100644 --- a/src/main/java/net/minecraft/world/level/levelgen/RandomSupport.java +++ b/src/main/java/net/minecraft/world/level/levelgen/RandomSupport.java @@ -5,6 +5,7 @@ import com.google.common.base.Charsets; @@ -66,8 +66,8 @@ index 36f9d68b70fbd1cd3790a9bb5a729a11da8cbf83..458ef9e6f68f89f34a9e1bd74b50d52e import java.util.concurrent.atomic.AtomicLong; public final class RandomSupport { -@@ -43,6 +44,12 @@ public final class RandomSupport { - }) ^ System.nanoTime(); +@@ -41,6 +42,12 @@ public final class RandomSupport { + return SEED_UNIQUIFIER.updateAndGet(seedUniquifier -> seedUniquifier * 1181783497276652981L) ^ System.nanoTime(); } + // Leaf start - Generate random seed faster diff --git a/patches/server/0050-Configurable-movement-speed-of-more-entities.patch b/patches/server/0050-Configurable-movement-speed-of-more-entities.patch index 719f01e7..09cd0abf 100644 --- a/patches/server/0050-Configurable-movement-speed-of-more-entities.patch +++ b/patches/server/0050-Configurable-movement-speed-of-more-entities.patch @@ -113,7 +113,7 @@ index feba8a264bae656244f60296d0511a8046297f73..2a24928fc4509ac3603f7e5ce574fed8 @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 cd73f0e40e5010e3069330ae66120dace63cde56..f6338904ca0961cfd67326908e9cf72e37c6e86e 100644 +index bf92f6c9d1ecff3e56e5bb904c7af9e793823e93..d37bc0dde078c2246474eadd19f6ebcc2a06fb17 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -1530,6 +1530,7 @@ public class PurpurWorldConfig { @@ -148,7 +148,7 @@ index cd73f0e40e5010e3069330ae66120dace63cde56..f6338904ca0961cfd67326908e9cf72e } public boolean illusionerRidable = false; -@@ -3119,6 +3123,7 @@ public class PurpurWorldConfig { +@@ -3123,6 +3127,7 @@ public class PurpurWorldConfig { public boolean zombieTakeDamageFromWater = false; public boolean zombieAlwaysDropExp = false; public double zombieHeadVisibilityPercent = 0.5D; @@ -156,7 +156,7 @@ index cd73f0e40e5010e3069330ae66120dace63cde56..f6338904ca0961cfd67326908e9cf72e private void zombieSettings() { zombieRidable = getBoolean("mobs.zombie.ridable", zombieRidable); zombieRidableInWater = getBoolean("mobs.zombie.ridable-in-water", zombieRidableInWater); -@@ -3138,6 +3143,7 @@ public class PurpurWorldConfig { +@@ -3142,6 +3147,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 cd73f0e40e5010e3069330ae66120dace63cde56..f6338904ca0961cfd67326908e9cf72e } public boolean zombieHorseRidable = false; -@@ -3186,6 +3192,7 @@ public class PurpurWorldConfig { +@@ -3190,6 +3196,7 @@ public class PurpurWorldConfig { public int zombieVillagerCuringTimeMax = 6000; public boolean zombieVillagerCureEnabled = true; public boolean zombieVillagerAlwaysDropExp = false; @@ -172,7 +172,7 @@ index cd73f0e40e5010e3069330ae66120dace63cde56..f6338904ca0961cfd67326908e9cf72e private void zombieVillagerSettings() { zombieVillagerRidable = getBoolean("mobs.zombie_villager.ridable", zombieVillagerRidable); zombieVillagerRidableInWater = getBoolean("mobs.zombie_villager.ridable-in-water", zombieVillagerRidableInWater); -@@ -3205,6 +3212,7 @@ public class PurpurWorldConfig { +@@ -3209,6 +3216,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 cd73f0e40e5010e3069330ae66120dace63cde56..f6338904ca0961cfd67326908e9cf72e } public boolean zombifiedPiglinRidable = false; -@@ -3218,6 +3226,7 @@ public class PurpurWorldConfig { +@@ -3222,6 +3230,7 @@ public class PurpurWorldConfig { public boolean zombifiedPiglinCountAsPlayerKillWhenAngry = true; public boolean zombifiedPiglinTakeDamageFromWater = false; public boolean zombifiedPiglinAlwaysDropExp = false; @@ -188,7 +188,7 @@ index cd73f0e40e5010e3069330ae66120dace63cde56..f6338904ca0961cfd67326908e9cf72e private void zombifiedPiglinSettings() { zombifiedPiglinRidable = getBoolean("mobs.zombified_piglin.ridable", zombifiedPiglinRidable); zombifiedPiglinRidableInWater = getBoolean("mobs.zombified_piglin.ridable-in-water", zombifiedPiglinRidableInWater); -@@ -3235,6 +3244,7 @@ public class PurpurWorldConfig { +@@ -3239,6 +3248,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/0052-Faster-sequencing-of-futures-for-chunk-structure-gen.patch b/patches/server/0052-Faster-sequencing-of-futures-for-chunk-structure-gen.patch index 1bdcfe92..8380304d 100644 --- a/patches/server/0052-Faster-sequencing-of-futures-for-chunk-structure-gen.patch +++ b/patches/server/0052-Faster-sequencing-of-futures-for-chunk-structure-gen.patch @@ -7,18 +7,16 @@ Replace `thenApply` with `thenCompose`. Once one task is completed then the next to prevent blocking threads while waiting to complete all tasks diff --git a/src/main/java/net/minecraft/Util.java b/src/main/java/net/minecraft/Util.java -index b40864e41e1506884fdefefbf3cf4833a8f706c3..4b52a487296c8ea4d4159ec74582f13eb3ffbe36 100644 +index 01a12f4d6f3c2f09bffc78692443b9fd391db45a..da6a9d2e315bf769e762b70599eeff25f6540728 100644 --- a/src/main/java/net/minecraft/Util.java +++ b/src/main/java/net/minecraft/Util.java -@@ -409,9 +409,11 @@ public class Util { +@@ -410,7 +410,11 @@ public class Util { return futures.get(0).thenApply(List::of); } else { CompletableFuture completableFuture = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])); -- return completableFuture.thenApply((void_) -> { -- return futures.stream().map(CompletableFuture::join).toList(); -- }); +- return completableFuture.thenApply(void_ -> futures.stream().map(CompletableFuture::join).toList()); + // Leaf start - Faster sequencing of futures for chunk structure gen -+ return completableFuture.thenCompose((void_) -> ++ return completableFuture.thenCompose(void_ -> + CompletableFuture.supplyAsync(() -> + futures.stream().map(CompletableFuture::join).toList())); + // Leaf end diff --git a/patches/server/0054-LinearPurpur-Add-Linear-region-format.patch b/patches/server/0054-LinearPurpur-Add-Linear-region-format.patch index 1f40d49e..d5db0da4 100644 --- a/patches/server/0054-LinearPurpur-Add-Linear-region-format.patch +++ b/patches/server/0054-LinearPurpur-Add-Linear-region-format.patch @@ -17,14 +17,14 @@ 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 5cd5ed2053bf8538c7733b8cfb784827f879c4c8..90d705a319323c82a9e19cf70c46c80354a7f3f2 100644 +index 544e9549cd5721728746f0995f8c0d5aba8750b0..e587b885772cc7cb4f9d298e2adea2c3417233cb 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -32,6 +32,8 @@ dependencies { // Leaf end // Paper start -+ implementation("com.github.luben:zstd-jni:1.5.5-11") // LinearPurpur ++ implementation("com.github.luben:zstd-jni:1.5.6-2") // 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 @@ -118,7 +118,7 @@ index 8dffb330b474b830d2f816ecf8be2e8d2e4556cd..bed46642b59d38e58e6aa663a47cbfc9 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 ad24801339c4b5a4b4035aa85d5c45b3b309e985..8adca25614bb2ff999a2372e80e93402accd761f 100644 +index ad0be84c4f8eec371d7d0dacd3c5a3622e82e726..7ff74086641bdaaa211e7cc00e169b93e146fb39 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -866,7 +866,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop { @@ -611,25 +611,35 @@ index fe312b1aef579cb4bf81bdd967cf72ff880d7505..8ee307a453e79e59444f5c5b8b45ffc7 regionfile.flush(); } diff --git a/src/main/java/net/minecraft/world/level/chunk/storage/SectionStorage.java b/src/main/java/net/minecraft/world/level/chunk/storage/SectionStorage.java -index 4aac1979cf57300825a999c876fcf24d3170e68e..79a389b9a139f6838adf32d3b5d4d7ecdd87bcc3 100644 +index 4ac5024936987c15f927e3148af4bfa57228ad1e..bbb3e50e82f09e234ec48b8d462b9d9bc8680684 100644 --- a/src/main/java/net/minecraft/world/level/chunk/storage/SectionStorage.java +++ b/src/main/java/net/minecraft/world/level/chunk/storage/SectionStorage.java -@@ -47,8 +47,8 @@ public class SectionStorage extends RegionFileStorage implements AutoCloseabl - public final RegistryAccess registryAccess; // Paper - rewrite chunk system +@@ -48,6 +48,11 @@ public class SectionStorage extends RegionFileStorage implements AutoCloseabl protected final LevelHeightAccessor levelHeightAccessor; -- public SectionStorage(Path path, Function> codecFactory, Function factory, DataFixer dataFixer, DataFixTypes dataFixTypes, boolean dsync, RegistryAccess dynamicRegistryManager, LevelHeightAccessor world) { + public SectionStorage( ++ // LinearPurpur start ++ org.purpurmc.purpur.region.RegionFileFormat format, ++ int linearCompression, ++ boolean linearCrashOnBrokenSymlink, ++ // LinearPurpur end + Path path, + Function> codecFactory, + Function factory, +@@ -57,7 +62,7 @@ public class SectionStorage extends RegionFileStorage implements AutoCloseabl + RegistryAccess dynamicRegistryManager, + LevelHeightAccessor world + ) { - super(path, dsync); // Paper - remove mojang I/O thread -+ public SectionStorage(org.purpurmc.purpur.region.RegionFileFormat format, int linearCompression, boolean linearCrashOnBrokenSymlink, Path path, Function> codecFactory, Function factory, DataFixer dataFixer, DataFixTypes dataFixTypes, boolean dsync, RegistryAccess dynamicRegistryManager, LevelHeightAccessor world) { // LinearPurpur + super(format, linearCompression, linearCrashOnBrokenSymlink, path, dsync); // Paper - remove mojang I/O thread // LinearPurpur this.codec = codecFactory; 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 593119cefb6664f2b0b03b684103440b27696e37..485bf453be799d1cb4a3a10a831db7da5db64b3b 100644 +index 43aea7cf6e2398effdaed765559942031f049fd3..e8d262c1795a5015948259132e201ba522000b25 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -@@ -573,7 +573,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -574,7 +574,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { world.getChunk(x, z); // make sure we're at ticket level 32 or lower return true; } @@ -663,7 +673,7 @@ index 0c8bcfbe35f9133a32a31163e5bf2f04786c77a0..63b5a0993207c55357ac507c974dea77 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 f6338904ca0961cfd67326908e9cf72e37c6e86e..1ac5a18e2b56770fe1b9b27b56e4a88fe27a27fe 100644 +index d37bc0dde078c2246474eadd19f6ebcc2a06fb17..e36059ceb31a5b852af0782181e16c1a1309e105 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/0056-Plazma-Add-missing-purpur-configuration-options.patch b/patches/server/0056-Plazma-Add-missing-purpur-configuration-options.patch index f86c73c3..4db5ee45 100644 --- a/patches/server/0056-Plazma-Add-missing-purpur-configuration-options.patch +++ b/patches/server/0056-Plazma-Add-missing-purpur-configuration-options.patch @@ -60,10 +60,10 @@ index a215c5a42943fcb97448e3ed67467e61efb0d28d..7bb25b1a8919abe4b9b65b6b5d54642a @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/frog/Frog.java b/src/main/java/net/minecraft/world/entity/animal/frog/Frog.java -index 2957a7617acae18e23d8ffb90ed5c790681da9c1..4da22d7e536706f2ce892d15435b56a63c11b544 100644 +index bde190fd608262fcf9eb272316c4984c918252ed..ecedc765b08aa6c2f11e48eac5c601baf6281ba9 100644 --- a/src/main/java/net/minecraft/world/entity/animal/frog/Frog.java +++ b/src/main/java/net/minecraft/world/entity/animal/frog/Frog.java -@@ -137,6 +137,23 @@ public class Frog extends Animal implements VariantHolder { +@@ -162,6 +162,23 @@ public class Frog extends Animal implements VariantHolder { public float getJumpPower() { return (getRider() != null && isControllable()) ? level().purpurConfig.frogRidableJumpHeight * this.getBlockJumpFactor() : super.getJumpPower(); } @@ -209,7 +209,7 @@ index 63b5a0993207c55357ac507c974dea77206e80f4..e45c11bf2c42e6d57f803349d8ca6936 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 1ac5a18e2b56770fe1b9b27b56e4a88fe27a27fe..a4d60637dabcb57e0a559779455603752df03753 100644 +index e36059ceb31a5b852af0782181e16c1a1309e105..af6190075cc0ffa6e8473491186e7a7958376d59 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -1193,7 +1193,15 @@ public class PurpurWorldConfig { @@ -290,7 +290,7 @@ index 1ac5a18e2b56770fe1b9b27b56e4a88fe27a27fe..a4d60637dabcb57e0a55977945560375 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 { +@@ -3003,7 +3041,15 @@ public class PurpurWorldConfig { public boolean wardenRidable = false; public boolean wardenRidableInWater = true; public boolean wardenControllable = true; diff --git a/patches/server/0065-Redirect-vanilla-getProfiler-in-PathNavigationRegion.patch b/patches/server/0065-Redirect-vanilla-getProfiler-in-PathNavigationRegion.patch index fe95256b..b5c517a8 100644 --- a/patches/server/0065-Redirect-vanilla-getProfiler-in-PathNavigationRegion.patch +++ b/patches/server/0065-Redirect-vanilla-getProfiler-in-PathNavigationRegion.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Redirect vanilla getProfiler in PathNavigationRegion diff --git a/src/main/java/net/minecraft/world/level/PathNavigationRegion.java b/src/main/java/net/minecraft/world/level/PathNavigationRegion.java -index 9c2321ebb1237b4ecd3e7f7053e5039b800d89ff..589d66a2d890415e75f9e30176f0a7ada04a8bd7 100644 +index a1a4b99167919bedb8a45c3b81889f58f2abfbcc..b0f619c0c145d32e6e5db066428b1c0f0a3774e4 100644 --- a/src/main/java/net/minecraft/world/level/PathNavigationRegion.java +++ b/src/main/java/net/minecraft/world/level/PathNavigationRegion.java -@@ -153,4 +153,10 @@ public class PathNavigationRegion implements BlockGetter, CollisionGetter { +@@ -150,4 +150,10 @@ public class PathNavigationRegion implements BlockGetter, CollisionGetter { public int getHeight() { return this.level.getHeight(); } diff --git a/patches/server/0066-Fix-MC-249136-lag-when-attempting-to-locate-a-buried.patch b/patches/server/0066-Fix-MC-249136-lag-when-attempting-to-locate-a-buried.patch index 68e31e71..e4dbabc8 100644 --- a/patches/server/0066-Fix-MC-249136-lag-when-attempting-to-locate-a-buried.patch +++ b/patches/server/0066-Fix-MC-249136-lag-when-attempting-to-locate-a-buried.patch @@ -8,10 +8,10 @@ This patch ported from 1.20.5 snapshot - 24w04a Mojang issues: https://bugs.mojang.com/browse/MC-249136 diff --git a/src/main/java/net/minecraft/world/level/StructureManager.java b/src/main/java/net/minecraft/world/level/StructureManager.java -index b59581b92aed0bc1b09008c695b0b112c3e65743..d4422631d9e6728fedfb459c46b6494422e660b9 100644 +index 07eb481380e8fd4e492f36342ba633579c1b624e..9f1ab055bbad2d96831c207f8f1b612617377f79 100644 --- a/src/main/java/net/minecraft/world/level/StructureManager.java +++ b/src/main/java/net/minecraft/world/level/StructureManager.java -@@ -23,6 +23,7 @@ import net.minecraft.world.level.levelgen.structure.StructureCheck; +@@ -25,6 +25,7 @@ import net.minecraft.world.level.levelgen.structure.StructureCheck; import net.minecraft.world.level.levelgen.structure.StructureCheckResult; import net.minecraft.world.level.levelgen.structure.StructurePiece; import net.minecraft.world.level.levelgen.structure.StructureStart; @@ -19,7 +19,7 @@ index b59581b92aed0bc1b09008c695b0b112c3e65743..d4422631d9e6728fedfb459c46b64944 public class StructureManager { public final LevelAccessor level; -@@ -163,9 +164,11 @@ public class StructureManager { +@@ -164,9 +165,11 @@ public class StructureManager { return this.level.getChunk(sectionPos.x(), sectionPos.z(), ChunkStatus.STRUCTURE_REFERENCES).getAllReferences(); } @@ -47,10 +47,10 @@ index b8b78494449c0cd638f9706a803dc54e184d981f..2dcbe2ffbcb3b33b71de21961cb83bb9 if (!skipReferencedStructures && structurecheckresult == StructureCheckResult.START_PRESENT) { diff --git a/src/main/java/net/minecraft/world/level/levelgen/structure/StructureCheck.java b/src/main/java/net/minecraft/world/level/levelgen/structure/StructureCheck.java -index 16356d7f388561300e794a52f3f263b8e7d9b880..1e973bcbc79de7fdbeb22e3b577ea51c8a165c79 100644 +index 09867812600b24b3b7d05b58f98582650d313fc8..2193b21de33a59d5a9100d5a34fc54e29866b436 100644 --- a/src/main/java/net/minecraft/world/level/levelgen/structure/StructureCheck.java +++ b/src/main/java/net/minecraft/world/level/levelgen/structure/StructureCheck.java -@@ -32,6 +32,7 @@ import net.minecraft.world.level.chunk.ChunkGenerator; +@@ -31,6 +31,7 @@ import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.chunk.storage.ChunkScanAccess; import net.minecraft.world.level.chunk.storage.ChunkStorage; import net.minecraft.world.level.levelgen.RandomState; @@ -58,7 +58,7 @@ index 16356d7f388561300e794a52f3f263b8e7d9b880..1e973bcbc79de7fdbeb22e3b577ea51c import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; import org.slf4j.Logger; -@@ -161,7 +162,7 @@ public class StructureCheck { +@@ -171,7 +172,7 @@ public class StructureCheck { this.structureConfigs = registryManager.registryOrThrow(Registries.STRUCTURE); } @@ -67,7 +67,7 @@ index 16356d7f388561300e794a52f3f263b8e7d9b880..1e973bcbc79de7fdbeb22e3b577ea51c long l = pos.toLong(); Object2IntMap object2IntMap = this.loadedChunksSafe.get(l); // Paper - rewrite chunk system - synchronise this class if (object2IntMap != null) { -@@ -171,6 +172,11 @@ public class StructureCheck { +@@ -181,6 +182,11 @@ public class StructureCheck { if (structureCheckResult != null) { return structureCheckResult; } else { @@ -76,36 +76,34 @@ index 16356d7f388561300e794a52f3f263b8e7d9b880..1e973bcbc79de7fdbeb22e3b577ea51c + return StructureCheckResult.START_NOT_PRESENT; + } + // Leaf end - boolean bl = this.featureChecksSafe.computeIfAbsent(type, (structure2) -> { // Paper - rewrite chunk system - synchronise this class - return new SynchronisedLong2BooleanMap(PER_FEATURE_CHECK_LIMIT); // Paper - rewrite chunk system - synchronise this class - }).getOrCompute(l, (chunkPos) -> { // Paper - rewrite chunk system - synchronise this class + boolean bl = this.featureChecksSafe // Paper - rewrite chunk system - synchronise this class + .computeIfAbsent(type, structure2 -> new SynchronisedLong2BooleanMap(PER_FEATURE_CHECK_LIMIT)) // Paper - rewrite chunk system - synchronise this class + .getOrCompute(l, chunkPos -> this.canCreateStructure(pos, type)); // Paper - rewrite chunk system - synchronise this class diff --git a/src/main/java/net/minecraft/world/level/levelgen/structure/placement/StructurePlacement.java b/src/main/java/net/minecraft/world/level/levelgen/structure/placement/StructurePlacement.java -index 02e58161a0f5915084230831ee03050d762b67d2..7d7559f4d0ffb0a0e85e1562bd856032e2f26fda 100644 +index dc44ae806dc2779e5f0ec0de3fdb4b53da806a5b..c154b3213864f697cc679e2ecdd3b31a97113542 100644 --- a/src/main/java/net/minecraft/world/level/levelgen/structure/placement/StructurePlacement.java +++ b/src/main/java/net/minecraft/world/level/levelgen/structure/placement/StructurePlacement.java -@@ -74,14 +74,18 @@ public abstract class StructurePlacement { +@@ -94,11 +94,21 @@ public abstract class StructurePlacement { } } // Paper end - Add missing structure set seed configs -- if (!this.isPlacementChunk(calculator, chunkX, chunkZ)) { -- return false; -- } else if (this.frequency < 1.0F && !this.frequencyReductionMethod.shouldGenerate(calculator.getLevelSeed(), this.salt, chunkX, chunkZ, this.frequency, saltOverride)) { // Paper - Add missing structure set seed configs -- return false; -- } else { -- return !this.exclusionZone.isPresent() || !this.exclusionZone.get().isPlacementForbidden(calculator, chunkX, chunkZ); -- } + // Leaf start - Fix MC-249136 -+ return this.isPlacementChunk(calculator, chunkX, chunkZ) && this.applyAdditionalChunkRestrictions(chunkX, chunkZ, calculator.getLevelSeed(), saltOverride) && this.applyInteractionsWithOtherStructures(calculator, chunkX, chunkZ); -+ } -+ + return this.isPlacementChunk(calculator, chunkX, chunkZ) +- && (!(this.frequency < 1.0F) || this.frequencyReductionMethod.shouldGenerate(calculator.getLevelSeed(), this.salt, chunkX, chunkZ, this.frequency, saltOverride)) // Paper - Add missing structure set seed configs +- && (!this.exclusionZone.isPresent() || !this.exclusionZone.get().isPlacementForbidden(calculator, chunkX, chunkZ)); ++ && this.applyAdditionalChunkRestrictions(chunkX, chunkZ, calculator.getLevelSeed(), saltOverride) ++ && this.applyInteractionsWithOtherStructures(calculator, chunkX, chunkZ); + } + + public boolean applyAdditionalChunkRestrictions(int chunkX, int chunkZ, long levelSeed, Integer saltOverride) { + return !(this.frequency < 1.0f) || this.frequencyReductionMethod.shouldGenerate(levelSeed, this.salt, chunkX, chunkZ, this.frequency, saltOverride); // Paper - Add missing structure set seed configs + } + + public boolean applyInteractionsWithOtherStructures(ChunkGeneratorStructureState calculator, int chunkX, int chunkZ) { + return this.exclusionZone.isEmpty() || !this.exclusionZone.get().isPlacementForbidden(calculator, chunkX, chunkZ); - } ++ } + // Leaf end - ++ protected abstract boolean isPlacementChunk(ChunkGeneratorStructureState calculator, int chunkX, int chunkZ); + public BlockPos getLocatePos(ChunkPos chunkPos) { diff --git a/patches/server/0068-Fix-MC-65198.patch b/patches/server/0068-Fix-MC-65198.patch index 1cd3b6e2..ad26e0fd 100644 --- a/patches/server/0068-Fix-MC-65198.patch +++ b/patches/server/0068-Fix-MC-65198.patch @@ -27,7 +27,7 @@ index 3756de835ea87e3a4fb87cbf77365ffd87957ea9..66e149fe132191293b6075f3368192f7 } diff --git a/src/main/java/net/minecraft/world/inventory/ResultSlot.java b/src/main/java/net/minecraft/world/inventory/ResultSlot.java -index 245731757f2593c736916ac6ee59e2c91d179934..45995459a174bd62896fbd205a367a9945ec3bb2 100644 +index accf752e7615f775483830f81bd0df30e40d3c7f..d3d7f9b81e0244b7d3a487ab16e78fd8be736765 100644 --- a/src/main/java/net/minecraft/world/inventory/ResultSlot.java +++ b/src/main/java/net/minecraft/world/inventory/ResultSlot.java @@ -45,7 +45,7 @@ public class ResultSlot extends Slot { @@ -38,7 +38,7 @@ index 245731757f2593c736916ac6ee59e2c91d179934..45995459a174bd62896fbd205a367a99 + stack.onCraftedBy(this.player.level(), this.player, stack.getCount()); // Leaf - Fix MC-65198 } - Container var3 = this.container; + if (this.container instanceof RecipeCraftingHolder recipeCraftingHolder) { diff --git a/src/main/java/net/minecraft/world/inventory/StonecutterMenu.java b/src/main/java/net/minecraft/world/inventory/StonecutterMenu.java index eade15820dd9db38b6af2a5c4314acfb14ca03e9..5fef8a6bc746a34a0b742c51f169a502bc9b6ce6 100644 --- a/src/main/java/net/minecraft/world/inventory/StonecutterMenu.java diff --git a/patches/server/0079-Mirai-Configurable-chat-message-signatures.patch b/patches/server/0079-Mirai-Configurable-chat-message-signatures.patch index 98dfb157..97d647f3 100644 --- a/patches/server/0079-Mirai-Configurable-chat-message-signatures.patch +++ b/patches/server/0079-Mirai-Configurable-chat-message-signatures.patch @@ -24,10 +24,10 @@ index 397f985756c5bc6c11a32c844d536000dd922ed1..4a6a94c471d317dd8ea2ad83c5b97826 } diff --git a/src/main/java/net/minecraft/network/protocol/game/ServerboundChatCommandPacket.java b/src/main/java/net/minecraft/network/protocol/game/ServerboundChatCommandPacket.java -index b8c1f3b9afddc87d56541c8af63cffecfcdd2653..65594c88f660b9d535cd2c6960496fae031446ac 100644 +index e62ae57532ddcf12b7ebca77220cb1f3bd603717..b702f707f03cba4f67657a0e7b65b28366b24b50 100644 --- a/src/main/java/net/minecraft/network/protocol/game/ServerboundChatCommandPacket.java +++ b/src/main/java/net/minecraft/network/protocol/game/ServerboundChatCommandPacket.java -@@ -16,7 +16,7 @@ public record ServerboundChatCommandPacket(String command, Instant timeStamp, lo +@@ -18,7 +18,7 @@ public record ServerboundChatCommandPacket( buf.writeUtf(this.command, 256); buf.writeInstant(this.timeStamp); buf.writeLong(this.salt); @@ -37,10 +37,10 @@ index b8c1f3b9afddc87d56541c8af63cffecfcdd2653..65594c88f660b9d535cd2c6960496fae } diff --git a/src/main/java/net/minecraft/network/protocol/game/ServerboundChatPacket.java b/src/main/java/net/minecraft/network/protocol/game/ServerboundChatPacket.java -index d1d2fc0c57523c1abf1e8bfec913c78927c3dafc..a39b0b643ee08ad3360ad5163af79c1d8b5887e4 100644 +index 831178218ddfaa1828c00d0662b251d11bb29ff5..a3718138b956f635faba10e3e38c5285318dd36a 100644 --- a/src/main/java/net/minecraft/network/protocol/game/ServerboundChatPacket.java +++ b/src/main/java/net/minecraft/network/protocol/game/ServerboundChatPacket.java -@@ -17,7 +17,7 @@ public record ServerboundChatPacket(String message, Instant timeStamp, long salt +@@ -18,7 +18,7 @@ public record ServerboundChatPacket(String message, Instant timeStamp, long salt buf.writeUtf(this.message, 256); buf.writeInstant(this.timeStamp); buf.writeLong(this.salt); @@ -50,18 +50,44 @@ index d1d2fc0c57523c1abf1e8bfec913c78927c3dafc..a39b0b643ee08ad3360ad5163af79c1d } diff --git a/src/main/java/net/minecraft/network/protocol/status/ServerStatus.java b/src/main/java/net/minecraft/network/protocol/status/ServerStatus.java -index c40979e2fa37acb2f3df493395f3ab6e185345d7..8f1ea047b76f083603e7c86d73c7eeab1c3f3f76 100644 +index 5ed4a3a30657ab9e748245ad34333b915e870ae2..866226b083217fef72dfa9b0271ab25ef25e21d8 100644 --- a/src/main/java/net/minecraft/network/protocol/status/ServerStatus.java +++ b/src/main/java/net/minecraft/network/protocol/status/ServerStatus.java -@@ -17,7 +17,7 @@ import net.minecraft.network.chat.ComponentSerialization; - - public record ServerStatus(Component description, Optional players, Optional version, Optional favicon, boolean enforcesSecureChat) { - public static final Codec CODEC = RecordCodecBuilder.create((instance) -> { -- return instance.group(ComponentSerialization.CODEC.optionalFieldOf("description", CommonComponents.EMPTY).forGetter(ServerStatus::description), ServerStatus.Players.CODEC.optionalFieldOf("players").forGetter(ServerStatus::players), ServerStatus.Version.CODEC.optionalFieldOf("version").forGetter(ServerStatus::version), ServerStatus.Favicon.CODEC.optionalFieldOf("favicon").forGetter(ServerStatus::favicon), Codec.BOOL.optionalFieldOf("enforcesSecureChat", Boolean.valueOf(false)).forGetter(ServerStatus::enforcesSecureChat)).apply(instance, ServerStatus::new); -+ return !org.dreeam.leaf.config.modules.network.ChatMessageSignature.enabled ? instance.group(ComponentSerialization.CODEC.optionalFieldOf("description", CommonComponents.EMPTY).forGetter(ServerStatus::description), ServerStatus.Players.CODEC.optionalFieldOf("players").forGetter(ServerStatus::players), ServerStatus.Version.CODEC.optionalFieldOf("version").forGetter(ServerStatus::version), ServerStatus.Favicon.CODEC.optionalFieldOf("favicon").forGetter(ServerStatus::favicon), Codec.BOOL.optionalFieldOf("enforcesSecureChat", Boolean.FALSE).forGetter(x -> true)).apply(instance, ServerStatus::new) : instance.group(ComponentSerialization.CODEC.optionalFieldOf("description", CommonComponents.EMPTY).forGetter(ServerStatus::description), ServerStatus.Players.CODEC.optionalFieldOf("players").forGetter(ServerStatus::players), ServerStatus.Version.CODEC.optionalFieldOf("version").forGetter(ServerStatus::version), ServerStatus.Favicon.CODEC.optionalFieldOf("favicon").forGetter(ServerStatus::favicon), Codec.BOOL.optionalFieldOf("enforcesSecureChat", Boolean.FALSE).forGetter(ServerStatus::enforcesSecureChat)).apply(instance, ServerStatus::new); // Leaf - Mirai - Configurable chat message signatures - }); +@@ -22,16 +22,26 @@ public record ServerStatus( + Optional favicon, + boolean enforcesSecureChat + ) { ++ // Leaf start - Mirai - Configurable chat message signatures + public static final Codec CODEC = RecordCodecBuilder.create( +- instance -> instance.group( +- ComponentSerialization.CODEC.optionalFieldOf("description", CommonComponents.EMPTY).forGetter(ServerStatus::description), +- ServerStatus.Players.CODEC.optionalFieldOf("players").forGetter(ServerStatus::players), +- ServerStatus.Version.CODEC.optionalFieldOf("version").forGetter(ServerStatus::version), +- ServerStatus.Favicon.CODEC.optionalFieldOf("favicon").forGetter(ServerStatus::favicon), +- Codec.BOOL.optionalFieldOf("enforcesSecureChat", Boolean.valueOf(false)).forGetter(ServerStatus::enforcesSecureChat) +- ) +- .apply(instance, ServerStatus::new) ++ instance -> ++ !org.dreeam.leaf.config.modules.network.ChatMessageSignature.enabled ++ ? instance.group( ++ ComponentSerialization.CODEC.optionalFieldOf("description", CommonComponents.EMPTY).forGetter(ServerStatus::description), ++ ServerStatus.Players.CODEC.optionalFieldOf("players").forGetter(ServerStatus::players), ++ ServerStatus.Version.CODEC.optionalFieldOf("version").forGetter(ServerStatus::version), ++ ServerStatus.Favicon.CODEC.optionalFieldOf("favicon").forGetter(ServerStatus::favicon), ++ Codec.BOOL.optionalFieldOf("enforcesSecureChat", Boolean.FALSE).forGetter(x -> true) ++ ).apply(instance, ServerStatus::new) ++ : instance.group( ++ ComponentSerialization.CODEC.optionalFieldOf("description", CommonComponents.EMPTY).forGetter(ServerStatus::description), ++ ServerStatus.Players.CODEC.optionalFieldOf("players").forGetter(ServerStatus::players), ++ ServerStatus.Version.CODEC.optionalFieldOf("version").forGetter(ServerStatus::version), ++ ServerStatus.Favicon.CODEC.optionalFieldOf("favicon").forGetter(ServerStatus::favicon), ++ Codec.BOOL.optionalFieldOf("enforcesSecureChat", Boolean.FALSE).forGetter(ServerStatus::enforcesSecureChat) ++ ).apply(instance, ServerStatus::new) + ); ++ // Leaf end- Mirai public static record Favicon(byte[] iconBytes) { + private static final String PREFIX = "data:image/png;base64,"; diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java index a83fb872a1d186a3547c12f518e1bb0067fffaf7..fbe299dc0e2d0903075f64f199a498c3e57f07ab 100644 --- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java @@ -75,7 +101,7 @@ index a83fb872a1d186a3547c12f518e1bb0067fffaf7..fbe299dc0e2d0903075f64f199a498c3 // Paper start - Add setting for proxy online mode status diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index 9b87e62426f8805247b86eef0fe2939cf76aa1d8..8221cb9a4cc0cc382ed1dbc8e7c743d65ab91be5 100644 +index 54e872d7279a56ce1c1ff0310ed302f0012e5d3e..8cea11444cfb711c60ee6af84996c29100541cfa 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java @@ -2262,7 +2262,7 @@ public class ServerPlayer extends Player { diff --git a/patches/server/0081-Cache-player-profileResult.patch b/patches/server/0081-Cache-player-profileResult.patch index 33128e5b..1ee5b204 100644 --- a/patches/server/0081-Cache-player-profileResult.patch +++ b/patches/server/0081-Cache-player-profileResult.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Cache player profileResult diff --git a/build.gradle.kts b/build.gradle.kts -index 6a96a847c3b0a7af0e187cc2251c3ad275da4c11..517b7551bfaf546109fd8d4d246c083e9e62f85b 100644 +index 821a01ab64dc2e59b78c19af5a62cdc42bf8bc03..98846d73a121cf0b7b41498be1bae24cf4168f56 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -31,6 +31,10 @@ dependencies { @@ -17,7 +17,7 @@ index 6a96a847c3b0a7af0e187cc2251c3ad275da4c11..517b7551bfaf546109fd8d4d246c083e + // Leaf end + // Paper start - implementation("com.github.luben:zstd-jni:1.5.5-11") // LinearPurpur + implementation("com.github.luben:zstd-jni:1.5.6-2") // LinearPurpur implementation("org.lz4:lz4-java:1.8.0") // LinearPurpur diff --git a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java index 0f3ba1abb609562e92dd9eb0ab7a621b8ed2d09f..910c8d2f32370c82c829535d4773fc7283c2e138 100644 diff --git a/patches/server/0083-Matter-Secure-Seed.patch b/patches/server/0083-Matter-Secure-Seed.patch index cf089e30..e4b649fb 100644 --- a/patches/server/0083-Matter-Secure-Seed.patch +++ b/patches/server/0083-Matter-Secure-Seed.patch @@ -70,7 +70,7 @@ index caef142261734aab264d1da420ff5e6d7117ea1c..e721f40495824dff2ba62c81156b2a89 } diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index 005549acdd30c88d14df9051cbb732baf38282e5..c00f6bda8c05cdcbe834232e6b4dea3f54640e35 100644 +index a5e3b6bee4484f598d7c762dc54bb92c7d0cb2d7..8f8ca4f69c442e30f30838c49917b7b7c81a9c0c 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java @@ -177,6 +177,10 @@ import org.bukkit.event.world.GenericGameEvent; @@ -273,10 +273,10 @@ index a907b79fd8291a0e92db138f37239d17424188a1..2f9546e69abedf06f3efbb96cd639bc1 ProfiledDuration profiledduration = JvmProfiler.INSTANCE.onChunkGenerate(ichunkaccess.getPos(), world.dimension(), this.toString()); diff --git a/src/main/java/net/minecraft/world/level/levelgen/WorldOptions.java b/src/main/java/net/minecraft/world/level/levelgen/WorldOptions.java -index d38cabc9eeb45dd863e5f87b7df3b6327ea6a4a2..3c3bd59afb5ea35cdece02b2c0af41a70f52cc46 100644 +index 147e41c5869ac9070e1cb40f1411490a756dedef..b5212c859a43d0fd0fe0bc1296bccd3520ecede3 100644 --- a/src/main/java/net/minecraft/world/level/levelgen/WorldOptions.java +++ b/src/main/java/net/minecraft/world/level/levelgen/WorldOptions.java -@@ -3,29 +3,58 @@ package net.minecraft.world.level.levelgen; +@@ -3,33 +3,60 @@ package net.minecraft.world.level.levelgen; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; @@ -294,29 +294,34 @@ index d38cabc9eeb45dd863e5f87b7df3b6327ea6a4a2..3c3bd59afb5ea35cdece02b2c0af41a7 +// Leaf end - Matter + public class WorldOptions { -- public static final MapCodec CODEC = RecordCodecBuilder.mapCodec((instance) -> { -- return instance.group(Codec.LONG.fieldOf("seed").stable().forGetter(WorldOptions::seed), Codec.BOOL.fieldOf("generate_features").orElse(true).stable().forGetter(WorldOptions::generateStructures), Codec.BOOL.fieldOf("bonus_chest").orElse(false).stable().forGetter(WorldOptions::generateBonusChest), Codec.STRING.optionalFieldOf("legacy_custom_options").stable().forGetter((generatorOptions) -> { -- return generatorOptions.legacyCustomOptions; -- })).apply(instance, instance.stable(WorldOptions::new)); -- }); -- public static final WorldOptions DEMO_OPTIONS = new WorldOptions((long)"North Carolina".hashCode(), true, true); + // Leaf start - Matter - Feature Secure Seed + private static final boolean isSecureSeedEnabled = org.dreeam.leaf.config.modules.misc.SecureSeed.enabled; -+ public static final MapCodec CODEC = RecordCodecBuilder.mapCodec((instance) -> -+ isSecureSeedEnabled ? -+ instance.group( + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec( +- instance -> instance.group( +- Codec.LONG.fieldOf("seed").stable().forGetter(WorldOptions::seed), +- Codec.BOOL.fieldOf("generate_features").orElse(true).stable().forGetter(WorldOptions::generateStructures), +- Codec.BOOL.fieldOf("bonus_chest").orElse(false).stable().forGetter(WorldOptions::generateBonusChest), +- Codec.STRING.optionalFieldOf("legacy_custom_options").stable().forGetter(generatorOptions -> generatorOptions.legacyCustomOptions) +- ) +- .apply(instance, instance.stable(WorldOptions::new)) +- ); +- public static final WorldOptions DEMO_OPTIONS = new WorldOptions((long)"North Carolina".hashCode(), true, true); ++ instance -> isSecureSeedEnabled ++ ? instance.group( + Codec.LONG.fieldOf("seed").stable().forGetter(WorldOptions::seed), + Codec.LONG_STREAM.fieldOf("feature_seed").stable().forGetter(WorldOptions::featureSeedStream), + Codec.BOOL.fieldOf("generate_features").orElse(true).stable().forGetter(WorldOptions::generateStructures), + Codec.BOOL.fieldOf("bonus_chest").orElse(false).stable().forGetter(WorldOptions::generateBonusChest), -+ Codec.STRING.optionalFieldOf("legacy_custom_options").stable().forGetter((generatorOptions) -> generatorOptions.legacyCustomOptions)).apply(instance, instance.stable(WorldOptions::new)) -+ : instance.group( -+ Codec.LONG.fieldOf("seed").stable().forGetter(WorldOptions::seed), -+ Codec.BOOL.fieldOf("generate_features").orElse(true).stable().forGetter(WorldOptions::generateStructures), -+ Codec.BOOL.fieldOf("bonus_chest").orElse(false).stable().forGetter(WorldOptions::generateBonusChest), -+ Codec.STRING.optionalFieldOf("legacy_custom_options").stable().forGetter((generatorOptions) -> generatorOptions.legacyCustomOptions)).apply(instance, instance.stable(WorldOptions::new))); ++ Codec.STRING.optionalFieldOf("legacy_custom_options").stable().forGetter((generatorOptions) -> generatorOptions.legacyCustomOptions) ++ ).apply(instance, instance.stable(WorldOptions::new)) ++ : instance.group( ++ Codec.LONG.fieldOf("seed").stable().forGetter(WorldOptions::seed), ++ Codec.BOOL.fieldOf("generate_features").orElse(true).stable().forGetter(WorldOptions::generateStructures), ++ Codec.BOOL.fieldOf("bonus_chest").orElse(false).stable().forGetter(WorldOptions::generateBonusChest), ++ Codec.STRING.optionalFieldOf("legacy_custom_options").stable().forGetter((generatorOptions) -> generatorOptions.legacyCustomOptions) ++ ).apply(instance, instance.stable(WorldOptions::new))); + // Leaf end - Matter -+ public static final WorldOptions DEMO_OPTIONS = isSecureSeedEnabled ? new WorldOptions("North Carolina".hashCode(), Globals.createRandomWorldSeed(), true, true) : new WorldOptions("North Carolina".hashCode(), true, true); // Leaf - Matter - Feature Secure Seed ++ public static final WorldOptions DEMO_OPTIONS = isSecureSeedEnabled ? new WorldOptions((long) "North Carolina".hashCode(), Globals.createRandomWorldSeed(), true, true) : new WorldOptions("North Carolina".hashCode(), true, true); // Leaf - Matter - Feature Secure Seed private final long seed; + private long[] featureSeed = Globals.createRandomWorldSeed(); // Leaf - Matter - Feature Secure Seed private final boolean generateStructures; @@ -342,7 +347,7 @@ index d38cabc9eeb45dd863e5f87b7df3b6327ea6a4a2..3c3bd59afb5ea35cdece02b2c0af41a7 } private WorldOptions(long seed, boolean generateStructures, boolean bonusChest, Optional legacyCustomOptions) { -@@ -35,10 +64,26 @@ public class WorldOptions { +@@ -39,10 +66,26 @@ public class WorldOptions { this.legacyCustomOptions = legacyCustomOptions; } @@ -369,7 +374,7 @@ index d38cabc9eeb45dd863e5f87b7df3b6327ea6a4a2..3c3bd59afb5ea35cdece02b2c0af41a7 public boolean generateStructures() { return this.generateStructures; } -@@ -51,17 +96,19 @@ public class WorldOptions { +@@ -55,17 +98,19 @@ public class WorldOptions { return this.legacyCustomOptions.isPresent(); } @@ -392,7 +397,7 @@ index d38cabc9eeb45dd863e5f87b7df3b6327ea6a4a2..3c3bd59afb5ea35cdece02b2c0af41a7 public static OptionalLong parseSeed(String seed) { seed = seed.trim(); -@@ -71,7 +118,7 @@ public class WorldOptions { +@@ -75,7 +120,7 @@ public class WorldOptions { try { return OptionalLong.of(Long.parseLong(seed)); } catch (NumberFormatException var2) { @@ -402,7 +407,7 @@ index d38cabc9eeb45dd863e5f87b7df3b6327ea6a4a2..3c3bd59afb5ea35cdece02b2c0af41a7 } } diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/GeodeFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/GeodeFeature.java -index f945fae50983424091b58f83ed14f2e8f2621619..49a02cc2e2a619352453d645ae69ba9a7156fa87 100644 +index 17d2bb3f7d158ec1230a1ad7c52b9feeda586630..2a30f2d4beaa6077a283565211f5c632dfac4fcb 100644 --- a/src/main/java/net/minecraft/world/level/levelgen/feature/GeodeFeature.java +++ b/src/main/java/net/minecraft/world/level/levelgen/feature/GeodeFeature.java @@ -25,6 +25,11 @@ import net.minecraft.world.level.levelgen.feature.configurations.GeodeConfigurat @@ -423,14 +428,14 @@ index f945fae50983424091b58f83ed14f2e8f2621619..49a02cc2e2a619352453d645ae69ba9a int k = geodeConfiguration.distributionPoints.sample(randomSource); - WorldgenRandom worldgenRandom = new WorldgenRandom(new LegacyRandomSource(worldGenLevel.getSeed())); + WorldgenRandom worldgenRandom = org.dreeam.leaf.config.modules.misc.SecureSeed.enabled ? new WorldgenCryptoRandom(0, 0, Globals.Salt.GEODE_FEATURE, 0) : new WorldgenRandom(new LegacyRandomSource(worldGenLevel.getSeed())); // Leaf - Matter - Feature Secure Seed - NormalNoise normalNoise = NormalNoise.create(worldgenRandom, -4, 1.0D); + NormalNoise normalNoise = NormalNoise.create(worldgenRandom, -4, 1.0); List list2 = Lists.newLinkedList(); double d = (double)k / (double)geodeConfiguration.outerWallDistance.getMaxValue(); diff --git a/src/main/java/net/minecraft/world/level/levelgen/structure/Structure.java b/src/main/java/net/minecraft/world/level/levelgen/structure/Structure.java -index 8eaa1a57e904fe7e540b311c6c5c36b755f021fc..0173fb2e9e7e218b911953e71342f46ca8858dd6 100644 +index e1fcc71b81c9da7180384ea1dfc656fdecf900c7..5fe14ff7c05f91b8f00fbdfd02909f4404860369 100644 --- a/src/main/java/net/minecraft/world/level/levelgen/structure/Structure.java +++ b/src/main/java/net/minecraft/world/level/levelgen/structure/Structure.java -@@ -38,6 +38,11 @@ import net.minecraft.world.level.levelgen.structure.pieces.PiecesContainer; +@@ -39,6 +39,11 @@ import net.minecraft.world.level.levelgen.structure.pieces.PiecesContainer; import net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilder; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; @@ -442,7 +447,7 @@ index 8eaa1a57e904fe7e540b311c6c5c36b755f021fc..0173fb2e9e7e218b911953e71342f46c public abstract class Structure { public static final Codec DIRECT_CODEC = BuiltInRegistries.STRUCTURE_TYPE.byNameCodec().dispatch(Structure::type, StructureType::codec); public static final Codec> CODEC = RegistryFileCodec.create(Registries.STRUCTURE, DIRECT_CODEC); -@@ -164,6 +169,14 @@ public abstract class Structure { +@@ -228,6 +233,14 @@ public abstract class Structure { } private static WorldgenRandom makeRandom(long seed, ChunkPos chunkPos) { @@ -458,7 +463,7 @@ index 8eaa1a57e904fe7e540b311c6c5c36b755f021fc..0173fb2e9e7e218b911953e71342f46c worldgenRandom.setLargeFeatureSeed(seed, chunkPos.x, chunkPos.z); return worldgenRandom; diff --git a/src/main/java/net/minecraft/world/level/levelgen/structure/placement/RandomSpreadStructurePlacement.java b/src/main/java/net/minecraft/world/level/levelgen/structure/placement/RandomSpreadStructurePlacement.java -index 41e24325dcb37e08936b1d13af34d338487929f3..062fdbb21e8cb5ae945ce39e208a04b9f60aef7f 100644 +index e6136d68111f47e2495de81713043865fffc864a..e78f2dd555ac90464bd03a809afd285d1dc35eae 100644 --- a/src/main/java/net/minecraft/world/level/levelgen/structure/placement/RandomSpreadStructurePlacement.java +++ b/src/main/java/net/minecraft/world/level/levelgen/structure/placement/RandomSpreadStructurePlacement.java @@ -11,6 +11,11 @@ import net.minecraft.world.level.chunk.ChunkGeneratorStructureState; @@ -471,9 +476,9 @@ index 41e24325dcb37e08936b1d13af34d338487929f3..062fdbb21e8cb5ae945ce39e208a04b9 +// Leaf end - Matter + public class RandomSpreadStructurePlacement extends StructurePlacement { - public static final Codec CODEC = ExtraCodecs.validate(RecordCodecBuilder.mapCodec((instance) -> { - return placementCodec(instance).and(instance.group(Codec.intRange(0, 4096).fieldOf("spacing").forGetter(RandomSpreadStructurePlacement::spacing), Codec.intRange(0, 4096).fieldOf("separation").forGetter(RandomSpreadStructurePlacement::separation), RandomSpreadType.CODEC.optionalFieldOf("spread_type", RandomSpreadType.LINEAR).forGetter(RandomSpreadStructurePlacement::spreadType))).apply(instance, RandomSpreadStructurePlacement::new); -@@ -51,8 +56,17 @@ public class RandomSpreadStructurePlacement extends StructurePlacement { + public static final Codec CODEC = ExtraCodecs.validate( + RecordCodecBuilder.mapCodec( +@@ -74,8 +79,17 @@ public class RandomSpreadStructurePlacement extends StructurePlacement { public ChunkPos getPotentialStructureChunk(long seed, int chunkX, int chunkZ) { int i = Math.floorDiv(chunkX, this.spacing); int j = Math.floorDiv(chunkZ, this.spacing); @@ -494,10 +499,10 @@ index 41e24325dcb37e08936b1d13af34d338487929f3..062fdbb21e8cb5ae945ce39e208a04b9 int l = this.spreadType.evaluate(worldgenRandom, k); int m = this.spreadType.evaluate(worldgenRandom, k); diff --git a/src/main/java/net/minecraft/world/level/levelgen/structure/placement/StructurePlacement.java b/src/main/java/net/minecraft/world/level/levelgen/structure/placement/StructurePlacement.java -index 7d7559f4d0ffb0a0e85e1562bd856032e2f26fda..76d8e461144852de0d9967ad751ee0ffb66a48f4 100644 +index c154b3213864f697cc679e2ecdd3b31a97113542..b75a636d3d88e355877872ef697a7d6dbcbdaeec 100644 --- a/src/main/java/net/minecraft/world/level/levelgen/structure/placement/StructurePlacement.java +++ b/src/main/java/net/minecraft/world/level/levelgen/structure/placement/StructurePlacement.java -@@ -18,6 +18,11 @@ import net.minecraft.world.level.levelgen.LegacyRandomSource; +@@ -20,6 +20,11 @@ import net.minecraft.world.level.levelgen.LegacyRandomSource; import net.minecraft.world.level.levelgen.WorldgenRandom; import net.minecraft.world.level.levelgen.structure.StructureSet; @@ -507,9 +512,9 @@ index 7d7559f4d0ffb0a0e85e1562bd856032e2f26fda..76d8e461144852de0d9967ad751ee0ff +// Leaf end - Matter + public abstract class StructurePlacement { - public static final Codec CODEC = BuiltInRegistries.STRUCTURE_PLACEMENT.byNameCodec().dispatch(StructurePlacement::type, StructurePlacementType::codec); - private static final int HIGHLY_ARBITRARY_RANDOM_SALT = 10387320; -@@ -96,8 +101,18 @@ public abstract class StructurePlacement { + public static final Codec CODEC = BuiltInRegistries.STRUCTURE_PLACEMENT + .byNameCodec() +@@ -118,8 +123,18 @@ public abstract class StructurePlacement { public abstract StructurePlacementType type(); private static boolean probabilityReducer(long seed, int salt, int chunkX, int chunkZ, float frequency, @org.jetbrains.annotations.Nullable Integer saltOverride) { // Paper - Add missing structure set seed configs; ignore here @@ -531,7 +536,7 @@ index 7d7559f4d0ffb0a0e85e1562bd856032e2f26fda..76d8e461144852de0d9967ad751ee0ff } diff --git a/src/main/java/net/minecraft/world/level/levelgen/structure/pools/JigsawPlacement.java b/src/main/java/net/minecraft/world/level/levelgen/structure/pools/JigsawPlacement.java -index f13572a4d0091972b95a45346853259953c269bf..078b2ead47a6c609618e7defac2888d749aa8d52 100644 +index 70dbf7267b43357578c07fcd46618f656410a8e2..c7d9359af6be9efa19dd1e27e36f3074d2b89c78 100644 --- a/src/main/java/net/minecraft/world/level/levelgen/structure/pools/JigsawPlacement.java +++ b/src/main/java/net/minecraft/world/level/levelgen/structure/pools/JigsawPlacement.java @@ -43,6 +43,11 @@ import net.minecraft.world.phys.shapes.VoxelShape; @@ -546,7 +551,7 @@ index f13572a4d0091972b95a45346853259953c269bf..078b2ead47a6c609618e7defac2888d7 public class JigsawPlacement { static final Logger LOGGER = LogUtils.getLogger(); -@@ -51,7 +56,11 @@ public class JigsawPlacement { +@@ -61,7 +66,11 @@ public class JigsawPlacement { ChunkGenerator chunkGenerator = context.chunkGenerator(); StructureTemplateManager structureTemplateManager = context.structureTemplateManager(); LevelHeightAccessor levelHeightAccessor = context.heightAccessor(); @@ -558,36 +563,9 @@ index f13572a4d0091972b95a45346853259953c269bf..078b2ead47a6c609618e7defac2888d7 + // Leaf end - Matter Registry registry = registryAccess.registryOrThrow(Registries.TEMPLATE_POOL); Rotation rotation = Rotation.getRandom(worldgenRandom); - StructureTemplatePool structureTemplatePool = structurePool.unwrapKey().flatMap((resourceKey) -> { -@@ -245,18 +254,20 @@ public class JigsawPlacement { - if (!boundingBox2.isInside(structureBlockInfox.pos().relative(JigsawBlock.getFrontFacing(structureBlockInfox.state())))) { - return 0; - } else { -- ResourceKey resourceKey = readPoolKey(structureBlockInfox, aliasLookup); -- Optional> optional = this.pools.getHolder(resourceKey); -- Optional> optional2 = optional.map((entry) -> { -+ // Leaf start - Mater - Decompile fix -+ ResourceKey resourceKey1 = readPoolKey(structureBlockInfox, aliasLookup); -+ Optional> optional1 = this.pools.getHolder(resourceKey1); -+ Optional> optional2 = optional1.map((entry) -> { - return entry.value().getFallback(); - }); -- int i = optional.map((entry) -> { -+ int i1 = optional1.map((entry) -> { - return entry.value().getMaxSize(this.structureTemplateManager); - }).orElse(0); -- int j = optional2.map((entry) -> { -+ int j1 = optional2.map((entry) -> { - return entry.value().getMaxSize(this.structureTemplateManager); - }).orElse(0); -- return Math.max(i, j); -+ return Math.max(i1, j1); -+ // Leaf end - Matter - } - }).max().orElse(0); - } else { + StructureTemplatePool structureTemplatePool = structurePool.unwrapKey() diff --git a/src/main/java/net/minecraft/world/level/levelgen/structure/structures/EndCityStructure.java b/src/main/java/net/minecraft/world/level/levelgen/structure/structures/EndCityStructure.java -index 2d4a14e8c3f876186c417b9e4284a95f65cf9cd5..fbac6cfcda9d164c169be4c5e49ae144fffa665a 100644 +index ffc8242c31bf18ef2f33f2b7ecb99f0a896ea730..5eb4cd3dfa593a9b8a368c820e395983b43df270 100644 --- a/src/main/java/net/minecraft/world/level/levelgen/structure/structures/EndCityStructure.java +++ b/src/main/java/net/minecraft/world/level/levelgen/structure/structures/EndCityStructure.java @@ -10,6 +10,7 @@ import net.minecraft.world.level.levelgen.structure.Structure; @@ -599,7 +577,7 @@ index 2d4a14e8c3f876186c417b9e4284a95f65cf9cd5..fbac6cfcda9d164c169be4c5e49ae144 public class EndCityStructure extends Structure { public static final Codec CODEC = simpleCodec(EndCityStructure::new); diff --git a/src/main/java/net/minecraft/world/level/levelgen/structure/structures/MineshaftStructure.java b/src/main/java/net/minecraft/world/level/levelgen/structure/structures/MineshaftStructure.java -index 087a9c500b9ae1ca2f410dc53e2f251114c97015..e0073906df7be4e219d1289d7178c7d4158598ef 100644 +index 944b5ff23ccf8e9c93db142a7cbeb29dc0b021da..dbda2a51b88f1c7c58d662a28e55bdcb913cb2dc 100644 --- a/src/main/java/net/minecraft/world/level/levelgen/structure/structures/MineshaftStructure.java +++ b/src/main/java/net/minecraft/world/level/levelgen/structure/structures/MineshaftStructure.java @@ -19,6 +19,7 @@ import net.minecraft.world.level.levelgen.WorldgenRandom; @@ -609,7 +587,7 @@ index 087a9c500b9ae1ca2f410dc53e2f251114c97015..e0073906df7be4e219d1289d7178c7d4 +//import su.plo.matter.WorldgenCryptoRandom; // Leaf - Matter - Feature Secure Seed public class MineshaftStructure extends Structure { - public static final Codec CODEC = RecordCodecBuilder.create((instance) -> { + public static final Codec CODEC = RecordCodecBuilder.create( diff --git a/src/main/java/org/bukkit/craftbukkit/CraftChunk.java b/src/main/java/org/bukkit/craftbukkit/CraftChunk.java index dca5f25cf331b5550e9be491b4e8a3466531e021..4882361460d934d0c1ff693325f59c10341c5f5d 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftChunk.java diff --git a/patches/server/0084-Matter-Seed-Command.patch b/patches/server/0084-Matter-Seed-Command.patch index 01c6e258..626f54c2 100644 --- a/patches/server/0084-Matter-Seed-Command.patch +++ b/patches/server/0084-Matter-Seed-Command.patch @@ -7,10 +7,10 @@ Original license: GPLv3 Original project: https://github.com/plasmoapp/matter diff --git a/src/main/java/net/minecraft/server/commands/SeedCommand.java b/src/main/java/net/minecraft/server/commands/SeedCommand.java -index 342362c217df5476a927eb54cef3cafcea3889fd..a05e0d998fffd8a50643f118b2ddf4af6804cc14 100644 +index 0b500b19a99fa6c2740c0db350a166462668df9c..e0516ed524fe55277adb3e2c4571ca40c334c5ef 100644 --- a/src/main/java/net/minecraft/server/commands/SeedCommand.java +++ b/src/main/java/net/minecraft/server/commands/SeedCommand.java -@@ -6,6 +6,10 @@ import net.minecraft.commands.Commands; +@@ -6,12 +6,27 @@ import net.minecraft.commands.Commands; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.ComponentUtils; @@ -20,25 +20,21 @@ index 342362c217df5476a927eb54cef3cafcea3889fd..a05e0d998fffd8a50643f118b2ddf4af + public class SeedCommand { public static void register(CommandDispatcher dispatcher, boolean dedicated) { - dispatcher.register(Commands.literal("seed").requires((source) -> { -@@ -16,7 +20,19 @@ public class SeedCommand { - context.getSource().sendSuccess(() -> { - return Component.translatable("commands.seed.success", component); - }, false); -- return (int)l; + dispatcher.register(Commands.literal("seed").requires(source -> !dedicated || source.hasPermission(2)).executes(context -> { + long l = context.getSource().getLevel().getSeed(); + Component component = ComponentUtils.copyOnClickText(String.valueOf(l)); + context.getSource().sendSuccess(() -> Component.translatable("commands.seed.success", component), false); + + // Leaf start - Matter - SecureSeed Command + if (org.dreeam.leaf.config.modules.misc.SecureSeed.enabled) { + Globals.setupGlobals(context.getSource().getLevel()); + String seedStr = Globals.seedToString(Globals.worldSeed); -+ + Component featureSeedComponent = ComponentUtils.copyOnClickText(seedStr); + + context.getSource().sendSuccess(() -> Component.translatable(("Feature seed: %s"), featureSeedComponent), false); + } + // Leaf end - Matter + -+ return (int) l; + return (int)l; })); } - }