From c4a7891533475f9cc024f245d5f1a83af540fa3a Mon Sep 17 00:00:00 2001 From: Dreeam <61569423+Dreeam-qwq@users.noreply.github.com> Date: Sat, 16 Dec 2023 15:35:56 -0500 Subject: [PATCH] 1.20.4 --- .../{build-1202.yml => build-1204.yml} | 12 +- README.md | 2 +- gradle.properties | 4 +- patches/api/0002-Pufferfish-Sentry.patch | 8 +- patches/api/0003-Purpur-API-Changes.patch | 18 +- patches/api/0004-Remove-Timings.patch | 11 - patches/api/0005-Bump-Dependencies.patch | 27 +- patches/api/0007-KeYi-Player-Skull-API.patch | 8 +- patches/api/0008-Slice-Smooth-Teleports.patch | 4 +- patches/server/0001-Rebrand.patch | 23 +- patches/server/0002-Leaf-Config.patch | 6 +- ...005-Pufferfish-Optimize-mob-spawning.patch | 111 +- ...fferfish-Dynamic-Activation-of-Brain.patch | 34 +- ...tle-goal-selector-during-inactive-ti.patch | 4 +- .../server/0008-Pufferfish-Entity-TTL.patch | 8 +- .../server/0009-Purpur-Server-Changes.patch | 1495 +++++++++-------- ...-Purpur-Configurable-server-mod-name.patch | 4 +- patches/server/0011-Remove-Timings.patch | 339 ++-- patches/server/0012-Bump-Dependencies.patch | 12 +- .../0013-Remove-Mojang-username-check.patch | 21 +- ...Remove-UseItemOnPacket-Too-Far-Check.patch | 4 +- .../server/0017-KeYi-Player-Skull-API.patch | 8 +- ...on-for-spigot-item-merging-mechanism.patch | 4 +- ...et-Fixes-Use-optimized-RecipeManager.patch | 6 +- ...Akarin-Save-Json-list-asynchronously.patch | 6 +- .../server/0023-Slice-Smooth-Teleports.patch | 12 +- patches/server/0025-Leaves-Server-Utils.patch | 16 +- .../server/0026-Leaves-Protocol-Core.patch | 18 +- .../server/0027-Leaves-Jade-Protocol.patch | 6 +- .../0029-Leaves-Xaero-Map-Protocol.patch | 4 +- .../0030-Leaves-Syncmatica-Protocol.patch | 10 +- ...tch => 0033-Petal-Async-Pathfinding.patch} | 28 +- ...-Skip-unnecessary-mob-spawning-compu.patch | 20 - ...r-NPE.patch => 0034-Fix-tracker-NPE.patch} | 10 +- ...-minecart-vehicle-collision-results.patch} | 10 +- ...rk.patch => 0036-Reduce-canSee-work.patch} | 12 +- ...tch => 0037-Faster-Natural-Spawning.patch} | 4 +- ...dom-for-xaeroMapServerID-generation.patch} | 2 +- ...-Fix-casting-in-Purpur-world-config.patch} | 12 +- ...tch.patch => 0040-Fix-sprint-glitch.patch} | 4 +- ...h => 0041-Fix-keepalive-kicked-name.patch} | 2 +- .../0035-Matter-Secure-Seed.patch | 0 .../0036-Matter-Seed-Command.patch | 0 43 files changed, 1140 insertions(+), 1209 deletions(-) rename .github/workflows/{build-1202.yml => build-1204.yml} (83%) rename patches/server/{0034-Petal-Async-Pathfinding.patch => 0033-Petal-Async-Pathfinding.patch} (98%) delete mode 100644 patches/server/0033-sync-with-Gale-s-Skip-unnecessary-mob-spawning-compu.patch rename patches/server/{0035-Fix-tracker-NPE.patch => 0034-Fix-tracker-NPE.patch} (94%) rename patches/server/{0036-Cache-minecart-vehicle-collision-results.patch => 0035-Cache-minecart-vehicle-collision-results.patch} (92%) rename patches/server/{0037-Reduce-canSee-work.patch => 0036-Reduce-canSee-work.patch} (87%) rename patches/server/{0038-Faster-Natural-Spawning.patch => 0037-Faster-Natural-Spawning.patch} (96%) rename patches/server/{0039-Faster-Random-for-xaeroMapServerID-generation.patch => 0038-Faster-Random-for-xaeroMapServerID-generation.patch} (93%) rename patches/server/{0040-Fix-casting-in-Purpur-world-config.patch => 0039-Fix-casting-in-Purpur-world-config.patch} (89%) rename patches/server/{0041-Fix-sprint-glitch.patch => 0040-Fix-sprint-glitch.patch} (84%) rename patches/server/{0042-Fix-keepalive-kicked-name.patch => 0041-Fix-keepalive-kicked-name.patch} (93%) rename patches/unapplied/{ => todo-server}/0035-Matter-Secure-Seed.patch (100%) rename patches/unapplied/{ => todo-server}/0036-Matter-Seed-Command.patch (100%) diff --git a/.github/workflows/build-1202.yml b/.github/workflows/build-1204.yml similarity index 83% rename from .github/workflows/build-1202.yml rename to .github/workflows/build-1204.yml index 769ff227..ccd36987 100644 --- a/.github/workflows/build-1202.yml +++ b/.github/workflows/build-1204.yml @@ -1,4 +1,4 @@ -name: Build Leaf 1.20.2 +name: Build Leaf 1.20.4 on: [ push, pull_request ] jobs: build: @@ -24,14 +24,14 @@ jobs: run: ./gradlew -Dorg.gradle.jvmargs="-Dgraal.CompilerConfiguration=enterprise -Dgraal.UsePriorityInlining=true -Dgraal.Vectorization=true -Dgraal.OptDuplication=true --add-modules jdk.incubator.vector" createReobfPaperclipJar --stacktrace --no-daemon - name: Rename Paperclip Jar - run: mv build/libs/Leaf-paperclip-1.20.2-R0.1-SNAPSHOT-reobf.jar ./leaf-1.20.2.jar + run: mv build/libs/Leaf-paperclip-1.20.4-R0.1-SNAPSHOT-reobf.jar ./leaf-1.20.4.jar - name: Release Leaf - if: github.ref_name == 'ver/1.20.2' + if: github.ref_name == 'ver/1.20.4' uses: marvinpinto/action-automatic-releases@master with: - title: "Leaf 1.20.2" - automatic_release_tag: "ver-1.20.2" + title: "Leaf 1.20.4" + automatic_release_tag: "ver-1.20.4" repo_token: "${{ secrets.GITHUB_TOKEN }}" - files: "./leaf-1.20.2.jar" + files: "./leaf-1.20.4.jar" prerelease: false diff --git a/README.md b/README.md index d1905ef3..bd3acd36 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ ## Leaf -[![Github Actions Build](https://img.shields.io/github/actions/workflow/status/Winds-Studio/Leaf/build-1202.yml?&style=for-the-badge)](https://github.com/Winds-Studio/Leaf/releases) +[![Github Actions Build](https://img.shields.io/github/actions/workflow/status/Winds-Studio/Leaf/build-1204.yml?&style=for-the-badge)](https://github.com/Winds-Studio/Leaf/releases) [![Discord](https://img.shields.io/discord/1145991395388162119?color=5865F2&label=discord&style=for-the-badge)](https://discord.gg/gfgAwdSEuM)
Leaf is a drop-in replacement designed for removing some checks, customized, and high-performance built on top of Gale with optimization from other forks.
diff --git a/gradle.properties b/gradle.properties index 5279b30b..1f07d64b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,7 +1,7 @@ group = org.dreeam.leaf -version = 1.20.2-R0.1-SNAPSHOT +version = 1.20.4-R0.1-SNAPSHOT -galeCommit = 07a2ca6b82a3b809d6b89213b0648ef9067858b6 +galeCommit = 78098840227379410ccc610bddafa6a7956c6ddd org.gradle.caching = true org.gradle.parallel = true diff --git a/patches/api/0002-Pufferfish-Sentry.patch b/patches/api/0002-Pufferfish-Sentry.patch index 6b584998..a6fae2cd 100644 --- a/patches/api/0002-Pufferfish-Sentry.patch +++ b/patches/api/0002-Pufferfish-Sentry.patch @@ -7,17 +7,17 @@ Original license: GPL v3 Original project: https://github.com/pufferfish-gg/Pufferfish diff --git a/build.gradle.kts b/build.gradle.kts -index 6be021dcdef8283db51baa25e74570473afb9063..a743dd26f0315ac2b39e846c18155b1f2e07e8f9 100644 +index 2149d23d695e0dd8ebab9f049ee6c3a164b5918b..8c1be45e89ca5ab6b59c2e9b4b0aad347464abfb 100644 --- a/build.gradle.kts +++ b/build.gradle.kts -@@ -47,6 +47,7 @@ dependencies { +@@ -51,6 +51,7 @@ dependencies { apiAndDocs("net.kyori:adventure-text-logger-slf4j") api("org.apache.logging.log4j:log4j-api:$log4jVersion") api("org.slf4j:slf4j-api:$slf4jVersion") + api("io.sentry:sentry:7.0.0") // Pufferfish - implementation("org.ow2.asm:asm:9.4") - implementation("org.ow2.asm:asm-commons:9.4") + implementation("org.ow2.asm:asm:9.5") + implementation("org.ow2.asm:asm-commons:9.5") 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 7f8b1d70..b07fcc8d 100644 --- a/patches/api/0003-Purpur-API-Changes.patch +++ b/patches/api/0003-Purpur-API-Changes.patch @@ -6,7 +6,7 @@ Subject: [PATCH] Purpur API Changes Original license: MIT Original project: https://github.com/PurpurMC/Purpur -Commit: 4f12f5d3d0431cf17c2f6f80f3bdd3c834c9b8fa +Commit: 9e1216de506439171c08773730faea0f0a617a83 Patches below are removed in this patch: Pufferfish-API-Changes.patch @@ -279,10 +279,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 7ca70b269e15e818e61a9329e2775789abb4bc73..aa9ca3e33903747a455ad0949387684ce4b917af 100644 +index 9f86ad25a57b3f6e6bda1ce657833837cb3b2292..7a8a2387d8ae5aae44325da9277e8284b4caa8c0 100644 --- a/src/main/java/org/bukkit/Material.java +++ b/src/main/java/org/bukkit/Material.java -@@ -11054,4 +11054,40 @@ public enum Material implements Keyed, Translatable, net.kyori.adventure.transla +@@ -11500,4 +11500,40 @@ public enum Material implements Keyed, Translatable, net.kyori.adventure.transla public boolean isEnabledByFeature(@NotNull World world) { return Bukkit.getDataPackManager().isEnabledByFeature(this, world); } @@ -817,10 +817,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 9e3cb75536ae260dc898ab9dafbc1d98398782bc..752690574e1d3f47a3cf80fe5da2ba4107386ffd 100644 +index 1d0fd7ff8449f815a7d980af0b378181ea8bf8d8..c20f29e1ddfd1d73df19f6d6f730fa23dc23dc7a 100644 --- a/src/main/java/org/bukkit/entity/Entity.java +++ b/src/main/java/org/bukkit/entity/Entity.java -@@ -1063,4 +1063,42 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent +@@ -1107,4 +1107,42 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent */ @NotNull String getScoreboardEntryName(); // Paper end - entity scoreboard name @@ -1027,10 +1027,10 @@ index bc84b892cae5fe7019a3ad481e9da79956efa1fe..48eb5b00c460cccde29d327cef1d63fc + // Purpur end } diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java -index a47be0fb0220e46cc360729fdf6cc113cdd05a39..91356220da06d290006c7c06244e96a7e88d9740 100644 +index d323109ef01bcd31970a749854eeaf8805e8de6b..dd3726acb045b908053f1fdf3a06bf025823f8c3 100644 --- a/src/main/java/org/bukkit/entity/Player.java +++ b/src/main/java/org/bukkit/entity/Player.java -@@ -3378,4 +3378,123 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM +@@ -3494,4 +3494,123 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM @Override Spigot spigot(); // Spigot end @@ -1266,10 +1266,10 @@ index c9f395064656dd0126410eb3c6e197baa450c063..13156a12e5df50cdc1e465dc0bd9d941 * When a player gets bad omen after killing a patrol captain. */ diff --git a/src/main/java/org/bukkit/event/inventory/InventoryType.java b/src/main/java/org/bukkit/event/inventory/InventoryType.java -index cbce826add9dc2b3187c7bea00c27b785d7517df..3a98de6407d9a6307f89c207be1f09e639385ebe 100644 +index 64e59fe706b0bb37fc2439fa88fd40c3167c9fb5..333ba8a730d01b6baa980f34aa03f3db90c8f255 100644 --- a/src/main/java/org/bukkit/event/inventory/InventoryType.java +++ b/src/main/java/org/bukkit/event/inventory/InventoryType.java -@@ -151,7 +151,7 @@ public enum InventoryType { +@@ -159,7 +159,7 @@ public enum InventoryType { SMITHING_NEW(4, "Upgrade Gear"), ; diff --git a/patches/api/0004-Remove-Timings.patch b/patches/api/0004-Remove-Timings.patch index a877b724..d985705e 100644 --- a/patches/api/0004-Remove-Timings.patch +++ b/patches/api/0004-Remove-Timings.patch @@ -2916,17 +2916,6 @@ index 9d4f553c04784cca63901a56a7aea62a5cae1d72..0f96873eff87ea267f9c1875b3893f35 private static boolean inRange(int i, int j, int k) { return i >= j && i <= k; } -diff --git a/src/main/java/org/bukkit/command/MessageCommandSender.java b/src/main/java/org/bukkit/command/MessageCommandSender.java -index 9d263ab3afb938c215c0b64d9171345fca6ceb2c..b2c9d86956179b77a43f95f13727a79c114476a7 100644 ---- a/src/main/java/org/bukkit/command/MessageCommandSender.java -+++ b/src/main/java/org/bukkit/command/MessageCommandSender.java -@@ -1,5 +1,5 @@ - package org.bukkit.command; -- -+// Dreeam - TODO: need check - import org.bukkit.Bukkit; - import org.bukkit.Server; - import org.bukkit.permissions.Permission; diff --git a/src/main/java/org/bukkit/command/SimpleCommandMap.java b/src/main/java/org/bukkit/command/SimpleCommandMap.java index e43d0e0a2c5edfcc82a677b6c4db9314006c9bf4..68fafa73d2e8d832acc7ce47591477749128b007 100644 --- a/src/main/java/org/bukkit/command/SimpleCommandMap.java diff --git a/patches/api/0005-Bump-Dependencies.patch b/patches/api/0005-Bump-Dependencies.patch index 0bc67d5a..8ca1ce54 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 a743dd26f0315ac2b39e846c18155b1f2e07e8f9..008ede9826d436cbc96dab9ae13b56e3df35a335 100644 +index 8c1be45e89ca5ab6b59c2e9b4b0aad347464abfb..240567146f24ac007409ab0fa73546f88592f46f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -9,11 +9,11 @@ java { @@ -16,9 +16,8 @@ index a743dd26f0315ac2b39e846c18155b1f2e07e8f9..008ede9826d436cbc96dab9ae13b56e3 +val annotationsVersion = "24.1.0" // Leaf - Bump Dependencies val bungeeCordChatVersion = "1.20-R0.1" val adventureVersion = "4.14.0" --val slf4jVersion = "1.8.0-beta4" + val slf4jVersion = "2.0.9" -val log4jVersion = "2.17.1" -+val slf4jVersion = "2.0.9" // Leaf - Bump Dependencies +val log4jVersion = "2.22.0" // Leaf - Bump Dependencies val apiAndDocs: Configuration by configurations.creating { attributes { @@ -30,9 +29,9 @@ index a743dd26f0315ac2b39e846c18155b1f2e07e8f9..008ede9826d436cbc96dab9ae13b56e3 - api("com.google.guava:guava:32.1.2-jre") + api("com.google.guava:guava:32.1.3-jre") // Leaf - Bump Dependencies api("com.google.code.gson:gson:2.10.1") - api("net.md-5:bungeecord-chat:$bungeeCordChatVersion-deprecated+build.14") // Paper - api("org.yaml:snakeyaml:2.2") -@@ -37,7 +37,7 @@ dependencies { + // Paper start - adventure + api("net.md-5:bungeecord-chat:$bungeeCordChatVersion-deprecated+build.14") { +@@ -41,7 +41,7 @@ dependencies { api("com.googlecode.json-simple:json-simple:1.1.1") { isTransitive = false // includes junit } @@ -41,12 +40,12 @@ index a743dd26f0315ac2b39e846c18155b1f2e07e8f9..008ede9826d436cbc96dab9ae13b56e3 apiAndDocs(platform("net.kyori:adventure-bom:$adventureVersion")) apiAndDocs("net.kyori:adventure-api") apiAndDocs("net.kyori:adventure-text-minimessage") -@@ -49,30 +49,32 @@ dependencies { +@@ -53,29 +53,31 @@ dependencies { api("org.slf4j:slf4j-api:$slf4jVersion") api("io.sentry:sentry:7.0.0") // Pufferfish -- implementation("org.ow2.asm:asm:9.4") -- implementation("org.ow2.asm:asm-commons:9.4") +- 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.6") + implementation("org.ow2.asm:asm-commons:9.6") @@ -55,18 +54,16 @@ index a743dd26f0315ac2b39e846c18155b1f2e07e8f9..008ede9826d436cbc96dab9ae13b56e3 - api("org.apache.maven:maven-resolver-provider:3.8.5") - compileOnly("org.apache.maven.resolver:maven-resolver-connector-basic:1.7.3") - compileOnly("org.apache.maven.resolver:maven-resolver-transport-http:1.7.3") -- compileOnly("com.google.code.findbugs:jsr305:1.3.9") // Paper + api("org.apache.maven:maven-resolver-provider:3.9.6") + compileOnly("org.apache.maven.resolver:maven-resolver-connector-basic:1.9.18") + compileOnly("org.apache.maven.resolver:maven-resolver-transport-http:1.9.18") -+ compileOnly("com.google.code.findbugs:jsr305:3.0.2") // Paper val annotations = "org.jetbrains:annotations:$annotationsVersion" // Paper - we don't want Java 5 annotations... compileOnly(annotations) testCompileOnly(annotations) // Paper start - add checker -- val checkerQual = "org.checkerframework:checker-qual:3.21.0" +- val checkerQual = "org.checkerframework:checker-qual:3.33.0" + val checkerQual = "org.checkerframework:checker-qual:3.41.0" // Leaf - Bump Dependencies compileOnlyApi(checkerQual) testCompileOnly(checkerQual) @@ -85,7 +82,7 @@ index a743dd26f0315ac2b39e846c18155b1f2e07e8f9..008ede9826d436cbc96dab9ae13b56e3 } // Paper start -@@ -140,7 +142,7 @@ tasks.withType { +@@ -143,7 +145,7 @@ tasks.withType { options.use() options.isDocFilesSubDirs = true options.links( @@ -94,7 +91,7 @@ index a743dd26f0315ac2b39e846c18155b1f2e07e8f9..008ede9826d436cbc96dab9ae13b56e3 "https://javadoc.io/doc/org.yaml/snakeyaml/2.2/", "https://javadoc.io/doc/org.jetbrains/annotations/$annotationsVersion/", // Paper - we don't want Java 5 annotations // "https://javadoc.io/doc/net.md-5/bungeecord-chat/$bungeeCordChatVersion/", // Paper - don't link to bungee chat -@@ -158,7 +160,7 @@ tasks.withType { +@@ -161,7 +163,7 @@ tasks.withType { "https://javadoc.io/doc/org.slf4j/slf4j-api/$slf4jVersion/", "https://javadoc.io/doc/org.apache.logging.log4j/log4j-api/$log4jVersion/", // Paper end @@ -103,7 +100,7 @@ index a743dd26f0315ac2b39e846c18155b1f2e07e8f9..008ede9826d436cbc96dab9ae13b56e3 ) options.tags("apiNote:a:API Note:") -@@ -201,6 +203,9 @@ val scanJar = tasks.register("scanJarForBadCalls", io.papermc.paperweight.tasks. +@@ -204,6 +206,9 @@ val scanJar = tasks.register("scanJarForBadCalls", io.papermc.paperweight.tasks. jarToScan.set(tasks.jar.flatMap { it.archiveFile }) classpath.from(configurations.compileClasspath) } diff --git a/patches/api/0007-KeYi-Player-Skull-API.patch b/patches/api/0007-KeYi-Player-Skull-API.patch index 9db7abe4..bd341242 100644 --- a/patches/api/0007-KeYi-Player-Skull-API.patch +++ b/patches/api/0007-KeYi-Player-Skull-API.patch @@ -7,14 +7,12 @@ Original license: MIT Original project: https://github.com/KeYiMC/KeYi diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java -index 91356220da06d290006c7c06244e96a7e88d9740..2eb611a28b4567f40aec9e864eb0dac62096f7d4 100644 +index dd3726acb045b908053f1fdf3a06bf025823f8c3..e13e160aa2a404db7b84a1bed1e66f6f2f9232bc 100644 --- a/src/main/java/org/bukkit/entity/Player.java +++ b/src/main/java/org/bukkit/entity/Player.java -@@ -8,8 +8,11 @@ import java.util.Collection; - import java.util.Date; +@@ -9,6 +9,10 @@ import java.util.Date; import java.util.Map; import java.util.UUID; -- import org.bukkit.BanEntry; +// KeYi start +import java.util.concurrent.CompletableFuture; @@ -23,7 +21,7 @@ index 91356220da06d290006c7c06244e96a7e88d9740..2eb611a28b4567f40aec9e864eb0dac6 import org.bukkit.DyeColor; import org.bukkit.Effect; import org.bukkit.GameMode; -@@ -3497,4 +3500,22 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM +@@ -3613,4 +3617,22 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM sendDeathScreen(message); } // Purpur end diff --git a/patches/api/0008-Slice-Smooth-Teleports.patch b/patches/api/0008-Slice-Smooth-Teleports.patch index 47024565..86bb4cd9 100644 --- a/patches/api/0008-Slice-Smooth-Teleports.patch +++ b/patches/api/0008-Slice-Smooth-Teleports.patch @@ -7,10 +7,10 @@ Original license: MIT Original project: https://github.com/Cryptite/Slice diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java -index 2eb611a28b4567f40aec9e864eb0dac62096f7d4..10350641e7d1cd066e1b7bd8be099b387df3ca58 100644 +index e13e160aa2a404db7b84a1bed1e66f6f2f9232bc..3c5a76050deb45d15e3608d0a99350c09bd1e766 100644 --- a/src/main/java/org/bukkit/entity/Player.java +++ b/src/main/java/org/bukkit/entity/Player.java -@@ -3244,6 +3244,19 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM +@@ -3361,6 +3361,19 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM String getClientBrandName(); // Paper end diff --git a/patches/server/0001-Rebrand.patch b/patches/server/0001-Rebrand.patch index 1400f02d..3788ca42 100644 --- a/patches/server/0001-Rebrand.patch +++ b/patches/server/0001-Rebrand.patch @@ -5,22 +5,19 @@ Subject: [PATCH] Rebrand diff --git a/build.gradle.kts b/build.gradle.kts -index de7a3389c66d5cb3123cf4c85d854bc727528b65..14965728716a69f849c21cfe69954a89cf054ff8 100644 +index e800e16e408d8a2f79c98bba229e878665b332db..40cd0233582c2f4e05c57853572eac7abc1f4015 100644 --- a/build.gradle.kts +++ b/build.gradle.kts -@@ -15,9 +15,9 @@ val alsoShade: Configuration by configurations.creating - dependencies { +@@ -29,7 +29,7 @@ dependencies { + extraRuntime(platform("net.kyori:adventure-bom:4.15.0-SNAPSHOT")) // Gale start - project setup // Depend on own API - implementation(project(":gale-api")) + implementation(project(":leaf-api")) // Leaf // Depend on Paper MojangAPI -- implementation("io.papermc.paper:paper-mojangapi:1.20.1-R0.1-SNAPSHOT") { -+ implementation("io.papermc.paper:paper-mojangapi:1.20.2-R0.1-SNAPSHOT") { // Leaf + implementation("io.papermc.paper:paper-mojangapi:${project.version}") { exclude("io.papermc.paper", "paper-api") - } - // Gale end - project setup -@@ -87,7 +87,7 @@ tasks.jar { +@@ -101,7 +101,7 @@ tasks.jar { attributes( "Main-Class" to "org.bukkit.craftbukkit.Main", "Implementation-Title" to "CraftBukkit", @@ -76,10 +73,10 @@ index e45e6b44b2a8f2cdae6e0048a812b92126aa17ca..b5f3f213da8a40d5184098af017c8e26 .completer(new ConsoleCommandCompleter(this.server)) .option(LineReader.Option.COMPLETE_IN_WORD, true); diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 1fb4befc9fd770e2dcc31e9f32965f4510ecc316..a93db76e432d485690d996d821bf8ec68c599b48 100644 +index f1bf143d5a97a4afbba6b2e7c07a5f46678c3260..69d7ffeae56f4e9e8bd33b23c9322f1cd9d09272 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -898,7 +898,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop atomicreference = new AtomicReference(); Thread thread = new io.papermc.paper.util.TickThread(() -> { // Paper - rewrite chunk system diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java -index d41a5cd97255663c54b45cb8f68b5ff5f74d9c14..dc6e4bcdbaef000869fcd35d125f71e45f3f2258 100644 +index fc017f554147eaaee5c436ede2595bccd6b8fd7f..5f1d63343b1d7fbcf19b1ef189504e55170dce34 100644 --- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java +++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java @@ -350,6 +350,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface @@ -58,10 +58,10 @@ index 7fab09e8edf26bd841ab6e51ddf45ac316aa113b..f2070cc0c1a665520b7270b3d72d4255 public ChunkMap(ServerLevel world, LevelStorageSource.LevelStorageAccess session, DataFixer dataFixer, StructureTemplateManager structureTemplateManager, Executor executor, BlockableEventLoop mainThreadExecutor, LightChunkGetter chunkProvider, ChunkGenerator chunkGenerator, ChunkProgressListener worldGenerationProgressListener, ChunkStatusUpdateListener chunkStatusChangeListener, Supplier persistentStateManagerFactory, int viewDistance, boolean dsync) { diff --git a/src/main/java/net/minecraft/server/level/ServerChunkCache.java b/src/main/java/net/minecraft/server/level/ServerChunkCache.java -index 292a6450a2031756b3037c77dfc501e9396d7440..c466991236490bd05bde99e01862fb0e02ff41f1 100644 +index b4b6f21556717900b7ac49f8bead34a95362d4de..c1a140b9d197c06451fe338c28adc5bdee1183a3 100644 --- a/src/main/java/net/minecraft/server/level/ServerChunkCache.java +++ b/src/main/java/net/minecraft/server/level/ServerChunkCache.java -@@ -74,6 +74,9 @@ public class ServerChunkCache extends ChunkSource { +@@ -72,6 +72,9 @@ public class ServerChunkCache extends ChunkSource { final it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap loadedChunkMap = new it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap<>(8192, 0.5f); private final LevelChunk[] lastLoadedChunks = new LevelChunk[4 * 4]; @@ -71,71 +71,58 @@ index 292a6450a2031756b3037c77dfc501e9396d7440..c466991236490bd05bde99e01862fb0e private static int getChunkCacheKey(int x, int z) { return x & 3 | ((z & 3) << 2); -@@ -521,28 +524,35 @@ public class ServerChunkCache extends ChunkSource { - int l = this.distanceManager.getNaturalSpawnChunkCount(); - // Paper start - per player mob spawning - if ((this.spawnFriendlies || this.spawnEnemies) && this.level.paperConfig().entities.spawning.perPlayerMobSpawns) { // don't count mobs when animals and monsters are disabled -- // re-set mob counts -- for (ServerPlayer player : this.level.players) { -- // Paper start - per player mob spawning backoff -- for (int ii = 0; ii < ServerPlayer.MOBCATEGORY_TOTAL_ENUMS; ii++) { -- player.mobCounts[ii] = 0; -- -- int newBackoff = player.mobBackoffCounts[ii] - 1; // TODO make configurable bleed // TODO use nonlinear algorithm? -- if (newBackoff < 0) { -- newBackoff = 0; -+ // Pufferfish start - moved down when async processing -+ if (!org.dreeam.leaf.LeafConfig.enableAsyncMobSpawning) { -+ // re-set mob counts -+ for (ServerPlayer player : this.level.players) { -+ // Paper start - per player mob spawning backoff -+ for (int ii = 0; ii < ServerPlayer.MOBCATEGORY_TOTAL_ENUMS; ii++) { -+ player.mobCounts[ii] = 0; -+ -+ int newBackoff = player.mobBackoffCounts[ii] - 1; // TODO make configurable bleed // TODO use nonlinear algorithm? -+ if (newBackoff < 0) { -+ newBackoff = 0; -+ } -+ player.mobBackoffCounts[ii] = newBackoff; +@@ -550,6 +553,8 @@ public class ServerChunkCache extends ChunkSource { + // Paper start - per player mob spawning + int naturalSpawnChunkCount = k; + if ((this.spawnFriendlies || this.spawnEnemies) && this.level.paperConfig().entities.spawning.perPlayerMobSpawns) { // don't count mobs when animals and monsters are disabled ++ // Pufferfish start - moved down when async processing ++ if (!org.dreeam.leaf.LeafConfig.enableAsyncMobSpawning) { + // re-set mob counts + for (ServerPlayer player : this.level.players) { + // Paper start - per player mob spawning backoff +@@ -564,17 +569,22 @@ public class ServerChunkCache extends ChunkSource { } -- player.mobBackoffCounts[ii] = newBackoff; -+ // Paper end - per player mob spawning backoff + // Paper end - per player mob spawning backoff } -- // Paper end - per player mob spawning backoff -+ lastSpawnState = NaturalSpawner.createState(l, this.level.getAllEntities(), this::getFullChunk, null, true); +- spawnercreature_d = NaturalSpawner.createState(naturalSpawnChunkCount, this.level.getAllEntities(), this::getFullChunk, null, true); ++ lastSpawnState = NaturalSpawner.createState(naturalSpawnChunkCount, this.level.getAllEntities(), this::getFullChunk, null, true); ++ } ++ // Pufferfish end + } else { +- spawnercreature_d = NaturalSpawner.createState(naturalSpawnChunkCount, this.level.getAllEntities(), this::getFullChunk, !this.level.paperConfig().entities.spawning.perPlayerMobSpawns ? new LocalMobCapCalculator(this.chunkMap) : null, false); ++ // Pufferfish start ++ lastSpawnState = NaturalSpawner.createState(naturalSpawnChunkCount, this.level.getAllEntities(), this::getFullChunk, !this.level.paperConfig().entities.spawning.perPlayerMobSpawns ? new LocalMobCapCalculator(this.chunkMap) : null, false); ++ _pufferfish_spawnCountsReady.set(true); ++ // Pufferfish end } -- spawnercreature_d = NaturalSpawner.createState(l, this.level.getAllEntities(), this::getFullChunk, null, true); -+ // Pufferfish end - } else { -- spawnercreature_d = NaturalSpawner.createState(l, this.level.getAllEntities(), this::getFullChunk, !this.level.paperConfig().entities.spawning.perPlayerMobSpawns ? new LocalMobCapCalculator(this.chunkMap) : null, false); -+ // Pufferfish start -+ lastSpawnState = NaturalSpawner.createState(l, this.level.getAllEntities(), this::getFullChunk, !this.level.paperConfig().entities.spawning.perPlayerMobSpawns ? new LocalMobCapCalculator(this.chunkMap) : null, false); -+ _pufferfish_spawnCountsReady.set(true); -+ // Pufferfish end - } - // Paper end - this.level.timings.countNaturalMobs.stopTiming(); // Paper - timings + // Paper end + this.level.timings.countNaturalMobs.stopTiming(); // Paper - timings -- this.lastSpawnState = spawnercreature_d; -+ //this.lastSpawnState = spawnercreature_d; // Pufferfish - this is managed asynchronously - // Paper - optimise chunk tick iteration - // Paper - optimise chunk tick iteration +- this.lastSpawnState = spawnercreature_d; ++ //this.lastSpawnState = spawnercreature_d; // Pufferfish - this is managed asynchronously // Gale start - MultiPaper - skip unnecessary mob spawning computations -@@ -636,8 +646,8 @@ public class ServerChunkCache extends ChunkSource { - // Paper end - optimise chunk tick iteration - if (tick && chunk1.chunkStatus.isOrAfter(net.minecraft.server.level.FullChunkStatus.ENTITY_TICKING)) { // Paper - optimise chunk tick iteration - chunk1.incrementInhabitedTime(j); -- if (spawn && flag2AndHasNaturalSpawn && (this.spawnEnemies || this.spawnFriendlies) && this.level.getWorldBorder().isWithinBounds(chunkcoordintpair)) { // Spigot // Paper - optimise chunk tick iteration // Gale - MultiPaper - skip unnecessary mob spawning computations -- NaturalSpawner.spawnForChunk(this.level, chunk1, spawnercreature_d, this.spawnFriendlies, this.spawnEnemies, flag1); -+ if (spawn && flag2 && (!org.dreeam.leaf.LeafConfig.enableAsyncMobSpawning || _pufferfish_spawnCountsReady.get()) && (this.spawnEnemies || this.spawnFriendlies) && this.level.getWorldBorder().isWithinBounds(chunkcoordintpair)) { // Spigot // Paper - optimise chunk tick iteration // Pufferfish -+ NaturalSpawner.spawnForChunk(this.level, chunk1, lastSpawnState, this.spawnFriendlies, this.spawnEnemies, flag1); // Pufferfish - } + } else { +- spawnercreature_d = null; ++ lastSpawnState = null; // Pufferfish + } + // Gale end - MultiPaper - skip unnecessary mob spawning computations - if (true || this.level.shouldTickBlocksAt(chunkcoordintpair.toLong())) { // Paper - optimise chunk tick iteration -@@ -679,6 +689,39 @@ public class ServerChunkCache extends ChunkSource { +@@ -663,8 +673,8 @@ public class ServerChunkCache extends ChunkSource { + if (tick && chunk1.chunkStatus.isOrAfter(net.minecraft.server.level.FullChunkStatus.ENTITY_TICKING)) { + // Paper end - optimise chunk tick iteration + chunk1.incrementInhabitedTime(j); +- if (spawn && flagAndHasNaturalSpawn && (this.spawnEnemies || this.spawnFriendlies) && this.level.getWorldBorder().isWithinBounds(chunkcoordintpair)) { // Spigot // Paper - optimise chunk tick iteration // Gale - MultiPaper - skip unnecessary mob spawning computations +- NaturalSpawner.spawnForChunk(this.level, chunk1, spawnercreature_d, this.spawnFriendlies, this.spawnEnemies, flag1); ++ if (spawn && flagAndHasNaturalSpawn && (!org.dreeam.leaf.LeafConfig.enableAsyncMobSpawning || _pufferfish_spawnCountsReady.get()) && (this.spawnEnemies || this.spawnFriendlies) && this.level.getWorldBorder().isWithinBounds(chunkcoordintpair)) { // Spigot // Paper - optimise chunk tick iteration // Gale - MultiPaper - skip unnecessary mob spawning computations // Pufferfish ++ NaturalSpawner.spawnForChunk(this.level, chunk1, lastSpawnState, this.spawnFriendlies, this.spawnEnemies, flag1); // Pufferfish + } + + if (true || this.level.shouldTickBlocksAt(chunkcoordintpair.toLong())) { // Paper - optimise chunk tick iteration +@@ -707,6 +717,40 @@ public class ServerChunkCache extends ChunkSource { + this.level.timings.broadcastChunkUpdates.stopTiming(); // Paper - timing // Paper - optimise chunk tick iteration - this.chunkMap.tick(); } ++ + // Pufferfish start - optimize mob spawning + if (org.dreeam.leaf.LeafConfig.enableAsyncMobSpawning) { + for (ServerPlayer player : this.level.players) { diff --git a/patches/server/0006-Pufferfish-Dynamic-Activation-of-Brain.patch b/patches/server/0006-Pufferfish-Dynamic-Activation-of-Brain.patch index 6a67f9fb..5f4a71fb 100644 --- a/patches/server/0006-Pufferfish-Dynamic-Activation-of-Brain.patch +++ b/patches/server/0006-Pufferfish-Dynamic-Activation-of-Brain.patch @@ -30,10 +30,10 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index fcf17d4faffe60bd2b2ba288c919debec735d432..7a63134b143e9ef67554bcfd6bcdaaf1ce2917d9 100644 +index b19571f838469dcaba5ecee06fe43de23bcdc776..1c9ba5d25d521126a912522aed8d220cc1bb68b4 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java -@@ -864,6 +864,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -881,6 +881,7 @@ public class ServerLevel extends Level implements WorldGenLevel { org.spigotmc.ActivationRange.activateEntities(this); // Spigot this.timings.entityTick.startTiming(); // Spigot this.entityTickList.forEach((entity) -> { @@ -42,10 +42,10 @@ index fcf17d4faffe60bd2b2ba288c919debec735d432..7a63134b143e9ef67554bcfd6bcdaaf1 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 a11ab3630fdc5848440e0df0f450337b02ca965a..ab359bca07ec86f14be8b2fb7cc0972d79bc0411 100644 +index 53275a3aef1f4c03324a368a9fef34ffc6307a7f..e3839453a62eb6b6b1272289ccde6a49593aa2f0 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -436,6 +436,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -441,6 +441,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S } // Paper end @@ -58,10 +58,10 @@ index a11ab3630fdc5848440e0df0f450337b02ca965a..ab359bca07ec86f14be8b2fb7cc0972d return this.yRot; } diff --git a/src/main/java/net/minecraft/world/entity/EntityType.java b/src/main/java/net/minecraft/world/entity/EntityType.java -index 73871f456a85bda1e51f54986d0e61fb629822e8..ebf05a484175548c0e411adfd35fd1f648925fed 100644 +index 940b8d0b89d7e55c938aefbe80ee71b0db3dacb8..3e89a633b57fd206216b65f704ea8c0243e02c52 100644 --- a/src/main/java/net/minecraft/world/entity/EntityType.java +++ b/src/main/java/net/minecraft/world/entity/EntityType.java -@@ -301,6 +301,7 @@ public class EntityType implements FeatureElement, EntityTypeT +@@ -305,6 +305,7 @@ public class EntityType implements FeatureElement, EntityTypeT private final boolean canSpawnFarFromPlayer; private final int clientTrackingRange; private final int updateInterval; @@ -70,10 +70,10 @@ index 73871f456a85bda1e51f54986d0e61fb629822e8..ebf05a484175548c0e411adfd35fd1f6 private String descriptionId; @Nullable diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java -index b35d9c04f0a9d73d6483526e396035d72fa33825..770fb085a259cf4af6e0c81c43f9968529659210 100644 +index db9aee68b644d318f65df010027b40628ea84ea2..88cccee4152d18db34818a37c7a2c19dcb6ef596 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java -@@ -226,10 +226,10 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -227,10 +227,10 @@ public abstract class Mob extends LivingEntity implements Targeting { @Override public void inactiveTick() { super.inactiveTick(); @@ -86,7 +86,7 @@ index b35d9c04f0a9d73d6483526e396035d72fa33825..770fb085a259cf4af6e0c81c43f99685 this.targetSelector.tick(); } } -@@ -904,10 +904,14 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -905,10 +905,14 @@ public abstract class Mob extends LivingEntity implements Targeting { int i = this.level().getServer().getTickCount() + this.getId(); if (i % 2 != 0 && this.tickCount > 1) { @@ -153,10 +153,10 @@ index 26731a659fe3c40fc20135d473bacf105cc15300..c521ff04be40bfa892021f67acc1b324 AllayAi.updateActivity(this); super.customServerAiStep(); diff --git a/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java b/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java -index 120fc4e35eb6eedb401b2741a5617bb90d0ee533..26f0430a92aaa5dd5210b255ffb82291c5a7b278 100644 +index 91bde1774cc9e7a323ffd2c943b6656101b232a1..53e932cd13d4d06d81cb3d41b433b8b03375b3b9 100644 --- a/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java +++ b/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java -@@ -280,8 +280,10 @@ public class Axolotl extends Animal implements LerpingModel, VariantHolder { - return true; +@@ -159,8 +159,10 @@ public class Frog extends Animal implements VariantHolder { + } + private int behaviorTick = 0; // Pufferfish @@ -243,10 +243,10 @@ index 57d7873290fc361d8c5c094e166416772fe11cbe..e25456327e510c0b4fac3b1974aa6f3e PiglinAi.updateActivity(this); super.customServerAiStep(); diff --git a/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java b/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java -index db09d5c6b709f746e69111cedebd29f82c1f9e32..f172cf9f754b73e44c3688581c984baa4e2ad8b6 100644 +index 206701dd16f0e5850bc2384388a0a3a746a1b74e..fd2811b0d7cd0f9ff165c5116fe268c4cfe01cce 100644 --- a/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java +++ b/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java -@@ -272,10 +272,12 @@ public class Warden extends Monster implements VibrationSystem { +@@ -273,10 +273,12 @@ public class Warden extends Monster implements VibrationSystem { } @@ -260,7 +260,7 @@ index db09d5c6b709f746e69111cedebd29f82c1f9e32..f172cf9f754b73e44c3688581c984baa super.customServerAiStep(); if ((this.tickCount + this.getId()) % 120 == 0) { diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java -index fdc63df66c41a26c9b417fc64df0120f1f3cb594..892101a78dbf2311f74abdad79b3d4dff8597a3a 100644 +index 53da46274f3cb2767b20e6959e2a0d01c1899750..ad8aad31c748bd813634abd8de4a75f89d8389f0 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java @@ -144,6 +144,8 @@ public class Villager extends AbstractVillager implements ReputationEventHandler diff --git a/patches/server/0007-Pufferfish-Throttle-goal-selector-during-inactive-ti.patch b/patches/server/0007-Pufferfish-Throttle-goal-selector-during-inactive-ti.patch index 6f59919e..0fb2f50b 100644 --- a/patches/server/0007-Pufferfish-Throttle-goal-selector-during-inactive-ti.patch +++ b/patches/server/0007-Pufferfish-Throttle-goal-selector-during-inactive-ti.patch @@ -7,10 +7,10 @@ Original license: GPL v3 Original project: https://github.com/pufferfish-gg/Pufferfish diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java -index bb32b2d71b65254ccfa6a73e7debc63f801e7dc5..db0fb4cd2041b456269479bd97751bd78d9593e9 100644 +index 88cccee4152d18db34818a37c7a2c19dcb6ef596..c413a191fa8fd1a2447f51f66187f0c18818c222 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java -@@ -222,11 +222,13 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -223,11 +223,13 @@ public abstract class Mob extends LivingEntity implements Targeting { return this.lookControl; } diff --git a/patches/server/0008-Pufferfish-Entity-TTL.patch b/patches/server/0008-Pufferfish-Entity-TTL.patch index 188f922a..312e765c 100644 --- a/patches/server/0008-Pufferfish-Entity-TTL.patch +++ b/patches/server/0008-Pufferfish-Entity-TTL.patch @@ -7,10 +7,10 @@ Original license: GPL v3 Original project: https://github.com/pufferfish-gg/Pufferfish diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index ab359bca07ec86f14be8b2fb7cc0972d79bc0411..e8e7f56860720f560f5abf48ea91dc0ff5b34380 100644 +index e3839453a62eb6b6b1272289ccde6a49593aa2f0..b6efe398aa82e1095e6f14e5544e656ebd92ddad 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -805,6 +805,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -810,6 +810,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S } public void tick() { @@ -24,10 +24,10 @@ index ab359bca07ec86f14be8b2fb7cc0972d79bc0411..e8e7f56860720f560f5abf48ea91dc0f } diff --git a/src/main/java/net/minecraft/world/entity/EntityType.java b/src/main/java/net/minecraft/world/entity/EntityType.java -index ebf05a484175548c0e411adfd35fd1f648925fed..2561e74ffdf595a9b6ae13dcd738662c772db442 100644 +index 3e89a633b57fd206216b65f704ea8c0243e02c52..a63399eedb896c06e96c7fba5cac7102e1c40ba6 100644 --- a/src/main/java/net/minecraft/world/entity/EntityType.java +++ b/src/main/java/net/minecraft/world/entity/EntityType.java -@@ -302,6 +302,7 @@ public class EntityType implements FeatureElement, EntityTypeT +@@ -306,6 +306,7 @@ public class EntityType implements FeatureElement, EntityTypeT private final int clientTrackingRange; private final int updateInterval; public boolean dabEnabled = false; // Pufferfish diff --git a/patches/server/0009-Purpur-Server-Changes.patch b/patches/server/0009-Purpur-Server-Changes.patch index 976ff723..581fa433 100644 --- a/patches/server/0009-Purpur-Server-Changes.patch +++ b/patches/server/0009-Purpur-Server-Changes.patch @@ -6,11 +6,12 @@ Subject: [PATCH] Purpur Server Changes Original license: MIT Original project: https://github.com/PurpurMC/Purpur -Commit: 4f12f5d3d0431cf17c2f6f80f3bdd3c834c9b8fa +Commit: 9e1216de506439171c08773730faea0f0a617a83 Patches below are removed in this patch: Metrics change in Purpur-config-files.patch Brand change in Rebrand.patch +Fix-decompile-errors.patch Alternative-Keepalive-Handling.patch Logger-settings-suppressing-pointless-logs.patch Fix-outdated-server-showing-in-ping-before-server-fu.patch @@ -27,10 +28,10 @@ Remove-Mojang-Profiler.patch MC-121706-Fix-mobs-not-looking-up-and-down-when-stra.patch diff --git a/build.gradle.kts b/build.gradle.kts -index 2ad52f8ef126982ac2d3f17ff7af210dcb7f1d79..6e60342d9d394ccd595bde42c84b753ed9c0f7ec 100644 +index 2b6b85708f3464e3d65de298c6e120145868ad5a..ee26e30a654cf8238069ba40d271e18b49ea99a3 100644 --- a/build.gradle.kts +++ b/build.gradle.kts -@@ -64,6 +64,10 @@ dependencies { +@@ -78,6 +78,10 @@ dependencies { } // Pufferfish end @@ -41,7 +42,7 @@ index 2ad52f8ef126982ac2d3f17ff7af210dcb7f1d79..6e60342d9d394ccd595bde42c84b753e testImplementation("io.github.classgraph:classgraph:4.8.47") // Paper - mob goal test testImplementation("org.junit.jupiter:junit-jupiter:5.10.0") testImplementation("org.hamcrest:hamcrest:2.2") -@@ -178,7 +182,7 @@ fun TaskContainer.registerRunTask( +@@ -192,7 +196,7 @@ fun TaskContainer.registerRunTask( name: String, block: JavaExec.() -> Unit ): TaskProvider = register(name) { @@ -142,10 +143,10 @@ index 0000000000000000000000000000000000000000..15a226e3854d731f7724025ea3459c8a + } +} diff --git a/src/main/java/com/destroystokyo/paper/entity/ai/MobGoalHelper.java b/src/main/java/com/destroystokyo/paper/entity/ai/MobGoalHelper.java -index a08c00b8c0488d18be5e182f7892e5ab71d12247..338f693d098b6ab507c30f6411c9a952c34ba8e3 100644 +index cfe6a6f6bcfd7a3b29ab25f5a6745d31c18f338d..c168658d4d4ec1ddd80425e786d4435fd6576637 100644 --- a/src/main/java/com/destroystokyo/paper/entity/ai/MobGoalHelper.java +++ b/src/main/java/com/destroystokyo/paper/entity/ai/MobGoalHelper.java -@@ -136,6 +136,10 @@ public class MobGoalHelper { +@@ -137,6 +137,10 @@ public class MobGoalHelper { static { // TODO these kinda should be checked on each release, in case obfuscation changes deobfuscationMap.put("abstract_skeleton_1", "abstract_skeleton_melee"); @@ -416,10 +417,10 @@ index 0000000000000000000000000000000000000000..a7d1ae53eac94bc2dcf8bc78ef1da0d3 + } +} diff --git a/src/main/java/net/minecraft/commands/CommandSourceStack.java b/src/main/java/net/minecraft/commands/CommandSourceStack.java -index 56ae02aab93b9a698e9d2f07a0448aa4767169d9..106b27d507b16297a0a88b3b5beaaf3d0ef7e2c6 100644 +index 14f4c0a93372a58cf36dc95265b5e210ea1605e5..e75a5caa06a1a92a7ab4c70b1d4ab512f645022d 100644 --- a/src/main/java/net/minecraft/commands/CommandSourceStack.java +++ b/src/main/java/net/minecraft/commands/CommandSourceStack.java -@@ -223,6 +223,19 @@ public class CommandSourceStack implements SharedSuggestionProvider, com.destroy +@@ -217,6 +217,19 @@ public class CommandSourceStack implements ExecutionCommandSource processQueue = new java.util.concurrent.ConcurrentLinkedQueue(); public int autosavePeriod; public Commands vanillaCommandDispatcher; -@@ -282,11 +283,13 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0; // Paper net.minecraft.world.level.block.entity.HopperBlockEntity.skipHopperEvents = worldserver.paperConfig().hopper.disableMoveEvent || org.bukkit.event.inventory.InventoryMoveItemEvent.getHandlerList().getRegisteredListeners().length == 0; // Paper worldserver.hasEntityMoveEvent = io.papermc.paper.event.entity.EntityMoveEvent.getHandlerList().getRegisteredListeners().length > 0; // Paper @@ -810,7 +811,7 @@ index c5f86ffb98bf9790e58e22473762a58546564100..4a318ba073eff673db292490d886748a /* Drop global time updates if (this.tickCount % 20 == 0) { -@@ -2542,6 +2568,15 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop { final io.papermc.paper.adventure.ChatDecorationProcessor processor = new io.papermc.paper.adventure.ChatDecorationProcessor(this, sender, commandSourceStack, message); diff --git a/src/main/java/net/minecraft/server/PlayerAdvancements.java b/src/main/java/net/minecraft/server/PlayerAdvancements.java -index 33c36779548332a8c3653c6b829d941b6dc5fd49..52f73a4644673ae4211873a18aebb147d204fe2c 100644 +index e15409231e56f5bbbfbcd19cea2c7e3fbc612886..c218d2b00c937ba2b3adb4314719b4f7d049ddd6 100644 --- a/src/main/java/net/minecraft/server/PlayerAdvancements.java +++ b/src/main/java/net/minecraft/server/PlayerAdvancements.java -@@ -247,6 +247,7 @@ public class PlayerAdvancements { +@@ -250,6 +250,7 @@ public class PlayerAdvancements { advancement.value().display().ifPresent((advancementdisplay) -> { // Paper start - Add Adventure message to PlayerAdvancementDoneEvent if (event.message() != null && this.player.level().getGameRules().getBoolean(GameRules.RULE_ANNOUNCE_ADVANCEMENTS)) { @@ -839,7 +840,7 @@ index 33c36779548332a8c3653c6b829d941b6dc5fd49..52f73a4644673ae4211873a18aebb147 // Paper end } diff --git a/src/main/java/net/minecraft/server/commands/EnchantCommand.java b/src/main/java/net/minecraft/server/commands/EnchantCommand.java -index 664cbce2e06fcb95d3d3d6c5302fc9119f938925..bc9778c705d23acd84fa1cdeff6b403b4cda3686 100644 +index 37d9c354af887c474094b1a364782007a5f2035d..ec86231077f6a1e03068507555539c5b550ddf31 100644 --- a/src/main/java/net/minecraft/server/commands/EnchantCommand.java +++ b/src/main/java/net/minecraft/server/commands/EnchantCommand.java @@ -48,7 +48,7 @@ public class EnchantCommand { @@ -896,7 +897,7 @@ index d601d287e94a59ff93b8a83a44dac02544d211df..0ff3b06a98b2f4514b2d861b92dd70fe itemstack1.setCount(1); entityitem = entityplayer.drop(itemstack1, false, false, false); // SPIGOT-2942: Add boolean to call event diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java -index 66ec23418a8a0b453275f03613126a3518a88348..77e80f2a59a8a45138c2b8504842f6f50d4895ab 100644 +index 5f1d63343b1d7fbcf19b1ef189504e55170dce34..f690b0b56bdaf78ce1e64445f14018b705eb3c37 100644 --- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java +++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java @@ -98,6 +98,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface @@ -964,10 +965,10 @@ index 66ec23418a8a0b453275f03613126a3518a88348..77e80f2a59a8a45138c2b8504842f6f5 } } diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServerProperties.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServerProperties.java -index 4cd514fd09689c0d1527a53dfe8cb6acb280c1ee..3876d6f0225a0028fd44ff87842fc124b8e680f9 100644 +index 96c79afbdc824257b4225a85ff9b2fe2d8310f57..7f1fae294f141bccab387788a1c5cc51905645c6 100644 --- a/src/main/java/net/minecraft/server/dedicated/DedicatedServerProperties.java +++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServerProperties.java -@@ -58,6 +58,7 @@ public class DedicatedServerProperties extends Settings> 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 643c889c4099fde0f64ed1fc72770de55adf9033..4f353e049252827a4e751817984746dfeb3b2659 100644 +index 1c9ba5d25d521126a912522aed8d220cc1bb68b4..dd677f1981abd5aaaf9c1ec79dbde1766f70ce84 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java -@@ -213,6 +213,8 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -215,6 +215,8 @@ public class ServerLevel extends Level implements WorldGenLevel { private final StructureManager structureManager; private final StructureCheck structureCheck; private final boolean tickTime; @@ -1138,7 +1139,7 @@ index 643c889c4099fde0f64ed1fc72770de55adf9033..4f353e049252827a4e751817984746df private final RandomSequences randomSequences; public long lastMidTickExecuteFailure; // Paper - execute chunk tasks mid tick -@@ -222,6 +224,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -224,6 +226,7 @@ public class ServerLevel extends Level implements WorldGenLevel { public boolean hasPhysicsEvent = true; // Paper public boolean hasEntityMoveEvent = false; // Paper private final alternate.current.wire.WireHandler wireHandler = new alternate.current.wire.WireHandler(this); // Paper - optimize redstone (Alternate Current) @@ -1146,7 +1147,7 @@ index 643c889c4099fde0f64ed1fc72770de55adf9033..4f353e049252827a4e751817984746df public static Throwable getAddToWorldStackTrace(Entity entity) { final Throwable thr = new Throwable(entity + " Added to world at " + new java.util.Date()); io.papermc.paper.util.StacktraceDeobfuscator.INSTANCE.deobfuscateThrowable(thr); -@@ -707,7 +710,24 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -709,7 +712,24 @@ public class ServerLevel extends Level implements WorldGenLevel { this.dragonParts = new Int2ObjectOpenHashMap(); this.tickTime = flag1; this.server = minecraftserver; @@ -1172,7 +1173,7 @@ index 643c889c4099fde0f64ed1fc72770de55adf9033..4f353e049252827a4e751817984746df this.serverLevelData = iworlddataserver; ChunkGenerator chunkgenerator = worlddimension.generator(); // CraftBukkit start -@@ -769,6 +789,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -771,6 +791,7 @@ public class ServerLevel extends Level implements WorldGenLevel { this.chunkTaskScheduler = new io.papermc.paper.chunk.system.scheduling.ChunkTaskScheduler(this, io.papermc.paper.chunk.system.scheduling.ChunkTaskScheduler.workerThreads); // Paper - rewrite chunk system this.entityLookup = new io.papermc.paper.chunk.system.entity.EntityLookup(this, new EntityCallbacks()); // Paper - rewrite chunk system @@ -1180,7 +1181,7 @@ index 643c889c4099fde0f64ed1fc72770de55adf9033..4f353e049252827a4e751817984746df } // Paper start -@@ -809,7 +830,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -817,7 +838,7 @@ public class ServerLevel extends Level implements WorldGenLevel { int i = this.getGameRules().getInt(GameRules.RULE_PLAYERS_SLEEPING_PERCENTAGE); long j; @@ -1189,7 +1190,7 @@ index 643c889c4099fde0f64ed1fc72770de55adf9033..4f353e049252827a4e751817984746df // CraftBukkit start j = this.levelData.getDayTime() + 24000L; TimeSkipEvent event = new TimeSkipEvent(this.getWorld(), TimeSkipEvent.SkipReason.NIGHT_SKIP, (j - j % 24000L) - this.getDayTime()); -@@ -922,6 +943,13 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -939,6 +960,13 @@ public class ServerLevel extends Level implements WorldGenLevel { this.serverLevelData.setGameTime(i); this.serverLevelData.getScheduledEvents().tick(this.server, i); if (this.levelData.getGameRules().getBoolean(GameRules.RULE_DAYLIGHT)) { @@ -1203,7 +1204,7 @@ index 643c889c4099fde0f64ed1fc72770de55adf9033..4f353e049252827a4e751817984746df this.setDayTime(this.levelData.getDayTime() + 1L); } -@@ -930,8 +958,22 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -947,8 +975,22 @@ public class ServerLevel extends Level implements WorldGenLevel { public void setDayTime(long timeOfDay) { this.serverLevelData.setDayTime(timeOfDay); @@ -1226,7 +1227,7 @@ index 643c889c4099fde0f64ed1fc72770de55adf9033..4f353e049252827a4e751817984746df public void tickCustomSpawners(boolean spawnMonsters, boolean spawnAnimals) { Iterator iterator = this.customSpawners.iterator(); -@@ -974,10 +1016,18 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -991,10 +1033,18 @@ public class ServerLevel extends Level implements WorldGenLevel { boolean flag1 = this.getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING) && this.random.nextDouble() < (double) difficultydamagescaler.getEffectiveDifficulty() * this.paperConfig().entities.spawning.skeletonHorseThunderSpawnChance.or(0.01D) && !this.getBlockState(blockposition.below()).is(Blocks.LIGHTNING_ROD); // Paper if (flag1) { @@ -1247,7 +1248,7 @@ index 643c889c4099fde0f64ed1fc72770de55adf9033..4f353e049252827a4e751817984746df entityhorseskeleton.setAge(0); entityhorseskeleton.setPos((double) blockposition.getX(), (double) blockposition.getY(), (double) blockposition.getZ()); this.addFreshEntity(entityhorseskeleton, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.LIGHTNING); // CraftBukkit -@@ -1091,7 +1141,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1114,7 +1164,7 @@ public class ServerLevel extends Level implements WorldGenLevel { return holder.is(PoiTypes.LIGHTNING_ROD); }, (blockposition1) -> { return blockposition1.getY() == this.getHeight(Heightmap.Types.WORLD_SURFACE, blockposition1.getX(), blockposition1.getZ()) - 1; @@ -1256,7 +1257,7 @@ index 643c889c4099fde0f64ed1fc72770de55adf9033..4f353e049252827a4e751817984746df return optional.map((blockposition1) -> { return blockposition1.above(1); -@@ -1140,11 +1190,27 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1163,11 +1213,27 @@ public class ServerLevel extends Level implements WorldGenLevel { if (this.canSleepThroughNights()) { if (!this.getServer().isSingleplayer() || this.getServer().isPublished()) { int i = this.getGameRules().getInt(GameRules.RULE_PLAYERS_SLEEPING_PERCENTAGE); @@ -1285,15 +1286,15 @@ index 643c889c4099fde0f64ed1fc72770de55adf9033..4f353e049252827a4e751817984746df ichatmutablecomponent = Component.translatable("sleep.players_sleeping", this.sleepStatus.amountSleeping(), this.sleepStatus.sleepersNeeded(i)); } -@@ -1283,6 +1349,7 @@ public class ServerLevel extends Level implements WorldGenLevel { - - private void resetWeatherCycle() { +@@ -1307,6 +1373,7 @@ public class ServerLevel extends Level implements WorldGenLevel { + @VisibleForTesting + public void resetWeatherCycle() { // CraftBukkit start + if (this.purpurConfig.rainStopsAfterSleep) // Purpur this.serverLevelData.setRaining(false, org.bukkit.event.weather.WeatherChangeEvent.Cause.SLEEP); // Paper - when passing the night // If we stop due to everyone sleeping we should reset the weather duration to some other random value. // Not that everyone ever manages to get the whole server to sleep at the same time.... -@@ -1290,6 +1357,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1314,6 +1381,7 @@ public class ServerLevel extends Level implements WorldGenLevel { this.serverLevelData.setRainTime(0); } // CraftBukkit end @@ -1301,7 +1302,7 @@ index 643c889c4099fde0f64ed1fc72770de55adf9033..4f353e049252827a4e751817984746df this.serverLevelData.setThundering(false, org.bukkit.event.weather.ThunderChangeEvent.Cause.SLEEP); // Paper - when passing the night // CraftBukkit start // If we stop due to everyone sleeping we should reset the weather duration to some other random value. -@@ -2778,7 +2846,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -2824,7 +2892,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 @@ -1311,11 +1312,11 @@ index 643c889c4099fde0f64ed1fc72770de55adf9033..4f353e049252827a4e751817984746df } // Paper end diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index f02ebd0d95433b44ce8f85f4374669d66a9a9660..1b760a544616c9950f65071736cf34abcb10d7a1 100644 +index a9d6870abe34e929c476ae199549e26643ef3343..6096a1d08cb2018a178ed925e0a909ed8f5c3888 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java -@@ -275,6 +275,10 @@ public class ServerPlayer extends Player { - public PlayerNaturallySpawnCreaturesEvent playerNaturallySpawnedEvent; // Paper +@@ -282,6 +282,10 @@ public class ServerPlayer extends Player { + public com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent playerNaturallySpawnedEvent; // Paper public @Nullable String clientBrandName = null; // Paper - Brand name public org.bukkit.event.player.PlayerQuitEvent.QuitReason quitReason = null; // Paper - there are a lot of changes to do if we change all methods leading to the event + public boolean purpurClient = false; // Purpur @@ -1325,7 +1326,7 @@ index f02ebd0d95433b44ce8f85f4374669d66a9a9660..1b760a544616c9950f65071736cf34ab // Paper start - replace player chunk loader private final java.util.concurrent.atomic.AtomicReference viewDistances = new java.util.concurrent.atomic.AtomicReference<>(new io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader.ViewDistances(-1, -1, -1)); -@@ -562,6 +566,9 @@ public class ServerPlayer extends Player { +@@ -569,6 +573,9 @@ public class ServerPlayer extends Player { } } @@ -1335,7 +1336,7 @@ index f02ebd0d95433b44ce8f85f4374669d66a9a9660..1b760a544616c9950f65071736cf34ab } @Override -@@ -628,6 +635,9 @@ public class ServerPlayer extends Player { +@@ -635,6 +642,9 @@ public class ServerPlayer extends Player { } this.getBukkitEntity().setExtraData(nbt); // CraftBukkit @@ -1345,7 +1346,7 @@ index f02ebd0d95433b44ce8f85f4374669d66a9a9660..1b760a544616c9950f65071736cf34ab } // CraftBukkit start - World fallback code, either respawn location or global spawn -@@ -756,6 +766,15 @@ public class ServerPlayer extends Player { +@@ -763,6 +773,15 @@ public class ServerPlayer extends Player { this.trackStartFallingPosition(); this.trackEnteredOrExitedLavaOnVehicle(); this.advancements.flushDirty(this); @@ -1361,15 +1362,15 @@ index f02ebd0d95433b44ce8f85f4374669d66a9a9660..1b760a544616c9950f65071736cf34ab } public void doTick() { -@@ -992,6 +1011,7 @@ public class ServerPlayer extends Player { +@@ -999,6 +1018,7 @@ public class ServerPlayer extends Player { })); - Team scoreboardteambase = this.getTeam(); + PlayerTeam scoreboardteam = this.getTeam(); + if (org.purpurmc.purpur.PurpurConfig.deathMessageOnlyBroadcastToAffectedPlayer) this.sendSystemMessage(ichatbasecomponent); else // Purpur - if (scoreboardteambase != null && scoreboardteambase.getDeathMessageVisibility() != Team.Visibility.ALWAYS) { - if (scoreboardteambase.getDeathMessageVisibility() == Team.Visibility.HIDE_FOR_OTHER_TEAMS) { + if (scoreboardteam != null && scoreboardteam.getDeathMessageVisibility() != Team.Visibility.ALWAYS) { + if (scoreboardteam.getDeathMessageVisibility() == Team.Visibility.HIDE_FOR_OTHER_TEAMS) { this.server.getPlayerList().broadcastSystemToTeam(this, ichatbasecomponent); -@@ -1098,6 +1118,16 @@ public class ServerPlayer extends Player { +@@ -1102,6 +1122,16 @@ public class ServerPlayer extends Player { if (this.isInvulnerableTo(source)) { return false; } else { @@ -1386,7 +1387,7 @@ index f02ebd0d95433b44ce8f85f4374669d66a9a9660..1b760a544616c9950f65071736cf34ab boolean flag = this.server.isDedicatedServer() && this.isPvpAllowed() && source.is(DamageTypeTags.IS_FALL); if (!flag && this.spawnInvulnerableTime > 0 && !source.is(DamageTypeTags.BYPASSES_INVULNERABILITY)) { -@@ -1241,6 +1271,7 @@ public class ServerPlayer extends Player { +@@ -1245,6 +1275,7 @@ public class ServerPlayer extends Player { playerlist.sendPlayerPermissionLevel(this); worldserver1.removePlayerImmediately(this, Entity.RemovalReason.CHANGED_DIMENSION); this.unsetRemoved(); @@ -1394,7 +1395,7 @@ index f02ebd0d95433b44ce8f85f4374669d66a9a9660..1b760a544616c9950f65071736cf34ab // CraftBukkit end this.setServerLevel(worldserver); -@@ -1396,7 +1427,7 @@ public class ServerPlayer extends Player { +@@ -1400,7 +1431,7 @@ public class ServerPlayer extends Player { return entitymonster.isPreventingPlayerRest(this); }); @@ -1403,7 +1404,7 @@ index f02ebd0d95433b44ce8f85f4374669d66a9a9660..1b760a544616c9950f65071736cf34ab return Either.left(Player.BedSleepingProblem.NOT_SAFE); } } -@@ -1436,7 +1467,19 @@ public class ServerPlayer extends Player { +@@ -1440,7 +1471,19 @@ public class ServerPlayer extends Player { }); if (!this.serverLevel().canSleepThroughNights()) { @@ -1424,7 +1425,7 @@ index f02ebd0d95433b44ce8f85f4374669d66a9a9660..1b760a544616c9950f65071736cf34ab } ((ServerLevel) this.level()).updateSleepingPlayerList(); -@@ -1533,6 +1576,7 @@ public class ServerPlayer extends Player { +@@ -1545,6 +1588,7 @@ public class ServerPlayer extends Player { @Override public void openTextEdit(SignBlockEntity sign, boolean front) { @@ -1432,7 +1433,7 @@ index f02ebd0d95433b44ce8f85f4374669d66a9a9660..1b760a544616c9950f65071736cf34ab this.connection.send(new ClientboundBlockUpdatePacket(this.level(), sign.getBlockPos())); this.connection.send(new ClientboundOpenSignEditorPacket(sign.getBlockPos(), front)); } -@@ -1778,6 +1822,26 @@ public class ServerPlayer extends Player { +@@ -1879,6 +1923,26 @@ public class ServerPlayer extends Player { this.lastSentExp = -1; // CraftBukkit - Added to reset } @@ -1459,7 +1460,7 @@ index f02ebd0d95433b44ce8f85f4374669d66a9a9660..1b760a544616c9950f65071736cf34ab @Override public void displayClientMessage(Component message, boolean overlay) { this.sendSystemMessage(message, overlay); -@@ -2105,8 +2169,68 @@ public class ServerPlayer extends Player { +@@ -2206,8 +2270,68 @@ public class ServerPlayer extends Player { public void resetLastActionTime() { this.lastActionTime = Util.getMillis(); @@ -1528,7 +1529,7 @@ index f02ebd0d95433b44ce8f85f4374669d66a9a9660..1b760a544616c9950f65071736cf34ab public ServerStatsCounter getStats() { return this.stats; } -@@ -2657,4 +2781,50 @@ public class ServerPlayer extends Player { +@@ -2758,4 +2882,50 @@ public class ServerPlayer extends Player { return (CraftPlayer) super.getBukkitEntity(); } // CraftBukkit end @@ -1580,7 +1581,7 @@ index f02ebd0d95433b44ce8f85f4374669d66a9a9660..1b760a544616c9950f65071736cf34ab + // Purpur end } diff --git a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java -index 091d292b04649977961f32dff949a432cb44106e..165b014e9b12f8f091f73c1696ad39fa10e460c1 100644 +index c0b368b8137ca6d90c4e6ec931e07b7ea69f8d9b..d02fec293868dd288e0fa0a9d214774f22719a0a 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java @@ -397,6 +397,7 @@ public class ServerPlayerGameMode { @@ -1591,15 +1592,6 @@ index 091d292b04649977961f32dff949a432cb44106e..165b014e9b12f8f091f73c1696ad39fa } // CraftBukkit end -@@ -427,7 +428,7 @@ public class ServerPlayerGameMode { - - ItemStack mainHandStack = null; // Paper - boolean isCorrectTool = false; // Paper -- if (this.isCreative()) { -+ if (this.isCreative() || (this.level.purpurConfig.shulkerBoxAllowOversizedStacks && block instanceof net.minecraft.world.level.block.ShulkerBoxBlock)) { // Purpur - // return true; // CraftBukkit - } else { - ItemStack itemstack = this.player.getMainHandItem(); @@ -516,6 +517,7 @@ public class ServerPlayerGameMode { public InteractionHand interactHand; public ItemStack interactItemStack; @@ -1637,7 +1629,7 @@ index 091d292b04649977961f32dff949a432cb44106e..165b014e9b12f8f091f73c1696ad39fa + // Purpur end } diff --git a/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java -index 9019bbc86f3e94b8f4033f2e5fb43dd7efac15f9..c2f73ac74d59f05cc4db657304de26132b78e506 100644 +index cb453c4db347b320f19a79ede2d8898106605e25..3eac8b20e31948f98a522a5f7e5088a032e36bed 100644 --- a/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java @@ -63,6 +63,7 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack @@ -1663,10 +1655,10 @@ index 9019bbc86f3e94b8f4033f2e5fb43dd7efac15f9..c2f73ac74d59f05cc4db657304de2613 try { String channels = payload.toString(com.google.common.base.Charsets.UTF_8); diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 477c343670599ba16dc34a5d4c07392ae1cc873b..b4e9a31d7c65fbee6eb83d2784313630a8d8fca9 100644 +index 7b955100e39a935259887475278b24cf29905577..ca8db3c11a6a794b23f760b7aaee69290752043f 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -334,6 +334,20 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -337,6 +337,20 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl } // Gale end - make max interaction distance configurable @@ -1687,7 +1679,7 @@ index 477c343670599ba16dc34a5d4c07392ae1cc873b..b4e9a31d7c65fbee6eb83d2784313630 @Override public void tick() { if (this.ackBlockChangesUpTo > -1) { -@@ -401,6 +415,12 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -404,6 +418,12 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl } if (this.player.getLastActionTime() > 0L && this.server.getPlayerIdleTimeout() > 0 && Util.getMillis() - this.player.getLastActionTime() > (long) this.server.getPlayerIdleTimeout() * 1000L * 60L && !this.player.wonGame) { // Paper - Prevent AFK kick while watching end credits. @@ -1700,7 +1692,7 @@ index 477c343670599ba16dc34a5d4c07392ae1cc873b..b4e9a31d7c65fbee6eb83d2784313630 this.player.resetLastActionTime(); // CraftBukkit - SPIGOT-854 this.disconnect(Component.translatable("multiplayer.disconnect.idling"), org.bukkit.event.player.PlayerKickEvent.Cause.IDLING); // Paper - kick event cause } -@@ -649,6 +669,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -652,6 +672,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl this.lastYaw = to.getYaw(); this.lastPitch = to.getPitch(); @@ -1709,7 +1701,7 @@ index 477c343670599ba16dc34a5d4c07392ae1cc873b..b4e9a31d7c65fbee6eb83d2784313630 // Skip the first time we do this if (true) { // Spigot - don't skip any move events Location oldTo = to.clone(); -@@ -725,6 +747,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -728,6 +750,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl if (packet.getId() == this.awaitingTeleport) { if (this.awaitingPositionFromClient == null) { this.disconnect(Component.translatable("multiplayer.disconnect.invalid_player_movement"), org.bukkit.event.player.PlayerKickEvent.Cause.INVALID_PLAYER_MOVEMENT); // Paper - kick event cause @@ -1717,7 +1709,7 @@ index 477c343670599ba16dc34a5d4c07392ae1cc873b..b4e9a31d7c65fbee6eb83d2784313630 return; } -@@ -1142,10 +1165,15 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1147,10 +1170,15 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl int maxBookPageSize = io.papermc.paper.configuration.GlobalConfiguration.get().itemValidation.bookSize.pageMax; double multiplier = Math.max(0.3D, Math.min(1D, io.papermc.paper.configuration.GlobalConfiguration.get().itemValidation.bookSize.totalMultiplier)); long byteAllowed = maxBookPageSize; @@ -1733,7 +1725,7 @@ index 477c343670599ba16dc34a5d4c07392ae1cc873b..b4e9a31d7c65fbee6eb83d2784313630 server.scheduleOnMain(() -> this.disconnect("Book too large!", org.bukkit.event.player.PlayerKickEvent.Cause.ILLEGAL_ACTION)); // Paper - kick event cause return; } -@@ -1169,6 +1197,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1174,6 +1202,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl if (byteTotal > byteAllowed) { ServerGamePacketListenerImpl.LOGGER.warn(this.player.getScoreboardName() + " tried to send too large of a book. Book Size: " + byteTotal + " - Allowed: "+ byteAllowed + " - Pages: " + pageList.size()); @@ -1741,7 +1733,7 @@ index 477c343670599ba16dc34a5d4c07392ae1cc873b..b4e9a31d7c65fbee6eb83d2784313630 server.scheduleOnMain(() -> this.disconnect("Book too large!", org.bukkit.event.player.PlayerKickEvent.Cause.ILLEGAL_ACTION)); // Paper - kick event cause return; } -@@ -1222,13 +1251,16 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1227,13 +1256,16 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl itemstack1.setTag(nbttagcompound.copy()); } @@ -1761,7 +1753,7 @@ index 477c343670599ba16dc34a5d4c07392ae1cc873b..b4e9a31d7c65fbee6eb83d2784313630 this.updateBookPages(pages, (s) -> { return Component.Serializer.toJson(Component.literal(s)); -@@ -1240,10 +1272,13 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1245,10 +1277,13 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl private void updateBookPages(List list, UnaryOperator unaryoperator, ItemStack itemstack, int slot, ItemStack handItem) { // CraftBukkit ListTag nbttaglist = new ListTag(); @@ -1777,7 +1769,7 @@ index 477c343670599ba16dc34a5d4c07392ae1cc873b..b4e9a31d7c65fbee6eb83d2784313630 Objects.requireNonNull(nbttaglist); stream.forEach(nbttaglist::add); -@@ -1253,11 +1288,11 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1258,11 +1293,11 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl for (int j = list.size(); i < j; ++i) { FilteredText filteredtext = (FilteredText) list.get(i); @@ -1791,7 +1783,7 @@ index 477c343670599ba16dc34a5d4c07392ae1cc873b..b4e9a31d7c65fbee6eb83d2784313630 } } -@@ -1270,6 +1305,16 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1275,6 +1310,16 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl this.player.getInventory().setItem(slot, CraftEventFactory.handleEditBookEvent(this.player, slot, handItem, itemstack)); // CraftBukkit // Paper - Don't ignore result (see other callsite for handleEditBookEvent) } @@ -1808,7 +1800,7 @@ index 477c343670599ba16dc34a5d4c07392ae1cc873b..b4e9a31d7c65fbee6eb83d2784313630 @Override public void handleEntityTagQuery(ServerboundEntityTagQuery packet) { PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel()); -@@ -1299,8 +1344,16 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1324,8 +1369,16 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl @Override public void handleMovePlayer(ServerboundMovePlayerPacket packet) { PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel()); @@ -1826,7 +1818,7 @@ index 477c343670599ba16dc34a5d4c07392ae1cc873b..b4e9a31d7c65fbee6eb83d2784313630 } else { ServerLevel worldserver = this.player.serverLevel(); -@@ -1483,7 +1536,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1510,7 +1563,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl if (!event.isAllowed()) { flag2 = true; // Paper - diff on change, this should be moved wrongly if (event.getLogWarning()) @@ -1835,7 +1827,7 @@ index 477c343670599ba16dc34a5d4c07392ae1cc873b..b4e9a31d7c65fbee6eb83d2784313630 } // Paper end } -@@ -1545,6 +1598,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1572,6 +1625,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl this.lastYaw = to.getYaw(); this.lastPitch = to.getPitch(); @@ -1844,7 +1836,7 @@ index 477c343670599ba16dc34a5d4c07392ae1cc873b..b4e9a31d7c65fbee6eb83d2784313630 // Skip the first time we do this if (from.getX() != Double.MAX_VALUE) { Location oldTo = to.clone(); -@@ -1583,6 +1638,13 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1610,6 +1665,13 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl this.player.resetFallDistance(); } @@ -1858,7 +1850,7 @@ index 477c343670599ba16dc34a5d4c07392ae1cc873b..b4e9a31d7c65fbee6eb83d2784313630 this.player.checkMovementStatistics(this.player.getX() - d3, this.player.getY() - d4, this.player.getZ() - d5); this.lastGoodX = this.player.getX(); this.lastGoodY = this.player.getY(); -@@ -1634,6 +1696,13 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1661,6 +1723,13 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl return false; } // Paper end - optimise out extra getCubes @@ -1872,7 +1864,16 @@ index 477c343670599ba16dc34a5d4c07392ae1cc873b..b4e9a31d7c65fbee6eb83d2784313630 private boolean isPlayerCollidingWithAnythingNew(LevelReader world, AABB box, double newX, double newY, double newZ) { AABB axisalignedbb1 = this.player.getBoundingBox().move(newX - this.player.getX(), newY - this.player.getY(), newZ - this.player.getZ()); Iterable iterable = world.getCollisions(this.player, axisalignedbb1.deflate(9.999999747378752E-6D)); -@@ -1979,6 +2048,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1671,7 +1740,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl + + do { + if (!iterator.hasNext()) { +- return false; ++ return !org.purpurmc.purpur.PurpurConfig.kickForOutOfOrderChat; // Purpur // Leaf TODO - Need check this + } + + voxelshape1 = (VoxelShape) iterator.next(); +@@ -2006,6 +2075,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl boolean cancelled; if (movingobjectposition == null || movingobjectposition.getType() != HitResult.Type.BLOCK) { @@ -1880,16 +1881,7 @@ index 477c343670599ba16dc34a5d4c07392ae1cc873b..b4e9a31d7c65fbee6eb83d2784313630 org.bukkit.event.player.PlayerInteractEvent event = CraftEventFactory.callPlayerInteractEvent(this.player, Action.RIGHT_CLICK_AIR, itemstack, enumhand); cancelled = event.useItemInHand() == Event.Result.DENY; } else { -@@ -2304,7 +2374,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl - do { - instant1 = (Instant) this.lastChatTimeStamp.get(); - if (timestamp.isBefore(instant1)) { -- return false; -+ return !org.purpurmc.purpur.PurpurConfig.kickForOutOfOrderChat; // Purpur - } - } while (!this.lastChatTimeStamp.compareAndSet(instant1, timestamp)); - -@@ -2724,6 +2794,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2721,6 +2791,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl AABB axisalignedbb = entity.getBoundingBox(); if (axisalignedbb.distanceToSqr(this.player.getEyePosition()) < ServerGamePacketListenerImpl.getMaxInteractionDistanceSquared(this.player.level())) { // Gale - make max interaction distance configurable @@ -1897,7 +1889,7 @@ index 477c343670599ba16dc34a5d4c07392ae1cc873b..b4e9a31d7c65fbee6eb83d2784313630 packet.dispatch(new ServerboundInteractPacket.Handler() { private void performInteraction(InteractionHand enumhand, ServerGamePacketListenerImpl.EntityInteraction playerconnection_a, PlayerInteractEntityEvent event) { // CraftBukkit ItemStack itemstack = ServerGamePacketListenerImpl.this.player.getItemInHand(enumhand); -@@ -2737,6 +2808,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2734,6 +2805,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl ServerGamePacketListenerImpl.this.cserver.getPluginManager().callEvent(event); @@ -1906,7 +1898,7 @@ index 477c343670599ba16dc34a5d4c07392ae1cc873b..b4e9a31d7c65fbee6eb83d2784313630 // Entity in bucket - SPIGOT-4048 and SPIGOT-6859a if ((entity instanceof Bucketable && entity instanceof LivingEntity && origItem != null && origItem.asItem() == Items.WATER_BUCKET) && (event.isCancelled() || ServerGamePacketListenerImpl.this.player.getInventory().getSelected() == null || ServerGamePacketListenerImpl.this.player.getInventory().getSelected().getItem() != origItem)) { entity.getEntityData().resendPossiblyDesyncedEntity(player); // Paper - The entire mob gets deleted, so resend it. -@@ -3322,6 +3395,12 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -3319,6 +3392,12 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl } } } @@ -1920,19 +1912,10 @@ index 477c343670599ba16dc34a5d4c07392ae1cc873b..b4e9a31d7c65fbee6eb83d2784313630 boolean flag1 = packet.getSlotNum() >= 1 && packet.getSlotNum() <= 45; boolean flag2 = itemstack.isEmpty() || itemstack.getDamageValue() >= 0 && itemstack.getCount() <= 64 && !itemstack.isEmpty(); diff --git a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java -index 7960b538029991e5a59189ae77b90b5d424c83ed..5d83c10c48658f949be68290faed57b14c332a37 100644 +index c4a681cdcd4d9e94fa7ef68562b9e41c2390852d..666239aaaec967fb6e1191a4cde58fd6afd44a0b 100644 --- a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java -@@ -154,6 +154,8 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener, - return false; - } - -+ if (true) return org.purpurmc.purpur.PurpurConfig.usernameValidCharactersPattern.matcher(in).matches(); // Purpur -+ - for (int i = 0, len = in.length(); i < len; ++i) { - char c = in.charAt(i); - -@@ -311,7 +313,7 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener, +@@ -278,7 +278,7 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener, ServerLoginPacketListenerImpl.LOGGER.warn("Failed to verify username but will let them in anyway!"); ServerLoginPacketListenerImpl.this.startClientVerification(ServerLoginPacketListenerImpl.this.createOfflineProfile(s1)); // Spigot } else { @@ -1942,10 +1925,10 @@ index 7960b538029991e5a59189ae77b90b5d424c83ed..5d83c10c48658f949be68290faed57b1 } } catch (AuthenticationUnavailableException authenticationunavailableexception) { diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index 29d33dcbf3787bd28176021d2eb7c9290ccce802..9d6e8747850d1e805200e8f89a0a79474e3a20f3 100644 +index 5720af3b629fbd10ac4a8c399623be4d4b2d8022..a0cca8f9f92eca597552d497ee61b068622482be 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java -@@ -504,6 +504,7 @@ public abstract class PlayerList { +@@ -502,6 +502,7 @@ public abstract class PlayerList { scoreboard.addPlayerToTeam(player.getScoreboardName(), collideRuleTeam); } // Paper end @@ -1953,7 +1936,7 @@ index 29d33dcbf3787bd28176021d2eb7c9290ccce802..9d6e8747850d1e805200e8f89a0a7947 // CraftBukkit - Moved from above, added world if (GaleGlobalConfiguration.get().logToConsole.playerLoginLocations) { // Gale - JettPack - make logging login location configurable PlayerList.LOGGER.info("{}[{}] logged in with entity id {} at ([{}]{}, {}, {})", player.getName().getString(), s1, player.getId(), worldserver1.serverLevelData.getLevelName(), player.getX(), player.getY(), player.getZ()); -@@ -623,6 +624,7 @@ public abstract class PlayerList { +@@ -621,6 +622,7 @@ public abstract class PlayerList { } public net.kyori.adventure.text.Component remove(ServerPlayer entityplayer, net.kyori.adventure.text.Component leaveMessage) { // Paper end @@ -1961,7 +1944,7 @@ index 29d33dcbf3787bd28176021d2eb7c9290ccce802..9d6e8747850d1e805200e8f89a0a7947 ServerLevel worldserver = entityplayer.serverLevel(); entityplayer.awardStat(Stats.LEAVE_GAME); -@@ -778,7 +780,7 @@ public abstract class PlayerList { +@@ -776,7 +778,7 @@ public abstract class PlayerList { event.disallow(PlayerLoginEvent.Result.KICK_BANNED, io.papermc.paper.adventure.PaperAdventure.asAdventure(ichatmutablecomponent)); // Paper - Adventure } else { // return this.players.size() >= this.maxPlayers && !this.canBypassPlayerLimit(gameprofile) ? IChatBaseComponent.translatable("multiplayer.disconnect.server_full") : null; @@ -1970,7 +1953,7 @@ index 29d33dcbf3787bd28176021d2eb7c9290ccce802..9d6e8747850d1e805200e8f89a0a7947 event.disallow(PlayerLoginEvent.Result.KICK_FULL, net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(org.spigotmc.SpigotConfig.serverFullMessage)); // Spigot // Paper - Adventure } } -@@ -1124,6 +1126,20 @@ public abstract class PlayerList { +@@ -1122,6 +1124,20 @@ public abstract class PlayerList { } // CraftBukkit end @@ -1991,7 +1974,7 @@ index 29d33dcbf3787bd28176021d2eb7c9290ccce802..9d6e8747850d1e805200e8f89a0a7947 public void broadcastAll(Packet packet, ResourceKey dimension) { Iterator iterator = this.players.iterator(); -@@ -1227,6 +1243,7 @@ public abstract class PlayerList { +@@ -1225,6 +1241,7 @@ public abstract class PlayerList { } else { b0 = (byte) (24 + permissionLevel); } @@ -1999,7 +1982,7 @@ index 29d33dcbf3787bd28176021d2eb7c9290ccce802..9d6e8747850d1e805200e8f89a0a7947 player.connection.send(new ClientboundEntityEventPacket(player, b0)); } -@@ -1235,6 +1252,27 @@ public abstract class PlayerList { +@@ -1233,6 +1250,27 @@ public abstract class PlayerList { player.getBukkitEntity().recalculatePermissions(); // CraftBukkit this.server.getCommands().sendCommands(player); } // Paper @@ -2376,19 +2359,19 @@ 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 3aad8e715aae1e0a8beeb44390fd31dc50f8ea3a..dda34ad1f05302d0706710dc20766c4059229c83 100644 +index b6efe398aa82e1095e6f14e5544e656ebd92ddad..8d330441c3af704ef124599aaa237f3173a8cdea 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -156,7 +156,7 @@ import org.bukkit.plugin.PluginManager; +@@ -157,7 +157,7 @@ import org.bukkit.plugin.PluginManager; // CraftBukkit end - public abstract class Entity implements Nameable, EntityAccess, CommandSource { + public abstract class Entity implements Nameable, EntityAccess, CommandSource, ScoreHolder { - + public static javax.script.ScriptEngine scriptEngine = new javax.script.ScriptEngineManager().getEngineByName("rhino"); // Purpur // CraftBukkit start private static final int CURRENT_LEVEL = 2; public boolean preserveMotion = true; // Paper - keep initial motion on first setPositionRotation -@@ -335,7 +335,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -336,7 +336,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S public double xOld; public double yOld; public double zOld; @@ -2397,7 +2380,7 @@ index 3aad8e715aae1e0a8beeb44390fd31dc50f8ea3a..dda34ad1f05302d0706710dc20766c40 public boolean noPhysics; public final RandomSource random; public int tickCount; -@@ -377,7 +377,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -378,7 +378,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S private final Set tags; private final double[] pistonDeltas; private long pistonDeltasGameTime; @@ -2406,7 +2389,7 @@ index 3aad8e715aae1e0a8beeb44390fd31dc50f8ea3a..dda34ad1f05302d0706710dc20766c40 private float eyeHeight; public boolean isInPowderSnow; public boolean wasInPowderSnow; -@@ -494,6 +494,25 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -499,6 +499,25 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S return false; } @@ -2432,7 +2415,7 @@ index 3aad8e715aae1e0a8beeb44390fd31dc50f8ea3a..dda34ad1f05302d0706710dc20766c40 public final boolean hardCollides() { return this.hardCollides; } -@@ -576,7 +595,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -581,7 +600,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S this.bb = Entity.INITIAL_AABB; this.stuckSpeedMultiplier = Vec3.ZERO; this.nextStep = 1.0F; @@ -2441,7 +2424,7 @@ index 3aad8e715aae1e0a8beeb44390fd31dc50f8ea3a..dda34ad1f05302d0706710dc20766c40 this.remainingFireTicks = -this.getFireImmuneTicks(); this.fluidHeight = new Object2DoubleArrayMap(2); this.fluidOnEyes = new HashSet(); -@@ -898,10 +917,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -903,10 +922,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S public void checkBelowWorld() { // Paper start - Configurable nether ceiling damage @@ -2454,7 +2437,7 @@ index 3aad8e715aae1e0a8beeb44390fd31dc50f8ea3a..dda34ad1f05302d0706710dc20766c40 this.onBelowWorld(); } -@@ -1878,7 +1898,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -1883,7 +1903,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S return this.isInWater() || flag; } @@ -2463,7 +2446,7 @@ index 3aad8e715aae1e0a8beeb44390fd31dc50f8ea3a..dda34ad1f05302d0706710dc20766c40 Entity entity = this.getVehicle(); if (entity instanceof Boat) { -@@ -3004,6 +3024,13 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -3033,6 +3053,13 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S this.passengers = ImmutableList.copyOf(list); } @@ -2477,7 +2460,7 @@ index 3aad8e715aae1e0a8beeb44390fd31dc50f8ea3a..dda34ad1f05302d0706710dc20766c40 this.gameEvent(GameEvent.ENTITY_MOUNT, passenger); } } -@@ -3044,6 +3071,14 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -3073,6 +3100,14 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S return false; } // Spigot end @@ -2492,7 +2475,7 @@ index 3aad8e715aae1e0a8beeb44390fd31dc50f8ea3a..dda34ad1f05302d0706710dc20766c40 if (this.passengers.size() == 1 && this.passengers.get(0) == entity) { this.passengers = ImmutableList.of(); } else { -@@ -3123,12 +3158,15 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -3152,12 +3187,15 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S return Vec3.directionFromRotation(this.getRotationVector()); } @@ -2509,7 +2492,7 @@ index 3aad8e715aae1e0a8beeb44390fd31dc50f8ea3a..dda34ad1f05302d0706710dc20766c40 } this.isInsidePortal = true; -@@ -3177,7 +3215,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -3206,7 +3244,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S } this.processPortalCooldown(); @@ -2518,7 +2501,7 @@ index 3aad8e715aae1e0a8beeb44390fd31dc50f8ea3a..dda34ad1f05302d0706710dc20766c40 } } -@@ -3367,7 +3405,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -3396,7 +3434,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S } public int getMaxAirSupply() { @@ -2527,7 +2510,7 @@ index 3aad8e715aae1e0a8beeb44390fd31dc50f8ea3a..dda34ad1f05302d0706710dc20766c40 } public int getAirSupply() { -@@ -3831,7 +3869,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -3864,7 +3902,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S } public boolean canChangeDimensions() { @@ -2536,7 +2519,7 @@ index 3aad8e715aae1e0a8beeb44390fd31dc50f8ea3a..dda34ad1f05302d0706710dc20766c40 } public float getBlockExplosionResistance(Explosion explosion, BlockGetter world, BlockPos pos, BlockState blockState, FluidState fluidState, float max) { -@@ -4129,6 +4167,20 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -4167,6 +4205,20 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S return SlotAccess.NULL; } @@ -2557,7 +2540,7 @@ index 3aad8e715aae1e0a8beeb44390fd31dc50f8ea3a..dda34ad1f05302d0706710dc20766c40 @Override public void sendSystemMessage(Component message) {} -@@ -4398,6 +4450,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -4440,6 +4492,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S this.yRotO = this.getYRot(); } @@ -2570,12 +2553,12 @@ index 3aad8e715aae1e0a8beeb44390fd31dc50f8ea3a..dda34ad1f05302d0706710dc20766c40 public boolean updateFluidHeightAndDoFluidPushing(TagKey tag, double speed) { if (false && this.touchingUnloadedChunk()) { // Gale - Airplane - reduce entity fluid lookups if no fluids - cost of a lookup here is the same cost as below, so skip return false; -@@ -4973,4 +5031,45 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -5015,4 +5073,45 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S return ((net.minecraft.server.level.ServerChunkCache) level.getChunkSource()).isPositionTicking(this); } // Paper end + -+ // Purpur start ++ // Purpur start + @Nullable + private Player rider = null; + @@ -2617,10 +2600,10 @@ index 3aad8e715aae1e0a8beeb44390fd31dc50f8ea3a..dda34ad1f05302d0706710dc20766c40 + // Purpur end } diff --git a/src/main/java/net/minecraft/world/entity/EntitySelector.java b/src/main/java/net/minecraft/world/entity/EntitySelector.java -index 3ff999734d14e2b6e7828e117f5ee32a60c26bc1..cfa9607241c3e69777ffc317206996c2f783437a 100644 +index 2986c3b1c9dd7f3a00ed7f25b25bfc2b513b35eb..8d199ed2f0b2f50a57f9854cc14005489ecb2976 100644 --- a/src/main/java/net/minecraft/world/entity/EntitySelector.java +++ b/src/main/java/net/minecraft/world/entity/EntitySelector.java -@@ -39,6 +39,7 @@ public final class EntitySelector { +@@ -40,6 +40,7 @@ public final class EntitySelector { return net.minecraft.util.Mth.clamp(serverPlayer.getStats().getValue(net.minecraft.stats.Stats.CUSTOM.get(net.minecraft.stats.Stats.TIME_SINCE_REST)), 1, Integer.MAX_VALUE) >= playerInsomniaTicks; }; // Paper end @@ -2629,10 +2612,10 @@ index 3ff999734d14e2b6e7828e117f5ee32a60c26bc1..cfa9607241c3e69777ffc317206996c2 private EntitySelector() {} // Paper start diff --git a/src/main/java/net/minecraft/world/entity/EntityType.java b/src/main/java/net/minecraft/world/entity/EntityType.java -index 2561e74ffdf595a9b6ae13dcd738662c772db442..5930e45bae5aa86b3cedb811c4c9bb92099bc1b5 100644 +index a63399eedb896c06e96c7fba5cac7102e1c40ba6..38845300ceb7092de4cd8e31ef8782728892f656 100644 --- a/src/main/java/net/minecraft/world/entity/EntityType.java +++ b/src/main/java/net/minecraft/world/entity/EntityType.java -@@ -309,13 +309,24 @@ public class EntityType implements FeatureElement, EntityTypeT +@@ -313,13 +313,24 @@ public class EntityType implements FeatureElement, EntityTypeT private Component description; @Nullable private ResourceLocation lootTable; @@ -2658,7 +2641,7 @@ index 2561e74ffdf595a9b6ae13dcd738662c772db442..5930e45bae5aa86b3cedb811c4c9bb92 public static ResourceLocation getKey(EntityType type) { return BuiltInRegistries.ENTITY_TYPE.getKey(type); } -@@ -531,6 +542,16 @@ public class EntityType implements FeatureElement, EntityTypeT +@@ -535,6 +546,16 @@ public class EntityType implements FeatureElement, EntityTypeT return this.category; } @@ -2675,7 +2658,7 @@ index 2561e74ffdf595a9b6ae13dcd738662c772db442..5930e45bae5aa86b3cedb811c4c9bb92 public String getDescriptionId() { if (this.descriptionId == null) { this.descriptionId = Util.makeDescriptionId("entity", BuiltInRegistries.ENTITY_TYPE.getKey(this)); -@@ -592,6 +613,12 @@ public class EntityType implements FeatureElement, EntityTypeT +@@ -596,6 +617,12 @@ public class EntityType implements FeatureElement, EntityTypeT entity.load(nbt); }, () -> { EntityType.LOGGER.warn("Skipping Entity with id {}", nbt.getString("id")); @@ -2689,7 +2672,7 @@ index 2561e74ffdf595a9b6ae13dcd738662c772db442..5930e45bae5aa86b3cedb811c4c9bb92 } diff --git a/src/main/java/net/minecraft/world/entity/ExperienceOrb.java b/src/main/java/net/minecraft/world/entity/ExperienceOrb.java -index 6dac7cd4c9abfbde299f5d279acc2739195fc312..2bcbfe5516e30a150aa133cf8c1561b784443778 100644 +index fb74f13ab2a977224e843a468ea8c72d923a75eb..1b8f5680c4122c7b6b19e2bc1ed6295caa024622 100644 --- a/src/main/java/net/minecraft/world/entity/ExperienceOrb.java +++ b/src/main/java/net/minecraft/world/entity/ExperienceOrb.java @@ -313,7 +313,7 @@ public class ExperienceOrb extends Entity { @@ -2773,10 +2756,10 @@ index 1bb8b6e91c44cd13411d96d749fa64835c75a267..b18cbe85330e26de6f6cbfcc3d51a741 protected ParticleOptions getInkParticle() { return ParticleTypes.GLOW_SQUID_INK; diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index c522c49e67b2eb92d38d2c76a31b562f653920be..d811a2456b7c2b8c4766f4b7943eeb438e88e3fd 100644 +index dbf3f61227198a0ce5c0521fec933aafa3199154..8047aeddf587e2387359291d6640eb4a005ef944 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 { +@@ -217,9 +217,9 @@ public abstract class LivingEntity extends Entity implements Attackable { protected int deathScore; public float lastHurt; public boolean jumping; @@ -2789,7 +2772,7 @@ index c522c49e67b2eb92d38d2c76a31b562f653920be..d811a2456b7c2b8c4766f4b7943eeb43 protected int lerpSteps; protected double lerpX; protected double lerpY; -@@ -253,6 +253,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -252,6 +252,7 @@ public abstract class LivingEntity extends Entity implements Attackable { private boolean skipDropExperience; // CraftBukkit start public int expToDrop; @@ -2797,7 +2780,7 @@ index c522c49e67b2eb92d38d2c76a31b562f653920be..d811a2456b7c2b8c4766f4b7943eeb43 public boolean forceDrops; public ArrayList drops = new ArrayList<>(); // Paper public final org.bukkit.craftbukkit.attribute.CraftAttributeMap craftAttributes; -@@ -262,6 +263,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -261,6 +262,7 @@ public abstract class LivingEntity extends Entity implements Attackable { public org.bukkit.craftbukkit.entity.CraftLivingEntity getBukkitLivingEntity() { return (org.bukkit.craftbukkit.entity.CraftLivingEntity) super.getBukkitEntity(); } // Paper public boolean silentDeath = false; // Paper - mark entity as dying silently for cancellable death event public net.kyori.adventure.util.TriState frictionState = net.kyori.adventure.util.TriState.NOT_SET; // Paper @@ -2805,7 +2788,7 @@ index c522c49e67b2eb92d38d2c76a31b562f653920be..d811a2456b7c2b8c4766f4b7943eeb43 @Override public float getBukkitYaw() { -@@ -286,7 +288,8 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -285,7 +287,8 @@ public abstract class LivingEntity extends Entity implements Attackable { this.effectsDirty = true; this.useItem = ItemStack.EMPTY; this.lastClimbablePos = Optional.empty(); @@ -2815,7 +2798,7 @@ index c522c49e67b2eb92d38d2c76a31b562f653920be..d811a2456b7c2b8c4766f4b7943eeb43 this.craftAttributes = new CraftAttributeMap(this.attributes); // CraftBukkit // CraftBukkit - setHealth(getMaxHealth()) inlined and simplified to skip the instanceof check for EntityPlayer, as getBukkitEntity() is not initialized in constructor this.entityData.set(LivingEntity.DATA_HEALTH_ID, (float) this.getAttribute(Attributes.MAX_HEALTH).getValue()); -@@ -302,6 +305,8 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -301,6 +304,8 @@ public abstract class LivingEntity extends Entity implements Attackable { this.brain = this.makeBrain(new Dynamic(dynamicopsnbt, (Tag) dynamicopsnbt.createMap((Map) ImmutableMap.of(dynamicopsnbt.createString("memories"), (Tag) dynamicopsnbt.emptyMap())))); } @@ -2824,7 +2807,7 @@ index c522c49e67b2eb92d38d2c76a31b562f653920be..d811a2456b7c2b8c4766f4b7943eeb43 public Brain getBrain() { return this.brain; } -@@ -337,6 +342,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -336,6 +341,7 @@ public abstract class LivingEntity extends Entity implements Attackable { public static AttributeSupplier.Builder createLivingAttributes() { return AttributeSupplier.builder().add(Attributes.MAX_HEALTH).add(Attributes.KNOCKBACK_RESISTANCE).add(Attributes.MOVEMENT_SPEED).add(Attributes.ARMOR).add(Attributes.ARMOR_TOUGHNESS).add(Attributes.MAX_ABSORPTION); } @@ -2832,7 +2815,7 @@ index c522c49e67b2eb92d38d2c76a31b562f653920be..d811a2456b7c2b8c4766f4b7943eeb43 @Override protected void checkFallDamage(double heightDifference, boolean onGround, BlockState state, BlockPos landedPosition) { -@@ -349,7 +355,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -348,7 +354,7 @@ public abstract class LivingEntity extends Entity implements Attackable { this.tryAddSoulSpeed(); } @@ -2841,7 +2824,7 @@ index c522c49e67b2eb92d38d2c76a31b562f653920be..d811a2456b7c2b8c4766f4b7943eeb43 double d1 = this.getX(); double d2 = this.getY(); double d3 = this.getZ(); -@@ -364,7 +370,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -363,7 +369,7 @@ public abstract class LivingEntity extends Entity implements Attackable { d3 = (double) landedPosition.getZ() + 0.5D + d5 / d6 * 0.5D; } @@ -2850,7 +2833,7 @@ index c522c49e67b2eb92d38d2c76a31b562f653920be..d811a2456b7c2b8c4766f4b7943eeb43 double d7 = Math.min((double) (0.2F + f / 15.0F), 2.5D); int i = (int) (150.0D * d7); -@@ -424,6 +430,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -423,6 +429,7 @@ public abstract class LivingEntity extends Entity implements Attackable { double d1 = this.level().getWorldBorder().getDamagePerBlock(); if (d1 > 0.0D) { @@ -2858,7 +2841,7 @@ index c522c49e67b2eb92d38d2c76a31b562f653920be..d811a2456b7c2b8c4766f4b7943eeb43 this.hurt(this.damageSources().outOfBorder(), (float) Math.max(1, Mth.floor(-d0 * d1))); } } -@@ -435,7 +442,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -434,7 +441,7 @@ public abstract class LivingEntity extends Entity implements Attackable { if (flag1) { this.setAirSupply(this.decreaseAirSupply(this.getAirSupply())); @@ -2867,7 +2850,7 @@ index c522c49e67b2eb92d38d2c76a31b562f653920be..d811a2456b7c2b8c4766f4b7943eeb43 this.setAirSupply(0); Vec3 vec3d = this.getDeltaMovement(); -@@ -447,7 +454,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -446,7 +453,7 @@ public abstract class LivingEntity extends Entity implements Attackable { this.level().addParticle(ParticleTypes.BUBBLE, this.getX() + d2, this.getY() + d3, this.getZ() + d4, vec3d.x, vec3d.y, vec3d.z); } @@ -2876,7 +2859,7 @@ index c522c49e67b2eb92d38d2c76a31b562f653920be..d811a2456b7c2b8c4766f4b7943eeb43 } } -@@ -797,6 +804,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -796,6 +803,7 @@ public abstract class LivingEntity extends Entity implements Attackable { dataresult.resultOrPartial(logger::error).ifPresent((nbtbase) -> { nbt.put("Brain", nbtbase); }); @@ -2884,7 +2867,7 @@ index c522c49e67b2eb92d38d2c76a31b562f653920be..d811a2456b7c2b8c4766f4b7943eeb43 } @Override -@@ -881,6 +889,11 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -880,6 +888,11 @@ public abstract class LivingEntity extends Entity implements Attackable { this.brain = this.makeBrain(new Dynamic(NbtOps.INSTANCE, nbt.get("Brain"))); } @@ -2896,7 +2879,7 @@ index c522c49e67b2eb92d38d2c76a31b562f653920be..d811a2456b7c2b8c4766f4b7943eeb43 } // CraftBukkit start -@@ -1024,10 +1037,31 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -1023,10 +1036,31 @@ public abstract class LivingEntity extends Entity implements Attackable { if (entity != null) { EntityType entitytypes = entity.getType(); @@ -2930,7 +2913,7 @@ index c522c49e67b2eb92d38d2c76a31b562f653920be..d811a2456b7c2b8c4766f4b7943eeb43 } return d0; -@@ -1087,6 +1121,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -1086,6 +1120,7 @@ public abstract class LivingEntity extends Entity implements Attackable { for (flag = false; iterator.hasNext(); flag = true) { // CraftBukkit start MobEffectInstance effect = (MobEffectInstance) iterator.next(); @@ -2938,7 +2921,7 @@ index c522c49e67b2eb92d38d2c76a31b562f653920be..d811a2456b7c2b8c4766f4b7943eeb43 EntityPotionEffectEvent event = CraftEventFactory.callEntityPotionEffectChangeEvent(this, effect, null, cause, EntityPotionEffectEvent.Action.CLEARED); if (event.isCancelled()) { continue; -@@ -1505,13 +1540,13 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -1504,13 +1539,13 @@ public abstract class LivingEntity extends Entity implements Attackable { if (entity1 instanceof net.minecraft.world.entity.player.Player) { net.minecraft.world.entity.player.Player entityhuman = (net.minecraft.world.entity.player.Player) entity1; @@ -2954,7 +2937,7 @@ index c522c49e67b2eb92d38d2c76a31b562f653920be..d811a2456b7c2b8c4766f4b7943eeb43 LivingEntity entityliving2 = entitywolf.getOwner(); if (entityliving2 instanceof net.minecraft.world.entity.player.Player) { -@@ -1619,6 +1654,18 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -1618,6 +1653,18 @@ public abstract class LivingEntity extends Entity implements Attackable { } } @@ -2973,7 +2956,7 @@ index c522c49e67b2eb92d38d2c76a31b562f653920be..d811a2456b7c2b8c4766f4b7943eeb43 org.bukkit.inventory.EquipmentSlot handSlot = (hand != null) ? org.bukkit.craftbukkit.CraftEquipmentSlot.getHand(hand) : null; EntityResurrectEvent event = new EntityResurrectEvent((org.bukkit.entity.LivingEntity) this.getBukkitEntity(), handSlot); event.setCancelled(itemstack == null); -@@ -1786,7 +1833,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -1783,7 +1830,7 @@ public abstract class LivingEntity extends Entity implements Attackable { boolean flag = false; if (this.dead && adversary instanceof WitherBoss) { // Paper @@ -2982,7 +2965,7 @@ index c522c49e67b2eb92d38d2c76a31b562f653920be..d811a2456b7c2b8c4766f4b7943eeb43 BlockPos blockposition = this.blockPosition(); BlockState iblockdata = Blocks.WITHER_ROSE.defaultBlockState(); -@@ -1832,6 +1879,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -1829,6 +1876,7 @@ public abstract class LivingEntity extends Entity implements Attackable { this.dropEquipment(); // CraftBukkit - from below if (this.shouldDropLoot() && this.level().getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) { @@ -2990,7 +2973,7 @@ index c522c49e67b2eb92d38d2c76a31b562f653920be..d811a2456b7c2b8c4766f4b7943eeb43 this.dropFromLootTable(source, flag); // Paper start final boolean prev = this.clearEquipmentSlots; -@@ -1840,6 +1888,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -1837,6 +1885,7 @@ public abstract class LivingEntity extends Entity implements Attackable { // Paper end this.dropCustomDeathLoot(source, i, flag); this.clearEquipmentSlots = prev; // Paper @@ -2998,7 +2981,7 @@ index c522c49e67b2eb92d38d2c76a31b562f653920be..d811a2456b7c2b8c4766f4b7943eeb43 } // CraftBukkit start - Call death event // Paper start - call advancement triggers with correct entity equipment org.bukkit.event.entity.EntityDeathEvent deathEvent = CraftEventFactory.callEntityDeathEvent(this, this.drops, () -> { -@@ -2111,7 +2160,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -2108,7 +2157,7 @@ public abstract class LivingEntity extends Entity implements Attackable { MobEffectInstance mobeffect = this.getEffect(MobEffects.JUMP); float f2 = mobeffect == null ? 0.0F : (float) (mobeffect.getAmplifier() + 1); @@ -3007,7 +2990,7 @@ index c522c49e67b2eb92d38d2c76a31b562f653920be..d811a2456b7c2b8c4766f4b7943eeb43 } } -@@ -2334,6 +2383,20 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -2331,6 +2380,20 @@ public abstract class LivingEntity extends Entity implements Attackable { } } @@ -3028,7 +3011,7 @@ index c522c49e67b2eb92d38d2c76a31b562f653920be..d811a2456b7c2b8c4766f4b7943eeb43 if (f > 0 || !human) { if (human) { // PAIL: Be sure to drag all this code from the EntityHuman subclass each update. -@@ -2554,7 +2617,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -2551,7 +2614,7 @@ public abstract class LivingEntity extends Entity implements Attackable { @Override protected void onBelowWorld() { @@ -3037,7 +3020,7 @@ index c522c49e67b2eb92d38d2c76a31b562f653920be..d811a2456b7c2b8c4766f4b7943eeb43 } protected void updateSwingTime() { -@@ -2748,7 +2811,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -2745,7 +2808,7 @@ public abstract class LivingEntity extends Entity implements Attackable { } protected long lastJumpTime = 0L; // Paper @@ -3046,7 +3029,7 @@ index c522c49e67b2eb92d38d2c76a31b562f653920be..d811a2456b7c2b8c4766f4b7943eeb43 Vec3 vec3d = this.getDeltaMovement(); // Paper start long time = System.nanoTime(); -@@ -2900,6 +2963,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -2897,6 +2960,7 @@ public abstract class LivingEntity extends Entity implements Attackable { if (f3 > 0.0F) { this.playSound(this.getFallDamageSound((int) f3), 1.0F, 1.0F); @@ -3054,7 +3037,7 @@ index c522c49e67b2eb92d38d2c76a31b562f653920be..d811a2456b7c2b8c4766f4b7943eeb43 this.hurt(this.damageSources().flyIntoWall(), f3); } } -@@ -3505,8 +3569,10 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -3507,8 +3571,10 @@ public abstract class LivingEntity extends Entity implements Attackable { this.pushEntities(); // Paper start @@ -3067,7 +3050,7 @@ index c522c49e67b2eb92d38d2c76a31b562f653920be..d811a2456b7c2b8c4766f4b7943eeb43 Location from = new Location(this.level().getWorld(), this.xo, this.yo, this.zo, this.yRotO, this.xRotO); Location to = new Location (this.level().getWorld(), this.getX(), this.getY(), this.getZ(), this.getYRot(), this.getXRot()); io.papermc.paper.event.entity.EntityMoveEvent event = new io.papermc.paper.event.entity.EntityMoveEvent(this.getBukkitLivingEntity(), from, to.clone()); -@@ -3516,12 +3582,48 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -3518,12 +3584,48 @@ public abstract class LivingEntity extends Entity implements Attackable { this.absMoveTo(event.getTo().getX(), event.getTo().getY(), event.getTo().getZ(), event.getTo().getYaw(), event.getTo().getPitch()); } } @@ -3116,7 +3099,7 @@ index c522c49e67b2eb92d38d2c76a31b562f653920be..d811a2456b7c2b8c4766f4b7943eeb43 } public boolean isSensitiveToWater() { -@@ -3542,7 +3644,16 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -3544,7 +3646,16 @@ public abstract class LivingEntity extends Entity implements Attackable { int j = i / 10; if (j % 2 == 0) { @@ -3135,10 +3118,10 @@ index c522c49e67b2eb92d38d2c76a31b562f653920be..d811a2456b7c2b8c4766f4b7943eeb43 }); } diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java -index e53ba9c21bd5ddc487ec2feb4208fd83d61af6e3..095b038c1c3b66485f319042488122846fb63e06 100644 +index c413a191fa8fd1a2447f51f66187f0c18818c222..86e1434a6361fda0d379dd67608752d0a2a30f5e 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java -@@ -65,6 +65,7 @@ import net.minecraft.world.item.ProjectileWeaponItem; +@@ -66,6 +66,7 @@ import net.minecraft.world.item.ProjectileWeaponItem; import net.minecraft.world.item.SpawnEggItem; import net.minecraft.world.item.SwordItem; import net.minecraft.world.item.enchantment.EnchantmentHelper; @@ -3146,7 +3129,7 @@ index e53ba9c21bd5ddc487ec2feb4208fd83d61af6e3..095b038c1c3b66485f31904248812284 import net.minecraft.world.level.GameRules; import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.Level; -@@ -134,6 +135,7 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -135,6 +136,7 @@ public abstract class Mob extends LivingEntity implements Targeting { private BlockPos restrictCenter; private float restrictRadius; @@ -3154,7 +3137,7 @@ index e53ba9c21bd5ddc487ec2feb4208fd83d61af6e3..095b038c1c3b66485f31904248812284 public boolean aware = true; // CraftBukkit protected Mob(EntityType type, Level world) { -@@ -149,8 +151,8 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -150,8 +152,8 @@ public abstract class Mob extends LivingEntity implements Targeting { this.goalSelector = new GoalSelector(); this.targetSelector = new GoalSelector(); // Gale end - Purpur - remove vanilla profiler @@ -3165,7 +3148,7 @@ index e53ba9c21bd5ddc487ec2feb4208fd83d61af6e3..095b038c1c3b66485f31904248812284 this.jumpControl = new JumpControl(this); this.bodyRotationControl = this.createBodyControl(); this.navigation = this.createNavigation(world); -@@ -325,6 +327,7 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -326,6 +328,7 @@ public abstract class Mob extends LivingEntity implements Targeting { entityliving = null; } } @@ -3173,7 +3156,7 @@ index e53ba9c21bd5ddc487ec2feb4208fd83d61af6e3..095b038c1c3b66485f31904248812284 this.target = entityliving; return true; // CraftBukkit end -@@ -369,8 +372,28 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -370,8 +373,28 @@ public abstract class Mob extends LivingEntity implements Targeting { this.resetAmbientSoundTime(); this.playAmbientSound(); } @@ -3202,7 +3185,7 @@ index e53ba9c21bd5ddc487ec2feb4208fd83d61af6e3..095b038c1c3b66485f31904248812284 @Override protected void playHurtSound(DamageSource source) { this.resetAmbientSoundTime(); -@@ -560,6 +583,7 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -561,6 +584,7 @@ public abstract class Mob extends LivingEntity implements Targeting { } nbt.putBoolean("Bukkit.Aware", this.aware); // CraftBukkit @@ -3210,7 +3193,7 @@ index e53ba9c21bd5ddc487ec2feb4208fd83d61af6e3..095b038c1c3b66485f31904248812284 } @Override -@@ -630,6 +654,11 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -631,6 +655,11 @@ public abstract class Mob extends LivingEntity implements Targeting { this.aware = nbt.getBoolean("Bukkit.Aware"); } // CraftBukkit end @@ -3222,7 +3205,7 @@ index e53ba9c21bd5ddc487ec2feb4208fd83d61af6e3..095b038c1c3b66485f31904248812284 } @Override -@@ -673,7 +702,7 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -674,7 +703,7 @@ public abstract class Mob extends LivingEntity implements Targeting { @Override public void aiStep() { super.aiStep(); @@ -3231,7 +3214,7 @@ index e53ba9c21bd5ddc487ec2feb4208fd83d61af6e3..095b038c1c3b66485f31904248812284 Vec3i baseblockposition = this.getPickupReach(); List list = this.level().getEntitiesOfClass(ItemEntity.class, this.getBoundingBox().inflate((double) baseblockposition.getX(), (double) baseblockposition.getY(), (double) baseblockposition.getZ())); Iterator iterator = list.iterator(); -@@ -1150,6 +1179,12 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -1151,6 +1180,12 @@ public abstract class Mob extends LivingEntity implements Targeting { } @@ -3244,7 +3227,7 @@ index e53ba9c21bd5ddc487ec2feb4208fd83d61af6e3..095b038c1c3b66485f31904248812284 @Nullable public static Item getEquipmentForSlot(EquipmentSlot equipmentSlot, int equipmentLevel) { switch (equipmentSlot) { -@@ -1244,7 +1279,7 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -1245,7 +1280,7 @@ public abstract class Mob extends LivingEntity implements Targeting { RandomSource randomsource = world.getRandom(); this.getAttribute(Attributes.FOLLOW_RANGE).addPermanentModifier(new AttributeModifier("Random spawn bonus", randomsource.triangle(0.0D, 0.11485000000000001D), AttributeModifier.Operation.MULTIPLY_BASE)); @@ -3253,7 +3236,7 @@ index e53ba9c21bd5ddc487ec2feb4208fd83d61af6e3..095b038c1c3b66485f31904248812284 this.setLeftHanded(true); } else { this.setLeftHanded(false); -@@ -1292,6 +1327,7 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -1293,6 +1328,7 @@ public abstract class Mob extends LivingEntity implements Targeting { if (!this.isAlive()) { return InteractionResult.PASS; } else if (this.getLeashHolder() == player) { @@ -3261,7 +3244,7 @@ index e53ba9c21bd5ddc487ec2feb4208fd83d61af6e3..095b038c1c3b66485f31904248812284 // CraftBukkit start - fire PlayerUnleashEntityEvent // Paper start - drop leash variable org.bukkit.event.player.PlayerUnleashEntityEvent event = CraftEventFactory.callPlayerUnleashEntityEvent(this, player, hand, !player.getAbilities().instabuild); -@@ -1365,7 +1401,7 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -1366,7 +1402,7 @@ public abstract class Mob extends LivingEntity implements Targeting { protected void onOffspringSpawnedFromEgg(Player player, Mob child) {} protected InteractionResult mobInteract(Player player, InteractionHand hand) { @@ -3270,7 +3253,7 @@ index e53ba9c21bd5ddc487ec2feb4208fd83d61af6e3..095b038c1c3b66485f31904248812284 } public boolean isWithinRestriction() { -@@ -1676,6 +1712,7 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -1677,6 +1713,7 @@ public abstract class Mob extends LivingEntity implements Targeting { this.setLastHurtMob(target); } @@ -3278,7 +3261,7 @@ index e53ba9c21bd5ddc487ec2feb4208fd83d61af6e3..095b038c1c3b66485f31904248812284 return flag; } -@@ -1697,28 +1734,7 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -1698,28 +1735,7 @@ public abstract class Mob extends LivingEntity implements Targeting { // Gale end - JettPack - optimize sun burn tick - cache eye blockpos public boolean isSunBurnTick() { @@ -3308,7 +3291,7 @@ index e53ba9c21bd5ddc487ec2feb4208fd83d61af6e3..095b038c1c3b66485f31904248812284 } @Override -@@ -1765,4 +1781,56 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -1767,4 +1783,56 @@ public abstract class Mob extends LivingEntity implements Targeting { return itemmonsteregg == null ? null : new ItemStack(itemmonsteregg); } @@ -3422,14 +3405,14 @@ index c5cdeb3a86453106c092c6f108da23ef54cb8123..635037fb2a44a422b42d7c3c27cc7638 } 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 8a720f9ae81d7ea856e28cb27a66adcf04bcb0eb..e0b70d9732a2b7d96999b7e4a497ffa1d8cf86a7 100644 +index 0a13e076b42bc8c0e7d4962379c207dea89f0435..62cb9f0c052222deecf76ebb8dbdd9652e691b2c 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 -@@ -80,7 +80,88 @@ import org.slf4j.Logger; +@@ -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.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, 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()) @@ -3452,6 +3435,7 @@ index 8a720f9ae81d7ea856e28cb27a66adcf04bcb0eb..e0b70d9732a2b7d96999b7e4a497ffa1 + .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()) @@ -3751,7 +3735,7 @@ index a85885ee51df585fa11ae9f8fcd67ff2a71c5a18..d81509e08e70ec5b2f837c9dc66b1254 @Override diff --git a/src/main/java/net/minecraft/world/entity/ai/goal/EatBlockGoal.java b/src/main/java/net/minecraft/world/entity/ai/goal/EatBlockGoal.java -index 93bbda61f0eb2dd52573602b1f9cc7b031d1fc5a..63f9e5e2490e5b2fec6f2395077e21e601804ca5 100644 +index 4e2c23ccdf4e4a4d65b291dbe20952bae1838bff..0da884a833f6c707fea512e826658c3bb73f7a77 100644 --- a/src/main/java/net/minecraft/world/entity/ai/goal/EatBlockGoal.java +++ b/src/main/java/net/minecraft/world/entity/ai/goal/EatBlockGoal.java @@ -74,7 +74,7 @@ public class EatBlockGoal extends Goal { @@ -3893,10 +3877,10 @@ index 09bc539502dada5dfdd95e50141e587c1c3dee4c..bac374f348363cd0f8b981dc444d419b if (baseEntity == null) { if (this.isCombat && (!targetEntity.canBeSeenAsEnemy() || targetEntity.level().getDifficulty() == Difficulty.PEACEFUL)) { diff --git a/src/main/java/net/minecraft/world/entity/ambient/Bat.java b/src/main/java/net/minecraft/world/entity/ambient/Bat.java -index ba809ea753df1f1c347d0410c4ff255ce6a55532..53e2dc684099c9593bdb764bad11f24934c13ca7 100644 +index 685823c4c6f175460fdeb84053ea115c24a67909..ed5c062edc767c186da377ddfc7a7a79a6cbdb13 100644 --- a/src/main/java/net/minecraft/world/entity/ambient/Bat.java +++ b/src/main/java/net/minecraft/world/entity/ambient/Bat.java -@@ -18,6 +18,7 @@ import net.minecraft.world.entity.EntityDimensions; +@@ -19,6 +19,7 @@ import net.minecraft.world.entity.EntityDimensions; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.MobSpawnType; @@ -3904,7 +3888,7 @@ index ba809ea753df1f1c347d0410c4ff255ce6a55532..53e2dc684099c9593bdb764bad11f249 import net.minecraft.world.entity.Pose; import net.minecraft.world.entity.ai.attributes.AttributeSupplier; import net.minecraft.world.entity.ai.attributes.Attributes; -@@ -43,12 +44,59 @@ public class Bat extends AmbientCreature { +@@ -46,12 +47,59 @@ public class Bat extends AmbientCreature { public Bat(EntityType type, Level world) { super(type, world); @@ -3963,8 +3947,8 @@ index ba809ea753df1f1c347d0410c4ff255ce6a55532..53e2dc684099c9593bdb764bad11f249 + @Override public boolean isFlapping() { - return !this.isResting() && this.tickCount % Bat.TICKS_PER_FLAP == 0; -@@ -98,7 +146,7 @@ public class Bat extends AmbientCreature { + return !this.isResting() && (float) this.tickCount % 10.0F == 0.0F; +@@ -101,7 +149,7 @@ public class Bat extends AmbientCreature { protected void pushEntities() {} public static AttributeSupplier.Builder createAttributes() { @@ -3973,7 +3957,7 @@ index ba809ea753df1f1c347d0410c4ff255ce6a55532..53e2dc684099c9593bdb764bad11f249 } public boolean isResting() { -@@ -130,6 +178,14 @@ public class Bat extends AmbientCreature { +@@ -134,6 +182,14 @@ public class Bat extends AmbientCreature { @Override protected void customServerAiStep() { @@ -3988,7 +3972,7 @@ index ba809ea753df1f1c347d0410c4ff255ce6a55532..53e2dc684099c9593bdb764bad11f249 super.customServerAiStep(); BlockPos blockposition = this.blockPosition(); BlockPos blockposition1 = blockposition.above(); -@@ -208,6 +264,28 @@ public class Bat extends AmbientCreature { +@@ -212,6 +268,28 @@ public class Bat extends AmbientCreature { } } @@ -4074,7 +4058,7 @@ index 2249fc6dd98afb8d52623b5864955fdd3b3fc042..2ccfaab0a02cf5ff9779e250fb79a75a double d = this.wantedX - this.fish.getX(); double e = this.wantedY - this.fish.getY(); diff --git a/src/main/java/net/minecraft/world/entity/animal/Animal.java b/src/main/java/net/minecraft/world/entity/animal/Animal.java -index a836bfd2ea8af8098a20fb37ca25a5a613226f67..a434d91b8dfff30cff81df964ea8149caa8cb604 100644 +index f6e0eefe068fe1a9fe159b382cf94de488521728..8df8a48bd1dbbb4a6835f68bd700eac2b5acf91b 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Animal.java +++ b/src/main/java/net/minecraft/world/entity/animal/Animal.java @@ -42,6 +42,7 @@ public abstract class Animal extends AgeableMob { @@ -4085,7 +4069,7 @@ index a836bfd2ea8af8098a20fb37ca25a5a613226f67..a434d91b8dfff30cff81df964ea8149c protected Animal(EntityType type, Level world) { super(type, world); -@@ -149,7 +150,7 @@ public abstract class Animal extends AgeableMob { +@@ -151,7 +152,7 @@ public abstract class Animal extends AgeableMob { if (this.isFood(itemstack)) { int i = this.getAge(); @@ -4094,7 +4078,7 @@ index a836bfd2ea8af8098a20fb37ca25a5a613226f67..a434d91b8dfff30cff81df964ea8149c final ItemStack breedCopy = itemstack.copy(); // Paper this.usePlayerItem(player, hand, itemstack); this.setInLove(player, breedCopy); // Paper -@@ -240,12 +241,20 @@ public abstract class Animal extends AgeableMob { +@@ -242,12 +243,20 @@ public abstract class Animal extends AgeableMob { AgeableMob entityageable = this.getBreedOffspring(world, other); if (entityageable != null) { @@ -4118,7 +4102,7 @@ index a836bfd2ea8af8098a20fb37ca25a5a613226f67..a434d91b8dfff30cff81df964ea8149c int experience = this.getRandom().nextInt(7) + 1; EntityBreedEvent entityBreedEvent = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityBreedEvent(entityageable, this, other, breeder, this.breedItem, experience); if (entityBreedEvent.isCancelled()) { -@@ -273,8 +282,10 @@ public abstract class Animal extends AgeableMob { +@@ -275,8 +284,10 @@ public abstract class Animal extends AgeableMob { entityplayer.awardStat(Stats.ANIMALS_BRED); CriteriaTriggers.BRED_ANIMALS.trigger(entityplayer, this, entityanimal, entityageable); } // Paper @@ -4132,7 +4116,7 @@ index a836bfd2ea8af8098a20fb37ca25a5a613226f67..a434d91b8dfff30cff81df964ea8149c entityanimal.resetLove(); worldserver.broadcastEntityEvent(this, (byte) 18); diff --git a/src/main/java/net/minecraft/world/entity/animal/Bee.java b/src/main/java/net/minecraft/world/entity/animal/Bee.java -index 9a7956befc346e1b58f064213800fd099a052fc6..38a3dcec138d9233a46e5d523bcc6d64bc7fffd0 100644 +index a87a34b0c4c8e5d0cf079025c230b1434c919b54..bdb78cc701543cfe91a6bafd1786fe2ea0bf1ddc 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Bee.java +++ b/src/main/java/net/minecraft/world/entity/animal/Bee.java @@ -43,6 +43,7 @@ import net.minecraft.world.entity.EntityType; @@ -4238,7 +4222,7 @@ index 9a7956befc346e1b58f064213800fd099a052fc6..38a3dcec138d9233a46e5d523bcc6d64 this.targetSelector.addGoal(1, (new Bee.BeeHurtByOtherGoal(this)).setAlertOthers(new Class[0])); this.targetSelector.addGoal(2, new Bee.BeeBecomeAngryTargetGoal(this)); this.targetSelector.addGoal(3, new ResetUniversalAngerTargetGoal<>(this, true)); -@@ -348,7 +399,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -355,7 +406,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { boolean wantsToEnterHive() { if (this.stayOutOfHiveCountdown <= 0 && !this.beePollinateGoal.isPollinating() && !this.hasStung() && this.getTarget() == null) { @@ -4247,7 +4231,7 @@ index 9a7956befc346e1b58f064213800fd099a052fc6..38a3dcec138d9233a46e5d523bcc6d64 return flag && !this.isHiveNearFire(); } else { -@@ -388,6 +439,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -395,6 +446,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { this.hurt(this.damageSources().drown(), 1.0F); } @@ -4255,7 +4239,7 @@ index 9a7956befc346e1b58f064213800fd099a052fc6..38a3dcec138d9233a46e5d523bcc6d64 if (flag) { ++this.timeSinceSting; if (this.timeSinceSting % 5 == 0 && this.random.nextInt(Mth.clamp(1200 - this.timeSinceSting, 1, 1200)) == 0) { -@@ -420,6 +472,26 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -427,6 +479,26 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { } } @@ -4282,7 +4266,7 @@ index 9a7956befc346e1b58f064213800fd099a052fc6..38a3dcec138d9233a46e5d523bcc6d64 @Override public int getRemainingPersistentAngerTime() { return (Integer) this.entityData.get(Bee.DATA_REMAINING_ANGER_TIME); -@@ -735,6 +807,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -742,6 +814,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { if (optional.isPresent()) { Bee.this.savedFlowerPos = (BlockPos) optional.get(); Bee.this.navigation.moveTo((double) Bee.this.savedFlowerPos.getX() + 0.5D, (double) Bee.this.savedFlowerPos.getY() + 0.5D, (double) Bee.this.savedFlowerPos.getZ() + 0.5D, 1.2000000476837158D); @@ -4290,7 +4274,7 @@ index 9a7956befc346e1b58f064213800fd099a052fc6..38a3dcec138d9233a46e5d523bcc6d64 return true; } else { Bee.this.remainingCooldownBeforeLocatingNewFlower = Mth.nextInt(Bee.this.random, 20, 60); -@@ -791,6 +864,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -798,6 +871,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { this.pollinating = false; Bee.this.navigation.stop(); Bee.this.remainingCooldownBeforeLocatingNewFlower = 200; @@ -4298,7 +4282,7 @@ index 9a7956befc346e1b58f064213800fd099a052fc6..38a3dcec138d9233a46e5d523bcc6d64 } @Override -@@ -837,6 +911,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -844,6 +918,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { this.setWantedPos(); } @@ -4306,7 +4290,7 @@ index 9a7956befc346e1b58f064213800fd099a052fc6..38a3dcec138d9233a46e5d523bcc6d64 ++this.successfulPollinatingTicks; if (Bee.this.random.nextFloat() < 0.05F && this.successfulPollinatingTicks > this.lastSoundPlayedTick + 60) { this.lastSoundPlayedTick = this.successfulPollinatingTicks; -@@ -881,16 +956,16 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -888,16 +963,16 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { } } @@ -4743,7 +4727,7 @@ index 3cdd9f379c7e2d46ea47c9ef55b121c93ec0bb4a..6d00b3cd4a9cb0fc8a9e9c27f37429a2 + // Purpur end } diff --git a/src/main/java/net/minecraft/world/entity/animal/Dolphin.java b/src/main/java/net/minecraft/world/entity/animal/Dolphin.java -index c528cb7c18650863eaf8e2c6c0d9276c02712cc9..1807c7bac6f5012da8130dd41edeb9dd4df32a47 100644 +index e555fd8ca61e1ce7a52ecd475cc3ea11dedcab08..ed2769d8049bb304c1ee3b8e162046855951a624 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Dolphin.java +++ b/src/main/java/net/minecraft/world/entity/animal/Dolphin.java @@ -82,19 +82,104 @@ public class Dolphin extends WaterAnimal { @@ -4852,7 +4836,7 @@ index c528cb7c18650863eaf8e2c6c0d9276c02712cc9..1807c7bac6f5012da8130dd41edeb9dd return super.finalizeSpawn(world, difficulty, spawnReason, entityData, entityNbt); } -@@ -164,17 +249,21 @@ public class Dolphin extends WaterAnimal { +@@ -159,17 +244,21 @@ public class Dolphin extends WaterAnimal { protected void registerGoals() { this.goalSelector.addGoal(0, new BreathAirGoal(this)); this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); @@ -4875,7 +4859,7 @@ index c528cb7c18650863eaf8e2c6c0d9276c02712cc9..1807c7bac6f5012da8130dd41edeb9dd } public static AttributeSupplier.Builder createAttributes() { -@@ -225,7 +314,7 @@ public class Dolphin extends WaterAnimal { +@@ -220,7 +309,7 @@ public class Dolphin extends WaterAnimal { @Override protected boolean canRide(Entity entity) { @@ -4884,7 +4868,7 @@ index c528cb7c18650863eaf8e2c6c0d9276c02712cc9..1807c7bac6f5012da8130dd41edeb9dd } @Override -@@ -260,6 +349,11 @@ public class Dolphin extends WaterAnimal { +@@ -255,6 +344,11 @@ public class Dolphin extends WaterAnimal { @Override public void tick() { super.tick(); @@ -4896,7 +4880,7 @@ index c528cb7c18650863eaf8e2c6c0d9276c02712cc9..1807c7bac6f5012da8130dd41edeb9dd if (this.isNoAi()) { this.setAirSupply(this.getMaxAirSupply()); } else { -@@ -405,6 +499,7 @@ public class Dolphin extends WaterAnimal { +@@ -400,6 +494,7 @@ public class Dolphin extends WaterAnimal { @Override public boolean canUse() { @@ -4905,7 +4889,7 @@ index c528cb7c18650863eaf8e2c6c0d9276c02712cc9..1807c7bac6f5012da8130dd41edeb9dd } diff --git a/src/main/java/net/minecraft/world/entity/animal/Fox.java b/src/main/java/net/minecraft/world/entity/animal/Fox.java -index 9e2af80c6a87f5849710266149cbca8cabfad4f8..075554f28dab5809d0f2d346bad40efc16b38371 100644 +index d17c69a857f083350cc9e9ec2b5dbe0a1482c85f..77d40aad6e336cac7ee4e4adef159571181ba44a 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Fox.java +++ b/src/main/java/net/minecraft/world/entity/animal/Fox.java @@ -36,6 +36,7 @@ import net.minecraft.util.RandomSource; @@ -5516,10 +5500,10 @@ index 17e42c49fe6f1696a0b0b4b2537cabfe565692e5..97c38b72b998bdf397c72d3ea08fd931 } } diff --git a/src/main/java/net/minecraft/world/entity/animal/Parrot.java b/src/main/java/net/minecraft/world/entity/animal/Parrot.java -index 397264d31992fd43bd57736c25693ae001330b6d..d97ca9d567df224c34eba306b4c9b7df65f31824 100644 +index 4c34edc55fa0e136ccf49a3aef001f413274dfac..351b580611bf4b92d7addcc402c3276f7cb4e639 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Parrot.java +++ b/src/main/java/net/minecraft/world/entity/animal/Parrot.java -@@ -130,12 +130,88 @@ public class Parrot extends ShoulderRidingEntity implements VariantHolder type, Level world) { super(type, world); @@ -5609,7 +5593,7 @@ index 397264d31992fd43bd57736c25693ae001330b6d..d97ca9d567df224c34eba306b4c9b7df @Nullable @Override public SpawnGroupData finalizeSpawn(ServerLevelAccessor world, DifficultyInstance difficulty, MobSpawnType spawnReason, @Nullable SpawnGroupData entityData, @Nullable CompoundTag entityNbt) { -@@ -154,8 +230,11 @@ public class Parrot extends ShoulderRidingEntity implements VariantHolder type, LevelAccessor world, MobSpawnType spawnReason, BlockPos pos, RandomSource random) { -@@ -307,13 +387,13 @@ public class Parrot extends ShoulderRidingEntity implements VariantHolder getModelRotationValues() { return this.modelRotationValues; -@@ -283,7 +320,7 @@ public class Axolotl extends Animal implements LerpingModel, VariantHolder { @@ -7184,7 +7157,7 @@ index 4e78834c03baef977ebc691103f4ec7a8d88a5fb..afd2b1922f23148d25e0f2732d60f4da @Override protected Brain.Provider brainProvider() { return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); -@@ -167,7 +220,7 @@ public class Frog extends Animal implements VariantHolder { +@@ -162,7 +215,7 @@ public class Frog extends Animal implements VariantHolder { private int behaviorTick = 0; // Pufferfish @Override protected void customServerAiStep() { @@ -7193,7 +7166,7 @@ index 4e78834c03baef977ebc691103f4ec7a8d88a5fb..afd2b1922f23148d25e0f2732d60f4da this.getBrain().tick((ServerLevel)this.level(), this); FrogAi.updateActivity(this); super.customServerAiStep(); -@@ -350,7 +403,7 @@ public class Frog extends Animal implements VariantHolder { +@@ -345,7 +398,7 @@ public class Frog extends Animal implements VariantHolder { return world.getBlockState(pos.below()).is(BlockTags.FROGS_SPAWNABLE_ON) && isBrightEnoughToSpawn(world, pos); } @@ -7203,7 +7176,7 @@ index 4e78834c03baef977ebc691103f4ec7a8d88a5fb..afd2b1922f23148d25e0f2732d60f4da super(entity); } diff --git a/src/main/java/net/minecraft/world/entity/animal/frog/Tadpole.java b/src/main/java/net/minecraft/world/entity/animal/frog/Tadpole.java -index c83dabddf93249a6477c10725622119c939db4d5..e91b4d63d42276f8a498cab7c439c785730f3f6f 100644 +index c83dabddf93249a6477c10725622119c939db4d5..4492652085d579fc786fe16c1930c8cfe7be8bfa 100644 --- a/src/main/java/net/minecraft/world/entity/animal/frog/Tadpole.java +++ b/src/main/java/net/minecraft/world/entity/animal/frog/Tadpole.java @@ -45,13 +45,50 @@ public class Tadpole extends AbstractFish { @@ -7258,15 +7231,17 @@ index c83dabddf93249a6477c10725622119c939db4d5..e91b4d63d42276f8a498cab7c439c785 @Override protected PathNavigation createNavigation(Level world) { return new WaterBoundPathNavigation(this, world); -@@ -80,7 +117,7 @@ public class Tadpole extends AbstractFish { +@@ -80,8 +117,8 @@ public class Tadpole extends AbstractFish { private int behaviorTick = 0; // Pufferfish @Override protected void customServerAiStep() { - if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish +- this.getBrain().tick((ServerLevel) this.level(), this); + if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider - this.getBrain().tick((ServerLevel) this.level(), this); ++ this.getBrain().tick((ServerLevel) this.level(), this); // Dreeam TODO - should remove this? TadpoleAi.updateActivity(this); super.customServerAiStep(); + } diff --git a/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java b/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java index 7b946ea210eebcab3d373b13e09ff839e49cfbe5..90e7c24eb50f333017e724ac56376fc54ee004f5 100644 --- a/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java @@ -7328,7 +7303,7 @@ index 7b946ea210eebcab3d373b13e09ff839e49cfbe5..90e7c24eb50f333017e724ac56376fc5 brain.setMemory(MemoryModuleType.RAM_TARGET, entity.position()); brain.eraseMemory(MemoryModuleType.RAM_COOLDOWN_TICKS); diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/AbstractHorse.java b/src/main/java/net/minecraft/world/entity/animal/horse/AbstractHorse.java -index a0628b9d74c29d02bfba583edf7ee6f2cde2cff6..bab9e413bd55d48e3e54bee66a6cd5be19a8f415 100644 +index 63bbb5723f587788a65cc1cdac4cea94d96f254b..27c86c474af331510b07eedc5aae430136235acc 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/AbstractHorse.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/AbstractHorse.java @@ -149,12 +149,60 @@ public abstract class AbstractHorse extends Animal implements ContainerListener, @@ -7409,7 +7384,7 @@ index a0628b9d74c29d02bfba583edf7ee6f2cde2cff6..bab9e413bd55d48e3e54bee66a6cd5be } protected int getInventorySize() { -@@ -1234,7 +1283,7 @@ public abstract class AbstractHorse extends Animal implements ContainerListener, +@@ -1231,7 +1280,7 @@ public abstract class AbstractHorse extends Animal implements ContainerListener, entityData = new AgeableMob.AgeableMobGroupData(0.2F); } @@ -7701,10 +7676,10 @@ index a6601f70890f90691923c0e6a9f10ea597ccabc2..42dcdbec69b052679e590a1ff932c619 protected SoundEvent getAmbientSound() { return SoundEvents.MULE_AMBIENT; diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/SkeletonHorse.java b/src/main/java/net/minecraft/world/entity/animal/horse/SkeletonHorse.java -index 92d170dd0155a7a5879de4a320cdc03bb66d8887..6e3af90f4cb4f7722bd1601a515fd9a377459d1b 100644 +index 41596d9c2e8e6c91f77b1bbe3ccf828708b6b970..64f0f486e29e0b63b024dd5c06738e12d0fb5b9a 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/SkeletonHorse.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/SkeletonHorse.java -@@ -31,6 +31,43 @@ public class SkeletonHorse extends AbstractHorse { +@@ -35,6 +35,43 @@ public class SkeletonHorse extends AbstractHorse { super(type, world); } @@ -7748,7 +7723,7 @@ index 92d170dd0155a7a5879de4a320cdc03bb66d8887..6e3af90f4cb4f7722bd1601a515fd9a3 public static AttributeSupplier.Builder createAttributes() { return createBaseHorseAttributes().add(Attributes.MAX_HEALTH, 15.0D).add(Attributes.MOVEMENT_SPEED, (double)0.2F); } -@@ -42,6 +79,7 @@ public class SkeletonHorse extends AbstractHorse { +@@ -54,6 +91,7 @@ public class SkeletonHorse extends AbstractHorse { @Override protected void addBehaviourGoals() { @@ -7820,10 +7795,10 @@ index b016f53c6644c6411b3a91e09049892131187179..02e3adc9a55fa9cd2a418094eb206970 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 7f8bbacf00498a2ed6a13760266df993a289c2dd..9e4a1c3ea8ce9ef438f958498cce4b04ec70dba9 100644 +index 2f7f1f01c5e99266e66f7b8324fc94d2130ea9a4..813501e8aac1c121569cb996b47f0293d99c7e36 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 -@@ -22,6 +22,48 @@ public class ZombieHorse extends AbstractHorse { +@@ -26,6 +26,48 @@ public class ZombieHorse extends AbstractHorse { super(type, world); } @@ -7872,7 +7847,7 @@ index 7f8bbacf00498a2ed6a13760266df993a289c2dd..9e4a1c3ea8ce9ef438f958498cce4b04 public static AttributeSupplier.Builder createAttributes() { return createBaseHorseAttributes().add(Attributes.MAX_HEALTH, 15.0D).add(Attributes.MOVEMENT_SPEED, (double)0.2F); } -@@ -64,6 +106,7 @@ public class ZombieHorse extends AbstractHorse { +@@ -76,6 +118,7 @@ public class ZombieHorse extends AbstractHorse { @Override protected void addBehaviourGoals() { @@ -8061,10 +8036,10 @@ index ffc5b68c4246a7111845230a75552bb15875a209..440add62fcfa62d483409e1aecfc9159 this.onDestroyedBy(source); diff --git a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java -index a288180da1996103eb7dc3bb87b4615f86630bb8..7f3c914358a3d623b07dbb69abc23e1341f0e58a 100644 +index f56bb431be7d5f1a1b8edec41af1f3a28289316d..dc7804371b65c43367ec87e79433106e8a11a6ff 100644 --- a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java +++ b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java -@@ -107,9 +107,11 @@ public class EnderDragon extends Mob implements Enemy { +@@ -107,6 +107,7 @@ public class EnderDragon extends Mob implements Enemy { @Nullable private BlockPos podium; // Paper end @@ -8072,15 +8047,10 @@ index a288180da1996103eb7dc3bb87b4615f86630bb8..7f3c914358a3d623b07dbb69abc23e13 public EnderDragon(EntityType entitytypes, Level world) { super(EntityType.ENDER_DRAGON, world); -+ this.explosionSource = new Explosion(world, this, null, null, Double.NaN, Double.NaN, Double.NaN, Float.NaN, true, Explosion.BlockInteraction.DESTROY); // Purpur - moved instantiation from field - this.fightOrigin = BlockPos.ZERO; - this.growlTime = 100; - this.nodes = new Node[24]; -@@ -128,7 +130,37 @@ public class EnderDragon extends Mob implements Enemy { - this.noPhysics = true; +@@ -129,6 +130,37 @@ public class EnderDragon extends Mob implements Enemy { this.noCulling = true; this.phaseManager = new EnderDragonPhaseManager(this); -- this.explosionSource = new Explosion(world, this, null, null, Double.NaN, Double.NaN, Double.NaN, Float.NaN, true, Explosion.BlockInteraction.DESTROY); // CraftBukkit + this.explosionSource = new Explosion(world, this, null, null, Double.NaN, Double.NaN, Double.NaN, Float.NaN, true, Explosion.BlockInteraction.DESTROY, ParticleTypes.EXPLOSION, ParticleTypes.EXPLOSION_EMITTER, SoundEvents.GENERIC_EXPLODE); // CraftBukkit + + // Purpur start + this.moveControl = new org.purpurmc.purpur.controller.FlyingMoveControllerWASD(this) { @@ -8530,7 +8500,7 @@ index c9a4feb4a52c0eb621b120e5b8c18d0a74dae0cd..8f8a3e03eec72cd48b10649778ec2f26 } diff --git a/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java b/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java -index 523f14916073fb137578da777a23ba8265fd8af6..2b9b0acd20d2bf16d08ed89ba625dfb15c630988 100644 +index 1e86e86b0a100a5d14aee10b60e70c32d2733660..1ea348b6007d8aebf1e0f29018a03eb10c445369 100644 --- a/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java +++ b/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java @@ -99,10 +99,12 @@ public class ArmorStand extends LivingEntity { @@ -8554,7 +8524,7 @@ index 523f14916073fb137578da777a23ba8265fd8af6..2b9b0acd20d2bf16d08ed89ba625dfb1 } public ArmorStand(Level world, double x, double y, double z) { -@@ -619,7 +622,7 @@ public class ArmorStand extends LivingEntity { +@@ -606,7 +609,7 @@ public class ArmorStand extends LivingEntity { private org.bukkit.event.entity.EntityDeathEvent brokenByPlayer(DamageSource damageSource) { // Paper ItemStack itemstack = new ItemStack(Items.ARMOR_STAND); @@ -8563,7 +8533,7 @@ index 523f14916073fb137578da777a23ba8265fd8af6..2b9b0acd20d2bf16d08ed89ba625dfb1 itemstack.setHoverName(this.getCustomName()); } -@@ -690,6 +693,7 @@ public class ArmorStand extends LivingEntity { +@@ -677,6 +680,7 @@ public class ArmorStand extends LivingEntity { @Override public void tick() { @@ -8571,16 +8541,16 @@ index 523f14916073fb137578da777a23ba8265fd8af6..2b9b0acd20d2bf16d08ed89ba625dfb1 // Paper start if (!this.canTick) { if (this.noTickPoseDirty) { -@@ -1024,4 +1028,18 @@ public class ArmorStand extends LivingEntity { +@@ -1004,4 +1008,18 @@ public class ArmorStand extends LivingEntity { + } } // Paper end - // Paper end + + // Purpur start + @Override + public void updateInWaterStateAndDoWaterCurrentPushing() { + if (this.level().purpurConfig.armorstandWaterMovement && -+ (this.level().purpurConfig.armorstandWaterFence || !(level().getBlockState(blockPosition().below()).getBlock() instanceof net.minecraft.world.level.block.FenceBlock))) ++ (this.level().purpurConfig.armorstandWaterFence || !(level().getBlockState(blockPosition().below()).getBlock() instanceof net.minecraft.world.level.block.FenceBlock))) + super.updateInWaterStateAndDoWaterCurrentPushing(); + } + @@ -8591,10 +8561,10 @@ index 523f14916073fb137578da777a23ba8265fd8af6..2b9b0acd20d2bf16d08ed89ba625dfb1 + // Purpur end } diff --git a/src/main/java/net/minecraft/world/entity/decoration/ItemFrame.java b/src/main/java/net/minecraft/world/entity/decoration/ItemFrame.java -index 759ecd79534a7706f7d4a63eb9dacbefcfe54674..182faba889dc15a3500c5919cad8a5483a53033a 100644 +index 69912c5b300b67394dce3876d2d96872033cf156..d728dc8a9b5fa2de0a824aaf132ee15db090b02e 100644 --- a/src/main/java/net/minecraft/world/entity/decoration/ItemFrame.java +++ b/src/main/java/net/minecraft/world/entity/decoration/ItemFrame.java -@@ -273,7 +273,13 @@ public class ItemFrame extends HangingEntity { +@@ -268,7 +268,13 @@ public class ItemFrame extends HangingEntity { } if (alwaysDrop) { @@ -8638,10 +8608,10 @@ index d9016807bc21c38a5c38170e1335c79b39355bcb..62cdc36a21c0203ed98d2946a1efdf54 } diff --git a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java -index 760e54d74fc027e631e45b07b729d060511d5bfd..07f1f6c9613150fd1cdd460a940629a67539d8db 100644 +index 2abd920e78a4da56654da87034c36c77d2fc6b35..d9bc196c653aff84913bbb0e495fe735e366d23f 100644 --- a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java +++ b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java -@@ -58,6 +58,12 @@ public class ItemEntity extends Entity implements TraceableEntity { +@@ -60,6 +60,12 @@ public class ItemEntity extends Entity implements TraceableEntity { public boolean canMobPickup = true; // Paper private int despawnRate = -1; // Paper public net.kyori.adventure.util.TriState frictionState = net.kyori.adventure.util.TriState.NOT_SET; // Paper @@ -8654,7 +8624,7 @@ index 760e54d74fc027e631e45b07b729d060511d5bfd..07f1f6c9613150fd1cdd460a940629a6 public ItemEntity(EntityType type, Level world) { super(type, world); -@@ -374,7 +380,16 @@ public class ItemEntity extends Entity implements TraceableEntity { +@@ -392,7 +398,16 @@ public class ItemEntity extends Entity implements TraceableEntity { @Override public boolean hurt(DamageSource source, float amount) { @@ -8672,7 +8642,7 @@ index 760e54d74fc027e631e45b07b729d060511d5bfd..07f1f6c9613150fd1cdd460a940629a6 return false; } else if (!this.getItem().isEmpty() && this.getItem().is(Items.NETHER_STAR) && source.is(DamageTypeTags.IS_EXPLOSION)) { return false; -@@ -576,6 +591,12 @@ public class ItemEntity extends Entity implements TraceableEntity { +@@ -595,6 +610,12 @@ public class ItemEntity extends Entity implements TraceableEntity { public void setItem(ItemStack stack) { this.getEntityData().set(ItemEntity.DATA_ITEM, stack); this.despawnRate = this.level().paperConfig().entities.spawning.altItemDespawnRate.enabled ? this.level().paperConfig().entities.spawning.altItemDespawnRate.items.getOrDefault(stack.getItem(), this.level().spigotConfig.itemDespawnRate) : this.level().spigotConfig.itemDespawnRate; // Paper @@ -8686,10 +8656,10 @@ index 760e54d74fc027e631e45b07b729d060511d5bfd..07f1f6c9613150fd1cdd460a940629a6 @Override diff --git a/src/main/java/net/minecraft/world/entity/item/PrimedTnt.java b/src/main/java/net/minecraft/world/entity/item/PrimedTnt.java -index 4ce3e69970dd9eb251d0538a2d233ca30e9e5e47..afc65b8bb7e7f7f70a25f2d869412ed325b658da 100644 +index c3e47426382296d650fa00ce0bc1a82bf23c7877..dfc3e9d2611ce418ac6f6cc5a23bb74415007713 100644 --- a/src/main/java/net/minecraft/world/entity/item/PrimedTnt.java +++ b/src/main/java/net/minecraft/world/entity/item/PrimedTnt.java -@@ -175,4 +175,29 @@ public class PrimedTnt extends Entity implements TraceableEntity { +@@ -207,4 +207,29 @@ public class PrimedTnt extends Entity implements TraceableEntity { return !level().paperConfig().fixes.preventTntFromMovingInWater && super.isPushedByFluid(); } // Paper end @@ -9132,7 +9102,7 @@ index fd1b5a1beea7594fa65decfdcccfa15781fc005b..304ea7fdcd410a7c88ec61143364e14d } // Paper end diff --git a/src/main/java/net/minecraft/world/entity/monster/Drowned.java b/src/main/java/net/minecraft/world/entity/monster/Drowned.java -index 991d728db2a3b64316fc2102cf3aee470327a62e..63a1cf5604c14025171d7be7434e2d6b64c98107 100644 +index 485d14d71fb26e6e0d00a43da040bf63d696b66a..034bb2d1292dde6276885c3ea71d886c3894311c 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Drowned.java +++ b/src/main/java/net/minecraft/world/entity/monster/Drowned.java @@ -29,6 +29,7 @@ import net.minecraft.world.entity.ai.goal.MoveToBlockGoal; @@ -9539,10 +9509,10 @@ index 66b6c55f72aec7e4e9dfa5417a46ba68dbb16a83..20ca96baf8f73fd5835422c6551f515a @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/Evoker.java b/src/main/java/net/minecraft/world/entity/monster/Evoker.java -index 7f0fbca7638bf89465bafed9d106813b86f0149b..4095f03ccd1712335baffe858603618100aed99c 100644 +index e67cb165a0d706d38e4970fb3d63f59a29808a76..daee6c4c0c2d43b65cdfd691bbbdc72465702dfe 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Evoker.java +++ b/src/main/java/net/minecraft/world/entity/monster/Evoker.java -@@ -50,10 +50,43 @@ public class Evoker extends SpellcasterIllager { +@@ -51,10 +51,43 @@ public class Evoker extends SpellcasterIllager { this.xpReward = 10; } @@ -9586,7 +9556,7 @@ index 7f0fbca7638bf89465bafed9d106813b86f0149b..4095f03ccd1712335baffe8586036181 this.goalSelector.addGoal(1, new Evoker.EvokerCastingSpellGoal()); this.goalSelector.addGoal(2, new AvoidEntityGoal<>(this, Player.class, 8.0F, 0.6D, 1.0D)); this.goalSelector.addGoal(4, new Evoker.EvokerSummonSpellGoal()); -@@ -62,6 +95,7 @@ public class Evoker extends SpellcasterIllager { +@@ -63,6 +96,7 @@ public class Evoker extends SpellcasterIllager { this.goalSelector.addGoal(8, new RandomStrollGoal(this, 0.6D)); this.goalSelector.addGoal(9, new LookAtPlayerGoal(this, Player.class, 3.0F, 1.0F)); this.goalSelector.addGoal(10, new LookAtPlayerGoal(this, Mob.class, 8.0F)); @@ -9594,7 +9564,7 @@ index 7f0fbca7638bf89465bafed9d106813b86f0149b..4095f03ccd1712335baffe8586036181 this.targetSelector.addGoal(1, (new HurtByTargetGoal(this, new Class[]{Raider.class})).setAlertOthers()); this.targetSelector.addGoal(2, (new NearestAttackableTargetGoal<>(this, Player.class, true)).setUnseenMemoryTicks(300)); this.targetSelector.addGoal(3, (new NearestAttackableTargetGoal<>(this, AbstractVillager.class, false)).setUnseenMemoryTicks(300)); -@@ -321,7 +355,7 @@ public class Evoker extends SpellcasterIllager { +@@ -327,7 +361,7 @@ public class Evoker extends SpellcasterIllager { return false; } else if (Evoker.this.tickCount < this.nextAttackTickCount) { return false; @@ -9841,7 +9811,7 @@ index 793c72bb7b86e404926085629121d6cad19a2740..d13eed85d5399cd6991b3ad90f05a580 } } diff --git a/src/main/java/net/minecraft/world/entity/monster/Guardian.java b/src/main/java/net/minecraft/world/entity/monster/Guardian.java -index 45300f79cba6133d2a2eca706eae03ee3cd973c3..54113957c9cfab2ad3be25dbc05b8c29d1a064d5 100644 +index fd41ef66e2e12ec3a888bb376ef4363343914fcd..01c558673f0bb5034bca9df0e473375e7b7e724e 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Guardian.java +++ b/src/main/java/net/minecraft/world/entity/monster/Guardian.java @@ -70,15 +70,51 @@ public class Guardian extends Monster { @@ -9904,7 +9874,7 @@ index 45300f79cba6133d2a2eca706eae03ee3cd973c3..54113957c9cfab2ad3be25dbc05b8c29 this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, LivingEntity.class, 10, true, false, new Guardian.GuardianAttackSelector(this))); } -@@ -352,7 +389,7 @@ public class Guardian extends Monster { +@@ -347,7 +384,7 @@ public class Guardian extends Monster { @Override public void travel(Vec3 movementInput) { if (this.isControlledByLocalInstance() && this.isInWater()) { @@ -9913,7 +9883,7 @@ index 45300f79cba6133d2a2eca706eae03ee3cd973c3..54113957c9cfab2ad3be25dbc05b8c29 this.move(MoverType.SELF, this.getDeltaMovement()); this.setDeltaMovement(this.getDeltaMovement().scale(0.9D)); if (!this.isMoving() && this.getTarget() == null) { -@@ -369,7 +406,7 @@ public class Guardian extends Monster { +@@ -364,7 +401,7 @@ public class Guardian extends Monster { return new Vector3f(0.0F, dimensions.height + 0.125F * scaleFactor, 0.0F); } @@ -9922,7 +9892,7 @@ index 45300f79cba6133d2a2eca706eae03ee3cd973c3..54113957c9cfab2ad3be25dbc05b8c29 private final Guardian guardian; -@@ -378,8 +415,17 @@ public class Guardian extends Monster { +@@ -373,8 +410,17 @@ public class Guardian extends Monster { this.guardian = guardian; } @@ -9941,7 +9911,7 @@ index 45300f79cba6133d2a2eca706eae03ee3cd973c3..54113957c9cfab2ad3be25dbc05b8c29 if (this.operation == MoveControl.Operation.MOVE_TO && !this.guardian.getNavigation().isDone()) { Vec3 vec3d = new Vec3(this.wantedX - this.guardian.getX(), this.wantedY - this.guardian.getY(), this.wantedZ - this.guardian.getZ()); double d0 = vec3d.length(); -@@ -390,7 +436,7 @@ public class Guardian extends Monster { +@@ -385,7 +431,7 @@ public class Guardian extends Monster { this.guardian.setYRot(this.rotlerp(this.guardian.getYRot(), f, 90.0F)); this.guardian.yBodyRot = this.guardian.getYRot(); @@ -9951,7 +9921,7 @@ index 45300f79cba6133d2a2eca706eae03ee3cd973c3..54113957c9cfab2ad3be25dbc05b8c29 this.guardian.setSpeed(f2); diff --git a/src/main/java/net/minecraft/world/entity/monster/Husk.java b/src/main/java/net/minecraft/world/entity/monster/Husk.java -index 8ef1e325d722ca36fc0fc36f1e5287d7002b9fb2..473f28e86a0e5157264b83d9c3c4a18c72216da3 100644 +index 72b8290bebe8ed9bc3c464b30cfe5d2d664310f5..06a5106a94a44c1d21537410d801cdd945503d69 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Husk.java +++ b/src/main/java/net/minecraft/world/entity/monster/Husk.java @@ -22,6 +22,59 @@ public class Husk extends Zombie { @@ -10159,7 +10129,7 @@ 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 e4218acaaf7d3aef0fb31f5597fb1af32aa2c8b5..01977550309451cda795583ba4122143b140b9b7 100644 +index 127a344f35e194fc7b1a0783c75291fab929fe19..d90d8539815d92143c994108efdfcc18bcb3b158 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 { @@ -10736,7 +10706,7 @@ index 0c11d9bef8f0129c541e30ad057612e881703b24..c9c21c87e3bd1c404fbef6768761bcb5 if (!CraftEventFactory.callEntityChangeBlockEvent(this, blockposition, iblockdata.getFluidState().createLegacyBlock())) { // Paper - fix wrong block state continue; diff --git a/src/main/java/net/minecraft/world/entity/monster/Shulker.java b/src/main/java/net/minecraft/world/entity/monster/Shulker.java -index 8cb6f2d32c4b7a62ec1bdfeb8b661a1387cafe4b..81caa18fca658f70846ba437ac02906f5e9653b9 100644 +index 06ab07fb5d8d0e2f97325890218a11fef551a0ba..22669a188c1961783341b22551325e19aaeb8088 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Shulker.java +++ b/src/main/java/net/minecraft/world/entity/monster/Shulker.java @@ -22,6 +22,8 @@ import net.minecraft.tags.DamageTypeTags; @@ -10844,7 +10814,7 @@ index 8cb6f2d32c4b7a62ec1bdfeb8b661a1387cafe4b..81caa18fca658f70846ba437ac02906f if (entityshulker != null) { entityshulker.setVariant(this.getVariant()); -@@ -591,7 +651,7 @@ public class Shulker extends AbstractGolem implements VariantHolder getVariant() { @@ -10853,7 +10823,7 @@ index 8cb6f2d32c4b7a62ec1bdfeb8b661a1387cafe4b..81caa18fca658f70846ba437ac02906f } @Nullable -@@ -601,7 +661,7 @@ public class Shulker extends AbstractGolem implements VariantHolder(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 118b636a44e4b062e812e433f603b039276337da..a95e983032b3d3d125a39a46700b7db9dc69f307 100644 +index 8185cef34b9300561a00f9e62b98f1aa818a3f5a..e01c91385935b71bb9aa7259b95cb963140e8c94 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 { @@ -11437,7 +11407,7 @@ index 61162ecd43dc5e6f7898daecdec49f444e6d869b..2f49b528601a1feb7246fe7a9b83ce82 if (flag && !this.isSilent()) { this.level().playSound((Player) null, this.getX(), this.getY(), this.getZ(), SoundEvents.STRIDER_EAT, this.getSoundSource(), 1.0F, 1.0F + (this.random.nextFloat() - this.random.nextFloat()) * 0.2F); diff --git a/src/main/java/net/minecraft/world/entity/monster/Vex.java b/src/main/java/net/minecraft/world/entity/monster/Vex.java -index 90e577b1a89b02c38daff2845a63dafe5ed929e1..be1c9a7e2bafb33dcb954ba9fd427c033bb7542f 100644 +index 30ea3f64234fd1fda8dada3c7fb12be0730322a8..44fe951f0297c0efa5169c8972c05eaf90d49edf 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Vex.java +++ b/src/main/java/net/minecraft/world/entity/monster/Vex.java @@ -63,6 +63,65 @@ public class Vex extends Monster implements TraceableEntity { @@ -11536,7 +11506,7 @@ index 90e577b1a89b02c38daff2845a63dafe5ed929e1..be1c9a7e2bafb33dcb954ba9fd427c03 } @Override -@@ -240,14 +301,14 @@ public class Vex extends Monster implements TraceableEntity { +@@ -251,14 +312,14 @@ public class Vex extends Monster implements TraceableEntity { return new Vector3f(0.0F, dimensions.height - 0.0625F * scaleFactor, 0.0F); } @@ -11553,7 +11523,7 @@ index 90e577b1a89b02c38daff2845a63dafe5ed929e1..be1c9a7e2bafb33dcb954ba9fd427c03 if (this.operation == MoveControl.Operation.MOVE_TO) { Vec3 vec3d = new Vec3(this.wantedX - Vex.this.getX(), this.wantedY - Vex.this.getY(), this.wantedZ - Vex.this.getZ()); double d0 = vec3d.length(); -@@ -256,7 +317,7 @@ public class Vex extends Monster implements TraceableEntity { +@@ -267,7 +328,7 @@ public class Vex extends Monster implements TraceableEntity { this.operation = MoveControl.Operation.WAIT; Vex.this.setDeltaMovement(Vex.this.getDeltaMovement().scale(0.5D)); } else { @@ -11779,7 +11749,7 @@ index 3e79562f51efbac51785fa0998d6a1a6e3036939..4f242ba9131f341606af13ac543af8a0 this.updateActivity(); } diff --git a/src/main/java/net/minecraft/world/entity/monster/Zombie.java b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -index 5fdad1600cc7a7c22d1d9a58b6b2dda605521b97..c8420cbbedf6c9e370dc89282b5e478fde7b807b 100644 +index 753defa8f8b48d004a2a53b2fc322fd9c083d95e..007e75ec5a6a8f1522e7f0d105507834028eb819 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zombie.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zombie.java @@ -96,22 +96,69 @@ public class Zombie extends Monster { @@ -12350,10 +12320,10 @@ index 5aab051998b67b7ba95cbf568de60e325b905eab..1805d4e15328fa99595641ea64fc2e3e PiglinBruteAi.updateActivity(this); PiglinBruteAi.maybePlayActivitySound(this); diff --git a/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java b/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java -index f172cf9f754b73e44c3688581c984baa4e2ad8b6..9e2498f8cb4a1a309aa037c01aa3039924f5b29e 100644 +index fd2811b0d7cd0f9ff165c5116fe268c4cfe01cce..96f98389d8cdf588396bf6257a11236a577878a0 100644 --- a/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java +++ b/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java -@@ -122,8 +122,32 @@ public class Warden extends Monster implements VibrationSystem { +@@ -123,8 +123,32 @@ public class Warden extends Monster implements VibrationSystem { this.setPathfindingMalus(BlockPathTypes.LAVA, 8.0F); this.setPathfindingMalus(BlockPathTypes.DAMAGE_FIRE, 0.0F); this.setPathfindingMalus(BlockPathTypes.DANGER_FIRE, 0.0F); @@ -12386,7 +12356,7 @@ index f172cf9f754b73e44c3688581c984baa4e2ad8b6..9e2498f8cb4a1a309aa037c01aa30399 @Override public Packet getAddEntityPacket() { return new ClientboundAddEntityPacket(this, this.hasPose(Pose.EMERGING) ? 1 : 0); -@@ -395,19 +419,16 @@ public class Warden extends Monster implements VibrationSystem { +@@ -396,19 +420,16 @@ public class Warden extends Monster implements VibrationSystem { @Contract("null->false") public boolean canTargetEntity(@Nullable Entity entity) { @@ -12468,7 +12438,7 @@ index 5f407535298a31a34cfe114dd863fd6a9b977707..29c7e33fe961020e5a0007287fe9b663 } diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java -index 892101a78dbf2311f74abdad79b3d4dff8597a3a..dd59182d002e1a026a563a76cee2b8fb73c41bbd 100644 +index ad8aad31c748bd813634abd8de4a75f89d8389f0..da95d8a9cc83484c186613fa83ecf3fa4ae663d9 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java @@ -145,6 +145,8 @@ public class Villager extends AbstractVillager implements ReputationEventHandler @@ -12580,7 +12550,7 @@ index 892101a78dbf2311f74abdad79b3d4dff8597a3a..dd59182d002e1a026a563a76cee2b8fb } brain.addActivity(Activity.CORE, VillagerGoalPackages.getCorePackage(villagerprofession, 0.5F)); -@@ -256,13 +342,22 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -256,13 +342,21 @@ public class Villager extends AbstractVillager implements ReputationEventHandler // Paper start this.customServerAiStep(false); } @@ -12592,7 +12562,6 @@ index 892101a78dbf2311f74abdad79b3d4dff8597a3a..dd59182d002e1a026a563a76cee2b8fb + // treat as inactive if lobotomized + inactive = inactive || checkLobotomized(); + } else { -+ // clean up state for API + this.isLobotomized = false; + } // Pufferfish start @@ -12606,7 +12575,7 @@ index 892101a78dbf2311f74abdad79b3d4dff8597a3a..dd59182d002e1a026a563a76cee2b8fb if (this.assignProfessionWhenSpawned) { this.assignProfessionWhenSpawned = false; } -@@ -318,7 +413,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -318,7 +412,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler if (!itemstack.is(Items.VILLAGER_SPAWN_EGG) && this.isAlive() && !this.isTrading() && !this.isSleeping()) { if (this.isBaby()) { this.setUnhappy(); @@ -12615,7 +12584,7 @@ index 892101a78dbf2311f74abdad79b3d4dff8597a3a..dd59182d002e1a026a563a76cee2b8fb } else { boolean flag = this.getOffers().isEmpty(); -@@ -331,9 +426,10 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -331,9 +425,10 @@ public class Villager extends AbstractVillager implements ReputationEventHandler } if (flag) { @@ -12628,7 +12597,7 @@ index 892101a78dbf2311f74abdad79b3d4dff8597a3a..dd59182d002e1a026a563a76cee2b8fb this.startTrading(player); } -@@ -502,7 +598,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -502,7 +597,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler while (iterator.hasNext()) { MerchantOffer merchantrecipe = (MerchantOffer) iterator.next(); @@ -12637,7 +12606,7 @@ index 892101a78dbf2311f74abdad79b3d4dff8597a3a..dd59182d002e1a026a563a76cee2b8fb } } -@@ -752,7 +848,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -752,7 +847,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler @Override public boolean canBreed() { @@ -12646,7 +12615,7 @@ index 892101a78dbf2311f74abdad79b3d4dff8597a3a..dd59182d002e1a026a563a76cee2b8fb } private boolean hungry() { -@@ -966,6 +1062,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -966,6 +1061,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler public boolean hasFarmSeeds() { return this.getInventory().hasAnyMatching((itemstack) -> { @@ -12658,7 +12627,7 @@ index 892101a78dbf2311f74abdad79b3d4dff8597a3a..dd59182d002e1a026a563a76cee2b8fb return itemstack.is(ItemTags.VILLAGER_PLANTABLE_SEEDS); }); } -@@ -1023,6 +1124,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -1023,6 +1123,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler } public void spawnGolemIfNeeded(ServerLevel world, long time, int requiredCount) { @@ -12666,7 +12635,7 @@ index 892101a78dbf2311f74abdad79b3d4dff8597a3a..dd59182d002e1a026a563a76cee2b8fb if (this.wantsToSpawnGolem(time)) { AABB axisalignedbb = this.getBoundingBox().inflate(10.0D, 10.0D, 10.0D); List list = world.getEntitiesOfClass(Villager.class, axisalignedbb); -@@ -1087,6 +1189,12 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -1087,6 +1188,12 @@ public class Villager extends AbstractVillager implements ReputationEventHandler @Override public void startSleeping(BlockPos pos) { @@ -12794,10 +12763,10 @@ index 8385eb1d60f377da94e3178ab506feefb43563fd..a5443f92786427c42092aec8350e7ab3 if (NaturalSpawner.isSpawnPositionOk(SpawnPlacements.Type.ON_GROUND, world, blockposition2, EntityType.WANDERING_TRADER)) { blockposition1 = blockposition2; diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java -index 9aaf1301281d8d45e4e7eb2cb859c339013b17ca..860113fba04e0fd3880e8e49c8a02477490aedb5 100644 +index 13130eb5d54bff689391855c153f3b2359200794..03d263d7ac7e665fb6bf6b258796426ce2c4827c 100644 --- a/src/main/java/net/minecraft/world/entity/player/Player.java +++ b/src/main/java/net/minecraft/world/entity/player/Player.java -@@ -191,11 +191,21 @@ public abstract class Player extends LivingEntity { +@@ -186,11 +186,21 @@ public abstract class Player extends LivingEntity { public boolean affectsSpawning = true; public net.kyori.adventure.util.TriState flyingFallDamage = net.kyori.adventure.util.TriState.NOT_SET; // Paper end @@ -12819,7 +12788,7 @@ index 9aaf1301281d8d45e4e7eb2cb859c339013b17ca..860113fba04e0fd3880e8e49c8a02477 @Override public CraftHumanEntity getBukkitEntity() { return (CraftHumanEntity) super.getBukkitEntity(); -@@ -204,6 +214,19 @@ public abstract class Player extends LivingEntity { +@@ -199,6 +209,19 @@ public abstract class Player extends LivingEntity { public final int sendAllPlayerInfoBucketIndex; // Gale - Purpur - spread out sending all player info @@ -12839,7 +12808,7 @@ index 9aaf1301281d8d45e4e7eb2cb859c339013b17ca..860113fba04e0fd3880e8e49c8a02477 public Player(Level world, BlockPos pos, float yaw, GameProfile gameProfile) { super(EntityType.PLAYER, world); this.lastItemInMainHand = ItemStack.EMPTY; -@@ -249,6 +272,12 @@ public abstract class Player extends LivingEntity { +@@ -244,6 +267,12 @@ public abstract class Player extends LivingEntity { @Override public void tick() { @@ -12873,12 +12842,12 @@ index 9aaf1301281d8d45e4e7eb2cb859c339013b17ca..860113fba04e0fd3880e8e49c8a02477 @Override public int getPortalWaitTime() { -- return this.abilities.invulnerable ? 1 : 80; -+ return canPortalInstant ? 1 : this.abilities.invulnerable ? this.level().purpurConfig.playerCreativePortalWaitTime : this.level().purpurConfig.playerPortalWaitTime; // Purpur +- return Math.max(1, this.level().getGameRules().getInt(this.abilities.invulnerable ? GameRules.RULE_PLAYERS_NETHER_PORTAL_CREATIVE_DELAY : GameRules.RULE_PLAYERS_NETHER_PORTAL_DEFAULT_DELAY)); ++ return Math.max(1, canPortalInstant ? 1 : this.level().getGameRules().getInt(this.abilities.invulnerable ? GameRules.RULE_PLAYERS_NETHER_PORTAL_CREATIVE_DELAY : GameRules.RULE_PLAYERS_NETHER_PORTAL_DEFAULT_DELAY)); } @Override -@@ -607,7 +646,7 @@ public abstract class Player extends LivingEntity { +@@ -602,7 +641,7 @@ public abstract class Player extends LivingEntity { while (iterator.hasNext()) { Entity entity = (Entity) iterator.next(); @@ -12887,7 +12856,7 @@ index 9aaf1301281d8d45e4e7eb2cb859c339013b17ca..860113fba04e0fd3880e8e49c8a02477 list1.add(entity); } else if (!entity.isRemoved()) { this.touch(entity); -@@ -1298,7 +1337,7 @@ public abstract class Player extends LivingEntity { +@@ -1293,7 +1332,7 @@ public abstract class Player extends LivingEntity { flag2 = flag2 && !this.level().paperConfig().entities.behavior.disablePlayerCrits; // Paper flag2 = flag2 && !this.isSprinting(); if (flag2) { @@ -12896,7 +12865,7 @@ index 9aaf1301281d8d45e4e7eb2cb859c339013b17ca..860113fba04e0fd3880e8e49c8a02477 } f += f1; -@@ -1998,9 +2037,19 @@ public abstract class Player extends LivingEntity { +@@ -1913,9 +1952,19 @@ public abstract class Player extends LivingEntity { @Override public int getExperienceReward() { if (!this.level().getGameRules().getBoolean(GameRules.RULE_KEEPINVENTORY) && !this.isSpectator()) { @@ -12919,7 +12888,7 @@ index 9aaf1301281d8d45e4e7eb2cb859c339013b17ca..860113fba04e0fd3880e8e49c8a02477 } else { return 0; } -@@ -2076,6 +2125,11 @@ public abstract class Player extends LivingEntity { +@@ -1991,6 +2040,11 @@ public abstract class Player extends LivingEntity { return this.inventory.armor; } @@ -12931,7 +12900,7 @@ index 9aaf1301281d8d45e4e7eb2cb859c339013b17ca..860113fba04e0fd3880e8e49c8a02477 public boolean setEntityOnShoulder(CompoundTag entityNbt) { if (!this.isPassenger() && this.onGround() && !this.isInWater() && !this.isInPowderSnow) { if (this.getShoulderEntityLeft().isEmpty()) { -@@ -2356,7 +2410,7 @@ public abstract class Player extends LivingEntity { +@@ -2271,7 +2325,7 @@ public abstract class Player extends LivingEntity { public ItemStack eat(Level world, ItemStack stack) { this.getFoodData().eat(stack.getItem(), stack); this.awardStat(Stats.ITEM_USED.get(stack.getItem())); @@ -12940,6 +12909,14 @@ index 9aaf1301281d8d45e4e7eb2cb859c339013b17ca..860113fba04e0fd3880e8e49c8a02477 if (this instanceof ServerPlayer) { CriteriaTriggers.CONSUME_ITEM.trigger((ServerPlayer) this, stack); } +@@ -2365,6 +2419,7 @@ public abstract class Player extends LivingEntity { + } + + public static boolean isValidUsername(String name) { ++ if (true) return org.purpurmc.purpur.PurpurConfig.usernameValidCharactersPattern.matcher(name).matches(); // Purpur + // Paper start + if (name == null || name.isEmpty() || name.length() > 16) { + return false; diff --git a/src/main/java/net/minecraft/world/entity/player/StackedContents.java b/src/main/java/net/minecraft/world/entity/player/StackedContents.java index 26b236a764177ac16d53f5cbaf83d3e21d015ebc..90b92aeeb893146a2036f4ad21bf3b084c2c50bd 100644 --- a/src/main/java/net/minecraft/world/entity/player/StackedContents.java @@ -12953,18 +12930,18 @@ index 26b236a764177ac16d53f5cbaf83d3e21d015ebc..90b92aeeb893146a2036f4ad21bf3b08 public static int getStackingIndex(ItemStack stack) { diff --git a/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java b/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java -index a66de8353eae89790e4fb81eda2ef2e539d59b13..8576ebd969fba43b9dc92b4e7268b7e87cdbf75d 100644 +index 267284a45e710a230c1f1a68db398a39bcd9a644..a325f8ac43a9a80684774a4c3e44fbdddd650aed 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java +++ b/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java -@@ -72,6 +72,7 @@ public abstract class AbstractArrow extends Projectile { - private IntOpenHashSet piercingIgnoreEntityIds; +@@ -74,6 +74,7 @@ public abstract class AbstractArrow extends Projectile { @Nullable private List piercedAndKilledEntities; + public ItemStack pickupItemStack; + public int lootingLevel; // Purpur // Spigot Start @Override -@@ -612,6 +613,12 @@ public abstract class AbstractArrow extends Projectile { +@@ -641,6 +642,12 @@ public abstract class AbstractArrow extends Projectile { this.knockback = punch; } @@ -13023,30 +13000,18 @@ index 0bbe853f7df93f9dcd2b21d762939f8b6be069aa..7db9844083703944f59e112c6dc5e1a5 public void tick() { super.tick(); diff --git a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java -index e799b199bee08bfaf5575eb0c0d2194af495d43e..8aed5562f2ae4cd63894d3c488b3607a92884db8 100644 +index f2854247ceff3d99f29ced43daa9537aa2ce7549..8c13a693ebd260d997a648917226f689beefb913 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java +++ b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java -@@ -335,6 +335,6 @@ public abstract class Projectile extends Entity implements TraceableEntity { +@@ -343,7 +343,7 @@ public abstract class Projectile extends Entity implements TraceableEntity { public boolean mayInteract(Level world, BlockPos pos) { Entity entity = this.getOwner(); - return entity instanceof Player ? entity.mayInteract(world, pos) : entity == null || world.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); + return entity instanceof Player ? entity.mayInteract(world, pos) : entity == null || world.purpurConfig.projectilesBypassMobGriefing || world.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); } - } -diff --git a/src/main/java/net/minecraft/world/entity/projectile/ProjectileUtil.java b/src/main/java/net/minecraft/world/entity/projectile/ProjectileUtil.java -index cc0a3d9794d05b6bc6ab05f4f2ab8d83134b181d..e1f918d0bd2a70db1aba8bda8717149f58766825 100644 ---- a/src/main/java/net/minecraft/world/entity/projectile/ProjectileUtil.java -+++ b/src/main/java/net/minecraft/world/entity/projectile/ProjectileUtil.java -@@ -33,7 +33,7 @@ public final class ProjectileUtil { - return getHitResult(vec32, entity, predicate, vec3, level); - } -- private static HitResult getHitResult(Vec3 pos, Entity entity, Predicate predicate, Vec3 velocity, Level world) { -+ public static HitResult getHitResult(Vec3 pos, Entity entity, Predicate predicate, Vec3 velocity, Level world) { // Purpur - private -> public - Vec3 vec3 = pos.add(velocity); - HitResult hitResult = world.clip(new ClipContext(pos, vec3, ClipContext.Block.COLLIDER, ClipContext.Fluid.NONE, entity)); - if (hitResult.getType() != HitResult.Type.MISS) { + public boolean mayBreak(Level world) { diff --git a/src/main/java/net/minecraft/world/entity/projectile/SmallFireball.java b/src/main/java/net/minecraft/world/entity/projectile/SmallFireball.java index 9d43c8520953d6fe0d0948f9dbe14e0650ee01c2..deee9fffe6981d7e728621cc799a812d78000592 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/SmallFireball.java @@ -13107,10 +13072,10 @@ index 718e120c9768cf716b32d3d652f53f1dda925168..440d3d72d8b2dac14f83a83caa5ae9db protected void onHit(HitResult hitResult) { super.onHit(hitResult); diff --git a/src/main/java/net/minecraft/world/entity/projectile/ThrownEnderpearl.java b/src/main/java/net/minecraft/world/entity/projectile/ThrownEnderpearl.java -index f5db60cbecbe69941873e064315931089fe0e48a..2728eaaf0a9b761d932bd22639ef4e1ccc428482 100644 +index af4da25c9b13c114179fab3254aea5323210d7da..59cc9e9a56898c7bdc5474842c31d2fbe6a81897 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/ThrownEnderpearl.java +++ b/src/main/java/net/minecraft/world/entity/projectile/ThrownEnderpearl.java -@@ -67,10 +67,11 @@ public class ThrownEnderpearl extends ThrowableItemProjectile { +@@ -70,10 +70,11 @@ public class ThrownEnderpearl extends ThrowableItemProjectile { Bukkit.getPluginManager().callEvent(teleEvent); if (!teleEvent.isCancelled() && entityplayer.connection.isAcceptingMessages()) { @@ -13123,7 +13088,7 @@ index f5db60cbecbe69941873e064315931089fe0e48a..2728eaaf0a9b761d932bd22639ef4e1c entityendermite.moveTo(entity.getX(), entity.getY(), entity.getZ(), entity.getYRot(), entity.getXRot()); this.level().addFreshEntity(entityendermite, CreatureSpawnEvent.SpawnReason.ENDER_PEARL); } -@@ -83,7 +84,7 @@ public class ThrownEnderpearl extends ThrowableItemProjectile { +@@ -86,7 +87,7 @@ public class ThrownEnderpearl extends ThrowableItemProjectile { entityplayer.connection.teleport(teleEvent.getTo()); entity.resetFallDistance(); CraftEventFactory.entityDamage = this; @@ -13133,10 +13098,10 @@ index f5db60cbecbe69941873e064315931089fe0e48a..2728eaaf0a9b761d932bd22639ef4e1c } // CraftBukkit end diff --git a/src/main/java/net/minecraft/world/entity/projectile/ThrownTrident.java b/src/main/java/net/minecraft/world/entity/projectile/ThrownTrident.java -index a6bc277b6589dd7104566542733327822d6299a4..dde841cc09ba4a3575a462b03537887551d47ba5 100644 +index 01e8f6f36a17c484b825879c377f7d6cc08e1fda..f74e5e055243abb36c7444422de54c806a39e675 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/ThrownTrident.java +++ b/src/main/java/net/minecraft/world/entity/projectile/ThrownTrident.java -@@ -62,7 +62,7 @@ public class ThrownTrident extends AbstractArrow { +@@ -60,7 +60,7 @@ public class ThrownTrident extends AbstractArrow { Entity entity = this.getOwner(); byte b0 = (Byte) this.entityData.get(ThrownTrident.ID_LOYALTY); @@ -13146,10 +13111,10 @@ index a6bc277b6589dd7104566542733327822d6299a4..dde841cc09ba4a3575a462b035378875 if (!this.level().isClientSide && this.pickup == AbstractArrow.Pickup.ALLOWED) { this.spawnAtLocation(this.getPickupItem(), 0.1F); diff --git a/src/main/java/net/minecraft/world/entity/projectile/WitherSkull.java b/src/main/java/net/minecraft/world/entity/projectile/WitherSkull.java -index 06d1bdb9bd124b201c36d284c50d22bf50d3735a..b4687453256ead43cf5288994316c7bf946b86df 100644 +index 78dd3365dc4d1265fc2102f740d75a384f5df5c5..aa5ce9625bf23885a55521cbb4d994b684a5cf61 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/WitherSkull.java +++ b/src/main/java/net/minecraft/world/entity/projectile/WitherSkull.java -@@ -97,7 +97,7 @@ public class WitherSkull extends AbstractHurtingProjectile { +@@ -98,7 +98,7 @@ public class WitherSkull extends AbstractHurtingProjectile { if (!this.level().isClientSide) { // CraftBukkit start // this.level().explode(this, this.getX(), this.getY(), this.getZ(), 1.0F, false, World.a.MOB); @@ -13158,7 +13123,7 @@ index 06d1bdb9bd124b201c36d284c50d22bf50d3735a..b4687453256ead43cf5288994316c7bf this.level().getCraftServer().getPluginManager().callEvent(event); if (!event.isCancelled()) { -@@ -109,6 +109,17 @@ public class WitherSkull extends AbstractHurtingProjectile { +@@ -110,6 +110,17 @@ public class WitherSkull extends AbstractHurtingProjectile { } @@ -13234,10 +13199,10 @@ index 31831811ce16265e9828fa34d9e67d8ac195d723..a1f74718240da3dfb0fc53f337ec3bf1 if (!this.raidMap.containsKey(raid.getId())) { this.raidMap.put(raid.getId(), raid); diff --git a/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java b/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java -index 44a6118d3bd67a95180f750c17967561946e2e87..faf449dfb4f95a300796db46833f3b6a51cb961b 100644 +index 48b1cddfca671ac8bcb93a1b60518a4ee9e977e2..0eca1c61991b0d344d0810239d9cab2873216f04 100644 --- a/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java +++ b/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java -@@ -112,12 +112,14 @@ public abstract class AbstractMinecart extends Entity { +@@ -105,12 +105,14 @@ public abstract class AbstractMinecart extends VehicleEntity { private double flyingY = 0.949999988079071D; // Paper - restore vanilla precision private double flyingZ = 0.949999988079071D; // Paper - restore vanilla precision public double maxSpeed = 0.4D; @@ -13252,7 +13217,7 @@ index 44a6118d3bd67a95180f750c17967561946e2e87..faf449dfb4f95a300796db46833f3b6a } protected AbstractMinecart(EntityType type, Level world, double x, double y, double z) { -@@ -342,6 +344,12 @@ public abstract class AbstractMinecart extends Entity { +@@ -294,6 +296,12 @@ public abstract class AbstractMinecart extends VehicleEntity { @Override public void tick() { @@ -13265,7 +13230,7 @@ index 44a6118d3bd67a95180f750c17967561946e2e87..faf449dfb4f95a300796db46833f3b6a // CraftBukkit start double prevX = this.getX(); double prevY = this.getY(); -@@ -499,16 +507,62 @@ public abstract class AbstractMinecart extends Entity { +@@ -451,16 +459,62 @@ public abstract class AbstractMinecart extends VehicleEntity { public void activateMinecart(int x, int y, int z, boolean powered) {} @@ -13328,7 +13293,7 @@ index 44a6118d3bd67a95180f750c17967561946e2e87..faf449dfb4f95a300796db46833f3b6a this.move(MoverType.SELF, this.getDeltaMovement()); if (!this.onGround()) { -@@ -670,7 +724,7 @@ public abstract class AbstractMinecart extends Entity { +@@ -622,7 +676,7 @@ public abstract class AbstractMinecart extends VehicleEntity { if (d18 > 0.01D) { double d20 = 0.06D; @@ -13338,25 +13303,10 @@ index 44a6118d3bd67a95180f750c17967561946e2e87..faf449dfb4f95a300796db46833f3b6a Vec3 vec3d5 = this.getDeltaMovement(); double d21 = vec3d5.x; diff --git a/src/main/java/net/minecraft/world/entity/vehicle/Boat.java b/src/main/java/net/minecraft/world/entity/vehicle/Boat.java -index 5c07da62c82bc70138f6cb5007629d6974be69ac..c314febb75a85ef12051bde392c5b57e9c5d85ac 100644 +index c041c0b81be41cfd128c2f5ba56a5329d50b2efc..7e9c88efd2a1edea673d1ef81635c2891a04d30e 100644 --- a/src/main/java/net/minecraft/world/entity/vehicle/Boat.java +++ b/src/main/java/net/minecraft/world/entity/vehicle/Boat.java -@@ -242,7 +242,13 @@ public class Boat extends Entity implements VariantHolder { - } - - protected void destroy(DamageSource source) { -- this.spawnAtLocation((ItemLike) this.getDropItem()); -+ // Purpur start -+ final ItemStack boat = new ItemStack(this.getDropItem()); -+ if (this.level().purpurConfig.persistentDroppableEntityDisplayNames && this.hasCustomName()) { -+ boat.setHoverName(this.getCustomName()); -+ } -+ this.spawnAtLocation(boat); -+ // Purpur end - } - - @Override -@@ -578,6 +584,7 @@ public class Boat extends Entity implements VariantHolder { +@@ -521,6 +521,7 @@ public class Boat extends VehicleEntity implements VariantHolder { if (f > 0.0F) { this.landFriction = f; @@ -13364,6 +13314,21 @@ index 5c07da62c82bc70138f6cb5007629d6974be69ac..c314febb75a85ef12051bde392c5b57e return Boat.Status.ON_LAND; } else { return Boat.Status.IN_AIR; +@@ -967,7 +968,13 @@ public class Boat extends VehicleEntity implements VariantHolder { + + @Override + public ItemStack getPickResult() { +- return new ItemStack(this.getDropItem()); ++ // Purpur start ++ final ItemStack boat = new ItemStack(this.getDropItem()); ++ if (this.level().purpurConfig.persistentDroppableEntityDisplayNames && this.hasCustomName()) { ++ boat.setHoverName(this.getCustomName()); ++ } ++ return boat; ++ // Purpur end + } + + public static enum Type implements StringRepresentable { diff --git a/src/main/java/net/minecraft/world/food/FoodData.java b/src/main/java/net/minecraft/world/food/FoodData.java index c3448707fd8a632b457cc97b35d08a9c6933d5ee..e8079d126e6c0cf0b15c01afb6498922ee05964c 100644 --- a/src/main/java/net/minecraft/world/food/FoodData.java @@ -13435,7 +13400,7 @@ index b16d9e2eaa589f19c563ee70b1a56d67dbcdecb0..71beab673f04cd051c46ea37f8c84731 public static final FoodProperties BAKED_POTATO = (new FoodProperties.Builder()).nutrition(5).saturationMod(0.6F).build(); public static final FoodProperties BEEF = (new FoodProperties.Builder()).nutrition(3).saturationMod(0.3F).meat().build(); diff --git a/src/main/java/net/minecraft/world/inventory/AbstractContainerMenu.java b/src/main/java/net/minecraft/world/inventory/AbstractContainerMenu.java -index 82f18790b9dc55b039ae03600a80a46d56a87521..6a754ecd4e9d6c3ebc7bd91b1de797fdbf3c4290 100644 +index 8fd82051bba33b4703e4d99fff886b63a319a5ba..1af23da6b3ccb4759e46e37cfa2ca85cf78f3ec2 100644 --- a/src/main/java/net/minecraft/world/inventory/AbstractContainerMenu.java +++ b/src/main/java/net/minecraft/world/inventory/AbstractContainerMenu.java @@ -76,6 +76,7 @@ public abstract class AbstractContainerMenu { @@ -13821,23 +13786,15 @@ index 076c2b2938c9b88b7e71dbc2aa9d8c7e90d4fe75..b1eacb9691b320a10de3420fae3632bb return itemstack; diff --git a/src/main/java/net/minecraft/world/inventory/InventoryMenu.java b/src/main/java/net/minecraft/world/inventory/InventoryMenu.java -index 9af1da3858d6cf79b8bfaf99dde1370ccc50d023..45eec732ff0e4e78b4d3f2112b6a79d7ae668d2f 100644 +index 9af1da3858d6cf79b8bfaf99dde1370ccc50d023..1acb41fab25bdbc4109913b111dbe3b0e106af3f 100644 --- a/src/main/java/net/minecraft/world/inventory/InventoryMenu.java +++ b/src/main/java/net/minecraft/world/inventory/InventoryMenu.java -@@ -4,6 +4,7 @@ import com.mojang.datafixers.util.Pair; - import net.minecraft.network.chat.Component; - import net.minecraft.resources.ResourceLocation; - import net.minecraft.world.Container; -+import net.minecraft.world.effect.MobEffects; - import net.minecraft.world.entity.EquipmentSlot; - import net.minecraft.world.entity.Mob; - import net.minecraft.world.entity.player.Inventory; -@@ -95,7 +96,7 @@ public class InventoryMenu extends RecipeBookMenu { +@@ -95,7 +95,7 @@ public class InventoryMenu extends RecipeBookMenu { public boolean mayPickup(Player playerEntity) { ItemStack itemstack = this.getItem(); - return !itemstack.isEmpty() && !playerEntity.isCreative() && EnchantmentHelper.hasBindingCurse(itemstack) ? false : super.mayPickup(playerEntity); -+ return !itemstack.isEmpty() && !playerEntity.isCreative() && EnchantmentHelper.hasBindingCurse(itemstack) ? playerEntity.level().purpurConfig.playerRemoveBindingWithWeakness && playerEntity.hasEffect(MobEffects.WEAKNESS) : super.mayPickup(playerEntity); // Purpur ++ return !itemstack.isEmpty() && !playerEntity.isCreative() && EnchantmentHelper.hasBindingCurse(itemstack) ? playerEntity.level().purpurConfig.playerRemoveBindingWithWeakness && playerEntity.hasEffect(net.minecraft.world.effect.MobEffects.WEAKNESS) : super.mayPickup(playerEntity); // Purpur } @Override @@ -13912,58 +13869,33 @@ 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 18898e16ec42f6b694b06e09d9174b60d62450d7..20f33b77b4a9494be227456bc742a029eb0af59b 100644 +index 2e75fd06e9e379eb95ebfe55086ffc327706ab2f..2918b1aca8fae6a319881a631dc727b6d375a33c 100644 --- a/src/main/java/net/minecraft/world/item/AxeItem.java +++ b/src/main/java/net/minecraft/world/item/AxeItem.java -@@ -33,29 +33,32 @@ public class AxeItem extends DiggerItem { +@@ -33,13 +33,15 @@ public class AxeItem extends DiggerItem { + Level level = context.getLevel(); BlockPos blockPos = context.getClickedPos(); Player player = context.getPlayer(); - BlockState blockState = level.getBlockState(blockPos); -- Optional optional = this.getStripped(blockState); -- Optional optional2 = WeatheringCopper.getPrevious(blockState); -- Optional optional3 = Optional.ofNullable(HoneycombItem.WAX_OFF_BY_BLOCK.get().get(blockState.getBlock())).map((block) -> { -- return block.withPropertiesOf(blockState); -- }); -+ // Purpur start -+ Block clickedBlock = level.getBlockState(blockPos).getBlock(); -+ Optional optional = Optional.ofNullable(level.purpurConfig.axeStrippables.get(blockState.getBlock())); -+ Optional optional2 = Optional.ofNullable(level.purpurConfig.axeWeatherables.get(blockState.getBlock())); -+ Optional optional3 = Optional.ofNullable(level.purpurConfig.axeWaxables.get(blockState.getBlock())); -+ // Purpur end - ItemStack itemStack = context.getItemInHand(); -- Optional optional4 = Optional.empty(); -+ Optional optional4 = Optional.empty(); // Purpur - if (optional.isPresent()) { -- level.playSound(player, blockPos, SoundEvents.AXE_STRIP, SoundSource.BLOCKS, 1.0F, 1.0F); -+ if (!STRIPPABLES.containsKey(clickedBlock)) level.playSound(null, blockPos, SoundEvents.AXE_STRIP, SoundSource.BLOCKS, 1.0F, 1.0F); // Purpur - force sound - optional4 = optional; - } else if (optional2.isPresent()) { -- level.playSound(player, blockPos, SoundEvents.AXE_SCRAPE, SoundSource.BLOCKS, 1.0F, 1.0F); -+ if (!HoneycombItem.WAXABLES.get().containsKey(clickedBlock)) level.playSound(null, blockPos, SoundEvents.AXE_SCRAPE, SoundSource.BLOCKS, 1.0F, 1.0F); // Purpur - force sound - level.levelEvent(player, 3005, blockPos, 0); - optional4 = optional2; - } else if (optional3.isPresent()) { -- level.playSound(player, blockPos, SoundEvents.AXE_WAX_OFF, SoundSource.BLOCKS, 1.0F, 1.0F); -+ if (!HoneycombItem.WAX_OFF_BY_BLOCK.get().containsKey(clickedBlock)) level.playSound(null, blockPos, SoundEvents.AXE_WAX_OFF, SoundSource.BLOCKS, 1.0F, 1.0F); // Purpur - force sound - level.levelEvent(player, 3004, blockPos, 0); - optional4 = optional3; - } - - if (optional4.isPresent()) { -+ org.purpurmc.purpur.tool.Actionable actionable = optional4.get(); // Purpur -+ BlockState state = actionable.into().withPropertiesOf(blockState); // Purpur +- Optional optional = this.evaluateNewBlockState(level, blockPos, player, level.getBlockState(blockPos)); ++ Optional optional = this.evaluateActionable(level, blockPos, player, level.getBlockState(blockPos)); // Purpur + if (optional.isEmpty()) { + return InteractionResult.PASS; + } else { ++ org.purpurmc.purpur.tool.Actionable actionable = optional.get(); // Purpur ++ BlockState state = actionable.into().withPropertiesOf(level.getBlockState(blockPos)); // Purpur + ItemStack itemStack = context.getItemInHand(); // Paper start - EntityChangeBlockEvent -- if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(player, blockPos, optional4.get())) { +- if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(player, blockPos, optional.get())) { + if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(player, blockPos, state)) { // Purpur return InteractionResult.PASS; } // Paper end -@@ -63,15 +66,22 @@ public class AxeItem extends DiggerItem { +@@ -47,35 +49,40 @@ public class AxeItem extends DiggerItem { CriteriaTriggers.ITEM_USED_ON_BLOCK.trigger((ServerPlayer)player, blockPos, itemStack); } -- level.setBlock(blockPos, optional4.get(), 11); -- level.gameEvent(GameEvent.BLOCK_CHANGE, blockPos, GameEvent.Context.of(player, optional4.get())); +- level.setBlock(blockPos, optional.get(), 11); +- level.gameEvent(GameEvent.BLOCK_CHANGE, blockPos, GameEvent.Context.of(player, optional.get())); + // Purpur start + level.setBlock(blockPos, state, 11); + actionable.drops().forEach((drop, chance) -> { @@ -13981,9 +13913,36 @@ index 18898e16ec42f6b694b06e09d9174b60d62450d7..20f33b77b4a9494be227456bc742a029 - return InteractionResult.sidedSuccess(level.isClientSide); + return InteractionResult.SUCCESS; // Purpur - force arm swing - } else { - return InteractionResult.PASS; } + } + +- private Optional evaluateNewBlockState(Level world, BlockPos pos, @Nullable Player player, BlockState state) { +- Optional optional = this.getStripped(state); ++ private Optional evaluateActionable(Level world, BlockPos pos, @Nullable Player player, BlockState state) { // Purpur ++ Optional optional = Optional.ofNullable(world.purpurConfig.axeStrippables.get(state.getBlock())); // Purpur + if (optional.isPresent()) { +- world.playSound(player, pos, SoundEvents.AXE_STRIP, SoundSource.BLOCKS, 1.0F, 1.0F); ++ world.playSound(STRIPPABLES.containsKey(state.getBlock()) ? player : null, pos, SoundEvents.AXE_STRIP, SoundSource.BLOCKS, 1.0F, 1.0F); // Purpur - force sound + return optional; + } else { +- Optional optional2 = WeatheringCopper.getPrevious(state); ++ Optional optional2 = Optional.ofNullable(world.purpurConfig.axeWeatherables.get(state.getBlock())); // Purpur + if (optional2.isPresent()) { +- world.playSound(player, pos, SoundEvents.AXE_SCRAPE, SoundSource.BLOCKS, 1.0F, 1.0F); ++ world.playSound(WeatheringCopper.getPrevious(state).isPresent() ? player : null, pos, SoundEvents.AXE_SCRAPE, SoundSource.BLOCKS, 1.0F, 1.0F); // Purpur - force sound + 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 + 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 + world.levelEvent(player, 3004, pos, 0); + return optional3; + } else { diff --git a/src/main/java/net/minecraft/world/item/BlockItem.java b/src/main/java/net/minecraft/world/item/BlockItem.java index efdf56044396b4ce486948d2c993971f99174a5e..42bfde8e36b6395f50973300313d6959e2735327 100644 --- a/src/main/java/net/minecraft/world/item/BlockItem.java @@ -14024,10 +13983,10 @@ index efdf56044396b4ce486948d2c993971f99174a5e..42bfde8e36b6395f50973300313d6959 CompoundTag nbttagcompound = BlockItem.getBlockEntityData(itemstack); diff --git a/src/main/java/net/minecraft/world/item/BoatItem.java b/src/main/java/net/minecraft/world/item/BoatItem.java -index aec7ac31a35b1cc81f40b3fbeb5cf95c0f2c8a6c..cbcd35e60a2c344c83978abf0b94c2120ff53dee 100644 +index 67a5a201d0b26ca7b27e6d0c3ffb9f8b6e16bce0..ec3d60b561de45349b705b7f14592be930af4b91 100644 --- a/src/main/java/net/minecraft/world/item/BoatItem.java +++ b/src/main/java/net/minecraft/world/item/BoatItem.java -@@ -69,6 +69,11 @@ public class BoatItem extends Item { +@@ -71,6 +71,11 @@ public class BoatItem extends Item { entityboat.setVariant(this.type); entityboat.setYRot(user.getYRot()); @@ -14310,10 +14269,10 @@ index 180aec596110309aade13d2080f8824d152b07cb..552c31c0f3746dd35388395036e70a92 return InteractionResult.PASS; } diff --git a/src/main/java/net/minecraft/world/item/ItemStack.java b/src/main/java/net/minecraft/world/item/ItemStack.java -index 8526df6a7112a8c1b541b341ab9e7dd3b8f53697..97b1852003450fd57bc7971ca5003508f4eb71cc 100644 +index 3c4919412fd995a6f00abe912e138b726392b88a..469d8ba7effb92cb9c6bfbc329daaec3e3fcea18 100644 --- a/src/main/java/net/minecraft/world/item/ItemStack.java +++ b/src/main/java/net/minecraft/world/item/ItemStack.java -@@ -432,6 +432,7 @@ public final class ItemStack { +@@ -453,6 +453,7 @@ public final class ItemStack { world.preventPoiUpdated = true; // CraftBukkit - SPIGOT-5710 for (BlockState blockstate : blocks) { blockstate.update(true, false); @@ -14321,7 +14280,7 @@ index 8526df6a7112a8c1b541b341ab9e7dd3b8f53697..97b1852003450fd57bc7971ca5003508 } world.preventPoiUpdated = false; -@@ -463,6 +464,7 @@ public final class ItemStack { +@@ -484,6 +485,7 @@ public final class ItemStack { if (!(block.getBlock() instanceof BaseEntityBlock)) { // Containers get placed automatically block.getBlock().onPlace(block, world, newblockposition, oldBlock, true, context); // Paper - pass context } @@ -14329,7 +14288,7 @@ index 8526df6a7112a8c1b541b341ab9e7dd3b8f53697..97b1852003450fd57bc7971ca5003508 world.notifyAndUpdatePhysics(newblockposition, null, oldBlock, block, world.getBlockState(newblockposition), updateFlag, 512); // send null chunk as chunk.k() returns false by this point } -@@ -591,6 +593,16 @@ public final class ItemStack { +@@ -612,6 +614,16 @@ public final class ItemStack { return this.isDamageableItem() && this.getDamageValue() > 0; } @@ -14346,7 +14305,7 @@ index 8526df6a7112a8c1b541b341ab9e7dd3b8f53697..97b1852003450fd57bc7971ca5003508 public int getDamageValue() { return this.tag == null ? 0 : this.tag.getInt("Damage"); } -@@ -610,7 +622,7 @@ public final class ItemStack { +@@ -631,7 +643,7 @@ public final class ItemStack { int j; if (amount > 0) { @@ -14355,7 +14314,7 @@ index 8526df6a7112a8c1b541b341ab9e7dd3b8f53697..97b1852003450fd57bc7971ca5003508 int k = 0; for (int l = 0; j > 0 && l < amount; ++l) { -@@ -665,6 +677,12 @@ public final class ItemStack { +@@ -686,6 +698,12 @@ public final class ItemStack { if (this.hurt(amount, entity.getRandom(), entity /*instanceof ServerPlayer ? (ServerPlayer) entity : null*/)) { // Paper - pass LivingEntity for EntityItemDamageEvent breakCallback.accept(entity); Item item = this.getItem(); @@ -14368,7 +14327,7 @@ index 8526df6a7112a8c1b541b341ab9e7dd3b8f53697..97b1852003450fd57bc7971ca5003508 // CraftBukkit start - Check for item breaking if (this.count == 1 && entity instanceof net.minecraft.world.entity.player.Player) { org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerItemBreakEvent((net.minecraft.world.entity.player.Player) entity, this); -@@ -1191,7 +1209,7 @@ public final class ItemStack { +@@ -1216,7 +1234,7 @@ public final class ItemStack { ListTag nbttaglist = this.tag.getList("Enchantments", 10); @@ -14377,7 +14336,7 @@ index 8526df6a7112a8c1b541b341ab9e7dd3b8f53697..97b1852003450fd57bc7971ca5003508 processEnchantOrder(this.tag); // Paper } -@@ -1199,6 +1217,12 @@ public final class ItemStack { +@@ -1224,6 +1242,12 @@ public final class ItemStack { return this.tag != null && this.tag.contains("Enchantments", 9) ? !this.tag.getList("Enchantments", 10).isEmpty() : false; } @@ -14391,10 +14350,10 @@ index 8526df6a7112a8c1b541b341ab9e7dd3b8f53697..97b1852003450fd57bc7971ca5003508 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 5f20e075c532f0f1d413242949d1738c0c152bf7..5fbb13ebef0ca66419f3e5006d19e4a5918a038a 100644 +index f692149d91b525bda6dc79d489d7496ea24037e8..cf68dca4096556b0c2594c76fcf113419e56dae0 100644 --- a/src/main/java/net/minecraft/world/item/Items.java +++ b/src/main/java/net/minecraft/world/item/Items.java -@@ -294,7 +294,7 @@ public class Items { +@@ -316,7 +316,7 @@ public class Items { public static final Item PURPUR_BLOCK = registerBlock(Blocks.PURPUR_BLOCK); public static final Item PURPUR_PILLAR = registerBlock(Blocks.PURPUR_PILLAR); public static final Item PURPUR_STAIRS = registerBlock(Blocks.PURPUR_STAIRS); @@ -14403,7 +14362,7 @@ index 5f20e075c532f0f1d413242949d1738c0c152bf7..5fbb13ebef0ca66419f3e5006d19e4a5 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); -@@ -1184,7 +1184,7 @@ public class Items { +@@ -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))); @@ -14412,7 +14371,7 @@ index 5f20e075c532f0f1d413242949d1738c0c152bf7..5fbb13ebef0ca66419f3e5006d19e4a5 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); -@@ -1309,6 +1309,13 @@ public class Items { +@@ -1367,6 +1367,13 @@ public class Items { ((BlockItem)item).registerBlocks(Item.BY_BLOCK, item); } @@ -14427,10 +14386,10 @@ index 5f20e075c532f0f1d413242949d1738c0c152bf7..5fbb13ebef0ca66419f3e5006d19e4a5 } } diff --git a/src/main/java/net/minecraft/world/item/MapItem.java b/src/main/java/net/minecraft/world/item/MapItem.java -index c368b437597edf7e165326727ae778a69c3fcc83..fed5bfb02ab7d6c1d1d9bf993fda5b3f411b9352 100644 +index 797415866a7f182d804f6b8e57ceb07a6ac2a20a..6cfd169c2c32b644d70907358c2d4a2087c00a68 100644 --- a/src/main/java/net/minecraft/world/item/MapItem.java +++ b/src/main/java/net/minecraft/world/item/MapItem.java -@@ -243,6 +243,7 @@ public class MapItem extends ComplexItem { +@@ -235,6 +235,7 @@ public class MapItem extends ComplexItem { MapItemSavedData worldmap = MapItem.getSavedData(map, world); if (worldmap != null) { @@ -14462,10 +14421,10 @@ index f33977d95b6db473be4f95075ba99caf90ad0220..56dc04d8875971ee9a5d077a695509af return stack.isEmpty() ? new ItemStack(Items.BUCKET) : stack; diff --git a/src/main/java/net/minecraft/world/item/MinecartItem.java b/src/main/java/net/minecraft/world/item/MinecartItem.java -index a33395dc5a94d89b5ab273c7832813b6ff9ea3b7..2b2218e2de535ebc8f529f5b5bf98fa1ef819a5e 100644 +index 3aa73cd44aa8c86b78c35bc1788e4f83018c49ed..66a8b28275619079e3bcbcc460146976d533d54e 100644 --- a/src/main/java/net/minecraft/world/item/MinecartItem.java +++ b/src/main/java/net/minecraft/world/item/MinecartItem.java -@@ -122,8 +122,9 @@ public class MinecartItem extends Item { +@@ -119,8 +119,9 @@ public class MinecartItem extends Item { BlockState iblockdata = world.getBlockState(blockposition); if (!iblockdata.is(BlockTags.RAILS)) { @@ -14476,8 +14435,8 @@ index a33395dc5a94d89b5ab273c7832813b6ff9ea3b7..2b2218e2de535ebc8f529f5b5bf98fa1 + } // else { // Purpur - place minecarts anywhere ItemStack itemstack = context.getItemInHand(); - if (!world.isClientSide) { -@@ -151,6 +152,6 @@ public class MinecartItem extends Item { + if (world instanceof ServerLevel) { +@@ -145,6 +146,6 @@ public class MinecartItem extends Item { itemstack.shrink(1); return InteractionResult.sidedSuccess(world.isClientSide); @@ -14540,25 +14499,26 @@ index ef3f90a5bcdd7b9815a4053cff166f9d2552f55d..e7e5e1cc92f56e3daba8fa09c59188fe com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent((org.bukkit.entity.Player) user.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemstack), (org.bukkit.entity.Projectile) entitysnowball.getBukkitEntity()); if (event.callEvent() && world.addFreshEntity(entitysnowball)) { diff --git a/src/main/java/net/minecraft/world/item/SpawnEggItem.java b/src/main/java/net/minecraft/world/item/SpawnEggItem.java -index 741719301e6fc91a598e74342810c4185e6fde26..6fbff9c02fbabf03c9c649a9ea6128021081f9cd 100644 +index 4f10f801dc126e9135432939b6663770c0e7a0bc..4249d8c8795c188f56da3bce00166f2e1aa46067 100644 --- a/src/main/java/net/minecraft/world/item/SpawnEggItem.java +++ b/src/main/java/net/minecraft/world/item/SpawnEggItem.java -@@ -68,6 +68,15 @@ public class SpawnEggItem extends Item { - SpawnerBlockEntity tileentitymobspawner = (SpawnerBlockEntity) tileentity; - EntityType entitytypes = this.getType(itemstack.getTag()); +@@ -68,6 +68,16 @@ public class SpawnEggItem extends Item { + Spawner spawner = (Spawner) tileentity; -+ // Purpur start -+ org.bukkit.block.Block bukkitBlock = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); -+ org.purpurmc.purpur.event.PlayerSetSpawnerTypeWithEggEvent event = new org.purpurmc.purpur.event.PlayerSetSpawnerTypeWithEggEvent((org.bukkit.entity.Player) context.getPlayer().getBukkitEntity(), bukkitBlock, (org.bukkit.block.CreatureSpawner) bukkitBlock.getState(), org.bukkit.entity.EntityType.fromName(entitytypes.getName())); -+ if (!event.callEvent()) { -+ return InteractionResult.FAIL; -+ } -+ entitytypes = EntityType.getFromBukkitType(event.getEntityType()); -+ // Purpur end + entitytypes = this.getType(itemstack.getTag()); + - tileentitymobspawner.setEntityId(entitytypes, world.getRandom()); - tileentity.setChanged(); - world.sendBlockUpdated(blockposition, iblockdata, iblockdata, 3); ++ // Purpur start ++ org.bukkit.block.Block bukkitBlock = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ org.purpurmc.purpur.event.PlayerSetSpawnerTypeWithEggEvent event = new org.purpurmc.purpur.event.PlayerSetSpawnerTypeWithEggEvent((org.bukkit.entity.Player) context.getPlayer().getBukkitEntity(), bukkitBlock, (org.bukkit.block.CreatureSpawner) bukkitBlock.getState(), org.bukkit.entity.EntityType.fromName(entitytypes.getName())); ++ if (!event.callEvent()) { ++ return InteractionResult.FAIL; ++ } ++ entitytypes = EntityType.getFromBukkitType(event.getEntityType()); ++ // Purpur end ++ + spawner.setEntityId(entitytypes, world.getRandom()); + world.sendBlockUpdated(blockposition, iblockdata, iblockdata, 3); + world.gameEvent((Entity) context.getPlayer(), GameEvent.BLOCK_CHANGE, blockposition); diff --git a/src/main/java/net/minecraft/world/item/ThrowablePotionItem.java b/src/main/java/net/minecraft/world/item/ThrowablePotionItem.java index de5bdceb4c8578fb972a2fd5ee0dfdae509e46dc..bcf63ccb6e679cb97d658780b2663aafa3568bcb 100644 --- a/src/main/java/net/minecraft/world/item/ThrowablePotionItem.java @@ -14573,7 +14533,7 @@ index de5bdceb4c8578fb972a2fd5ee0dfdae509e46dc..bcf63ccb6e679cb97d658780b2663aaf 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 8078f127ff4b6e0aafb5804b9c02e237f79445b5..c32cbe6065ecb6810f352b8a3598c21e42e60e1d 100644 +index 5fab851b319847035fb1eefd0ab999de3ccc2cd8..ec5daeef857fdad6c7659130fb42f52cf6eb491f 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 { @@ -14597,7 +14557,7 @@ index 8078f127ff4b6e0aafb5804b9c02e237f79445b5..c32cbe6065ecb6810f352b8a3598c21e // CraftBukkit start // Paper start 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()); -@@ -130,6 +138,14 @@ public class TridentItem extends Item implements Vanishable { +@@ -131,6 +139,14 @@ public class TridentItem extends Item implements Vanishable { f2 *= f6 / f5; f3 *= f6 / f5; f4 *= f6 / f5; @@ -14613,10 +14573,10 @@ index 8078f127ff4b6e0aafb5804b9c02e237f79445b5..c32cbe6065ecb6810f352b8a3598c21e entityhuman.startAutoSpinAttack(20); if (entityhuman.onGround()) { diff --git a/src/main/java/net/minecraft/world/item/crafting/Ingredient.java b/src/main/java/net/minecraft/world/item/crafting/Ingredient.java -index 06fe5b056d78d42cdf78437eeabe1786d596b7f8..3532db21cee82c18f95c540d24b2071585d71c4e 100644 +index 7c29750e534eae4266bf7a63c50e3827401d6569..e8e9a3370ba07dc0ca47c8352f6f04a449f2268f 100644 --- a/src/main/java/net/minecraft/world/item/crafting/Ingredient.java +++ b/src/main/java/net/minecraft/world/item/crafting/Ingredient.java -@@ -39,6 +39,7 @@ public final class Ingredient implements Predicate { +@@ -36,6 +36,7 @@ public final class Ingredient implements Predicate { @Nullable private IntList stackingIds; public boolean exact; // CraftBukkit @@ -14624,7 +14584,7 @@ index 06fe5b056d78d42cdf78437eeabe1786d596b7f8..3532db21cee82c18f95c540d24b20715 public static final Codec CODEC = Ingredient.codec(true); public static final Codec CODEC_NONEMPTY = Ingredient.codec(false); -@@ -70,6 +71,12 @@ public final class Ingredient implements Predicate { +@@ -67,6 +68,12 @@ public final class Ingredient implements Predicate { } else if (this.isEmpty()) { return itemstack.isEmpty(); } else { @@ -14770,10 +14730,10 @@ index 4f7457578ab3118d10e0d5dfc23d79c9b20c2f44..e03ce53b93d1b9366f2a7f14f341750a public ItemStack assemble() { diff --git a/src/main/java/net/minecraft/world/level/BaseSpawner.java b/src/main/java/net/minecraft/world/level/BaseSpawner.java -index 6eca4a9b3cf462a4d18f32619bbcdfda0fa2ebc5..914564a528c360f352927e7681ab2e31ed365b21 100644 +index d88a23984dcea9c2119bdc245013af8b25448da3..075b4ac21707bd0b3ad2197c59359f8d33bae486 100644 --- a/src/main/java/net/minecraft/world/level/BaseSpawner.java +++ b/src/main/java/net/minecraft/world/level/BaseSpawner.java -@@ -71,6 +71,7 @@ public abstract class BaseSpawner { +@@ -57,6 +57,7 @@ public abstract class BaseSpawner { } public boolean isNearPlayer(Level world, BlockPos pos) { @@ -14795,10 +14755,10 @@ index aaa07fcd4b32fe0de88142ab30378327a01f1729..bc8555d21d418f9da37cc089904f7cb0 if (range < 0.0D || d < range * range) { return true; diff --git a/src/main/java/net/minecraft/world/level/Explosion.java b/src/main/java/net/minecraft/world/level/Explosion.java -index a12bf8dec7a5e2bfcdb399e6631ee4d447f564ae..d3c20e4ae510028d25a05915e4662b03e6d0b128 100644 +index ee76770b4f0cfadd2f7953c1328a2b6144379742..7bd894f302df5d900b15f2573305ae5082502ad0 100644 --- a/src/main/java/net/minecraft/world/level/Explosion.java +++ b/src/main/java/net/minecraft/world/level/Explosion.java -@@ -87,7 +87,7 @@ public class Explosion { +@@ -97,7 +97,7 @@ public class Explosion { this.hitPlayers = Maps.newHashMap(); this.level = world; this.source = entity; @@ -14807,7 +14767,7 @@ index a12bf8dec7a5e2bfcdb399e6631ee4d447f564ae..d3c20e4ae510028d25a05915e4662b03 this.x = x; this.y = y; this.z = z; -@@ -403,10 +403,27 @@ public class Explosion { +@@ -425,10 +425,27 @@ public class Explosion { public void explode() { // CraftBukkit start @@ -14837,10 +14797,10 @@ index a12bf8dec7a5e2bfcdb399e6631ee4d447f564ae..d3c20e4ae510028d25a05915e4662b03 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 4ddf4ad2cdf44841e1ca67a9ba1cce926f92bc6d..c694b9a10815031631905f8d72c09d3ff5305c0e 100644 +index d2a4e3326939c3c6dde7aba091d92ee84731d394..e79dbebe298289dcd63f03ebcc15dd409bfbf220 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 { +@@ -178,6 +178,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { // Gale end - Gale configuration public final com.destroystokyo.paper.antixray.ChunkPacketBlockController chunkPacketBlockController; // Paper - Anti-Xray @@ -14848,7 +14808,7 @@ index 4ddf4ad2cdf44841e1ca67a9ba1cce926f92bc6d..c694b9a10815031631905f8d72c09d3f public final co.aikar.timings.WorldTimingsHandler timings; // Paper public static BlockPos lastPhysicsProblem; // Spigot private org.spigotmc.TickLimiter entityLimiter; -@@ -194,6 +195,49 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -197,6 +198,49 @@ public abstract class Level implements LevelAccessor, AutoCloseable { } // Paper end - fix and optimise world upgrading @@ -14898,7 +14858,7 @@ index 4ddf4ad2cdf44841e1ca67a9ba1cce926f92bc6d..c694b9a10815031631905f8d72c09d3f public CraftWorld getWorld() { return this.world; } -@@ -224,6 +268,8 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -227,6 +271,8 @@ public abstract class Level implements LevelAccessor, AutoCloseable { this.spigotConfig = new org.spigotmc.SpigotWorldConfig(((net.minecraft.world.level.storage.PrimaryLevelData) worlddatamutable).getLevelName()); // Spigot this.paperConfig = paperWorldConfigCreator.apply(this.spigotConfig); // Paper this.galeConfig = galeWorldConfigCreator.apply(this.spigotConfig); // Gale - Gale configuration @@ -14907,7 +14867,7 @@ index 4ddf4ad2cdf44841e1ca67a9ba1cce926f92bc6d..c694b9a10815031631905f8d72c09d3f this.generator = gen; this.world = new CraftWorld((ServerLevel) this, gen, biomeProvider, env); -@@ -1889,4 +1935,14 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -1909,4 +1955,14 @@ public abstract class Level implements LevelAccessor, AutoCloseable { } } // Paper end - notify observers even if grow failed @@ -14936,10 +14896,10 @@ index 61829217fa49a4671e549a4462c73a3c7cc557ef..530c5e3500bd735bbd41d6c973d7470c 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 5c5a3b169795bf8a527b316c666cbc2105c66622..020afeca950d2c7fb6c7b179d424548fd90f8b0d 100644 +index 9fca247f51e8b4d445f61ab5c16faf3928626deb..583bb1282fedcab75dbe4359a9f53b76a538d903 100644 --- a/src/main/java/net/minecraft/world/level/block/AnvilBlock.java +++ b/src/main/java/net/minecraft/world/level/block/AnvilBlock.java -@@ -55,6 +55,54 @@ public class AnvilBlock extends FallingBlock { +@@ -62,6 +62,54 @@ public class AnvilBlock extends FallingBlock { @Override public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { @@ -14995,10 +14955,10 @@ index 5c5a3b169795bf8a527b316c666cbc2105c66622..020afeca950d2c7fb6c7b179d424548f 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 087f3b3cc180e16195efdc0b402701fd9f5d78b4..aa4e13f1c77f10221128569483497668cd2eb7d3 100644 +index 3ecc92439fc85d224ff52f41c5e34079e042a5e6..2336fea8c65d64a77a1afa4b8b976fb0d7da00eb 100644 --- a/src/main/java/net/minecraft/world/level/block/AzaleaBlock.java +++ b/src/main/java/net/minecraft/world/level/block/AzaleaBlock.java -@@ -43,6 +43,20 @@ public class AzaleaBlock extends BushBlock implements BonemealableBlock { +@@ -49,6 +49,20 @@ public class AzaleaBlock extends BushBlock implements BonemealableBlock { @Override public void performBonemeal(ServerLevel world, RandomSource random, BlockPos pos, BlockState state) { @@ -15016,14 +14976,14 @@ index 087f3b3cc180e16195efdc0b402701fd9f5d78b4..aa4e13f1c77f10221128569483497668 + + private void growTree(ServerLevel world, RandomSource random, BlockPos pos, net.minecraft.world.level.block.state.BlockState state) { + // Purpur end - TREE_GROWER.growTree(world, world.getChunkSource().getGenerator(), pos, state, random); + TreeGrower.AZALEA.growTree(world, world.getChunkSource().getGenerator(), pos, state, random); } 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 3d2b34c5a7c9b00c1164b4f89c2cbff81fc460eb..b5505e926e5cdb447de68e8eb8e46c97eb988e27 100644 +index 2a65c7b859b1126dbac9819a01ca2652e20498a9..3192edee23b899107b17e354ddfb3159ac2ef429 100644 --- a/src/main/java/net/minecraft/world/level/block/BaseCoralPlantTypeBlock.java +++ b/src/main/java/net/minecraft/world/level/block/BaseCoralPlantTypeBlock.java -@@ -35,6 +35,7 @@ public class BaseCoralPlantTypeBlock extends Block implements SimpleWaterloggedB +@@ -39,6 +39,7 @@ public abstract class BaseCoralPlantTypeBlock extends Block implements SimpleWat } protected static boolean scanForWater(BlockState state, BlockGetter world, BlockPos pos) { @@ -15032,10 +14992,10 @@ index 3d2b34c5a7c9b00c1164b4f89c2cbff81fc460eb..b5505e926e5cdb447de68e8eb8e46c97 return true; } else { diff --git a/src/main/java/net/minecraft/world/level/block/BedBlock.java b/src/main/java/net/minecraft/world/level/block/BedBlock.java -index d40500f9a807cab0b2fb6fa9032f33f4fb74c895..2b66ddafaaca17f64d1e7502dfa4d7576e3e032f 100644 +index 04b1aa22ac1df39d274f27d9c93e0492a8a673f8..8c6a8ab9e18bfbb015febea55e188ee9882ec5dc 100644 --- a/src/main/java/net/minecraft/world/level/block/BedBlock.java +++ b/src/main/java/net/minecraft/world/level/block/BedBlock.java -@@ -96,7 +96,7 @@ public class BedBlock extends HorizontalDirectionalBlock implements EntityBlock +@@ -106,7 +106,7 @@ public class BedBlock extends HorizontalDirectionalBlock implements EntityBlock Vec3 vec3d = pos.getCenter(); @@ -15044,7 +15004,7 @@ index d40500f9a807cab0b2fb6fa9032f33f4fb74c895..2b66ddafaaca17f64d1e7502dfa4d757 return InteractionResult.SUCCESS; } else if ((Boolean) state.getValue(BedBlock.OCCUPIED)) { if (!BedBlock.canSetSpawn(world)) return this.explodeBed(state, world, pos); // Paper - check explode first -@@ -149,7 +149,7 @@ public class BedBlock extends HorizontalDirectionalBlock implements EntityBlock +@@ -159,7 +159,7 @@ public class BedBlock extends HorizontalDirectionalBlock implements EntityBlock Vec3 vec3d = blockposition.getCenter(); @@ -15053,7 +15013,7 @@ index d40500f9a807cab0b2fb6fa9032f33f4fb74c895..2b66ddafaaca17f64d1e7502dfa4d757 return InteractionResult.SUCCESS; } } -@@ -173,7 +173,7 @@ public class BedBlock extends HorizontalDirectionalBlock implements EntityBlock +@@ -183,7 +183,7 @@ public class BedBlock extends HorizontalDirectionalBlock implements EntityBlock @Override public void fallOn(Level world, BlockState state, BlockPos pos, Entity entity, float fallDistance) { @@ -15063,10 +15023,10 @@ index d40500f9a807cab0b2fb6fa9032f33f4fb74c895..2b66ddafaaca17f64d1e7502dfa4d757 @Override diff --git a/src/main/java/net/minecraft/world/level/block/BigDripleafBlock.java b/src/main/java/net/minecraft/world/level/block/BigDripleafBlock.java -index 54cf35b0c48d96ecfb27ff13cd685c16a1cd616b..1822ea0c72cc1685aab86a44f75c791bc5c595fa 100644 +index 8e4a6a1188b2ce2825dc5750505212c72efb5c7b..c7f78ccb228d261984ac360f2ca6ae9478786184 100644 --- a/src/main/java/net/minecraft/world/level/block/BigDripleafBlock.java +++ b/src/main/java/net/minecraft/world/level/block/BigDripleafBlock.java -@@ -236,7 +236,7 @@ public class BigDripleafBlock extends HorizontalDirectionalBlock implements Bone +@@ -243,7 +243,7 @@ public class BigDripleafBlock extends HorizontalDirectionalBlock implements Bone BigDripleafBlock.playTiltSound(world, blockposition, soundeffect); } @@ -15076,10 +15036,10 @@ index 54cf35b0c48d96ecfb27ff13cd685c16a1cd616b..1822ea0c72cc1685aab86a44f75c791b if (i != -1) { world.scheduleTick(blockposition, (Block) this, i); diff --git a/src/main/java/net/minecraft/world/level/block/Block.java b/src/main/java/net/minecraft/world/level/block/Block.java -index 8f237fa0afb9f8d8fcded1a017342ecacd10bcf2..bcc15bae4d737f54781779d46635c0d498ac81be 100644 +index 2ccfb0456cbc42e79bbab49f0c01443ce1560d3a..27879468851875f9d9e7eb28f47ad36d36fd7475 100644 --- a/src/main/java/net/minecraft/world/level/block/Block.java +++ b/src/main/java/net/minecraft/world/level/block/Block.java -@@ -62,6 +62,13 @@ import net.minecraft.world.phys.shapes.Shapes; +@@ -63,6 +63,13 @@ import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; import org.slf4j.Logger; @@ -15092,8 +15052,8 @@ index 8f237fa0afb9f8d8fcded1a017342ecacd10bcf2..bcc15bae4d737f54781779d46635c0d4 + public class Block extends BlockBehaviour implements ItemLike { - private static final Logger LOGGER = LogUtils.getLogger(); -@@ -87,6 +94,10 @@ public class Block extends BlockBehaviour implements ItemLike { + public static final MapCodec CODEC = simpleCodec(Block::new); +@@ -89,6 +96,10 @@ public class Block extends BlockBehaviour implements ItemLike { public static final int UPDATE_LIMIT = 512; protected final StateDefinition stateDefinition; private BlockState defaultBlockState; @@ -15104,7 +15064,7 @@ index 8f237fa0afb9f8d8fcded1a017342ecacd10bcf2..bcc15bae4d737f54781779d46635c0d4 // Paper start public final boolean isDestroyable() { return io.papermc.paper.configuration.GlobalConfiguration.get().unsupportedSettings.allowPermanentBlockBreakExploits || -@@ -313,7 +324,7 @@ public class Block extends BlockBehaviour implements ItemLike { +@@ -320,7 +331,7 @@ public class Block extends BlockBehaviour implements ItemLike { public static void dropResources(BlockState state, LevelAccessor world, BlockPos pos, @Nullable BlockEntity blockEntity) { if (world instanceof ServerLevel) { Block.getDrops(state, (ServerLevel) world, pos, blockEntity).forEach((itemstack) -> { @@ -15113,7 +15073,7 @@ index 8f237fa0afb9f8d8fcded1a017342ecacd10bcf2..bcc15bae4d737f54781779d46635c0d4 }); state.spawnAfterBreak((ServerLevel) world, pos, ItemStack.EMPTY, true); } -@@ -329,7 +340,7 @@ public class Block extends BlockBehaviour implements ItemLike { +@@ -336,7 +347,7 @@ public class Block extends BlockBehaviour implements ItemLike { io.papermc.paper.event.block.BlockBreakBlockEvent event = new io.papermc.paper.event.block.BlockBreakBlockEvent(org.bukkit.craftbukkit.block.CraftBlock.at(world, pos), org.bukkit.craftbukkit.block.CraftBlock.at(world, source), items); event.callEvent(); for (var drop : event.getDrops()) { @@ -15122,7 +15082,7 @@ index 8f237fa0afb9f8d8fcded1a017342ecacd10bcf2..bcc15bae4d737f54781779d46635c0d4 } state.spawnAfterBreak(world.getMinecraftWorld(), pos, ItemStack.EMPTY, true); } -@@ -340,13 +351,53 @@ public class Block extends BlockBehaviour implements ItemLike { +@@ -347,13 +358,53 @@ public class Block extends BlockBehaviour implements ItemLike { public static void dropResources(BlockState state, Level world, BlockPos pos, @Nullable BlockEntity blockEntity, @Nullable Entity entity, ItemStack tool) { if (world instanceof ServerLevel) { Block.getDrops(state, (ServerLevel) world, pos, blockEntity, entity, tool).forEach((itemstack1) -> { @@ -15177,7 +15137,7 @@ index 8f237fa0afb9f8d8fcded1a017342ecacd10bcf2..bcc15bae4d737f54781779d46635c0d4 public static void popResource(Level world, BlockPos pos, ItemStack stack) { double d0 = (double) EntityType.ITEM.getHeight() / 2.0D; double d1 = (double) pos.getX() + 0.5D + Mth.nextDouble(world.random, -0.25D, 0.25D); -@@ -430,7 +481,17 @@ public class Block extends BlockBehaviour implements ItemLike { +@@ -437,7 +488,17 @@ public class Block extends BlockBehaviour implements ItemLike { } // Paper } @@ -15196,7 +15156,7 @@ index 8f237fa0afb9f8d8fcded1a017342ecacd10bcf2..bcc15bae4d737f54781779d46635c0d4 public boolean isPossibleToRespawnInThis(BlockState state) { return !state.isSolid() && !state.liquid(); -@@ -449,7 +510,7 @@ public class Block extends BlockBehaviour implements ItemLike { +@@ -456,7 +517,7 @@ public class Block extends BlockBehaviour implements ItemLike { } public void fallOn(Level world, BlockState state, BlockPos pos, Entity entity, float fallDistance) { @@ -15206,10 +15166,10 @@ index 8f237fa0afb9f8d8fcded1a017342ecacd10bcf2..bcc15bae4d737f54781779d46635c0d4 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 d5654cfe37bd82f1290b280990a8502432491ae1..6425bc42bb8024aa7936b841d6c2ee2c892eb329 100644 +index 9a2de546dc2af2ad4bf5d32ca6583f0e1f3f70d8..3d48293c34fa37ba5091c6058dadb32a8f74a009 100644 --- a/src/main/java/net/minecraft/world/level/block/Blocks.java +++ b/src/main/java/net/minecraft/world/level/block/Blocks.java -@@ -1094,8 +1094,8 @@ public class Blocks { +@@ -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))); @@ -15220,7 +15180,7 @@ index d5654cfe37bd82f1290b280990a8502432491ae1..6425bc42bb8024aa7936b841d6c2ee2c 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))); -@@ -1160,7 +1160,7 @@ public class Blocks { +@@ -1215,7 +1215,7 @@ public class Blocks { } private static Boolean ocelotOrParrot(BlockState state, BlockGetter world, BlockPos pos, EntityType type) { @@ -15228,12 +15188,12 @@ index d5654cfe37bd82f1290b280990a8502432491ae1..6425bc42bb8024aa7936b841d6c2ee2c + return type == EntityType.OCELOT || type == EntityType.PARROT; // Purpur - decompile error } - private static BedBlock bed(DyeColor color) { + private static Block bed(DyeColor color) { 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 03fde6e47c4a347c62fe9b4a3351769aedf874f6..ca906b0250e5332f7ececf1419ca6d2c1d385adc 100644 +index bed3d9c781c7d3ca260027b4737970889a54689c..db1941ed32d141327a8b11e54b3ff9900072ad36 100644 --- a/src/main/java/net/minecraft/world/level/block/BushBlock.java +++ b/src/main/java/net/minecraft/world/level/block/BushBlock.java -@@ -48,4 +48,24 @@ public class BushBlock extends Block { +@@ -52,4 +52,24 @@ public abstract class BushBlock extends Block { public boolean isPathfindable(BlockState state, BlockGetter world, BlockPos pos, PathComputationType type) { return type == PathComputationType.AIR && !this.hasCollision ? true : super.isPathfindable(state, world, pos, type); } @@ -15259,19 +15219,19 @@ index 03fde6e47c4a347c62fe9b4a3351769aedf874f6..ca906b0250e5332f7ececf1419ca6d2c + // Purpur end } diff --git a/src/main/java/net/minecraft/world/level/block/CactusBlock.java b/src/main/java/net/minecraft/world/level/block/CactusBlock.java -index 0003fb51ae3a6575575e10b4c86719f3061e2577..fa6a2fbb8065b1f120750491b7e4b89542a6a891 100644 +index a9629a102c4fa4e5720e63fcf4590e9231426c62..a476f9a1eaa99b557962947149b6ee6ea3288d6e 100644 --- a/src/main/java/net/minecraft/world/level/block/CactusBlock.java +++ b/src/main/java/net/minecraft/world/level/block/CactusBlock.java -@@ -22,7 +22,7 @@ import net.minecraft.world.phys.shapes.CollisionContext; +@@ -23,7 +23,7 @@ import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit -public class CactusBlock extends Block { +public class CactusBlock extends Block implements BonemealableBlock { // Purpur + public static final MapCodec CODEC = simpleCodec(CactusBlock::new); public static final IntegerProperty AGE = BlockStateProperties.AGE_15; - public static final int MAX_AGE = 15; -@@ -107,7 +107,7 @@ public class CactusBlock extends Block { +@@ -114,7 +114,7 @@ public class CactusBlock extends Block { enumdirection = (Direction) iterator.next(); iblockdata1 = world.getBlockState(pos.relative(enumdirection)); @@ -15280,7 +15240,7 @@ index 0003fb51ae3a6575575e10b4c86719f3061e2577..fa6a2fbb8065b1f120750491b7e4b895 return false; } -@@ -129,4 +129,34 @@ public class CactusBlock extends Block { +@@ -136,4 +136,34 @@ public class CactusBlock extends Block { public boolean isPathfindable(BlockState state, BlockGetter world, BlockPos pos, PathComputationType type) { return false; } @@ -15316,10 +15276,10 @@ index 0003fb51ae3a6575575e10b4c86719f3061e2577..fa6a2fbb8065b1f120750491b7e4b895 + // Purpur end } diff --git a/src/main/java/net/minecraft/world/level/block/CampfireBlock.java b/src/main/java/net/minecraft/world/level/block/CampfireBlock.java -index 7700461b8cd0bde1bf6c0d5e4b73184bed1adc4e..cfa02b274286374c7555919d0e8d66a2c8fb8b88 100644 +index 7302d07c6ff69608e75ac52fdb19f2ec1d105129..35e2f279d358201384ff74fd767df18f6fda432b 100644 --- a/src/main/java/net/minecraft/world/level/block/CampfireBlock.java +++ b/src/main/java/net/minecraft/world/level/block/CampfireBlock.java -@@ -123,7 +123,7 @@ public class CampfireBlock extends BaseEntityBlock implements SimpleWaterloggedB +@@ -138,7 +138,7 @@ public class CampfireBlock extends BaseEntityBlock implements SimpleWaterloggedB BlockPos blockposition = ctx.getClickedPos(); boolean flag = world.getFluidState(blockposition).getType() == Fluids.WATER; @@ -15329,10 +15289,10 @@ index 7700461b8cd0bde1bf6c0d5e4b73184bed1adc4e..cfa02b274286374c7555919d0e8d66a2 @Override diff --git a/src/main/java/net/minecraft/world/level/block/CarvedPumpkinBlock.java b/src/main/java/net/minecraft/world/level/block/CarvedPumpkinBlock.java -index 23c487e295b3b736d8800f0c884324c9b18a5373..ebeb7caf7fd4f45714bab0856a48b847a544cce7 100644 +index a63733fa01dc58b3c0abb28c1cd88c8b0a456083..75ef899fcd063dd7770aefaca69a6936cccfa620 100644 --- a/src/main/java/net/minecraft/world/level/block/CarvedPumpkinBlock.java +++ b/src/main/java/net/minecraft/world/level/block/CarvedPumpkinBlock.java -@@ -64,7 +64,7 @@ public class CarvedPumpkinBlock extends HorizontalDirectionalBlock { +@@ -71,7 +71,7 @@ public class CarvedPumpkinBlock extends HorizontalDirectionalBlock { SnowGolem entitysnowman = (SnowGolem) EntityType.SNOW_GOLEM.create(world); if (entitysnowman != null) { @@ -15341,7 +15301,7 @@ index 23c487e295b3b736d8800f0c884324c9b18a5373..ebeb7caf7fd4f45714bab0856a48b847 } } else { BlockPattern.BlockPatternMatch shapedetector_shapedetectorcollection1 = this.getOrCreateIronGolemFull().find(world, pos); -@@ -74,7 +74,7 @@ public class CarvedPumpkinBlock extends HorizontalDirectionalBlock { +@@ -81,7 +81,7 @@ public class CarvedPumpkinBlock extends HorizontalDirectionalBlock { if (entityirongolem != null) { entityirongolem.setPlayerCreated(true); @@ -15350,7 +15310,7 @@ index 23c487e295b3b736d8800f0c884324c9b18a5373..ebeb7caf7fd4f45714bab0856a48b847 } } } -@@ -82,6 +82,16 @@ public class CarvedPumpkinBlock extends HorizontalDirectionalBlock { +@@ -89,6 +89,16 @@ public class CarvedPumpkinBlock extends HorizontalDirectionalBlock { } private static void spawnGolemInWorld(Level world, BlockPattern.BlockPatternMatch patternResult, Entity entity, BlockPos pos) { @@ -15368,10 +15328,10 @@ index 23c487e295b3b736d8800f0c884324c9b18a5373..ebeb7caf7fd4f45714bab0856a48b847 entity.moveTo((double) pos.getX() + 0.5D, (double) pos.getY() + 0.05D, (double) pos.getZ() + 0.5D, 0.0F, 0.0F); // CraftBukkit start diff --git a/src/main/java/net/minecraft/world/level/block/CauldronBlock.java b/src/main/java/net/minecraft/world/level/block/CauldronBlock.java -index 2f85b893dd0abc39fcedec65acc89e1567faf6f0..3ee012a9ef8cada0b2203e53b2f731f60f697cb1 100644 +index a821a981adbebdcf22997731b9bbea3d033cd2b1..028419d45c098baf5eab5d6e7a73189cb3e86622 100644 --- a/src/main/java/net/minecraft/world/level/block/CauldronBlock.java +++ b/src/main/java/net/minecraft/world/level/block/CauldronBlock.java -@@ -29,7 +29,7 @@ public class CauldronBlock extends AbstractCauldronBlock { +@@ -36,7 +36,7 @@ public class CauldronBlock extends AbstractCauldronBlock { } protected static boolean shouldHandlePrecipitation(Level world, Biome.Precipitation precipitation) { @@ -15381,10 +15341,10 @@ index 2f85b893dd0abc39fcedec65acc89e1567faf6f0..3ee012a9ef8cada0b2203e53b2f731f6 @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 ead7b37122c76d43af2cdd17af7f0da8014efb26..1acc2dcda68ec8e462d51927f2ea985e7952a830 100644 +index 54916c80720f219bf747250a2ff9a875f180c7a2..cae6d33728a39de9db908e1e24fdc3ad987d0542 100644 --- a/src/main/java/net/minecraft/world/level/block/CaveVinesBlock.java +++ b/src/main/java/net/minecraft/world/level/block/CaveVinesBlock.java -@@ -88,4 +88,11 @@ public class CaveVinesBlock extends GrowingPlantHeadBlock implements Bonemealabl +@@ -94,4 +94,11 @@ public class CaveVinesBlock extends GrowingPlantHeadBlock implements Bonemealabl public void performBonemeal(ServerLevel world, RandomSource random, BlockPos pos, BlockState state) { world.setBlock(pos, state.setValue(BERRIES, Boolean.valueOf(true)), 2); } @@ -15397,23 +15357,23 @@ index ead7b37122c76d43af2cdd17af7f0da8014efb26..1acc2dcda68ec8e462d51927f2ea985e + // Purpur end } diff --git a/src/main/java/net/minecraft/world/level/block/ChangeOverTimeBlock.java b/src/main/java/net/minecraft/world/level/block/ChangeOverTimeBlock.java -index 8512b977b44a0a4d3a2521e27a60d65f7ac967be..dd270f67388c8663e0418875c88cb1e2a55d0635 100644 +index daae7fd6e0148cfba8e359d990748a0c83a3376e..0e06b1bcd906e92c083dc74d56d6d0a2a36f62a7 100644 --- a/src/main/java/net/minecraft/world/level/block/ChangeOverTimeBlock.java +++ b/src/main/java/net/minecraft/world/level/block/ChangeOverTimeBlock.java -@@ -65,7 +65,7 @@ public interface ChangeOverTimeBlock> { +@@ -67,7 +67,7 @@ public interface ChangeOverTimeBlock> { } float f = (float) (k + 1) / (float) (k + j + 1); - float f1 = f * f * this.getChanceModifier(); + float f1 = world.purpurConfig.disableOxidationProximityPenalty ? this.getChanceModifier() : f * f * this.getChanceModifier(); // Purpur - if (random.nextFloat() < f1) { - this.getNext(state).ifPresent((iblockdata2) -> { + return random.nextFloat() < f1 ? this.getNext(state) : Optional.empty(); + } diff --git a/src/main/java/net/minecraft/world/level/block/ChestBlock.java b/src/main/java/net/minecraft/world/level/block/ChestBlock.java -index af6e245b02d5fb78764d2db0ac200056277b212a..4ee31c5a6053237b15ddb8e3208cdb9a35a0d08d 100644 +index 9804ee2020e5cef23d3f5174d153fc149e611503..3a5e5cf88c5592e1bc3e6dc9eced2d1dd47bd145 100644 --- a/src/main/java/net/minecraft/world/level/block/ChestBlock.java +++ b/src/main/java/net/minecraft/world/level/block/ChestBlock.java -@@ -355,6 +355,7 @@ public class ChestBlock extends AbstractChestBlock implements +@@ -358,6 +358,7 @@ public class ChestBlock extends AbstractChestBlock implements } private static boolean isBlockedChestByBlock(BlockGetter world, BlockPos pos) { @@ -15422,10 +15382,10 @@ index af6e245b02d5fb78764d2db0ac200056277b212a..4ee31c5a6053237b15ddb8e3208cdb9a return world.getBlockState(blockposition1).isRedstoneConductor(world, blockposition1); diff --git a/src/main/java/net/minecraft/world/level/block/ComposterBlock.java b/src/main/java/net/minecraft/world/level/block/ComposterBlock.java -index 0500d4b96328ccc64e0dd3bd2d35c6b7bd21907e..8daea5e92ebb0715c99695cff307f132fcfd01bd 100644 +index ce43cb260b36ca170a1d1725a7bf02525e8970d6..91873061bfdc912a59e819555244a534d15ee69b 100644 --- a/src/main/java/net/minecraft/world/level/block/ComposterBlock.java +++ b/src/main/java/net/minecraft/world/level/block/ComposterBlock.java -@@ -231,20 +231,28 @@ public class ComposterBlock extends Block implements WorldlyContainerHolder { +@@ -238,20 +238,28 @@ public class ComposterBlock extends Block implements WorldlyContainerHolder { ItemStack itemstack = player.getItemInHand(hand); if (i < 8 && ComposterBlock.COMPOSTABLES.containsKey(itemstack.getItem())) { @@ -15466,7 +15426,7 @@ index 0500d4b96328ccc64e0dd3bd2d35c6b7bd21907e..8daea5e92ebb0715c99695cff307f132 return InteractionResult.sidedSuccess(world.isClientSide); } else if (i == 8) { -@@ -255,6 +263,26 @@ public class ComposterBlock extends Block implements WorldlyContainerHolder { +@@ -262,6 +270,26 @@ public class ComposterBlock extends Block implements WorldlyContainerHolder { } } @@ -15494,10 +15454,10 @@ index 0500d4b96328ccc64e0dd3bd2d35c6b7bd21907e..8daea5e92ebb0715c99695cff307f132 int i = (Integer) state.getValue(ComposterBlock.LEVEL); diff --git a/src/main/java/net/minecraft/world/level/block/CoralBlock.java b/src/main/java/net/minecraft/world/level/block/CoralBlock.java -index 88faea00be60a519f56f975a5311df5e1eb3e6b8..cbb726ac367be81e27d3a86643baf7c4f0746edf 100644 +index 8fd8285e07de4a0457da507501e49a807542f3b1..e580c5a141bebdc45893b5abde01e633c864fc13 100644 --- a/src/main/java/net/minecraft/world/level/block/CoralBlock.java +++ b/src/main/java/net/minecraft/world/level/block/CoralBlock.java -@@ -45,6 +45,7 @@ public class CoralBlock extends Block { +@@ -59,6 +59,7 @@ public class CoralBlock extends Block { } protected boolean scanForWater(BlockGetter world, BlockPos pos) { @@ -15506,10 +15466,10 @@ index 88faea00be60a519f56f975a5311df5e1eb3e6b8..cbb726ac367be81e27d3a86643baf7c4 int i = aenumdirection.length; diff --git a/src/main/java/net/minecraft/world/level/block/CropBlock.java b/src/main/java/net/minecraft/world/level/block/CropBlock.java -index 6365ddea0c23bc5d4009d98915f2b39aed2a0328..61d051f42d8c3d1f039b97fdc7a61b54f57ee86a 100644 +index 9550ce8588c6aa3ba4cbbbb86912eae2b452eb01..32b121fc8b92ce6ff202b967b7d08f77a9a332f4 100644 --- a/src/main/java/net/minecraft/world/level/block/CropBlock.java +++ b/src/main/java/net/minecraft/world/level/block/CropBlock.java -@@ -172,7 +172,7 @@ public class CropBlock extends BushBlock implements BonemealableBlock { +@@ -179,7 +179,7 @@ public class CropBlock extends BushBlock implements BonemealableBlock { @Override public void entityInside(BlockState state, Level world, BlockPos pos, Entity entity) { if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(world, pos)).callEvent()) { return; } // Paper @@ -15518,7 +15478,7 @@ index 6365ddea0c23bc5d4009d98915f2b39aed2a0328..61d051f42d8c3d1f039b97fdc7a61b54 world.destroyBlock(pos, true, entity); } -@@ -207,4 +207,15 @@ public class CropBlock extends BushBlock implements BonemealableBlock { +@@ -214,4 +214,15 @@ public class CropBlock extends BushBlock implements BonemealableBlock { protected void createBlockStateDefinition(StateDefinition.Builder builder) { builder.add(CropBlock.AGE); } @@ -15535,10 +15495,10 @@ index 6365ddea0c23bc5d4009d98915f2b39aed2a0328..61d051f42d8c3d1f039b97fdc7a61b54 + // Purpur end } diff --git a/src/main/java/net/minecraft/world/level/block/DoorBlock.java b/src/main/java/net/minecraft/world/level/block/DoorBlock.java -index c028a7158e41a0754abb8e24dcd647633fbf3fe8..cd65d32f4af016d4937e598c71386a3072f4c490 100644 +index ed57fbcfcff29a71026b0600b02daf4178d78429..31a5d3a5642123983b8c7df49be04f25141d15a2 100644 --- a/src/main/java/net/minecraft/world/level/block/DoorBlock.java +++ b/src/main/java/net/minecraft/world/level/block/DoorBlock.java -@@ -167,6 +167,7 @@ public class DoorBlock extends Block { +@@ -198,6 +198,7 @@ public class DoorBlock extends Block { public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { if (!this.type.canOpenByHand()) { return InteractionResult.PASS; @@ -15546,7 +15506,7 @@ index c028a7158e41a0754abb8e24dcd647633fbf3fe8..cd65d32f4af016d4937e598c71386a30 } else { state = (BlockState) state.cycle(DoorBlock.OPEN); world.setBlock(pos, state, 10); -@@ -270,4 +271,18 @@ public class DoorBlock extends Block { +@@ -301,4 +302,18 @@ public class DoorBlock extends Block { flag = false; return flag; } @@ -15566,10 +15526,10 @@ index c028a7158e41a0754abb8e24dcd647633fbf3fe8..cd65d32f4af016d4937e598c71386a30 + // Purpur end } diff --git a/src/main/java/net/minecraft/world/level/block/DragonEggBlock.java b/src/main/java/net/minecraft/world/level/block/DragonEggBlock.java -index 7e1edcc7b9f170b7c649437c2f0dd78c0bab9be4..5f8ac1fdac2c334951261f2b9702f5e711743c88 100644 +index 7f365143ce5c62e734eceb855ba0a02ab3a99b27..bbb266cbe23da2573d3dfb3a6edd57461988d3c5 100644 --- a/src/main/java/net/minecraft/world/level/block/DragonEggBlock.java +++ b/src/main/java/net/minecraft/world/level/block/DragonEggBlock.java -@@ -42,8 +42,8 @@ public class DragonEggBlock extends FallingBlock { +@@ -49,8 +49,8 @@ public class DragonEggBlock extends FallingBlock { } private void teleport(BlockState state, Level world, BlockPos pos) { @@ -15580,10 +15540,10 @@ index 7e1edcc7b9f170b7c649437c2f0dd78c0bab9be4..5f8ac1fdac2c334951261f2b9702f5e7 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 839b7bc9392906dca384003468746963631fe095..286f34eef22a85be3fe9747dc3c3f9a7d51f437c 100644 +index 790cf30c2bfd4e2530ff563dfcf05e25554248b3..ba69e9b37ce9f2d8b439d471e6de770da38d6971 100644 --- a/src/main/java/net/minecraft/world/level/block/EnchantmentTableBlock.java +++ b/src/main/java/net/minecraft/world/level/block/EnchantmentTableBlock.java -@@ -29,6 +29,8 @@ import net.minecraft.world.level.pathfinder.PathComputationType; +@@ -30,6 +30,8 @@ import net.minecraft.world.level.pathfinder.PathComputationType; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; @@ -15591,8 +15551,8 @@ index 839b7bc9392906dca384003468746963631fe095..286f34eef22a85be3fe9747dc3c3f9a7 +import net.minecraft.world.item.Items; // Purpur public class EnchantmentTableBlock extends BaseEntityBlock { - protected static final VoxelShape SHAPE = Block.box(0.0D, 0.0D, 0.0D, 16.0D, 12.0D, 16.0D); -@@ -121,4 +123,18 @@ public class EnchantmentTableBlock extends BaseEntityBlock { + public static final MapCodec CODEC = simpleCodec(EnchantmentTableBlock::new); +@@ -128,4 +130,18 @@ public class EnchantmentTableBlock extends BaseEntityBlock { public boolean isPathfindable(BlockState state, BlockGetter world, BlockPos pos, PathComputationType type) { return false; } @@ -15612,10 +15572,10 @@ index 839b7bc9392906dca384003468746963631fe095..286f34eef22a85be3fe9747dc3c3f9a7 + // Purpur end } diff --git a/src/main/java/net/minecraft/world/level/block/EndPortalBlock.java b/src/main/java/net/minecraft/world/level/block/EndPortalBlock.java -index 41d7cff39fc37955877668337689b4b26cd8c7cf..2deddc746e43896584bd65ba8e7971a80acb4a4d 100644 +index c82ebcac07033d887af499f81520982fbe5ed4f1..0b45bc1db5f57a4381c470a563aa81ac0d3a1be7 100644 --- a/src/main/java/net/minecraft/world/level/block/EndPortalBlock.java +++ b/src/main/java/net/minecraft/world/level/block/EndPortalBlock.java -@@ -46,6 +46,14 @@ public class EndPortalBlock extends BaseEntityBlock { +@@ -54,6 +54,14 @@ public class EndPortalBlock extends BaseEntityBlock { public void entityInside(BlockState state, Level world, BlockPos pos, Entity entity) { if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(world, pos)).callEvent()) { return; } // Paper if (world instanceof ServerLevel && entity.canChangeDimensions() && Shapes.joinIsNotEmpty(Shapes.create(entity.getBoundingBox().move((double) (-pos.getX()), (double) (-pos.getY()), (double) (-pos.getZ()))), state.getShape(world, pos), BooleanOp.AND)) { @@ -15630,7 +15590,7 @@ index 41d7cff39fc37955877668337689b4b26cd8c7cf..2deddc746e43896584bd65ba8e7971a8 ResourceKey resourcekey = world.getTypeKey() == LevelStem.END ? Level.OVERWORLD : Level.END; // CraftBukkit - SPIGOT-6152: send back to main overworld in custom ends ServerLevel worldserver = ((ServerLevel) world).getServer().getLevel(resourcekey); -@@ -53,6 +61,22 @@ public class EndPortalBlock extends BaseEntityBlock { +@@ -61,6 +69,22 @@ public class EndPortalBlock extends BaseEntityBlock { // return; // CraftBukkit - always fire event in case plugins wish to change it } @@ -15654,10 +15614,10 @@ index 41d7cff39fc37955877668337689b4b26cd8c7cf..2deddc746e43896584bd65ba8e7971a8 entity.portalWorld = ((ServerLevel)world); entity.portalBlock = pos.immutable(); 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 7385e91f32f070e86a4e0fd3d214f55d832c7979..7b73de87236a60ce7343c29ec147e1866b448ba3 100644 +index ddca14f1224327a738415fb8b37398d8df0aa9c8..fe3236295790b9e250486835176cae810160c33a 100644 --- a/src/main/java/net/minecraft/world/level/block/EnderChestBlock.java +++ b/src/main/java/net/minecraft/world/level/block/EnderChestBlock.java -@@ -85,6 +85,34 @@ public class EnderChestBlock extends AbstractChestBlock i +@@ -92,6 +92,34 @@ public class EnderChestBlock extends AbstractChestBlock i EnderChestBlockEntity enderChestBlockEntity = (EnderChestBlockEntity)blockEntity; playerEnderChestContainer.setActiveChest(enderChestBlockEntity); player.openMenu(new SimpleMenuProvider((syncId, inventory, playerx) -> { @@ -15693,10 +15653,10 @@ index 7385e91f32f070e86a4e0fd3d214f55d832c7979..7b73de87236a60ce7343c29ec147e186 }, CONTAINER_TITLE)); player.awardStat(Stats.OPEN_ENDERCHEST); diff --git a/src/main/java/net/minecraft/world/level/block/FarmBlock.java b/src/main/java/net/minecraft/world/level/block/FarmBlock.java -index 502dcba14da9d3dcefc61fdc349a4e1e1d94b478..856099241737c43b8213ccc203ef6bb7b7667b1f 100644 +index 59bbdead2ebd8965d222540c7243dde051bbcc4b..c4eca9db159d6a581d863558ebc3008d51d25cfb 100644 --- a/src/main/java/net/minecraft/world/level/block/FarmBlock.java +++ b/src/main/java/net/minecraft/world/level/block/FarmBlock.java -@@ -103,7 +103,7 @@ public class FarmBlock extends Block { +@@ -110,7 +110,7 @@ public class FarmBlock extends Block { @Override public void fallOn(Level world, BlockState state, BlockPos pos, Entity entity, float fallDistance) { super.fallOn(world, state, pos, entity, fallDistance); // CraftBukkit - moved here as game rules / events shouldn't affect fall damage. @@ -15705,7 +15665,7 @@ index 502dcba14da9d3dcefc61fdc349a4e1e1d94b478..856099241737c43b8213ccc203ef6bb7 // CraftBukkit start - Interact soil org.bukkit.event.Cancellable cancellable; if (entity instanceof Player) { -@@ -117,6 +117,22 @@ public class FarmBlock extends Block { +@@ -124,6 +124,22 @@ public class FarmBlock extends Block { return; } @@ -15728,7 +15688,7 @@ index 502dcba14da9d3dcefc61fdc349a4e1e1d94b478..856099241737c43b8213ccc203ef6bb7 if (!CraftEventFactory.callEntityChangeBlockEvent(entity, pos, Blocks.DIRT.defaultBlockState())) { return; } -@@ -164,7 +180,7 @@ public class FarmBlock extends Block { +@@ -171,7 +187,7 @@ public class FarmBlock extends Block { } } @@ -15738,10 +15698,10 @@ index 502dcba14da9d3dcefc61fdc349a4e1e1d94b478..856099241737c43b8213ccc203ef6bb7 @Override diff --git a/src/main/java/net/minecraft/world/level/block/GrowingPlantHeadBlock.java b/src/main/java/net/minecraft/world/level/block/GrowingPlantHeadBlock.java -index b325fdec8eb99ce57152a5c0fefa5059685276e4..c93e60b01dd46e7de6a6b5a5149a522304f28178 100644 +index 4ebdc4918131a15a1c91b45e8ceb1392bca20a81..2537f99baca6213618865d60f84e96b8a4849307 100644 --- a/src/main/java/net/minecraft/world/level/block/GrowingPlantHeadBlock.java +++ b/src/main/java/net/minecraft/world/level/block/GrowingPlantHeadBlock.java -@@ -30,12 +30,12 @@ public abstract class GrowingPlantHeadBlock extends GrowingPlantBlock implements +@@ -34,12 +34,12 @@ public abstract class GrowingPlantHeadBlock extends GrowingPlantBlock implements @Override public BlockState getStateForPlacement(LevelAccessor world) { @@ -15756,7 +15716,7 @@ index b325fdec8eb99ce57152a5c0fefa5059685276e4..c93e60b01dd46e7de6a6b5a5149a5223 } @Override -@@ -51,7 +51,7 @@ public abstract class GrowingPlantHeadBlock extends GrowingPlantBlock implements +@@ -55,7 +55,7 @@ public abstract class GrowingPlantHeadBlock extends GrowingPlantBlock implements } else { modifier = world.spigotConfig.caveVinesModifier; } @@ -15765,7 +15725,7 @@ index b325fdec8eb99ce57152a5c0fefa5059685276e4..c93e60b01dd46e7de6a6b5a5149a5223 // Spigot end BlockPos blockposition1 = pos.relative(this.growthDirection); -@@ -73,11 +73,11 @@ public abstract class GrowingPlantHeadBlock extends GrowingPlantBlock implements +@@ -77,11 +77,11 @@ public abstract class GrowingPlantHeadBlock extends GrowingPlantBlock implements } public BlockState getMaxAgeState(BlockState state) { @@ -15779,7 +15739,7 @@ index b325fdec8eb99ce57152a5c0fefa5059685276e4..c93e60b01dd46e7de6a6b5a5149a5223 } protected BlockState updateBodyAfterConvertedFromHead(BlockState from, BlockState to) { -@@ -119,13 +119,13 @@ public abstract class GrowingPlantHeadBlock extends GrowingPlantBlock implements +@@ -123,13 +123,13 @@ public abstract class GrowingPlantHeadBlock extends GrowingPlantBlock implements @Override public void performBonemeal(ServerLevel world, RandomSource random, BlockPos pos, BlockState state) { BlockPos blockposition1 = pos.relative(this.growthDirection); @@ -15795,7 +15755,7 @@ index b325fdec8eb99ce57152a5c0fefa5059685276e4..c93e60b01dd46e7de6a6b5a5149a5223 } } -@@ -138,4 +138,6 @@ public abstract class GrowingPlantHeadBlock extends GrowingPlantBlock implements +@@ -142,4 +142,6 @@ public abstract class GrowingPlantHeadBlock extends GrowingPlantBlock implements protected GrowingPlantHeadBlock getHeadBlock() { return this; } @@ -15803,10 +15763,10 @@ index b325fdec8eb99ce57152a5c0fefa5059685276e4..c93e60b01dd46e7de6a6b5a5149a5223 + public abstract int getMaxGrowthAge(); // Purpur } diff --git a/src/main/java/net/minecraft/world/level/block/HayBlock.java b/src/main/java/net/minecraft/world/level/block/HayBlock.java -index cfbe1dae76db76cf54a4f5d72aca72d5e893859e..74cb10230d459ac9f300a9d59af504d233ac663e 100644 +index ef364aa171a48482a45bc18cfe730ec20c3f7be6..74971d90506aa253d5ee821b5390fb2551a3a393 100644 --- a/src/main/java/net/minecraft/world/level/block/HayBlock.java +++ b/src/main/java/net/minecraft/world/level/block/HayBlock.java -@@ -15,6 +15,6 @@ public class HayBlock extends RotatedPillarBlock { +@@ -23,6 +23,6 @@ public class HayBlock extends RotatedPillarBlock { @Override public void fallOn(Level world, BlockState state, BlockPos pos, Entity entity, float fallDistance) { @@ -15815,10 +15775,10 @@ index cfbe1dae76db76cf54a4f5d72aca72d5e893859e..74cb10230d459ac9f300a9d59af504d2 } } diff --git a/src/main/java/net/minecraft/world/level/block/IceBlock.java b/src/main/java/net/minecraft/world/level/block/IceBlock.java -index 04089e6f7d6e3d532b00585870283922b6be5246..61e6d14abd54ecd5e43a5459f8daa7d86adedf44 100644 +index 4ab6997dad5b112f5105f786a6cee78c6c5667e8..bbf19716d84a0d7e71a11559ef4f62590f2f367c 100644 --- a/src/main/java/net/minecraft/world/level/block/IceBlock.java +++ b/src/main/java/net/minecraft/world/level/block/IceBlock.java -@@ -33,7 +33,7 @@ public class IceBlock extends HalfTransparentBlock { +@@ -41,7 +41,7 @@ public class IceBlock extends HalfTransparentBlock { public void afterDestroy(Level world, BlockPos pos, ItemStack tool) { // Paper end if (EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) == 0) { @@ -15827,7 +15787,7 @@ index 04089e6f7d6e3d532b00585870283922b6be5246..61e6d14abd54ecd5e43a5459f8daa7d8 world.removeBlock(pos, false); return; } -@@ -61,7 +61,7 @@ public class IceBlock extends HalfTransparentBlock { +@@ -69,7 +69,7 @@ public class IceBlock extends HalfTransparentBlock { return; } // CraftBukkit end @@ -15837,10 +15797,10 @@ index 04089e6f7d6e3d532b00585870283922b6be5246..61e6d14abd54ecd5e43a5459f8daa7d8 } 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 ff30a93f4160e8e22b40c7a7033c14fa15839160..bf043e1b9f0ec5876a2fa2d0597ec3c60b32b2c0 100644 +index 4dbacee1930bc3955ce431e1d32353588b47afc9..a53c6ab63fd10ac94292836120152f54f23c1e13 100644 --- a/src/main/java/net/minecraft/world/level/block/KelpBlock.java +++ b/src/main/java/net/minecraft/world/level/block/KelpBlock.java -@@ -65,4 +65,11 @@ public class KelpBlock extends GrowingPlantHeadBlock implements LiquidBlockConta +@@ -72,4 +72,11 @@ public class KelpBlock extends GrowingPlantHeadBlock implements LiquidBlockConta public FluidState getFluidState(BlockState state) { return Fluids.WATER.getSource(false); } @@ -15853,10 +15813,10 @@ index ff30a93f4160e8e22b40c7a7033c14fa15839160..bf043e1b9f0ec5876a2fa2d0597ec3c6 + // Purpur end } diff --git a/src/main/java/net/minecraft/world/level/block/LiquidBlock.java b/src/main/java/net/minecraft/world/level/block/LiquidBlock.java -index 4a1830f85f47014da63e4584f411d13f0f0cd8b3..17b3dbb83fd9eb6ecdd58c1ac6446410b4bc3a51 100644 +index 2bd097203f1e92d3fc343f91dc37220e09dd5066..016fe816819ab9022fd03c50427b62abbcd18b3c 100644 --- a/src/main/java/net/minecraft/world/level/block/LiquidBlock.java +++ b/src/main/java/net/minecraft/world/level/block/LiquidBlock.java -@@ -107,7 +107,7 @@ public class LiquidBlock extends Block implements BucketPickup { +@@ -139,7 +139,7 @@ public class LiquidBlock extends Block implements BucketPickup { @Override public void onPlace(BlockState state, Level world, BlockPos pos, BlockState oldState, boolean notify) { @@ -15865,7 +15825,7 @@ index 4a1830f85f47014da63e4584f411d13f0f0cd8b3..17b3dbb83fd9eb6ecdd58c1ac6446410 world.scheduleTick(pos, state.getFluidState().getType(), this.getFlowSpeed(world, pos)); // Paper } -@@ -135,7 +135,7 @@ public class LiquidBlock extends Block implements BucketPickup { +@@ -167,7 +167,7 @@ public class LiquidBlock extends Block implements BucketPickup { @Override public BlockState updateShape(BlockState state, Direction direction, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { @@ -15874,7 +15834,7 @@ index 4a1830f85f47014da63e4584f411d13f0f0cd8b3..17b3dbb83fd9eb6ecdd58c1ac6446410 world.scheduleTick(pos, state.getFluidState().getType(), this.fluid.getTickDelay(world)); } -@@ -144,7 +144,7 @@ public class LiquidBlock extends Block implements BucketPickup { +@@ -176,7 +176,7 @@ public class LiquidBlock extends Block implements BucketPickup { @Override public void neighborChanged(BlockState state, Level world, BlockPos pos, Block sourceBlock, BlockPos sourcePos, boolean notify) { @@ -15884,10 +15844,10 @@ index 4a1830f85f47014da63e4584f411d13f0f0cd8b3..17b3dbb83fd9eb6ecdd58c1ac6446410 } diff --git a/src/main/java/net/minecraft/world/level/block/MagmaBlock.java b/src/main/java/net/minecraft/world/level/block/MagmaBlock.java -index 1b766045687e4dcded5cbcc50b746c55b9a34e22..be365914856593bb3c4e1945cc990786072f2953 100644 +index 10f5ffacc72a5e0116e2599ca83ee57a5b1ce0eb..31e6468f639de3ed0b25c3bc4ee09333c2150e1b 100644 --- a/src/main/java/net/minecraft/world/level/block/MagmaBlock.java +++ b/src/main/java/net/minecraft/world/level/block/MagmaBlock.java -@@ -22,7 +22,7 @@ public class MagmaBlock extends Block { +@@ -29,7 +29,7 @@ public class MagmaBlock extends Block { @Override public void stepOn(Level world, BlockPos pos, BlockState state, Entity entity) { @@ -15897,10 +15857,10 @@ index 1b766045687e4dcded5cbcc50b746c55b9a34e22..be365914856593bb3c4e1945cc990786 entity.hurt(world.damageSources().hotFloor(), 1.0F); org.bukkit.craftbukkit.event.CraftEventFactory.blockDamage = null; // CraftBukkit diff --git a/src/main/java/net/minecraft/world/level/block/NetherPortalBlock.java b/src/main/java/net/minecraft/world/level/block/NetherPortalBlock.java -index a6ab0d0defc05e56a91084c49897059670a1324b..589b437e7c97c846410f293e2f014bdcd7cb333e 100644 +index ee998d06804e344ea9d5b84ef0074b84aaba04c2..673dd5cc5c83eb606aa5684b8ae14b82e0346a35 100644 --- a/src/main/java/net/minecraft/world/level/block/NetherPortalBlock.java +++ b/src/main/java/net/minecraft/world/level/block/NetherPortalBlock.java -@@ -52,7 +52,7 @@ public class NetherPortalBlock extends Block { +@@ -60,7 +60,7 @@ public class NetherPortalBlock extends Block { @Override public void randomTick(BlockState state, ServerLevel world, BlockPos pos, RandomSource random) { @@ -15909,7 +15869,7 @@ index a6ab0d0defc05e56a91084c49897059670a1324b..589b437e7c97c846410f293e2f014bdc while (world.getBlockState(pos).is((Block) this)) { pos = pos.below(); } -@@ -84,6 +84,14 @@ public class NetherPortalBlock extends Block { +@@ -92,6 +92,14 @@ public class NetherPortalBlock extends Block { public void entityInside(BlockState state, Level world, BlockPos pos, Entity entity) { if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(world, pos)).callEvent()) { return; } // Paper if (entity.canChangeDimensions()) { @@ -15925,19 +15885,19 @@ index a6ab0d0defc05e56a91084c49897059670a1324b..589b437e7c97c846410f293e2f014bdc EntityPortalEnterEvent event = new EntityPortalEnterEvent(entity.getBukkitEntity(), new org.bukkit.Location(world.getWorld(), pos.getX(), pos.getY(), pos.getZ())); world.getCraftServer().getPluginManager().callEvent(event); diff --git a/src/main/java/net/minecraft/world/level/block/NetherWartBlock.java b/src/main/java/net/minecraft/world/level/block/NetherWartBlock.java -index e55720c4d2fbdf6aae526910e87a67c29cf906fd..7d15796e3637c1a865703807c98a22c01315c307 100644 +index 0fc333f240d6918e841a9221be42973839408802..9e47da91a5daed92b7326c84a88e619d2d981dd0 100644 --- a/src/main/java/net/minecraft/world/level/block/NetherWartBlock.java +++ b/src/main/java/net/minecraft/world/level/block/NetherWartBlock.java -@@ -14,7 +14,7 @@ import net.minecraft.world.level.block.state.properties.IntegerProperty; +@@ -16,7 +16,7 @@ import net.minecraft.world.level.block.state.properties.IntegerProperty; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; -public class NetherWartBlock extends BushBlock { +public class NetherWartBlock extends BushBlock implements BonemealableBlock { // Purpur + public static final MapCodec CODEC = simpleCodec(NetherWartBlock::new); public static final int MAX_AGE = 3; - public static final IntegerProperty AGE = BlockStateProperties.AGE_3; -@@ -60,4 +60,32 @@ public class NetherWartBlock extends BushBlock { +@@ -68,4 +68,32 @@ public class NetherWartBlock extends BushBlock { protected void createBlockStateDefinition(StateDefinition.Builder builder) { builder.add(NetherWartBlock.AGE); } @@ -15971,10 +15931,10 @@ index e55720c4d2fbdf6aae526910e87a67c29cf906fd..7d15796e3637c1a865703807c98a22c0 + // Purpur end } diff --git a/src/main/java/net/minecraft/world/level/block/NoteBlock.java b/src/main/java/net/minecraft/world/level/block/NoteBlock.java -index e46d84750bdd7c940f400efda226e12a3fdc3848..6343cd0c33cafb30225cfae17ea1cf15859073b1 100644 +index ff16075fbfe664c73a46bc4b002450867974114e..604053c7b5b2b7f2f1666baa3e0ce5acf3b37e46 100644 --- a/src/main/java/net/minecraft/world/level/block/NoteBlock.java +++ b/src/main/java/net/minecraft/world/level/block/NoteBlock.java -@@ -87,7 +87,7 @@ public class NoteBlock extends Block { +@@ -94,7 +94,7 @@ public class NoteBlock extends Block { } private void playNote(@Nullable Entity entity, BlockState state, Level world, BlockPos pos) { @@ -15984,10 +15944,10 @@ index e46d84750bdd7c940f400efda226e12a3fdc3848..6343cd0c33cafb30225cfae17ea1cf15 // org.bukkit.event.block.NotePlayEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callNotePlayEvent(world, pos, state.getValue(NoteBlock.INSTRUMENT), state.getValue(NoteBlock.NOTE)); // if (event.isCancelled()) { diff --git a/src/main/java/net/minecraft/world/level/block/ObserverBlock.java b/src/main/java/net/minecraft/world/level/block/ObserverBlock.java -index 7b45d6b9a005036ca5051d089a7be792eb87012f..8806c97ecc6bdd8a64c2d82bb2f58f46ac37c468 100644 +index 713352b68f82d4c4a19a712d5207de0f99456713..d056e80c98973e9ba64adc5a8554acc8a5f3eac9 100644 --- a/src/main/java/net/minecraft/world/level/block/ObserverBlock.java +++ b/src/main/java/net/minecraft/world/level/block/ObserverBlock.java -@@ -64,6 +64,7 @@ public class ObserverBlock extends DirectionalBlock { +@@ -71,6 +71,7 @@ public class ObserverBlock extends DirectionalBlock { @Override public BlockState updateShape(BlockState state, Direction direction, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { if (state.getValue(ObserverBlock.FACING) == direction && !(Boolean) state.getValue(ObserverBlock.POWERED)) { @@ -15996,10 +15956,10 @@ index 7b45d6b9a005036ca5051d089a7be792eb87012f..8806c97ecc6bdd8a64c2d82bb2f58f46 } diff --git a/src/main/java/net/minecraft/world/level/block/PointedDripstoneBlock.java b/src/main/java/net/minecraft/world/level/block/PointedDripstoneBlock.java -index cd943997f11f5ea5c600fdc6db96043fb0fa713c..4adeda49a2e422e11f885bffb311653d99159bf4 100644 +index bd22d3fdecbc992b11073a74d854b7d1b43c3f6a..0a3b97f18abcc9b385c9efd5a30f3e2ce5e4bd59 100644 --- a/src/main/java/net/minecraft/world/level/block/PointedDripstoneBlock.java +++ b/src/main/java/net/minecraft/world/level/block/PointedDripstoneBlock.java -@@ -186,7 +186,7 @@ public class PointedDripstoneBlock extends Block implements Fallable, SimpleWate +@@ -195,7 +195,7 @@ public class PointedDripstoneBlock extends Block implements Fallable, SimpleWate @VisibleForTesting public static void maybeTransferFluid(BlockState state, ServerLevel world, BlockPos pos, float dripChance) { @@ -16008,7 +15968,7 @@ index cd943997f11f5ea5c600fdc6db96043fb0fa713c..4adeda49a2e422e11f885bffb311653d if (PointedDripstoneBlock.isStalactiteStartPos(state, world, pos)) { Optional optional = PointedDripstoneBlock.getFluidAboveStalactite(world, pos, state); -@@ -195,13 +195,13 @@ public class PointedDripstoneBlock extends Block implements Fallable, SimpleWate +@@ -204,13 +204,13 @@ public class PointedDripstoneBlock extends Block implements Fallable, SimpleWate float f1; if (fluidtype == Fluids.WATER) { @@ -16025,10 +15985,10 @@ index cd943997f11f5ea5c600fdc6db96043fb0fa713c..4adeda49a2e422e11f885bffb311653d if (dripChance < f1) { diff --git a/src/main/java/net/minecraft/world/level/block/PowderSnowBlock.java b/src/main/java/net/minecraft/world/level/block/PowderSnowBlock.java -index e6fcea4482d5d87ed78beefad4c57bc86089460f..1626eb90a6b348ad9735b82452f52d4560075a03 100644 +index f579911b06b66e94e6311d970e93cca33fa089c6..2c63579226409a1823d2e8990e7ffc4250b83afb 100644 --- a/src/main/java/net/minecraft/world/level/block/PowderSnowBlock.java +++ b/src/main/java/net/minecraft/world/level/block/PowderSnowBlock.java -@@ -73,7 +73,7 @@ public class PowderSnowBlock extends Block implements BucketPickup { +@@ -80,7 +80,7 @@ public class PowderSnowBlock extends Block implements BucketPickup { if (!world.isClientSide) { // CraftBukkit start if (entity.isOnFire() && entity.mayInteract(world, pos)) { @@ -16038,10 +15998,10 @@ index e6fcea4482d5d87ed78beefad4c57bc86089460f..1626eb90a6b348ad9735b82452f52d45 } // CraftBukkit end diff --git a/src/main/java/net/minecraft/world/level/block/PoweredRailBlock.java b/src/main/java/net/minecraft/world/level/block/PoweredRailBlock.java -index 7fddb6fa8fd30ef88346a59f7867aae792f13772..40893e71fe8447b695350273bef9623bd5accdcd 100644 +index b84c48902ef24fdae17578a304e6c93dc20c5dce..e03125281767845564c48c98c3e6b6bbd269ade1 100644 --- a/src/main/java/net/minecraft/world/level/block/PoweredRailBlock.java +++ b/src/main/java/net/minecraft/world/level/block/PoweredRailBlock.java -@@ -23,7 +23,7 @@ public class PoweredRailBlock extends BaseRailBlock { +@@ -30,7 +30,7 @@ public class PoweredRailBlock extends BaseRailBlock { } protected boolean findPoweredRailSignal(Level world, BlockPos pos, BlockState state, boolean flag, int distance) { @@ -16051,10 +16011,10 @@ index 7fddb6fa8fd30ef88346a59f7867aae792f13772..40893e71fe8447b695350273bef9623b } else { int j = pos.getX(); diff --git a/src/main/java/net/minecraft/world/level/block/RespawnAnchorBlock.java b/src/main/java/net/minecraft/world/level/block/RespawnAnchorBlock.java -index 2ed78cf83c0ae66a6ddba1ff307da89a24b0d0a8..ae17d6a54fad0bd2d71d306f418b5ced2f11b863 100644 +index 797ece59c10bdb60a86f71ca3b7bb95dbe0f1078..ff315a10bcc605dc4e02a8de6b7d4f10db543a6c 100644 --- a/src/main/java/net/minecraft/world/level/block/RespawnAnchorBlock.java +++ b/src/main/java/net/minecraft/world/level/block/RespawnAnchorBlock.java -@@ -141,7 +141,7 @@ public class RespawnAnchorBlock extends Block { +@@ -148,7 +148,7 @@ public class RespawnAnchorBlock extends Block { }; Vec3 vec3d = explodedPos.getCenter(); @@ -16064,10 +16024,10 @@ index 2ed78cf83c0ae66a6ddba1ff307da89a24b0d0a8..ae17d6a54fad0bd2d71d306f418b5ced public static boolean canSetSpawn(Level world) { diff --git a/src/main/java/net/minecraft/world/level/block/SculkShriekerBlock.java b/src/main/java/net/minecraft/world/level/block/SculkShriekerBlock.java -index 02d01eabb9606ae8c3b76ad9fa4bb9a525e247b1..ce51fec4a874f9466f9966684c535315dbf40b9e 100644 +index 09c61eb5ba129e9630a756b452ef6aa61745c533..837c8399b2f490d98ca556e66018bfd471cf05bf 100644 --- a/src/main/java/net/minecraft/world/level/block/SculkShriekerBlock.java +++ b/src/main/java/net/minecraft/world/level/block/SculkShriekerBlock.java -@@ -130,7 +130,7 @@ public class SculkShriekerBlock extends BaseEntityBlock implements SimpleWaterlo +@@ -137,7 +137,7 @@ public class SculkShriekerBlock extends BaseEntityBlock implements SimpleWaterlo @Nullable @Override public BlockState getStateForPlacement(BlockPlaceContext ctx) { @@ -16076,24 +16036,11 @@ index 02d01eabb9606ae8c3b76ad9fa4bb9a525e247b1..ce51fec4a874f9466f9966684c535315 } @Override -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 d5fe3b8e2f5a8899f6afeb0600764284a617f261..2b513fc2f6c33963e43093cb08594bff946d72fa 100644 ---- a/src/main/java/net/minecraft/world/level/block/ShulkerBoxBlock.java -+++ b/src/main/java/net/minecraft/world/level/block/ShulkerBoxBlock.java -@@ -135,7 +135,7 @@ public class ShulkerBoxBlock extends BaseEntityBlock { - public void playerWillDestroy(Level world, BlockPos pos, BlockState state, Player player) { - BlockEntity blockEntity = world.getBlockEntity(pos); - if (blockEntity instanceof ShulkerBoxBlockEntity shulkerBoxBlockEntity) { -- if (!world.isClientSide && player.isCreative() && !shulkerBoxBlockEntity.isEmpty()) { -+ if (world.purpurConfig.shulkerBoxAllowOversizedStacks || (!world.isClientSide && player.isCreative() && !shulkerBoxBlockEntity.isEmpty())) { // Purpur - ItemStack itemStack = getColoredItemStack(this.getColor()); - blockEntity.saveToItem(itemStack); - if (shulkerBoxBlockEntity.hasCustomName()) { 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 ea8c78af35b0ddc0d08adfccfc78770b867e5df6..88cfa41f90d4ad395b96fd0b69ac0bdefe06ed2d 100644 +index adc7eba4bb5e8f7c507a16cdbd7497338a7658cf..512c528e0f2f3aa0da0253698a0189415329265a 100644 --- a/src/main/java/net/minecraft/world/level/block/SlabBlock.java +++ b/src/main/java/net/minecraft/world/level/block/SlabBlock.java -@@ -131,4 +131,25 @@ public class SlabBlock extends Block implements SimpleWaterloggedBlock { +@@ -138,4 +138,25 @@ public class SlabBlock extends Block implements SimpleWaterloggedBlock { return false; } } @@ -16120,10 +16067,10 @@ index ea8c78af35b0ddc0d08adfccfc78770b867e5df6..88cfa41f90d4ad395b96fd0b69ac0bde + // Purpur end } diff --git a/src/main/java/net/minecraft/world/level/block/SnowLayerBlock.java b/src/main/java/net/minecraft/world/level/block/SnowLayerBlock.java -index 14e00c7feb1c051d56a3d27cd00dcef072dd771a..4952fb1aaaafb55baa0fddb389f966a120a4786c 100644 +index a3da9536c3a3ad33d1c795673bdd7b05d6534054..9b057f3967aae5d0ca621b19d1212db91aaaee22 100644 --- a/src/main/java/net/minecraft/world/level/block/SnowLayerBlock.java +++ b/src/main/java/net/minecraft/world/level/block/SnowLayerBlock.java -@@ -81,6 +81,12 @@ public class SnowLayerBlock extends Block { +@@ -88,6 +88,12 @@ public class SnowLayerBlock extends Block { public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { BlockState iblockdata1 = world.getBlockState(pos.below()); @@ -16137,10 +16084,10 @@ index 14e00c7feb1c051d56a3d27cd00dcef072dd771a..4952fb1aaaafb55baa0fddb389f966a1 } diff --git a/src/main/java/net/minecraft/world/level/block/SpawnerBlock.java b/src/main/java/net/minecraft/world/level/block/SpawnerBlock.java -index 936d844a5a246138c9f9ae4ae6e318242b8f1420..93f5f226cf6fd6110e4daa02b3f5d9ad253814a0 100644 +index e8b1c44da90f60cde20cda65aba2aa1e30f89d25..c2e03881fff78aff203b5838180894bb70f419b9 100644 --- a/src/main/java/net/minecraft/world/level/block/SpawnerBlock.java +++ b/src/main/java/net/minecraft/world/level/block/SpawnerBlock.java -@@ -40,6 +40,58 @@ public class SpawnerBlock extends BaseEntityBlock { +@@ -42,6 +42,58 @@ public class SpawnerBlock extends BaseEntityBlock { return createTickerHelper(type, BlockEntityType.MOB_SPAWNER, world.isClientSide ? SpawnerBlockEntity::clientTick : SpawnerBlockEntity::serverTick); } @@ -16148,12 +16095,12 @@ index 936d844a5a246138c9f9ae4ae6e318242b8f1420..93f5f226cf6fd6110e4daa02b3f5d9ad + @Override + public void playerDestroy(Level level, net.minecraft.world.entity.player.Player player, BlockPos pos, BlockState state, BlockEntity blockEntity, ItemStack stack, boolean includeDrops) { + if (level.purpurConfig.silkTouchEnabled && player.getBukkitEntity().hasPermission("purpur.drop.spawners") && isSilkTouch(level, stack)) { -+ Optional> type = net.minecraft.world.entity.EntityType.by(((SpawnerBlockEntity) blockEntity).getSpawner().nextSpawnData.getEntityToSpawn()); ++ java.util.Optional> type = net.minecraft.world.entity.EntityType.by(((SpawnerBlockEntity) blockEntity).getSpawner().nextSpawnData.getEntityToSpawn()); + + net.minecraft.world.entity.EntityType entityType = type.orElse(null); + final net.kyori.adventure.text.Component mobName = io.papermc.paper.adventure.PaperAdventure.asAdventure(entityType == null ? Component.empty() : entityType.getDescription()); -+ CompoundTag display = new CompoundTag(); -+ CompoundTag tag = new CompoundTag(); ++ net.minecraft.nbt.CompoundTag display = new net.minecraft.nbt.CompoundTag(); ++ net.minecraft.nbt.CompoundTag tag = new net.minecraft.nbt.CompoundTag(); + + String name = level.purpurConfig.silkTouchSpawnerName; + if (name != null && !name.isEmpty() && !name.equals("Monster Spawner")) { @@ -16199,7 +16146,7 @@ index 936d844a5a246138c9f9ae4ae6e318242b8f1420..93f5f226cf6fd6110e4daa02b3f5d9ad @Override public void spawnAfterBreak(BlockState state, ServerLevel world, BlockPos pos, ItemStack tool, boolean dropExperience) { super.spawnAfterBreak(state, world, pos, tool, dropExperience); -@@ -48,6 +100,7 @@ public class SpawnerBlock extends BaseEntityBlock { +@@ -50,6 +102,7 @@ public class SpawnerBlock extends BaseEntityBlock { @Override public int getExpDrop(BlockState iblockdata, ServerLevel worldserver, BlockPos blockposition, ItemStack itemstack, boolean flag) { @@ -16208,10 +16155,10 @@ index 936d844a5a246138c9f9ae4ae6e318242b8f1420..93f5f226cf6fd6110e4daa02b3f5d9ad int i = 15 + worldserver.random.nextInt(15) + worldserver.random.nextInt(15); diff --git a/src/main/java/net/minecraft/world/level/block/SpongeBlock.java b/src/main/java/net/minecraft/world/level/block/SpongeBlock.java -index d810f6bf9a8a354e5b8994e51ec3672428277dde..cc1ac862526377b2ac7b66bc20f428dc1aed6e78 100644 +index c4667bea0708d12e228ec2a4c84fcee7e48ca08c..9e4146ecd36ff2698ee951660ed88290c80fd8f7 100644 --- a/src/main/java/net/minecraft/world/level/block/SpongeBlock.java +++ b/src/main/java/net/minecraft/world/level/block/SpongeBlock.java -@@ -51,7 +51,7 @@ public class SpongeBlock extends Block { +@@ -58,7 +58,7 @@ public class SpongeBlock extends Block { private boolean removeWaterBreadthFirstSearch(Level world, BlockPos pos) { BlockStateListPopulator blockList = new BlockStateListPopulator(world); // CraftBukkit - Use BlockStateListPopulator @@ -16220,7 +16167,7 @@ index d810f6bf9a8a354e5b8994e51ec3672428277dde..cc1ac862526377b2ac7b66bc20f428dc Direction[] aenumdirection = SpongeBlock.ALL_DIRECTIONS; int i = aenumdirection.length; -@@ -70,7 +70,7 @@ public class SpongeBlock extends Block { +@@ -77,7 +77,7 @@ public class SpongeBlock extends Block { FluidState fluid = blockList.getFluidState(blockposition1); // CraftBukkit end @@ -16229,7 +16176,7 @@ index d810f6bf9a8a354e5b8994e51ec3672428277dde..cc1ac862526377b2ac7b66bc20f428dc return false; } else { Block block = iblockdata.getBlock(); -@@ -85,6 +85,10 @@ public class SpongeBlock extends Block { +@@ -92,6 +92,10 @@ public class SpongeBlock extends Block { if (iblockdata.getBlock() instanceof LiquidBlock) { blockList.setBlock(blockposition1, Blocks.AIR.defaultBlockState(), 3); // CraftBukkit @@ -16241,10 +16188,10 @@ index d810f6bf9a8a354e5b8994e51ec3672428277dde..cc1ac862526377b2ac7b66bc20f428dc 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 0a95842c53a9d0286c57bcb42db97e468e30fb7d..0882e67c5cf876e0fc58a4ca4accb4be40418983 100644 +index 77ae7b8ab24935d046cce1f8f7f476310876f9df..b683f3c2fcd37b17a732802738cd14be87065e54 100644 --- a/src/main/java/net/minecraft/world/level/block/StonecutterBlock.java +++ b/src/main/java/net/minecraft/world/level/block/StonecutterBlock.java -@@ -92,4 +92,16 @@ public class StonecutterBlock extends Block { +@@ -99,4 +99,16 @@ public class StonecutterBlock extends Block { public boolean isPathfindable(BlockState state, BlockGetter world, BlockPos pos, PathComputationType type) { return false; } @@ -16262,19 +16209,19 @@ index 0a95842c53a9d0286c57bcb42db97e468e30fb7d..0882e67c5cf876e0fc58a4ca4accb4be + // Purpur end } diff --git a/src/main/java/net/minecraft/world/level/block/SugarCaneBlock.java b/src/main/java/net/minecraft/world/level/block/SugarCaneBlock.java -index c3f500580d257e1397f2eb7c47b063a6fe6bb405..21a194fadb7d1f0a30f94caf999dabdd78847f36 100644 +index ceaec1776067b7635c3952025f00f13f4ea86c88..8b6c43b0a2fb4b89d6f63716e56074ef0e194e63 100644 --- a/src/main/java/net/minecraft/world/level/block/SugarCaneBlock.java +++ b/src/main/java/net/minecraft/world/level/block/SugarCaneBlock.java -@@ -19,7 +19,7 @@ import net.minecraft.world.level.material.FluidState; +@@ -20,7 +20,7 @@ import net.minecraft.world.level.material.FluidState; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; -public class SugarCaneBlock extends Block { +public class SugarCaneBlock extends Block implements BonemealableBlock { // Purpur + public static final MapCodec CODEC = simpleCodec(SugarCaneBlock::new); public static final IntegerProperty AGE = BlockStateProperties.AGE_15; - protected static final float AABB_OFFSET = 6.0F; -@@ -106,4 +106,34 @@ public class SugarCaneBlock extends Block { +@@ -113,4 +113,34 @@ public class SugarCaneBlock extends Block { protected void createBlockStateDefinition(StateDefinition.Builder builder) { builder.add(SugarCaneBlock.AGE); } @@ -16310,10 +16257,10 @@ index c3f500580d257e1397f2eb7c47b063a6fe6bb405..21a194fadb7d1f0a30f94caf999dabdd + // Purpur end } diff --git a/src/main/java/net/minecraft/world/level/block/TurtleEggBlock.java b/src/main/java/net/minecraft/world/level/block/TurtleEggBlock.java -index 07157822659288e76b2fba34db8d5d566506f33b..e23b920be6702ef6faf97b42fb8a87442707d6be 100644 +index b0199e071cba4c7ad51799132d00b22b616953fc..2c0dcfc916f0845dc830a7ac9ffc828df20f27d0 100644 --- a/src/main/java/net/minecraft/world/level/block/TurtleEggBlock.java +++ b/src/main/java/net/minecraft/world/level/block/TurtleEggBlock.java -@@ -162,7 +162,7 @@ public class TurtleEggBlock extends Block { +@@ -169,7 +169,7 @@ public class TurtleEggBlock extends Block { private boolean shouldUpdateHatchLevel(Level world) { float f = world.getTimeOfDay(1.0F); @@ -16322,7 +16269,7 @@ index 07157822659288e76b2fba34db8d5d566506f33b..e23b920be6702ef6faf97b42fb8a8744 } @Override -@@ -195,6 +195,31 @@ public class TurtleEggBlock extends Block { +@@ -202,6 +202,31 @@ public class TurtleEggBlock extends Block { } private boolean canDestroyEgg(Level world, Entity entity) { @@ -16356,10 +16303,10 @@ index 07157822659288e76b2fba34db8d5d566506f33b..e23b920be6702ef6faf97b42fb8a8744 } } 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 6866605c7ef5361b21130a19a59c3fa3660dfb19..dee5d76d29da13f8639ab5d392cd0143201e71ba 100644 +index b4f75d034fbaea8ca68c1b5c5715773e0b8a9036..d05939c4b2ae42a09ee9e97431e83babfc8ed76c 100644 --- a/src/main/java/net/minecraft/world/level/block/TwistingVinesBlock.java +++ b/src/main/java/net/minecraft/world/level/block/TwistingVinesBlock.java -@@ -27,4 +27,11 @@ public class TwistingVinesBlock extends GrowingPlantHeadBlock { +@@ -34,4 +34,11 @@ public class TwistingVinesBlock extends GrowingPlantHeadBlock { protected boolean canGrowInto(BlockState state) { return NetherVines.isValidGrowthState(state); } @@ -16372,10 +16319,10 @@ index 6866605c7ef5361b21130a19a59c3fa3660dfb19..dee5d76d29da13f8639ab5d392cd0143 + // 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 e5c135ec059746b75fe58516809584221285cdbe..713c7e6e31a3e1097b612c77a4fce147c9252e0b 100644 +index 98e62d2cd3c106753c3be4a217e9107397d388ab..6a1fd51423c17cd1498cb313fa52314daaca0a29 100644 --- a/src/main/java/net/minecraft/world/level/block/WeepingVinesBlock.java +++ b/src/main/java/net/minecraft/world/level/block/WeepingVinesBlock.java -@@ -27,4 +27,11 @@ public class WeepingVinesBlock extends GrowingPlantHeadBlock { +@@ -34,4 +34,11 @@ public class WeepingVinesBlock extends GrowingPlantHeadBlock { protected boolean canGrowInto(BlockState state) { return NetherVines.isValidGrowthState(state); } @@ -16388,10 +16335,10 @@ index e5c135ec059746b75fe58516809584221285cdbe..713c7e6e31a3e1097b612c77a4fce147 + // Purpur end } diff --git a/src/main/java/net/minecraft/world/level/block/WitherSkullBlock.java b/src/main/java/net/minecraft/world/level/block/WitherSkullBlock.java -index 1aa0e921890d600c9274deb923da04e72b12bcc6..44bd7bee2665a05878fd2df935a700f02cd13a75 100644 +index fb180f0bcd20e51d41cfc924029c0b23d3d26258..688d161cd6725f494366c23668ebd6ff709b1587 100644 --- a/src/main/java/net/minecraft/world/level/block/WitherSkullBlock.java +++ b/src/main/java/net/minecraft/world/level/block/WitherSkullBlock.java -@@ -69,6 +69,7 @@ public class WitherSkullBlock extends SkullBlock { +@@ -76,6 +76,7 @@ public class WitherSkullBlock extends SkullBlock { entitywither.moveTo((double) blockposition1.getX() + 0.5D, (double) blockposition1.getY() + 0.55D, (double) blockposition1.getZ() + 0.5D, shapedetector_shapedetectorcollection.getForwards().getAxis() == Direction.Axis.X ? 0.0F : 90.0F, 0.0F); entitywither.yBodyRot = shapedetector_shapedetectorcollection.getForwards().getAxis() == Direction.Axis.X ? 0.0F : 90.0F; entitywither.makeInvulnerable(); @@ -16571,7 +16518,7 @@ index f13943db6f2fb923c52dcf9e8bf7000041d0a362..99ef8d7e3ee0ee9777d12ad825e728c3 BeaconBlockEntity.playSound(world, pos, SoundEvents.BEACON_AMBIENT); } diff --git a/src/main/java/net/minecraft/world/level/block/entity/BeehiveBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/BeehiveBlockEntity.java -index cf09525efd2d53bf884cd6ec3b0b9229715895eb..1098cf5a7675ec742caf687cc8828e09cfd3125e 100644 +index dfd364ac4b7551a13c4c6c100b5e62c0dfb10595..f5bcfece7bba52234964da646370bc271043a631 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/BeehiveBlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/BeehiveBlockEntity.java @@ -43,7 +43,7 @@ public class BeehiveBlockEntity extends BlockEntity { @@ -16848,10 +16795,10 @@ index 65e1381bb2d10bd212463feb602c60f8fdb9ade1..b7370e64fd0d50e8725d7d5afc30af2e + // Purpur } diff --git a/src/main/java/net/minecraft/world/level/block/entity/SignBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/SignBlockEntity.java -index 38cde466714e5663cd416b6afd5d2558e139ec09..2d625f18f2ba42ee5a1ebeea78ca395ad6f88b37 100644 +index bc01970c5ef9cde4a75394d6977837e924a38463..642e81d7ce763e3f983c83c967f7204164d260be 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/SignBlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/SignBlockEntity.java -@@ -202,16 +202,31 @@ public class SignBlockEntity extends BlockEntity implements CommandSource { // C +@@ -200,16 +200,31 @@ public class SignBlockEntity extends BlockEntity implements CommandSource { // C return this.setText((SignText) textChanger.apply(signtext), front); } @@ -16885,7 +16832,7 @@ index 38cde466714e5663cd416b6afd5d2558e139ec09..2d625f18f2ba42ee5a1ebeea78ca395a } } -@@ -351,6 +366,28 @@ public class SignBlockEntity extends BlockEntity implements CommandSource { // C +@@ -349,6 +364,28 @@ public class SignBlockEntity extends BlockEntity implements CommandSource { // C return ClientboundBlockEntityDataPacket.create(this); } @@ -16915,7 +16862,7 @@ index 38cde466714e5663cd416b6afd5d2558e139ec09..2d625f18f2ba42ee5a1ebeea78ca395a public CompoundTag getUpdateTag() { return this.saveWithoutMetadata(); diff --git a/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java -index 6569efea988243729af2c0df8d15edc848e95c13..fb7890bfe6b2390911adc74bb436fe5fd37315f3 100644 +index c7ebc50201a96b58dd3828a30eff1292a48a532e..df1a45f8cc21534dd4f7b54e47158564baa80655 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java @@ -178,6 +178,14 @@ public class TheEndGatewayBlockEntity extends TheEndPortalBlockEntity { @@ -16965,10 +16912,10 @@ index 744d91546d1a810f60a43c15ed74b4158f341a4a..354538daefa603f6df5a139b6bff87db } diff --git a/src/main/java/net/minecraft/world/level/block/state/BlockBehaviour.java b/src/main/java/net/minecraft/world/level/block/state/BlockBehaviour.java -index e6a4a5898ffdcb2aa2bc01371a6d7dbc06d610ce..e46a097dc134672720bc753ec0da0a9102737d2c 100644 +index 3ab8b99837b1d1faea722c598b0228b2780be8b1..0b6ab25fb59a7dd713a0fa9063f8590cad8414de 100644 --- a/src/main/java/net/minecraft/world/level/block/state/BlockBehaviour.java +++ b/src/main/java/net/minecraft/world/level/block/state/BlockBehaviour.java -@@ -81,7 +81,7 @@ public abstract class BlockBehaviour implements FeatureElement { +@@ -85,7 +85,7 @@ public abstract class BlockBehaviour implements FeatureElement { protected static final Direction[] UPDATE_SHAPE_ORDER = new Direction[]{Direction.WEST, Direction.EAST, Direction.NORTH, Direction.SOUTH, Direction.DOWN, Direction.UP}; public final boolean hasCollision; @@ -16977,7 +16924,7 @@ index e6a4a5898ffdcb2aa2bc01371a6d7dbc06d610ce..e46a097dc134672720bc753ec0da0a91 protected final boolean isRandomlyTicking; protected final SoundType soundType; protected final float friction; -@@ -89,7 +89,7 @@ public abstract class BlockBehaviour implements FeatureElement { +@@ -93,7 +93,7 @@ public abstract class BlockBehaviour implements FeatureElement { protected final float jumpFactor; protected final boolean dynamicShape; protected final FeatureFlagSet requiredFeatures; @@ -17105,7 +17052,7 @@ index d280c98aed5262c4ce39526c917de884f25a8584..e7d9f6802520620a1dcf0938256ffe80 @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 3583fcf5284bc5883308876dbd9886664b391e28..ba57accc272958da4714896baeadb52c99383561 100644 +index 2aca9b193db5dadc4fb90b8d7548277b698924aa..29ec2f9a35dd73e8a6adf2e4edcfe543270520d8 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 { @@ -17117,7 +17064,7 @@ index 3583fcf5284bc5883308876dbd9886664b391e28..ba57accc272958da4714896baeadb52c 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; -@@ -465,7 +465,7 @@ public class WalkNodeEvaluator extends NodeEvaluator { +@@ -471,7 +471,7 @@ public class WalkNodeEvaluator extends NodeEvaluator { return BlockPathTypes.BLOCKED; } else { // Paper end @@ -17126,7 +17073,7 @@ index 3583fcf5284bc5883308876dbd9886664b391e28..ba57accc272958da4714896baeadb52c return BlockPathTypes.DANGER_OTHER; } -@@ -498,7 +498,7 @@ public class WalkNodeEvaluator extends NodeEvaluator { +@@ -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; @@ -17136,7 +17083,7 @@ index 3583fcf5284bc5883308876dbd9886664b391e28..ba57accc272958da4714896baeadb52c return BlockPathTypes.STICKY_HONEY; } else if (blockState.is(Blocks.COCOA)) { diff --git a/src/main/java/net/minecraft/world/level/portal/PortalShape.java b/src/main/java/net/minecraft/world/level/portal/PortalShape.java -index c461e0d04047db9c0c5ecc04063cebd38bf96ec2..e7554ec800f321e4e34c926c53f2375a8c3aa979 100644 +index 590cd053a1b1c2a489772a2879998725fe0d783c..ba3f79cc1f7e672f0a9d32d262122ec6eba22b97 100644 --- a/src/main/java/net/minecraft/world/level/portal/PortalShape.java +++ b/src/main/java/net/minecraft/world/level/portal/PortalShape.java @@ -34,7 +34,7 @@ public class PortalShape { @@ -17179,7 +17126,7 @@ 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 e3dbf3066337a482460238f8a94d854cf88adfa2..5c70aa2ce1a9e89c8c271201b6755ea1325058ac 100644 +index 67d595f75e0c3bffdb27b85b25ccd1f0bf1427d5..4d0c524af87d05dbd4a923ad6c40e1f26149e921 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 { @@ -17194,7 +17141,7 @@ index e3dbf3066337a482460238f8a94d854cf88adfa2..5c70aa2ce1a9e89c8c271201b6755ea1 + // Purpur } diff --git a/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java b/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java -index 2bbc39c257965ad91ee360cdfcd3538a0f041c7e..d0e3b531392738679894a989293ae49eb319676c 100644 +index 2bbc39c257965ad91ee360cdfcd3538a0f041c7e..91fbc0cfc84045e32a4ee16fba8164de7901c7e6 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java @@ -567,4 +567,213 @@ public class CraftOfflinePlayer implements OfflinePlayer, ConfigurationSerializa @@ -17401,10 +17348,10 @@ index 2bbc39c257965ad91ee360cdfcd3538a0f041c7e..d0e3b531392738679894a989293ae49e + File playerDir = server.console.playerDataStorage.getPlayerDir(); + try { + File tempFile = File.createTempFile(this.getUniqueId()+"-", ".dat", playerDir); -+ net.minecraft.nbt.NbtIo.writeCompressed(compoundTag, tempFile); ++ net.minecraft.nbt.NbtIo.writeCompressed(compoundTag, tempFile.toPath()); + File playerDataFile = new File(playerDir, this.getUniqueId()+".dat"); + File playerDataFileOld = new File(playerDir, this.getUniqueId()+".dat_old"); -+ net.minecraft.Util.safeReplaceFile(playerDataFile, tempFile, playerDataFileOld); ++ net.minecraft.Util.safeReplaceFile(playerDataFile.toPath(), tempFile.toPath(), playerDataFileOld.toPath()); + } catch (java.io.IOException e) { + e.printStackTrace(); + } @@ -17412,10 +17359,10 @@ index 2bbc39c257965ad91ee360cdfcd3538a0f041c7e..d0e3b531392738679894a989293ae49e + // Purpur end - OfflinePlayer API } diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 135fd0f6843659b55cc4f5e1482b0544adf6acae..8d8e4623b2551f1d51714a5e3daa4d418f8d8f63 100644 +index cae462613284bea0029e1087f80d758e89090c12..9ef1d6bf3b8ec431a7747c4edb4b61671758b7e9 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -405,6 +405,20 @@ public final class CraftServer implements Server { +@@ -406,6 +406,20 @@ public final class CraftServer implements Server { this.dataPackManager = new CraftDataPackManager(this.getServer().getPackRepository()); Bukkit.setServer(this); @@ -17436,7 +17383,7 @@ index 135fd0f6843659b55cc4f5e1482b0544adf6acae..8d8e4623b2551f1d51714a5e3daa4d41 CraftRegistry.setMinecraftRegistry(console.registryAccess()); -@@ -1046,6 +1060,7 @@ public final class CraftServer implements Server { +@@ -1041,6 +1055,7 @@ public final class CraftServer implements Server { org.spigotmc.SpigotConfig.init((File) this.console.options.valueOf("spigot-settings")); // Spigot this.console.paperConfigurations.reloadConfigs(this.console); this.console.galeConfigurations.reloadConfigs(this.console); // Gale - Gale configuration @@ -17444,7 +17391,7 @@ index 135fd0f6843659b55cc4f5e1482b0544adf6acae..8d8e4623b2551f1d51714a5e3daa4d41 for (ServerLevel world : this.console.getAllLevels()) { // world.serverLevelData.setDifficulty(config.difficulty); // Paper - per level difficulty world.setSpawnSettings(world.serverLevelData.getDifficulty() != Difficulty.PEACEFUL && config.spawnMonsters, config.spawnAnimals); // Paper - per level difficulty (from MinecraftServer#setDifficulty(ServerLevel, Difficulty, boolean)) -@@ -1061,6 +1076,7 @@ public final class CraftServer implements Server { +@@ -1056,6 +1071,7 @@ public final class CraftServer implements Server { } } world.spigotConfig.init(); // Spigot @@ -17452,7 +17399,7 @@ index 135fd0f6843659b55cc4f5e1482b0544adf6acae..8d8e4623b2551f1d51714a5e3daa4d41 } Plugin[] pluginClone = pluginManager.getPlugins().clone(); // Paper -@@ -1076,6 +1092,7 @@ public final class CraftServer implements Server { +@@ -1071,6 +1087,7 @@ public final class CraftServer implements Server { this.reloadData(); org.spigotmc.SpigotConfig.registerCommands(); // Spigot io.papermc.paper.command.PaperCommands.registerCommands(this.console); // Paper @@ -17460,7 +17407,7 @@ index 135fd0f6843659b55cc4f5e1482b0544adf6acae..8d8e4623b2551f1d51714a5e3daa4d41 this.overrideAllCommandBlockCommands = this.commandsConfiguration.getStringList("command-block-overrides").contains("*"); this.ignoreVanillaPermissions = this.commandsConfiguration.getBoolean("ignore-vanilla-permissions"); -@@ -1541,6 +1558,55 @@ public final class CraftServer implements Server { +@@ -1573,6 +1590,55 @@ public final class CraftServer implements Server { return true; } @@ -17516,7 +17463,7 @@ index 135fd0f6843659b55cc4f5e1482b0544adf6acae..8d8e4623b2551f1d51714a5e3daa4d41 @Override public List getRecipesFor(ItemStack result) { Preconditions.checkArgument(result != null, "ItemStack cannot be null"); -@@ -2941,6 +3007,7 @@ public final class CraftServer implements Server { +@@ -2973,6 +3039,7 @@ public final class CraftServer implements Server { @Override public double[] getTPS() { return new double[] { @@ -17524,7 +17471,7 @@ index 135fd0f6843659b55cc4f5e1482b0544adf6acae..8d8e4623b2551f1d51714a5e3daa4d41 net.minecraft.server.MinecraftServer.getServer().tps1.getAverage(), net.minecraft.server.MinecraftServer.getServer().tps5.getAverage(), net.minecraft.server.MinecraftServer.getServer().tps15.getAverage() -@@ -3033,6 +3100,18 @@ public final class CraftServer implements Server { +@@ -3065,6 +3132,18 @@ public final class CraftServer implements Server { } // Gale end - Gale configuration - API @@ -17543,7 +17490,7 @@ index 135fd0f6843659b55cc4f5e1482b0544adf6acae..8d8e4623b2551f1d51714a5e3daa4d41 @Override public void restart() { org.spigotmc.RestartCommand.restart(); -@@ -3269,4 +3348,15 @@ public final class CraftServer implements Server { +@@ -3301,4 +3380,15 @@ public final class CraftServer implements Server { } // Gale end - YAPFA - last tick time - API @@ -17560,10 +17507,10 @@ index 135fd0f6843659b55cc4f5e1482b0544adf6acae..8d8e4623b2551f1d51714a5e3daa4d41 + // Purpur end } diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -index 656394bd8e4de8f3292a7781c0dcbf30c2a2ed6b..ee2087cd33167547b0713fa329f00d3c7257165d 100644 +index 5c3d07151ff26377b4d0dbeff793fe7e27176ad8..cd342de8266237d49c143a4cdb803d09b8579986 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -@@ -2354,6 +2354,48 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -2360,6 +2360,48 @@ public class CraftWorld extends CraftRegionAccessor implements World { return (this.getHandle().getDragonFight() == null) ? null : new CraftDragonBattle(this.getHandle().getDragonFight()); } @@ -17613,7 +17560,7 @@ index 656394bd8e4de8f3292a7781c0dcbf30c2a2ed6b..ee2087cd33167547b0713fa329f00d3c public PersistentDataContainer getPersistentDataContainer() { return this.persistentDataContainer; diff --git a/src/main/java/org/bukkit/craftbukkit/Main.java b/src/main/java/org/bukkit/craftbukkit/Main.java -index e8f4e3620062a507f00c2b76a934ec48b0d5d89e..85f0ed9073dff0540e6eac26bc634f4d54a60db1 100644 +index 231ea6f9a149868163a124a0056c197dd9b3a48c..802f30f6bacac22e581fef0ff6a3e668d656607f 100644 --- a/src/main/java/org/bukkit/craftbukkit/Main.java +++ b/src/main/java/org/bukkit/craftbukkit/Main.java @@ -195,6 +195,14 @@ public class Main { @@ -17753,17 +17700,18 @@ 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 21e83238a0bad86ffacf60d5c5612771a49ef33d..a38149b8883195736ec6093aeb54971a89ec056c 100644 +index 4daf2c54c7127e8e091ffc49362f288594956143..f782e8dd9d3456f345859dffd69e5830d576ccd1 100644 --- a/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java +++ b/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java -@@ -59,6 +59,7 @@ public class CraftEnchantment extends Enchantment { - return EnchantmentTarget.CROSSBOW; - case VANISHABLE: - return EnchantmentTarget.VANISHABLE; -+ case BOW_AND_CROSSBOW: return EnchantmentTarget.BOW_AND_CROSSBOW; // Purpur - default: - return null; - } +@@ -80,6 +80,8 @@ public class CraftEnchantment extends Enchantment { + case TRIDENT -> EnchantmentTarget.TRIDENT; + case CROSSBOW -> EnchantmentTarget.CROSSBOW; + case VANISHABLE -> EnchantmentTarget.VANISHABLE; ++ case BOW_AND_CROSSBOW -> EnchantmentTarget.BOW_AND_CROSSBOW; // Purpur ++ case WEAPON_AND_SHEARS -> EnchantmentTarget.WEAPON_AND_SHEARS; // Purpur + }; + } + diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEndermite.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEndermite.java index d657fd2c507a5b215aeab0a5f3e9c2ee892a27c8..985e9ec21c60a1f47973bd5fc53b96a6f9b7d04a 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEndermite.java @@ -17784,10 +17732,10 @@ index d657fd2c507a5b215aeab0a5f3e9c2ee892a27c8..985e9ec21c60a1f47973bd5fc53b96a6 // Paper start @Override diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java -index 9f843b89dc20b91bf7243facee8486d525e4a1b3..7ca35289068dbece3f9f19384fe202fc844eceea 100644 +index aa4dbf91cf6da329fdcacbde98bb870eb48e8f5c..03b38dd69cd6932c17b9b2d832e67c14628a4918 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java -@@ -223,6 +223,11 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { +@@ -228,6 +228,11 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { this.entityType = CraftEntityType.minecraftToBukkit(entity.getType()); } @@ -17799,7 +17747,7 @@ index 9f843b89dc20b91bf7243facee8486d525e4a1b3..7ca35289068dbece3f9f19384fe202fc public static CraftEntity getEntity(CraftServer server, Entity entity) { /* * Order is *EXTREMELY* important -- keep it right! =D -@@ -600,6 +605,10 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { +@@ -607,6 +612,10 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { // Paper end if ((!ignorePassengers && this.entity.isVehicle()) || this.entity.isRemoved()) { // Paper - Teleport passenger API @@ -17810,7 +17758,7 @@ index 9f843b89dc20b91bf7243facee8486d525e4a1b3..7ca35289068dbece3f9f19384fe202fc return false; } -@@ -1538,4 +1547,27 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { +@@ -1582,4 +1591,27 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { return this.getHandle().getScoreboardName(); } // Paper end - entity scoreboard name @@ -17839,10 +17787,10 @@ index 9f843b89dc20b91bf7243facee8486d525e4a1b3..7ca35289068dbece3f9f19384fe202fc + // Purpur end } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java -index aefb9879b2edadfb4b21d80135d713b9d34c9941..2a534391e49c0653fd98fe5c22e474ae7e82feef 100644 +index 8a1e765363aeb61078fd23980d3856dc680cb05e..aac60c61fc631c8ecac161eae513a305610a3dfb 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java -@@ -266,6 +266,7 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { +@@ -267,6 +267,7 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { @Override public void recalculatePermissions() { this.perm.recalculatePermissions(); @@ -17873,7 +17821,7 @@ index 63cae1a2e95d8da17c45c4404a8dd0ca6a413c39..966587c2788b5c93be83259ddc962a89 + // Purpur end } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java -index f444e843535ec68ede0f05e7e7ef182ce872342b..6f967e1bce4d359efcdf2a82d4ab6f6b030c0731 100644 +index 81498941748d646ebe6495f4a7ce6953532144c6..df1f7bd8d2e1ef29cc65443bc8f929acd4bcdc53 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java @@ -151,4 +151,46 @@ public class CraftItem extends CraftEntity implements Item { @@ -17924,10 +17872,10 @@ index f444e843535ec68ede0f05e7e7ef182ce872342b..6f967e1bce4d359efcdf2a82d4ab6f6b + // Purpur end } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java -index 6be370a2be88aac6e229210ef625380171504693..afcab60de32e61b0dbdddb36b7839b854c3602ab 100644 +index ba2cd9c4cdbd5ddab1300320d7e0ede4d4b7a31a..f346ef373a1eeaa063a90302e20ee90821d63e40 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java -@@ -453,7 +453,7 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { +@@ -454,7 +454,7 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { net.minecraft.server.level.ServerPlayer entityPlayer = killer == null ? null : ((CraftPlayer) killer).getHandle(); getHandle().lastHurtByPlayer = entityPlayer; getHandle().lastHurtByMob = entityPlayer; @@ -17936,7 +17884,7 @@ index 6be370a2be88aac6e229210ef625380171504693..afcab60de32e61b0dbdddb36b7839b85 } // Paper end -@@ -465,7 +465,7 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { +@@ -466,7 +466,7 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { @Override public boolean addPotionEffect(PotionEffect effect, boolean force) { org.spigotmc.AsyncCatcher.catchOp("effect add"); // Paper @@ -17945,7 +17893,7 @@ index 6be370a2be88aac6e229210ef625380171504693..afcab60de32e61b0dbdddb36b7839b85 return true; } -@@ -486,7 +486,7 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { +@@ -487,7 +487,7 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { @Override public PotionEffect getPotionEffect(PotionEffectType type) { MobEffectInstance handle = this.getHandle().getEffect(CraftPotionEffectType.bukkitToMinecraft(type)); @@ -17954,7 +17902,7 @@ index 6be370a2be88aac6e229210ef625380171504693..afcab60de32e61b0dbdddb36b7839b85 } @Override -@@ -498,7 +498,7 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { +@@ -499,7 +499,7 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { public Collection getActivePotionEffects() { List effects = new ArrayList(); for (MobEffectInstance handle : this.getHandle().activeEffects.values()) { @@ -17963,7 +17911,7 @@ index 6be370a2be88aac6e229210ef625380171504693..afcab60de32e61b0dbdddb36b7839b85 } return effects; } -@@ -1115,4 +1115,32 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { +@@ -1120,4 +1120,32 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { getHandle().knockback(strength, directionX, directionZ); }; // Paper end @@ -18018,10 +17966,10 @@ index 0ad16ee7b33582d214dab41eeee378d52c8e38ed..16bd1294c219f15ada653ef810bc2d74 + // Purpur end } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 3a792ddc31e76038b84e8f87088c4cd94c349138..3b3bbeda831f82b6d9b284d85a31a1fff578a64f 100644 +index fd84786f3e72875e79df46416f47f3403876cef3..dd3af429e9949a8dea09abf29bac226cc1f82e8c 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -519,10 +519,15 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -527,10 +527,15 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @Override public void setPlayerListName(String name) { @@ -18038,7 +17986,7 @@ index 3a792ddc31e76038b84e8f87088c4cd94c349138..3b3bbeda831f82b6d9b284d85a31a1ff for (ServerPlayer player : (List) this.server.getHandle().players) { if (player.getBukkitEntity().canSee(this)) { player.connection.send(new ClientboundPlayerInfoUpdatePacket(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_DISPLAY_NAME, this.getHandle())); -@@ -1358,6 +1363,10 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -1366,6 +1371,10 @@ public class CraftPlayer extends CraftHumanEntity implements Player { } if (entity.isVehicle() && !ignorePassengers) { // Paper - Teleport API @@ -18049,7 +17997,7 @@ index 3a792ddc31e76038b84e8f87088c4cd94c349138..3b3bbeda831f82b6d9b284d85a31a1ff return false; } -@@ -2518,6 +2527,28 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -2556,6 +2565,28 @@ public class CraftPlayer extends CraftHumanEntity implements Player { return this.getHandle().getAbilities().walkingSpeed * 2f; } @@ -18078,7 +18026,7 @@ index 3a792ddc31e76038b84e8f87088c4cd94c349138..3b3bbeda831f82b6d9b284d85a31a1ff private void validateSpeed(float value) { Preconditions.checkArgument(value <= 1f && value >= -1f, "Speed value (%s) need to be between -1f and 1f", value); } -@@ -3303,4 +3334,70 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -3293,4 +3324,70 @@ public class CraftPlayer extends CraftHumanEntity implements Player { return this.spigot; } // Spigot end @@ -18231,7 +18179,7 @@ index 38b6d2c377800134de592a780b737b45c8096a11..449acd9dc983be1cd51208bc8f8d843d + // Purpur end } diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java -index 64ae7cfe765ebe697a2cce1b71751e628d6f1662..1920c154b43711473cdf29aeb881a773b8ce45df 100644 +index f5a5ae30dfba21d5cf3990c046cfe41547e8a87a..7feace95794a2e1e4b0b14b5d0bc236db352ff65 100644 --- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java @@ -594,6 +594,15 @@ public class CraftEventFactory { @@ -18250,7 +18198,7 @@ index 64ae7cfe765ebe697a2cce1b71751e628d6f1662..1920c154b43711473cdf29aeb881a773 return event; } -@@ -1071,6 +1080,7 @@ public class CraftEventFactory { +@@ -1073,6 +1082,7 @@ public class CraftEventFactory { damageCause = DamageCause.ENTITY_EXPLOSION; } event = new EntityDamageByEntityEvent(damager.getBukkitEntity(), entity.getBukkitEntity(), damageCause, modifiers, modifierFunctions, source.isCritical()); // Paper - add critical damage API @@ -18258,7 +18206,7 @@ index 64ae7cfe765ebe697a2cce1b71751e628d6f1662..1920c154b43711473cdf29aeb881a773 } event.setCancelled(cancelled); -@@ -1185,6 +1195,7 @@ public class CraftEventFactory { +@@ -1187,6 +1197,7 @@ public class CraftEventFactory { } else { entity.lastDamageCancelled = true; // SPIGOT-5339, SPIGOT-6252, SPIGOT-6777: Keep track if the event was canceled } @@ -18266,7 +18214,7 @@ index 64ae7cfe765ebe697a2cce1b71751e628d6f1662..1920c154b43711473cdf29aeb881a773 return event; } -@@ -1248,6 +1259,7 @@ public class CraftEventFactory { +@@ -1250,6 +1261,7 @@ public class CraftEventFactory { EntityDamageEvent event; if (damager != null) { event = new EntityDamageByEntityEvent(damager.getBukkitEntity(), damagee.getBukkitEntity(), cause, modifiers, modifierFunctions, critical); // Paper - add critical damage API @@ -18275,10 +18223,10 @@ index 64ae7cfe765ebe697a2cce1b71751e628d6f1662..1920c154b43711473cdf29aeb881a773 event = new EntityDamageEvent(damagee.getBukkitEntity(), cause, modifiers, modifierFunctions); } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java -index b4bd318d61834d70d666577073f18e4c49ded113..a35f60b01b371673023bd23f47a8ddafd38787f2 100644 +index 977b77547f7ba62cef3640cf8d4f1c8e7cded53a..beae43e9b6fe447e7515d878ac175f461968768a 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java -@@ -181,8 +181,19 @@ public class CraftContainer extends AbstractContainerMenu { +@@ -184,8 +184,19 @@ public class CraftContainer extends AbstractContainerMenu { case PLAYER: case CHEST: case ENDER_CHEST: @@ -18300,10 +18248,10 @@ index b4bd318d61834d70d666577073f18e4c49ded113..a35f60b01b371673023bd23f47a8ddaf case DISPENSER: case DROPPER: diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java -index 471ae4458e7ea7c29d7551b32cec98180fbccd4e..23db63c78e9fcf86cd498b3ed36ca50253c2fe97 100644 +index 3b0d3e9a067fccb10122c273aaf658ba240aa716..9b7fd460d3393e07970c66fec7f35a918675cd58 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java -@@ -83,7 +83,7 @@ public class CraftInventory implements Inventory { +@@ -84,7 +84,7 @@ public class CraftInventory implements Inventory { @Override public void setContents(ItemStack[] items) { @@ -18353,10 +18301,10 @@ index 9ee14589d63bbfc0880f2eee5e924fe946ee0035..0a5841fa26698e60bdeadbb58b9343fe + // Purpur end } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java -index 9469b0d5d8a46ac17c3998a4b537a4feb1deb3b0..89c10c309f0703711afdf4357cb72d0058b30e27 100644 +index c77634ec9c4e7a9eaacc81de7f95e9452b393a52..dea0996e0b29d398249940ab25ab837eb15d23df 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java -@@ -599,4 +599,17 @@ public final class CraftItemFactory implements ItemFactory { +@@ -602,4 +602,17 @@ public final class CraftItemFactory implements ItemFactory { return CraftItemStack.asCraftMirror(enchanted); } // Paper end - enchantWithLevels API @@ -18472,7 +18420,7 @@ index 844fb8c662a409670f631228f687d85c5436d3dd..2bfa5908f1848702ceb42da7576a609d public static boolean equals(MobEffect mobEffect, PotionEffectType type) { diff --git a/src/main/java/org/bukkit/craftbukkit/util/permissions/CommandPermissions.java b/src/main/java/org/bukkit/craftbukkit/util/permissions/CommandPermissions.java -index ea732f8fe7b5dd56aab5d3a061a1cad19c49ae0b..8d2b0dc792120eda396947f5935052346f770567 100644 +index dd95b3bfe59f2bb635afe92317288efcd2986326..11f43f44f359ce57d3a8f3322e58b9f5dfdaf00a 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/permissions/CommandPermissions.java +++ b/src/main/java/org/bukkit/craftbukkit/util/permissions/CommandPermissions.java @@ -23,7 +23,15 @@ public final class CommandPermissions { @@ -18494,7 +18442,7 @@ index ea732f8fe7b5dd56aab5d3a061a1cad19c49ae0b..8d2b0dc792120eda396947f593505234 DefaultPermissions.registerPermission(CommandPermissions.PREFIX + "seed", "Allows the user to view the seed of the world", PermissionDefault.OP, commands); diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java new file mode 100644 -index 0000000000000000000000000000000000000000..1be93b19b51b0772bebc9add05583a4660a35ce6 +index 0000000000000000000000000000000000000000..b12437a7e292fbf9aefc7a41b5bc1695733a11c5 --- /dev/null +++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java @@ -0,0 +1,636 @@ @@ -18575,8 +18523,8 @@ index 0000000000000000000000000000000000000000..1be93b19b51b0772bebc9add05583a46 + commands = new HashMap<>(); + commands.put("purpur", new PurpurCommand("purpur")); + -+ version = getInt("config-version", 33); -+ set("config-version", 33); ++ version = getInt("config-version", 34); ++ set("config-version", 34); + + readConfig(PurpurConfig.class, null); + @@ -19136,10 +19084,10 @@ index 0000000000000000000000000000000000000000..1be93b19b51b0772bebc9add05583a46 +} 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..47e7e93dde48a75d61904bc7f40cb6a47cc79a15 +index 0000000000000000000000000000000000000000..ff9efaa4455e1030e54aab46bc7bfd2f390793c6 --- /dev/null +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -0,0 +1,3227 @@ +@@ -0,0 +1,3292 @@ +package org.purpurmc.purpur; + +import net.minecraft.core.registries.BuiltInRegistries; @@ -19577,8 +19525,6 @@ index 0000000000000000000000000000000000000000..47e7e93dde48a75d61904bc7f40cb6a4 + public double playerCriticalDamageMultiplier = 1.5D; + public int playerBurpDelay = 10; + public boolean playerBurpWhenFull = false; -+ public int playerPortalWaitTime = 80; -+ public int playerCreativePortalWaitTime = 1; + public boolean playerRidableInWater = false; + public boolean playerRemoveBindingWithWeakness = false; + public int shiftRightClickRepairsMendingPoints = 0; @@ -19607,8 +19553,6 @@ index 0000000000000000000000000000000000000000..47e7e93dde48a75d61904bc7f40cb6a4 + playerCriticalDamageMultiplier = getDouble("gameplay-mechanics.player.critical-damage-multiplier", playerCriticalDamageMultiplier); + playerBurpDelay = getInt("gameplay-mechanics.player.burp-delay", playerBurpDelay); + playerBurpWhenFull = getBoolean("gameplay-mechanics.player.burp-when-full", playerBurpWhenFull); -+ playerPortalWaitTime = getInt("gameplay-mechanics.player.portal-wait-time", playerPortalWaitTime); -+ playerCreativePortalWaitTime = getInt("gameplay-mechanics.player.creative-portal-wait-time", playerCreativePortalWaitTime); + playerRidableInWater = getBoolean("gameplay-mechanics.player.ridable-in-water", playerRidableInWater); + playerRemoveBindingWithWeakness = getBoolean("gameplay-mechanics.player.curse-of-binding.remove-with-weakness", playerRemoveBindingWithWeakness); + shiftRightClickRepairsMendingPoints = getInt("gameplay-mechanics.player.shift-right-click-repairs-mending-points", shiftRightClickRepairsMendingPoints); @@ -19750,6 +19694,45 @@ index 0000000000000000000000000000000000000000..47e7e93dde48a75d61904bc7f40cb6a4 + }); + set("gameplay-mechanics.shovel-turns-block-to-grass-path", null); + } ++ if (PurpurConfig.version < 34) { ++ PurpurConfig.config.set("world-settings.default.tools.axe.waxables.minecraft:waxed_chiseled_copper", Map.of("into", "minecraft:chiseled_copper", "drops", new HashMap())); ++ PurpurConfig.config.set("world-settings.default.tools.axe.waxables.minecraft:waxed_exposed_chiseled_copper", Map.of("into", "minecraft:exposed_chiseled_copper", "drops", new HashMap())); ++ PurpurConfig.config.set("world-settings.default.tools.axe.waxables.minecraft:waxed_weathered_chiseled_copper", Map.of("into", "minecraft:weathered_chiseled_copper", "drops", new HashMap())); ++ PurpurConfig.config.set("world-settings.default.tools.axe.waxables.minecraft:waxed_oxidized_chiseled_copper", Map.of("into", "minecraft:oxidized_chiseled_copper", "drops", new HashMap())); ++ PurpurConfig.config.set("world-settings.default.tools.axe.waxables.minecraft:waxed_copper_door", Map.of("into", "minecraft:copper_door", "drops", new HashMap())); ++ PurpurConfig.config.set("world-settings.default.tools.axe.waxables.minecraft:waxed_exposed_copper_door", Map.of("into", "minecraft:exposed_copper_door", "drops", new HashMap())); ++ PurpurConfig.config.set("world-settings.default.tools.axe.waxables.minecraft:waxed_weathered_copper_door", Map.of("into", "minecraft:weathered_copper_door", "drops", new HashMap())); ++ PurpurConfig.config.set("world-settings.default.tools.axe.waxables.minecraft:waxed_oxidized_copper_door", Map.of("into", "minecraft:oxidized_copper_door", "drops", new HashMap())); ++ PurpurConfig.config.set("world-settings.default.tools.axe.waxables.minecraft:waxed_copper_trapdoor", Map.of("into", "minecraft:copper_trapdoor", "drops", new HashMap())); ++ PurpurConfig.config.set("world-settings.default.tools.axe.waxables.minecraft:waxed_exposed_copper_trapdoor", Map.of("into", "minecraft:exposed_copper_trapdoor", "drops", new HashMap())); ++ PurpurConfig.config.set("world-settings.default.tools.axe.waxables.minecraft:waxed_weathered_copper_trapdoor", Map.of("into", "minecraft:weathered_copper_trapdoor", "drops", new HashMap())); ++ PurpurConfig.config.set("world-settings.default.tools.axe.waxables.minecraft:waxed_oxidized_copper_trapdoor", Map.of("into", "minecraft:oxidized_copper_trapdoor", "drops", new HashMap())); ++ PurpurConfig.config.set("world-settings.default.tools.axe.waxables.minecraft:waxed_copper_grate", Map.of("into", "minecraft:copper_grate", "drops", new HashMap())); ++ PurpurConfig.config.set("world-settings.default.tools.axe.waxables.minecraft:waxed_exposed_copper_grate", Map.of("into", "minecraft:exposed_copper_grate", "drops", new HashMap())); ++ PurpurConfig.config.set("world-settings.default.tools.axe.waxables.minecraft:waxed_weathered_copper_grate", Map.of("into", "minecraft:weathered_copper_grate", "drops", new HashMap())); ++ PurpurConfig.config.set("world-settings.default.tools.axe.waxables.minecraft:waxed_oxidized_copper_grate", Map.of("into", "minecraft:oxidized_copper_grate", "drops", new HashMap())); ++ PurpurConfig.config.set("world-settings.default.tools.axe.waxables.minecraft:waxed_copper_bulb", Map.of("into", "minecraft:copper_bulb", "drops", new HashMap())); ++ PurpurConfig.config.set("world-settings.default.tools.axe.waxables.minecraft:waxed_exposed_copper_bulb", Map.of("into", "minecraft:exposed_copper_bulb", "drops", new HashMap())); ++ PurpurConfig.config.set("world-settings.default.tools.axe.waxables.minecraft:waxed_weathered_copper_bulb", Map.of("into", "minecraft:weathered_copper_bulb", "drops", new HashMap())); ++ PurpurConfig.config.set("world-settings.default.tools.axe.waxables.minecraft:waxed_oxidized_copper_bulb", Map.of("into", "minecraft:oxidized_copper_bulb", "drops", new HashMap())); ++ ++ PurpurConfig.config.set("world-settings.default.tools.axe.weatherables.minecraft:exposed_chiseled_copper", Map.of("into", "minecraft:chiseled_copper", "drops", new HashMap())); ++ PurpurConfig.config.set("world-settings.default.tools.axe.weatherables.minecraft:weathered_chiseled_copper", Map.of("into", "minecraft:exposed_chiseled_copper", "drops", new HashMap())); ++ PurpurConfig.config.set("world-settings.default.tools.axe.weatherables.minecraft:oxidized_chiseled_copper", Map.of("into", "minecraft:weathered_chiseled_copper", "drops", new HashMap())); ++ PurpurConfig.config.set("world-settings.default.tools.axe.weatherables.minecraft:oxidized_cut_copper_stairs", Map.of("into", "minecraft:weathered_cut_copper_stairs", "drops", new HashMap())); ++ PurpurConfig.config.set("world-settings.default.tools.axe.weatherables.minecraft:exposed_copper_door", Map.of("into", "minecraft:copper_door", "drops", new HashMap())); ++ PurpurConfig.config.set("world-settings.default.tools.axe.weatherables.minecraft:weathered_copper_door", Map.of("into", "minecraft:exposed_copper_door", "drops", new HashMap())); ++ PurpurConfig.config.set("world-settings.default.tools.axe.weatherables.minecraft:oxidized_copper_door", Map.of("into", "minecraft:weathered_copper_door", "drops", new HashMap())); ++ PurpurConfig.config.set("world-settings.default.tools.axe.weatherables.minecraft:exposed_copper_trapdoor", Map.of("into", "minecraft:copper_trapdoor", "drops", new HashMap())); ++ PurpurConfig.config.set("world-settings.default.tools.axe.weatherables.minecraft:weathered_copper_trapdoor", Map.of("into", "minecraft:exposed_copper_trapdoor", "drops", new HashMap())); ++ PurpurConfig.config.set("world-settings.default.tools.axe.weatherables.minecraft:oxidized_copper_trapdoor", Map.of("into", "minecraft:weathered_copper_trapdoor", "drops", new HashMap())); ++ PurpurConfig.config.set("world-settings.default.tools.axe.weatherables.minecraft:exposed_copper_grate", Map.of("into", "minecraft:copper_grate", "drops", new HashMap())); ++ PurpurConfig.config.set("world-settings.default.tools.axe.weatherables.minecraft:weathered_copper_grate", Map.of("into", "minecraft:exposed_copper_grate", "drops", new HashMap())); ++ PurpurConfig.config.set("world-settings.default.tools.axe.weatherables.minecraft:oxidized_copper_grate", Map.of("into", "minecraft:weathered_copper_grate", "drops", new HashMap())); ++ PurpurConfig.config.set("world-settings.default.tools.axe.weatherables.minecraft:exposed_copper_bulb", Map.of("into", "minecraft:copper_bulb", "drops", new HashMap())); ++ PurpurConfig.config.set("world-settings.default.tools.axe.weatherables.minecraft:weathered_copper_bulb", Map.of("into", "minecraft:exposed_copper_bulb", "drops", new HashMap())); ++ PurpurConfig.config.set("world-settings.default.tools.axe.weatherables.minecraft:oxidized_copper_bulb", Map.of("into", "minecraft:weathered_copper_bulb", "drops", new HashMap())); ++ } + getMap("tools.axe.strippables", Map.ofEntries( + Map.entry("minecraft:oak_wood", Map.of("into", "minecraft:stripped_oak_wood", "drops", new HashMap())), + Map.entry("minecraft:oak_log", Map.of("into", "minecraft:stripped_oak_log", "drops", new HashMap())), @@ -19805,7 +19788,27 @@ index 0000000000000000000000000000000000000000..47e7e93dde48a75d61904bc7f40cb6a4 + Map.entry("minecraft:waxed_cut_copper_stairs", Map.of("into", "minecraft:cut_copper_stairs", "drops", new HashMap())), + Map.entry("minecraft:waxed_exposed_cut_copper_stairs", Map.of("into", "minecraft:exposed_cut_copper_stairs", "drops", new HashMap())), + Map.entry("minecraft:waxed_weathered_cut_copper_stairs", Map.of("into", "minecraft:weathered_cut_copper_stairs", "drops", new HashMap())), -+ Map.entry("minecraft:waxed_oxidized_cut_copper_stairs", Map.of("into", "minecraft:oxidized_cut_copper_stairs", "drops", new HashMap()))) ++ Map.entry("minecraft:waxed_oxidized_cut_copper_stairs", Map.of("into", "minecraft:oxidized_cut_copper_stairs", "drops", new HashMap())), ++ Map.entry("minecraft:waxed_chiseled_copper", Map.of("into", "minecraft:chiseled_copper", "drops", new HashMap())), ++ Map.entry("minecraft:waxed_exposed_chiseled_copper", Map.of("into", "minecraft:exposed_chiseled_copper", "drops", new HashMap())), ++ Map.entry("minecraft:waxed_weathered_chiseled_copper", Map.of("into", "minecraft:weathered_chiseled_copper", "drops", new HashMap())), ++ Map.entry("minecraft:waxed_oxidized_chiseled_copper", Map.of("into", "minecraft:oxidized_chiseled_copper", "drops", new HashMap())), ++ Map.entry("minecraft:waxed_copper_door", Map.of("into", "minecraft:copper_door", "drops", new HashMap())), ++ Map.entry("minecraft:waxed_exposed_copper_door", Map.of("into", "minecraft:exposed_copper_door", "drops", new HashMap())), ++ Map.entry("minecraft:waxed_weathered_copper_door", Map.of("into", "minecraft:weathered_copper_door", "drops", new HashMap())), ++ Map.entry("minecraft:waxed_oxidized_copper_door", Map.of("into", "minecraft:oxidized_copper_door", "drops", new HashMap())), ++ Map.entry("minecraft:waxed_copper_trapdoor", Map.of("into", "minecraft:copper_trapdoor", "drops", new HashMap())), ++ Map.entry("minecraft:waxed_exposed_copper_trapdoor", Map.of("into", "minecraft:exposed_copper_trapdoor", "drops", new HashMap())), ++ Map.entry("minecraft:waxed_weathered_copper_trapdoor", Map.of("into", "minecraft:weathered_copper_trapdoor", "drops", new HashMap())), ++ Map.entry("minecraft:waxed_oxidized_copper_trapdoor", Map.of("into", "minecraft:oxidized_copper_trapdoor", "drops", new HashMap())), ++ Map.entry("minecraft:waxed_copper_grate", Map.of("into", "minecraft:copper_grate", "drops", new HashMap())), ++ Map.entry("minecraft:waxed_exposed_copper_grate", Map.of("into", "minecraft:exposed_copper_grate", "drops", new HashMap())), ++ Map.entry("minecraft:waxed_weathered_copper_grate", Map.of("into", "minecraft:weathered_copper_grate", "drops", new HashMap())), ++ Map.entry("minecraft:waxed_oxidized_copper_grate", Map.of("into", "minecraft:oxidized_copper_grate", "drops", new HashMap())), ++ Map.entry("minecraft:waxed_copper_bulb", Map.of("into", "minecraft:copper_bulb", "drops", new HashMap())), ++ Map.entry("minecraft:waxed_exposed_copper_bulb", Map.of("into", "minecraft:exposed_copper_bulb", "drops", new HashMap())), ++ Map.entry("minecraft:waxed_weathered_copper_bulb", Map.of("into", "minecraft:weathered_copper_bulb", "drops", new HashMap())), ++ Map.entry("minecraft:waxed_oxidized_copper_bulb", Map.of("into", "minecraft:oxidized_copper_bulb", "drops", new HashMap()))) + ).forEach((blockId, obj) -> { + Block block = BuiltInRegistries.BLOCK.get(new ResourceLocation(blockId)); + if (block == Blocks.AIR) { PurpurConfig.log(Level.SEVERE, "Invalid block for `tools.axe.waxables`: " + blockId); return; } @@ -19830,12 +19833,27 @@ index 0000000000000000000000000000000000000000..47e7e93dde48a75d61904bc7f40cb6a4 + Map.entry("minecraft:exposed_cut_copper", Map.of("into", "minecraft:cut_copper", "drops", new HashMap())), + Map.entry("minecraft:weathered_cut_copper", Map.of("into", "minecraft:exposed_cut_copper", "drops", new HashMap())), + Map.entry("minecraft:oxidized_cut_copper", Map.of("into", "minecraft:weathered_cut_copper", "drops", new HashMap())), ++ Map.entry("minecraft:exposed_chiseled_copper", Map.of("into", "minecraft:chiseled_copper", "drops", new HashMap())), ++ Map.entry("minecraft:weathered_chiseled_copper", Map.of("into", "minecraft:exposed_chiseled_copper", "drops", new HashMap())), ++ Map.entry("minecraft:oxidized_chiseled_copper", Map.of("into", "minecraft:weathered_chiseled_copper", "drops", new HashMap())), + Map.entry("minecraft:exposed_cut_copper_slab", Map.of("into", "minecraft:cut_copper_slab", "drops", new HashMap())), + Map.entry("minecraft:weathered_cut_copper_slab", Map.of("into", "minecraft:exposed_cut_copper_slab", "drops", new HashMap())), + Map.entry("minecraft:oxidized_cut_copper_slab", Map.of("into", "minecraft:weathered_cut_copper_slab", "drops", new HashMap())), + Map.entry("minecraft:exposed_cut_copper_stairs", Map.of("into", "minecraft:cut_copper_stairs", "drops", new HashMap())), + Map.entry("minecraft:weathered_cut_copper_stairs", Map.of("into", "minecraft:exposed_cut_copper_stairs", "drops", new HashMap())), -+ Map.entry("minecraft:oxidized_cut_copper_stairs", Map.of("into", "minecraft:weathered_cut_copper_stairs", "drops", new HashMap()))) ++ Map.entry("minecraft:oxidized_cut_copper_stairs", Map.of("into", "minecraft:weathered_cut_copper_stairs", "drops", new HashMap())), ++ Map.entry("minecraft:exposed_copper_door", Map.of("into", "minecraft:copper_door", "drops", new HashMap())), ++ Map.entry("minecraft:weathered_copper_door", Map.of("into", "minecraft:exposed_copper_door", "drops", new HashMap())), ++ Map.entry("minecraft:oxidized_copper_door", Map.of("into", "minecraft:weathered_copper_door", "drops", new HashMap())), ++ Map.entry("minecraft:exposed_copper_trapdoor", Map.of("into", "minecraft:copper_trapdoor", "drops", new HashMap())), ++ Map.entry("minecraft:weathered_copper_trapdoor", Map.of("into", "minecraft:exposed_copper_trapdoor", "drops", new HashMap())), ++ Map.entry("minecraft:oxidized_copper_trapdoor", Map.of("into", "minecraft:weathered_copper_trapdoor", "drops", new HashMap())), ++ Map.entry("minecraft:exposed_copper_grate", Map.of("into", "minecraft:copper_grate", "drops", new HashMap())), ++ Map.entry("minecraft:weathered_copper_grate", Map.of("into", "minecraft:exposed_copper_grate", "drops", new HashMap())), ++ Map.entry("minecraft:oxidized_copper_grate", Map.of("into", "minecraft:weathered_copper_grate", "drops", new HashMap())), ++ Map.entry("minecraft:exposed_copper_bulb", Map.of("into", "minecraft:copper_bulb", "drops", new HashMap())), ++ Map.entry("minecraft:weathered_copper_bulb", Map.of("into", "minecraft:exposed_copper_bulb", "drops", new HashMap())), ++ Map.entry("minecraft:oxidized_copper_bulb", Map.of("into", "minecraft:weathered_copper_bulb", "drops", new HashMap()))) + ).forEach((blockId, obj) -> { + Block block = BuiltInRegistries.BLOCK.get(new ResourceLocation(blockId)); + if (block == Blocks.AIR) { PurpurConfig.log(Level.SEVERE, "Invalid block for `tools.axe.weatherables`: " + blockId); return; } @@ -20179,11 +20197,6 @@ index 0000000000000000000000000000000000000000..47e7e93dde48a75d61904bc7f40cb6a4 + sculkShriekerCanSummonDefault = getBoolean("blocks.sculk_shrieker.can-summon-default", sculkShriekerCanSummonDefault); + } + -+ public boolean shulkerBoxAllowOversizedStacks = false; -+ private void shulkerBoxSettings() { -+ shulkerBoxAllowOversizedStacks = getBoolean("blocks.shulker_box.allow-oversized-stacks", shulkerBoxAllowOversizedStacks); -+ } -+ + public boolean signAllowColors = false; + private void signSettings() { + signAllowColors = getBoolean("blocks.sign.allow-colors", signAllowColors); @@ -23171,7 +23184,7 @@ index 0000000000000000000000000000000000000000..ba2a37dad43e238e54632975abea8ee6 +} diff --git a/src/main/java/org/purpurmc/purpur/entity/DolphinSpit.java b/src/main/java/org/purpurmc/purpur/entity/DolphinSpit.java new file mode 100644 -index 0000000000000000000000000000000000000000..ce614ae6b1fa0b31c1ee8dacb69134bb20c949f4 +index 0000000000000000000000000000000000000000..92d562fa11f69bb6b841299aef257ea0c674ca1c --- /dev/null +++ b/src/main/java/org/purpurmc/purpur/entity/DolphinSpit.java @@ -0,0 +1,106 @@ @@ -23223,7 +23236,7 @@ index 0000000000000000000000000000000000000000..ce614ae6b1fa0b31c1ee8dacb69134bb + super_tick(); + + Vec3 mot = this.getDeltaMovement(); -+ HitResult hitResult = ProjectileUtil.getHitResult(this.position(), this, this::canHitEntity, mot, level()); ++ HitResult hitResult = ProjectileUtil.getHitResultOnMoveVector(this, this::canHitEntity); + + this.preOnHit(hitResult); + @@ -23283,7 +23296,7 @@ index 0000000000000000000000000000000000000000..ce614ae6b1fa0b31c1ee8dacb69134bb +} diff --git a/src/main/java/org/purpurmc/purpur/entity/PhantomFlames.java b/src/main/java/org/purpurmc/purpur/entity/PhantomFlames.java new file mode 100644 -index 0000000000000000000000000000000000000000..ea8b928b6d82689e71bbcc39ab497491072dfba6 +index 0000000000000000000000000000000000000000..d0d951f867390fa12cae2ba2a49212354b10d7b0 --- /dev/null +++ b/src/main/java/org/purpurmc/purpur/entity/PhantomFlames.java @@ -0,0 +1,121 @@ @@ -23338,7 +23351,7 @@ index 0000000000000000000000000000000000000000..ea8b928b6d82689e71bbcc39ab497491 + super_tick(); + + Vec3 mot = this.getDeltaMovement(); -+ HitResult hitResult = ProjectileUtil.getHitResult(this.position(), this, this::canHitEntity, mot, level()); ++ HitResult hitResult = ProjectileUtil.getHitResultOnMoveVector(this, this::canHitEntity); + + this.preOnHit(hitResult); + diff --git a/patches/server/0010-Purpur-Configurable-server-mod-name.patch b/patches/server/0010-Purpur-Configurable-server-mod-name.patch index 619dd457..94162ac2 100644 --- a/patches/server/0010-Purpur-Configurable-server-mod-name.patch +++ b/patches/server/0010-Purpur-Configurable-server-mod-name.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Purpur: Configurable server mod name diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 995dd071082e482785448678b9189f0715a75308..ee53c964c86e281120958aa0d2a7e1b7ca9d070f 100644 +index 7418860e8d25d6eeab33a617a7365c608e1454d2..176f10372a0060fbd2733a6713eb3979a8f4652e 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1689,7 +1689,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop, String> taskNameCache = new MapMaker().weakKeys().makeMap(); @@ -173,8 +172,8 @@ index e6452bb4f29bf32600dbf8654365826600189bb5..00000000000000000000000000000000 - return Timings.ofSafe("## Packet - " + packet.getClass().getName(), packetProcessTimer); - } - -- public static Timing getCommandFunctionTiming(CommandFunction function) { -- return Timings.ofSafe("Command Function - " + function.getId()); +- public static Timing getCommandFunctionTiming(CommandFunction function) { +- return Timings.ofSafe("Command Function - " + function.id()); - } - - public static void processConfig(GlobalConfiguration.Timings config) { @@ -926,31 +925,11 @@ index dab211c458311869c61779305580a1c7da830f71..0ddcf3652a2cc9e0cc28f672f103ec7e } @Override -diff --git a/src/main/java/net/minecraft/commands/CommandFunction.java b/src/main/java/net/minecraft/commands/CommandFunction.java -index 956cddf5d975b91619316b9b6779cf51575cfc0a..0e460de37ac2ae8accbd0d3da73faac6cd7df8e0 100644 ---- a/src/main/java/net/minecraft/commands/CommandFunction.java -+++ b/src/main/java/net/minecraft/commands/CommandFunction.java -@@ -32,15 +32,6 @@ import net.minecraft.server.ServerFunctionManager; - public class CommandFunction { - private final CommandFunction.Entry[] entries; - final ResourceLocation id; -- // Paper start -- public co.aikar.timings.Timing timing; -- public co.aikar.timings.Timing getTiming() { -- if (timing == null) { -- timing = co.aikar.timings.MinecraftTimings.getCommandFunctionTiming(this); -- } -- return timing; -- } -- // Paper end - - public CommandFunction(ResourceLocation id, CommandFunction.Entry[] elements) { - this.id = id; diff --git a/src/main/java/net/minecraft/network/protocol/PacketUtils.java b/src/main/java/net/minecraft/network/protocol/PacketUtils.java -index 9a49f5271ec1d9de17632bfffe8309cb1ba0d8b1..1bf374d482acba25614ae303d1fa72ed686a3072 100644 +index c5c734b9eb80d1cdf0e9fd8a043f2b6d1f4cbffe..68ef0398e1b517dd9fd2def43d7d87e4be42ec84 100644 --- a/src/main/java/net/minecraft/network/protocol/PacketUtils.java +++ b/src/main/java/net/minecraft/network/protocol/PacketUtils.java -@@ -48,8 +48,8 @@ public class PacketUtils { +@@ -49,8 +49,8 @@ public class PacketUtils { try { // Paper - detailed watchdog information if (MinecraftServer.getServer().hasStopped() || (listener instanceof ServerCommonPacketListenerImpl && ((ServerCommonPacketListenerImpl) listener).processedDisconnect)) return; // CraftBukkit, MC-142590 if (listener.shouldHandleMessage(packet)) { @@ -960,12 +939,12 @@ index 9a49f5271ec1d9de17632bfffe8309cb1ba0d8b1..1bf374d482acba25614ae303d1fa72ed + try { packet.handle(listener); } catch (Exception exception) { - if (exception instanceof ReportedException) { + label25: diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index badb81539ce8c19a4fd15bcbdde074688c16db92..6dd82dca0c02a92e220d99ea4f2e6e3eaf0752ec 100644 +index 176f10372a0060fbd2733a6713eb3979a8f4652e..138935ffe2f7852e8aa30a5fdea2d4ca340c4cdf 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -179,8 +179,6 @@ import org.bukkit.craftbukkit.Main; +@@ -180,8 +180,6 @@ import org.bukkit.craftbukkit.Main; import org.bukkit.event.server.ServerLoadEvent; // CraftBukkit end @@ -974,7 +953,7 @@ index badb81539ce8c19a4fd15bcbdde074688c16db92..6dd82dca0c02a92e220d99ea4f2e6e3e public abstract class MinecraftServer extends ReentrantBlockableEventLoop implements ServerInfo, CommandSource, AutoCloseable { public static final int SERVER_THREAD_PRIORITY = Integer.getInteger("gale.thread.priority.server", -1); // Gale - server thread priority environment variable -@@ -917,7 +915,6 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop { return !this.canSleepForTickNoOversleep(); // Paper - move oversleep into full server tick -@@ -1377,15 +1374,14 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop { entityplayer.connection.suspendFlushing(); }); @@ -1039,7 +1037,7 @@ index badb81539ce8c19a4fd15bcbdde074688c16db92..6dd82dca0c02a92e220d99ea4f2e6e3e // Paper start - Folia scheduler API ((io.papermc.paper.threadedregions.scheduler.FoliaGlobalRegionScheduler) Bukkit.getGlobalRegionScheduler()).tick(); getAllLevels().forEach(level -> { -@@ -1494,20 +1482,15 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0; // Purpur -@@ -1547,14 +1529,12 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop { return ichunkaccess1; -@@ -445,17 +443,13 @@ public class ServerChunkCache extends ChunkSource { +@@ -443,17 +441,13 @@ public class ServerChunkCache extends ChunkSource { public void save(boolean flush) { this.runDistanceManagerUpdates(); @@ -1309,7 +1275,7 @@ index c466991236490bd05bde99e01862fb0e02ff41f1..cb5a808ff5902ddae52c400c0f60f02c } // Paper end -@@ -481,20 +475,14 @@ public class ServerChunkCache extends ChunkSource { +@@ -479,21 +473,15 @@ public class ServerChunkCache extends ChunkSource { @Override public void tick(BooleanSupplier shouldKeepTicking, boolean tickChunks) { @@ -1322,6 +1288,7 @@ index c466991236490bd05bde99e01862fb0e02ff41f1..cb5a808ff5902ddae52c400c0f60f02c this.chunkMap.level.playerChunkLoader.tick(); // Paper - replace player chunk loader - this is mostly required to account for view distance changes this.tickChunks(); - this.level.timings.chunks.stopTiming(); // Paper - timings + this.chunkMap.tick(); } - this.level.timings.doChunkUnload.startTiming(); // Spigot @@ -1330,58 +1297,58 @@ index c466991236490bd05bde99e01862fb0e02ff41f1..cb5a808ff5902ddae52c400c0f60f02c this.clearCache(); } -@@ -520,7 +508,6 @@ public class ServerChunkCache extends ChunkSource { - boolean flag2AndHasNaturalSpawn = flag2 && this.anySpawnCategoryIsSpawnedThisTick(); - if (flag2AndHasNaturalSpawn) { - // Gale end - MultiPaper - skip unnecessary mob spawning computations -- this.level.timings.countNaturalMobs.startTiming(); // Paper - timings - int l = this.distanceManager.getNaturalSpawnChunkCount(); - // Paper start - per player mob spawning - if ((this.spawnFriendlies || this.spawnEnemies) && this.level.paperConfig().entities.spawning.perPlayerMobSpawns) { // don't count mobs when animals and monsters are disabled -@@ -550,7 +537,6 @@ public class ServerChunkCache extends ChunkSource { - // Pufferfish end - } - // Paper end -- this.level.timings.countNaturalMobs.stopTiming(); // Paper - timings +@@ -503,7 +491,6 @@ public class ServerChunkCache extends ChunkSource { - //this.lastSpawnState = spawnercreature_d; // Pufferfish - this is managed asynchronously - // Paper - optimise chunk tick iteration -@@ -560,9 +546,6 @@ public class ServerChunkCache extends ChunkSource { - spawnercreature_d = null; - } - // Gale end - MultiPaper - skip unnecessary mob spawning computations -- this.level.timings.chunkTicks.startTiming(); // Paper -- -- // Paper - optimise chunk tick iteration + this.lastInhabitedUpdate = i; + if (!this.level.isDebug()) { +- if (this.level.getServer().tickRateManager().runsNormally()) this.level.timings.chunkTicks.startTiming(); // Paper // Paper start - optimise chunk tick iteration ChunkMap playerChunkMap = this.chunkMap; -@@ -663,15 +646,10 @@ public class ServerChunkCache extends ChunkSource { +@@ -548,7 +535,6 @@ public class ServerChunkCache extends ChunkSource { + boolean flagAndHasNaturalSpawn = flag && this.anySpawnCategoryIsSpawnedThisTick(); + if (flagAndHasNaturalSpawn) { + // Gale end - MultiPaper - skip unnecessary mob spawning computations +- this.level.timings.countNaturalMobs.startTiming(); // Paper - timings + int k = this.distanceManager.getNaturalSpawnChunkCount(); + // Paper start - per player mob spawning + int naturalSpawnChunkCount = k; +@@ -579,7 +565,6 @@ public class ServerChunkCache extends ChunkSource { + // Pufferfish end + } + // Paper end +- this.level.timings.countNaturalMobs.stopTiming(); // Paper - timings + + //this.lastSpawnState = spawnercreature_d; // Pufferfish - this is managed asynchronously + // Gale start - MultiPaper - skip unnecessary mob spawning computations +@@ -690,17 +675,13 @@ public class ServerChunkCache extends ChunkSource { + } + } + // Paper end - optimise chunk tick iteration +- this.level.timings.chunkTicks.stopTiming(); // Paper + + if (flag) { +- try (co.aikar.timings.Timing ignored = this.level.timings.miscMobSpawning.startTiming()) { // Paper - timings + this.level.tickCustomSpawners(this.spawnEnemies, this.spawnFriendlies); +- } // Paper - timings } } - // Paper end - optimise chunk tick iteration -- this.level.timings.chunkTicks.stopTiming(); // Paper - if (flag2) { -- try (co.aikar.timings.Timing ignored = this.level.timings.miscMobSpawning.startTiming()) { // Paper - timings - this.level.tickCustomSpawners(this.spawnEnemies, this.spawnFriendlies); -- } // Paper - timings - } -- // Paper - optimise chunk tick iteration + // Paper - optimise chunk tick iteration - this.level.timings.broadcastChunkUpdates.startTiming(); // Paper - timing // Paper start - optimise chunk tick iteration if (!this.chunkMap.needsChangeBroadcasting.isEmpty()) { it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet copy = this.chunkMap.needsChangeBroadcasting.clone(); -@@ -685,7 +663,6 @@ public class ServerChunkCache extends ChunkSource { +@@ -714,7 +695,6 @@ public class ServerChunkCache extends ChunkSource { } } // Paper end - optimise chunk tick iteration - this.level.timings.broadcastChunkUpdates.stopTiming(); // Paper - timing // Paper - optimise chunk tick iteration - this.chunkMap.tick(); } + diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index 4f353e049252827a4e751817984746dfeb3b2659..e1f2e1511e3a9452c428a19098dce19abb4d9405 100644 +index dd677f1981abd5aaaf9c1ec79dbde1766f70ce84..22c9353264da69591a748773e5dd0ea49229f221 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 @@ @@ -1392,36 +1359,40 @@ index 4f353e049252827a4e751817984746dfeb3b2659..e1f2e1511e3a9452c428a19098dce19a import com.google.common.collect.Lists; import com.mojang.datafixers.DataFixer; import com.mojang.datafixers.util.Pair; -@@ -852,23 +851,15 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -863,27 +862,19 @@ public class ServerLevel extends Level implements WorldGenLevel { + this.tickTime(); + } - this.updateSkyBrightness(); - this.tickTime(); - this.timings.scheduledBlocks.startTiming(); // Paper - if (!this.isDebug()) { + if (!this.isDebug() && flag) { j = this.getGameTime(); this.blockTicks.tick(j, 65536, this::tickBlock); this.fluidTicks.tick(j, 65536, this::tickFluid); } - this.timings.scheduledBlocks.stopTiming(); // Paper -- this.timings.raids.startTiming(); // Paper - timings - this.raids.tick(); -- this.timings.raids.stopTiming(); // Paper - timings + if (flag) { +- this.timings.raids.startTiming(); // Paper - timings + this.raids.tick(); +- this.timings.raids.stopTiming(); // Paper - timings + } + - this.timings.chunkProviderTick.startTiming(); // Paper - timings this.getChunkSource().tick(shouldKeepTicking, true); - this.timings.chunkProviderTick.stopTiming(); // Paper - timings -- this.timings.doSounds.startTiming(); // Spigot - this.runBlockEvents(); -- this.timings.doSounds.stopTiming(); // Spigot - this.handlingTick = false; - boolean flag = true || !this.players.isEmpty() || !this.getForcedChunks().isEmpty(); // CraftBukkit - this prevents entity cleanup, other issues on servers with no players - -@@ -877,13 +868,11 @@ public class ServerLevel extends Level implements WorldGenLevel { + if (flag) { +- this.timings.doSounds.startTiming(); // Spigot + this.runBlockEvents(); +- this.timings.doSounds.stopTiming(); // Spigot } - if (flag || this.emptyTime++ < 300) { + this.handlingTick = false; +@@ -894,13 +885,11 @@ public class ServerLevel extends Level implements WorldGenLevel { + } + + if (flag1 || this.emptyTime++ < 300) { - this.timings.tickEntities.startTiming(); // Spigot - if (this.dragonFight != null) { + if (this.dragonFight != null && flag) { this.dragonFight.tick(); } @@ -1430,7 +1401,7 @@ index 4f353e049252827a4e751817984746dfeb3b2659..e1f2e1511e3a9452c428a19098dce19a this.entityTickList.forEach((entity) -> { entity.activatedPriorityReset = false; // Pufferfish - DAB if (!entity.isRemoved()) { -@@ -920,8 +909,6 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -937,8 +926,6 @@ public class ServerLevel extends Level implements WorldGenLevel { } } }); @@ -1439,15 +1410,15 @@ index 4f353e049252827a4e751817984746dfeb3b2659..e1f2e1511e3a9452c428a19098dce19a this.tickBlockEntities(); } -@@ -1054,7 +1041,6 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1072,7 +1059,6 @@ public class ServerLevel extends Level implements WorldGenLevel { + } } // Paper - // Paper start - optimise random block ticking - timings.chunkTicksBlocks.startTiming(); // Paper if (randomTickSpeed > 0) { + // Paper start - optimize random block ticking LevelChunkSection[] sections = chunk.getSections(); - final int minSection = io.papermc.paper.util.WorldUtil.getMinSection(this); -@@ -1086,8 +1072,6 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1105,8 +1091,6 @@ public class ServerLevel extends Level implements WorldGenLevel { } } // Paper end - optimise random block ticking @@ -1455,8 +1426,8 @@ index 4f353e049252827a4e751817984746dfeb3b2659..e1f2e1511e3a9452c428a19098dce19a - timings.chunkTicksBlocks.stopTiming(); // Paper } - private void tickIceAndSnow(boolean raining, BlockPos.MutableBlockPos blockposition1, final LevelChunk chunk) { // Paper - optimise chunk ticking -@@ -1412,31 +1396,21 @@ public class ServerLevel extends Level implements WorldGenLevel { + @VisibleForTesting +@@ -1436,31 +1420,21 @@ public class ServerLevel extends Level implements WorldGenLevel { currentlyTickingEntity.lazySet(entity); } // Paper end - log detailed entity tick information @@ -1488,7 +1459,7 @@ index 4f353e049252827a4e751817984746dfeb3b2659..e1f2e1511e3a9452c428a19098dce19a Iterator iterator = entity.getPassengers().iterator(); while (iterator.hasNext()) { -@@ -1444,7 +1418,6 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1468,7 +1442,6 @@ public class ServerLevel extends Level implements WorldGenLevel { this.tickPassenger(entity, entity1); } @@ -1496,7 +1467,7 @@ index 4f353e049252827a4e751817984746dfeb3b2659..e1f2e1511e3a9452c428a19098dce19a // Paper start - log detailed entity tick information } finally { if (currentlyTickingEntity.get() == entity) { -@@ -1459,9 +1432,6 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1483,9 +1456,6 @@ public class ServerLevel extends Level implements WorldGenLevel { if (passenger instanceof Player || this.entityTickList.contains(passenger)) { // Paper - EAR 2 final boolean isActive = org.spigotmc.ActivationRange.checkIfActive(passenger); @@ -1506,7 +1477,7 @@ index 4f353e049252827a4e751817984746dfeb3b2659..e1f2e1511e3a9452c428a19098dce19a passenger.setOldPosAndRot(); ++passenger.tickCount; // Paper start - EAR 2 -@@ -1482,8 +1452,6 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1506,8 +1476,6 @@ public class ServerLevel extends Level implements WorldGenLevel { this.tickPassenger(passenger, entity2); } @@ -1515,7 +1486,7 @@ index 4f353e049252827a4e751817984746dfeb3b2659..e1f2e1511e3a9452c428a19098dce19a } } else { passenger.stopRiding(); -@@ -1503,14 +1471,11 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1527,14 +1495,11 @@ public class ServerLevel extends Level implements WorldGenLevel { org.bukkit.Bukkit.getPluginManager().callEvent(new org.bukkit.event.world.WorldSaveEvent(getWorld())); } @@ -1530,7 +1501,7 @@ index 4f353e049252827a4e751817984746dfeb3b2659..e1f2e1511e3a9452c428a19098dce19a // Copied from save() // CraftBukkit start - moved from MinecraftServer.saveChunks -@@ -1522,7 +1487,6 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1546,7 +1511,6 @@ public class ServerLevel extends Level implements WorldGenLevel { this.convertable.saveDataTag(this.server.registryAccess(), this.serverLevelData, this.server.getPlayerList().getSingleplayerData()); } // CraftBukkit end @@ -1538,7 +1509,7 @@ index 4f353e049252827a4e751817984746dfeb3b2659..e1f2e1511e3a9452c428a19098dce19a } // Paper end -@@ -1536,7 +1500,6 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1560,7 +1524,6 @@ public class ServerLevel extends Level implements WorldGenLevel { if (!savingDisabled) { org.bukkit.Bukkit.getPluginManager().callEvent(new org.bukkit.event.world.WorldSaveEvent(this.getWorld())); // CraftBukkit @@ -1546,7 +1517,7 @@ index 4f353e049252827a4e751817984746dfeb3b2659..e1f2e1511e3a9452c428a19098dce19a if (progressListener != null) { progressListener.progressStartNoAbort(Component.translatable("menu.savingLevel")); } -@@ -1546,11 +1509,8 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1570,11 +1533,8 @@ public class ServerLevel extends Level implements WorldGenLevel { progressListener.progressStage(Component.translatable("menu.savingChunks")); } @@ -1559,10 +1530,10 @@ index 4f353e049252827a4e751817984746dfeb3b2659..e1f2e1511e3a9452c428a19098dce19a } else if (close) { chunkproviderserver.close(false); } // Paper - rewrite chunk system diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index b4e9a31d7c65fbee6eb83d2784313630a8d8fca9..9c7fe1d04315423adb2ca8596175ddc94f7a81ef 100644 +index ca8db3c11a6a794b23f760b7aaee69290752043f..add52c6986866c42d73c51fa8390d62a4a9d5594 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -2484,7 +2484,6 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2481,7 +2481,6 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl public void handleCommand(String s) { // Paper - private -> public org.spigotmc.AsyncCatcher.catchOp("Command Dispatched Async: " + s); // Paper - Add async catcher @@ -1570,7 +1541,7 @@ index b4e9a31d7c65fbee6eb83d2784313630a8d8fca9..9c7fe1d04315423adb2ca8596175ddc9 if ( org.spigotmc.SpigotConfig.logCommands ) // Spigot this.LOGGER.info(this.player.getScoreboardName() + " issued server command: " + s); -@@ -2494,7 +2493,6 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2491,7 +2490,6 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl this.cserver.getPluginManager().callEvent(event); if (event.isCancelled()) { @@ -1578,7 +1549,7 @@ index b4e9a31d7c65fbee6eb83d2784313630a8d8fca9..9c7fe1d04315423adb2ca8596175ddc9 return; } -@@ -2506,8 +2504,6 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2503,8 +2501,6 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl player.sendMessage(org.bukkit.ChatColor.RED + "An internal error occurred while attempting to perform this command"); java.util.logging.Logger.getLogger(ServerGamePacketListenerImpl.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); return; @@ -1588,7 +1559,7 @@ index b4e9a31d7c65fbee6eb83d2784313630a8d8fca9..9c7fe1d04315423adb2ca8596175ddc9 } // CraftBukkit end diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index 9d6e8747850d1e805200e8f89a0a79474e3a20f3..1dd4bea0d5cf4aec51220253af8981c5aba29634 100644 +index a0cca8f9f92eca597552d497ee61b068622482be..4158800ce4f86d20213dfd9ccba38d4baf10aa02 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java @@ -1,6 +1,5 @@ @@ -1598,7 +1569,7 @@ index 9d6e8747850d1e805200e8f89a0a79474e3a20f3..1dd4bea0d5cf4aec51220253af8981c5 import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; -@@ -1334,7 +1333,6 @@ public abstract class PlayerList { +@@ -1332,7 +1331,6 @@ public abstract class PlayerList { public void saveAll(int interval) { io.papermc.paper.util.MCUtil.ensureMain("Save Players" , () -> { // Paper - Ensure main @@ -1606,7 +1577,7 @@ index 9d6e8747850d1e805200e8f89a0a79474e3a20f3..1dd4bea0d5cf4aec51220253af8981c5 int numSaved = 0; long now = MinecraftServer.currentTick; for (int i = 0; i < this.players.size(); ++i) { -@@ -1345,7 +1343,6 @@ public abstract class PlayerList { +@@ -1343,7 +1341,6 @@ public abstract class PlayerList { } // Paper end } @@ -1615,10 +1586,10 @@ index 9d6e8747850d1e805200e8f89a0a79474e3a20f3..1dd4bea0d5cf4aec51220253af8981c5 } diff --git a/src/main/java/net/minecraft/world/entity/EntityType.java b/src/main/java/net/minecraft/world/entity/EntityType.java -index 5930e45bae5aa86b3cedb811c4c9bb92099bc1b5..540bafec1e973e7461c6c09228d801d4303b0e56 100644 +index 38845300ceb7092de4cd8e31ef8782728892f656..0d9d7e3b1302b2ee396954a47038370c1d4a4c59 100644 --- a/src/main/java/net/minecraft/world/entity/EntityType.java +++ b/src/main/java/net/minecraft/world/entity/EntityType.java -@@ -336,15 +336,6 @@ public class EntityType implements FeatureElement, EntityTypeT +@@ -340,15 +340,6 @@ public class EntityType implements FeatureElement, EntityTypeT } public EntityType(EntityType.EntityFactory factory, MobCategory spawnGroup, boolean saveable, boolean summonable, boolean fireImmune, boolean spawnableFarFromPlayer, ImmutableSet canSpawnInside, EntityDimensions dimensions, int maxTrackDistance, int trackTickInterval, FeatureFlagSet requiredFeatures) { @@ -1634,7 +1605,7 @@ index 5930e45bae5aa86b3cedb811c4c9bb92099bc1b5..540bafec1e973e7461c6c09228d801d4 this.builtInRegistryHolder = BuiltInRegistries.ENTITY_TYPE.createIntrusiveHolder(this); this.factory = factory; this.category = spawnGroup; -@@ -714,12 +705,6 @@ public class EntityType implements FeatureElement, EntityTypeT +@@ -718,12 +709,6 @@ public class EntityType implements FeatureElement, EntityTypeT return this.updateInterval; } @@ -1647,7 +1618,7 @@ index 5930e45bae5aa86b3cedb811c4c9bb92099bc1b5..540bafec1e973e7461c6c09228d801d4 public boolean trackDeltas() { return this != EntityType.PLAYER && this != EntityType.LLAMA_SPIT && this != EntityType.WITHER && this != EntityType.BAT && this != EntityType.ITEM_FRAME && this != EntityType.GLOW_ITEM_FRAME && this != EntityType.LEASH_KNOT && this != EntityType.PAINTING && this != EntityType.END_CRYSTAL && this != EntityType.EVOKER_FANGS; } -@@ -829,7 +814,7 @@ public class EntityType implements FeatureElement, EntityTypeT +@@ -833,7 +818,7 @@ public class EntityType implements FeatureElement, EntityTypeT Util.fetchChoiceType(References.ENTITY_TREE, id); } @@ -1754,10 +1725,10 @@ index fcdb9bde8e1605e30dde3e580491522d4b62cdc0..4de18d00cc464313b777874430da3f55 } diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index c694b9a10815031631905f8d72c09d3ff5305c0e..192026f9edab53248dbd6db4fdb7d3955dff247e 100644 +index e79dbebe298289dcd63f03ebcc15dd409bfbf220..afe0fa16ced3cae40737c8017875901e4809df24 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 { +@@ -179,7 +179,6 @@ public abstract class Level implements LevelAccessor, AutoCloseable { public final com.destroystokyo.paper.antixray.ChunkPacketBlockController chunkPacketBlockController; // Paper - Anti-Xray public final org.purpurmc.purpur.PurpurWorldConfig purpurConfig; // Purpur @@ -1765,7 +1736,7 @@ index c694b9a10815031631905f8d72c09d3ff5305c0e..192026f9edab53248dbd6db4fdb7d395 public static BlockPos lastPhysicsProblem; // Spigot private org.spigotmc.TickLimiter entityLimiter; private org.spigotmc.TickLimiter tileLimiter; -@@ -355,7 +354,6 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -358,7 +357,6 @@ public abstract class Level implements LevelAccessor, AutoCloseable { public void onBorderSetDamageSafeZOne(WorldBorder border, double safeZoneRadius) {} }); // CraftBukkit end @@ -1773,7 +1744,7 @@ index c694b9a10815031631905f8d72c09d3ff5305c0e..192026f9edab53248dbd6db4fdb7d395 this.keepSpawnInMemory = this.paperConfig().spawn.keepSpawnLoaded; // Paper this.entityLimiter = new org.spigotmc.TickLimiter(this.spigotConfig.entityMaxTickTime); this.tileLimiter = new org.spigotmc.TickLimiter(this.spigotConfig.tileMaxTickTime); -@@ -1316,15 +1314,12 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -1325,15 +1323,12 @@ public abstract class Level implements LevelAccessor, AutoCloseable { } protected void tickBlockEntities() { @@ -1787,9 +1758,9 @@ index c694b9a10815031631905f8d72c09d3ff5305c0e..192026f9edab53248dbd6db4fdb7d395 - this.timings.tileEntityTick.startTiming(); // Spigot // Spigot start - // Iterator iterator = this.blockEntityTickers.iterator(); - int tilesThisCycle = 0; -@@ -1357,9 +1352,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { + // Iterator iterator = this.blockEntityTickers.iterator(); + boolean flag = this.tickRateManager().runsNormally(); +@@ -1368,9 +1363,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { } this.blockEntityTickers.removeAll(toRemove); @@ -1821,10 +1792,10 @@ index 530c5e3500bd735bbd41d6c973d7470c43aed404..ec6afe51fd204e4c0764850dcc4535f7 // Paper start diff --git a/src/main/java/net/minecraft/world/level/block/Block.java b/src/main/java/net/minecraft/world/level/block/Block.java -index bcc15bae4d737f54781779d46635c0d498ac81be..50258f03dd8d310bae707afad9d0df5ead28ab99 100644 +index 27879468851875f9d9e7eb28f47ad36d36fd7475..be19989c059caaa8406ce58443eb9a2586d49dfe 100644 --- a/src/main/java/net/minecraft/world/level/block/Block.java +++ b/src/main/java/net/minecraft/world/level/block/Block.java -@@ -112,13 +112,6 @@ public class Block extends BlockBehaviour implements ItemLike { +@@ -114,13 +114,6 @@ public class Block extends BlockBehaviour implements ItemLike { this != Blocks.STRUCTURE_BLOCK && this != Blocks.JIGSAW; } @@ -1901,10 +1872,10 @@ index cd375184c63453829be96449c4df88372f905d9e..6e67591750ae8395f7f7b8a1299d6573 @Override diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 5cbfa4ecb4c76cfda4fa42bfa6fdcec75ec1fe27..20f57d1e3e27f0a1d7daec67d7f615465cd90107 100644 +index 9ef1d6bf3b8ec431a7747c4edb4b61671758b7e9..7ae5e99e6cc8e88009688468f6d19b5af09da9e0 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -477,7 +477,6 @@ public final class CraftServer implements Server { +@@ -472,7 +472,6 @@ public final class CraftServer implements Server { this.saveCommandsConfig(); this.overrideAllCommandBlockCommands = this.commandsConfiguration.getStringList("command-block-overrides").contains("*"); this.ignoreVanillaPermissions = this.commandsConfiguration.getBoolean("ignore-vanilla-permissions"); @@ -1913,7 +1884,7 @@ index 5cbfa4ecb4c76cfda4fa42bfa6fdcec75ec1fe27..20f57d1e3e27f0a1d7daec67d7f61546 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 85f0ed9073dff0540e6eac26bc634f4d54a60db1..602013bf66c5b1fd1c720ead4e14acfb2d90521b 100644 +index 802f30f6bacac22e581fef0ff6a3e668d656607f..a37998f9bec941287f51589fff33231046f05258 100644 --- a/src/main/java/org/bukkit/craftbukkit/Main.java +++ b/src/main/java/org/bukkit/craftbukkit/Main.java @@ -372,8 +372,6 @@ public class Main { @@ -1926,7 +1897,7 @@ index 85f0ed9073dff0540e6eac26bc634f4d54a60db1..602013bf66c5b1fd1c720ead4e14acfb tryPreloadClass("io.netty.channel.AbstractChannelHandlerContext$11"); tryPreloadClass("io.netty.channel.AbstractChannelHandlerContext$12"); diff --git a/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java b/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java -index b07be33bf62a0d4f0a0f44ac6bfbb023086a6b0d..801166b152e14ca266c574b17fad8d695c743f35 100644 +index 4be39d64431b7c42ef23c13c2872f8ab46fffdc7..1b8728dbb8dcde72935ce0b45f32520ce3586f77 100644 --- a/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java +++ b/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java @@ -1,6 +1,5 @@ @@ -2045,21 +2016,19 @@ index ea26d9464644b5217879b8c21b4da28e57708dcb..cee5c35ac2ba48d092f4227119c915e6 long getCreatedAt() { diff --git a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboardManager.java b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboardManager.java -index 891f850ea99dac1433f3e395e26be14c8abf2bfb..e9fd08ea4c03429d186d2ceecc51c3fc8371f85d 100644 +index b3e1adeb932da9b3bed16acd94e2f16da48a7c72..e9798517b9211c50a20ea5c69603aab35f614f02 100644 --- a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboardManager.java +++ b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboardManager.java -@@ -113,18 +113,10 @@ public final class CraftScoreboardManager implements ScoreboardManager { - - // CraftBukkit method - public void getScoreboardScores(ObjectiveCriteria criteria, String name, Consumer consumer) { -- // Paper start - add timings for scoreboard search +@@ -115,16 +115,9 @@ public final class CraftScoreboardManager implements ScoreboardManager { + public void forAllObjectives(ObjectiveCriteria criteria, ScoreHolder holder, Consumer consumer) { + // Paper start - add timings for scoreboard search // plugins leaking scoreboards will make this very expensive, let server owners debug it easily - co.aikar.timings.MinecraftTimings.scoreboardScoreSearch.startTimingIfSync(); - try { - // Paper end - add timings for scoreboard search for (CraftScoreboard scoreboard : this.scoreboards) { Scoreboard board = scoreboard.board; - board.forAllObjectives(criteria, name, (score) -> consumer.accept(score)); + board.forAllObjectives(criteria, holder, (score) -> consumer.accept(score)); } - } finally { // Paper start - add timings for scoreboard search - co.aikar.timings.MinecraftTimings.scoreboardScoreSearch.stopTimingIfSync(); @@ -2068,10 +2037,10 @@ index 891f850ea99dac1433f3e395e26be14c8abf2bfb..e9fd08ea4c03429d186d2ceecc51c3fc } } diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java -index ce5817b8660ca3c3fb93314bfd326a6bc20b4832..823e858cc73d7dba6fc8ddc12eea47c5c9dd7dc4 100644 +index 8561bc5482574365d7cff3a4046afe11b00f6d1f..b39d1ba982f633d68837a04dd0be2e639ee69ba4 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java +++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java -@@ -211,12 +211,6 @@ public final class CraftMagicNumbers implements UnsafeValues { +@@ -209,12 +209,6 @@ public final class CraftMagicNumbers implements UnsafeValues { } // Paper end // ======================================================================== @@ -2084,7 +2053,7 @@ index ce5817b8660ca3c3fb93314bfd326a6bc20b4832..823e858cc73d7dba6fc8ddc12eea47c5 public static byte toLegacyData(BlockState data) { return CraftLegacy.toLegacyData(data); -@@ -478,10 +472,6 @@ public final class CraftMagicNumbers implements UnsafeValues { +@@ -475,10 +469,6 @@ public final class CraftMagicNumbers implements UnsafeValues { } // Paper start @@ -2096,7 +2065,7 @@ index ce5817b8660ca3c3fb93314bfd326a6bc20b4832..823e858cc73d7dba6fc8ddc12eea47c5 @Override public com.destroystokyo.paper.util.VersionFetcher getVersionFetcher() { diff --git a/src/main/java/org/galemc/gale/configuration/GaleGlobalConfiguration.java b/src/main/java/org/galemc/gale/configuration/GaleGlobalConfiguration.java -index 104316a79771cfd9fce6883499fca268eed223c4..357dafd28c77b3fdd16f51381d59c6c40dcfd1d1 100644 +index b4cca06a583fbb7918237de256f43ee61fd8ec6c..dd4a5f610e6e84a73051a8ed46e1961804356ca3 100644 --- a/src/main/java/org/galemc/gale/configuration/GaleGlobalConfiguration.java +++ b/src/main/java/org/galemc/gale/configuration/GaleGlobalConfiguration.java @@ -80,41 +80,6 @@ public class GaleGlobalConfiguration extends ConfigurationPart { diff --git a/patches/server/0012-Bump-Dependencies.patch b/patches/server/0012-Bump-Dependencies.patch index 0c811b93..74516525 100644 --- a/patches/server/0012-Bump-Dependencies.patch +++ b/patches/server/0012-Bump-Dependencies.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Bump Dependencies diff --git a/build.gradle.kts b/build.gradle.kts -index 6e60342d9d394ccd595bde42c84b753ed9c0f7ec..aa3880a5bd5864081d0f9b52b727d3428d8ea6f1 100644 +index ee26e30a654cf8238069ba40d271e18b49ea99a3..3d2439e90e1cb97b9b2c26c03f1dd03d5fd37552 100644 --- a/build.gradle.kts +++ b/build.gradle.kts -@@ -22,7 +22,7 @@ dependencies { +@@ -36,7 +36,7 @@ dependencies { } // Gale end - project setup // Paper start @@ -17,7 +17,7 @@ index 6e60342d9d394ccd595bde42c84b753ed9c0f7ec..aa3880a5bd5864081d0f9b52b727d342 implementation("net.minecrell:terminalconsoleappender:1.3.0") implementation("net.kyori:adventure-text-serializer-ansi:4.14.0") // Keep in sync with adventureVersion from Paper-API build file implementation("net.kyori:ansi:1.0.3") // Manually bump beyond above transitive dep -@@ -32,30 +32,34 @@ dependencies { +@@ -46,30 +46,34 @@ dependencies { all its classes to check if they are plugins. Scanning takes about 1-2 seconds so adding this speeds up the server start. */ @@ -66,7 +66,7 @@ index 6e60342d9d394ccd595bde42c84b753ed9c0f7ec..aa3880a5bd5864081d0f9b52b727d342 // Pufferfish start implementation("org.yaml:snakeyaml:2.2") -@@ -68,10 +72,14 @@ dependencies { +@@ -82,10 +86,14 @@ dependencies { implementation("org.mozilla:rhino-engine:1.7.14") // Purpur implementation("dev.omega24:upnp4j:1.0") // Purpur @@ -83,8 +83,8 @@ index 6e60342d9d394ccd595bde42c84b753ed9c0f7ec..aa3880a5bd5864081d0f9b52b727d342 + // Leaf end } - val craftbukkitPackageVersion = "1_20_R2" // Paper -@@ -263,3 +271,7 @@ sourceSets { + val craftbukkitPackageVersion = "1_20_R3" // Paper +@@ -277,3 +285,7 @@ sourceSets { } } // Gale end - package license into jar diff --git a/patches/server/0013-Remove-Mojang-username-check.patch b/patches/server/0013-Remove-Mojang-username-check.patch index 6abafc7c..79f19402 100644 --- a/patches/server/0013-Remove-Mojang-username-check.patch +++ b/patches/server/0013-Remove-Mojang-username-check.patch @@ -5,22 +5,23 @@ Subject: [PATCH] Remove Mojang username check diff --git a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java -index 744f44e33578b56bbfd48fe27509e887716b3310..4cecb53d3792f02f8f76c2619058383142889be3 100644 +index 666239aaaec967fb6e1191a4cde58fd6afd44a0b..40d4da1c0ccabfb1b5b1e813b61689b47603ba43 100644 --- a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java -@@ -174,10 +174,10 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener, +@@ -153,7 +153,12 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener, public void handleHello(ServerboundHelloPacket packet) { // Gale start - JettPack - reduce array allocations Validate.validState(this.state == ServerLoginPacketListenerImpl.State.HELLO, "Unexpected hello packet", ArrayConstants.emptyObjectArray); -- Validate.validState(ServerLoginPacketListenerImpl.isValidUsername(packet.name()), "Invalid characters in username", ArrayConstants.emptyObjectArray); -+ if (!org.dreeam.leaf.LeafConfig.removeMojangUsernameCheck) Validate.validState(ServerLoginPacketListenerImpl.isValidUsername(packet.name()), "Invalid characters in username", ArrayConstants.emptyObjectArray); // Leaf - Remove Mojang's username check +- if (io.papermc.paper.configuration.GlobalConfiguration.get().proxies.isProxyOnlineMode() && io.papermc.paper.configuration.GlobalConfiguration.get().unsupportedSettings.performUsernameValidation && !this.iKnowThisMayNotBeTheBestIdeaButPleaseDisableUsernameValidation) Validate.validState(Player.isValidUsername(packet.name()), "Invalid characters in username", ArrayConstants.emptyObjectArray); // Paper - config username validation ++ // Leaf start - Remove Mojang's username check ++ if (!org.dreeam.leaf.LeafConfig.removeMojangUsernameCheck) { ++ if (io.papermc.paper.configuration.GlobalConfiguration.get().proxies.isProxyOnlineMode() && io.papermc.paper.configuration.GlobalConfiguration.get().unsupportedSettings.performUsernameValidation && !this.iKnowThisMayNotBeTheBestIdeaButPleaseDisableUsernameValidation) ++ Validate.validState(Player.isValidUsername(packet.name()), "Invalid characters in username", ArrayConstants.emptyObjectArray); // Paper - config username validation ++ } ++ // Leaf end // Gale end - JettPack - reduce array allocations - // Paper start - validate usernames -- if (io.papermc.paper.configuration.GlobalConfiguration.get().proxies.isProxyOnlineMode() && io.papermc.paper.configuration.GlobalConfiguration.get().unsupportedSettings.performUsernameValidation) { -+ if (io.papermc.paper.configuration.GlobalConfiguration.get().proxies.isProxyOnlineMode() && io.papermc.paper.configuration.GlobalConfiguration.get().unsupportedSettings.performUsernameValidation && !org.dreeam.leaf.LeafConfig.removeMojangUsernameCheck) { // Leaf - Remove Mojang's username check - if (!this.iKnowThisMayNotBeTheBestIdeaButPleaseDisableUsernameValidation && !validateUsername(packet.name())) { - ServerLoginPacketListenerImpl.this.disconnect("Failed to verify username!"); - return; + this.requestedUsername = packet.name(); + GameProfile gameprofile = this.server.getSingleplayerProfile(); diff --git a/src/main/java/org/dreeam/leaf/LeafConfig.java b/src/main/java/org/dreeam/leaf/LeafConfig.java index 80a196442edbc6b4eb44bb6a405100871aea2f6a..1e9a440d790bdd521c58dfc9c1575e2759006d02 100644 --- a/src/main/java/org/dreeam/leaf/LeafConfig.java diff --git a/patches/server/0015-Remove-UseItemOnPacket-Too-Far-Check.patch b/patches/server/0015-Remove-UseItemOnPacket-Too-Far-Check.patch index 2acfff19..78e8aa61 100644 --- a/patches/server/0015-Remove-UseItemOnPacket-Too-Far-Check.patch +++ b/patches/server/0015-Remove-UseItemOnPacket-Too-Far-Check.patch @@ -7,10 +7,10 @@ This Check is added in 1.17.x -> 1.18.x update by Mojang. By removing this check, it enable hackers to use some modules of hack clients. diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 9c7fe1d04315423adb2ca8596175ddc94f7a81ef..47f2568bacb06ffc7d756bbe2ea36ef9582dd4f2 100644 +index add52c6986866c42d73c51fa8390d62a4a9d5594..78374c798272f597067bcf2ff7d9d060c0f4f5b2 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -1981,7 +1981,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2008,7 +2008,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl Vec3 vec3d2 = vec3d.subtract(vec3d1); double d0 = 1.0000001D; diff --git a/patches/server/0017-KeYi-Player-Skull-API.patch b/patches/server/0017-KeYi-Player-Skull-API.patch index c12c5ca0..8d585766 100644 --- a/patches/server/0017-KeYi-Player-Skull-API.patch +++ b/patches/server/0017-KeYi-Player-Skull-API.patch @@ -7,10 +7,10 @@ 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 3b3bbeda831f82b6d9b284d85a31a1fff578a64f..5da0975b347261fc659f3c7710761c12307be493 100644 +index dd3af429e9949a8dea09abf29bac226cc1f82e8c..c33661468d4f1e0cc668f5854b3df472c8646897 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,6 +30,11 @@ import java.util.Optional; import java.util.Set; import java.util.UUID; import java.util.WeakHashMap; @@ -22,7 +22,7 @@ index 3b3bbeda831f82b6d9b284d85a31a1fff578a64f..5da0975b347261fc659f3c7710761c12 import java.util.logging.Level; import java.util.logging.Logger; import javax.annotation.Nullable; -@@ -165,6 +170,7 @@ import org.bukkit.event.player.PlayerUnregisterChannelEvent; +@@ -166,6 +171,7 @@ import org.bukkit.event.player.PlayerUnregisterChannelEvent; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.InventoryView.Property; import org.bukkit.inventory.ItemStack; @@ -30,7 +30,7 @@ index 3b3bbeda831f82b6d9b284d85a31a1fff578a64f..5da0975b347261fc659f3c7710761c12 import org.bukkit.map.MapCursor; import org.bukkit.map.MapView; import org.bukkit.metadata.MetadataValue; -@@ -3400,4 +3406,28 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -3390,4 +3396,28 @@ public class CraftPlayer extends CraftHumanEntity implements Player { this.getHandle().connection.send(new net.minecraft.network.protocol.game.ClientboundPlayerCombatKillPacket(getEntityId(), io.papermc.paper.adventure.PaperAdventure.asVanilla(message))); } // Purpur end diff --git a/patches/server/0019-KeYi-Add-an-option-for-spigot-item-merging-mechanism.patch b/patches/server/0019-KeYi-Add-an-option-for-spigot-item-merging-mechanism.patch index ba33a871..29fadc91 100644 --- a/patches/server/0019-KeYi-Add-an-option-for-spigot-item-merging-mechanism.patch +++ b/patches/server/0019-KeYi-Add-an-option-for-spigot-item-merging-mechanism.patch @@ -7,10 +7,10 @@ Original license: MIT Original project: https://github.com/KeYiMC/KeYi diff --git a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java -index 07f1f6c9613150fd1cdd460a940629a67539d8db..0fe02df86483809cef22fca2e2ce0af7b4a5c6d5 100644 +index d9bc196c653aff84913bbb0e495fe735e366d23f..1f61dc925624c493ae458748e8422383104b022f 100644 --- a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java +++ b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java -@@ -331,7 +331,7 @@ public class ItemEntity extends Entity implements TraceableEntity { +@@ -349,7 +349,7 @@ public class ItemEntity extends Entity implements TraceableEntity { ItemStack itemstack1 = other.getItem(); if (Objects.equals(this.target, other.target) && ItemEntity.areMergable(itemstack, itemstack1)) { diff --git a/patches/server/0021-Carpet-Fixes-Use-optimized-RecipeManager.patch b/patches/server/0021-Carpet-Fixes-Use-optimized-RecipeManager.patch index 8a508b1a..423ca9e8 100644 --- a/patches/server/0021-Carpet-Fixes-Use-optimized-RecipeManager.patch +++ b/patches/server/0021-Carpet-Fixes-Use-optimized-RecipeManager.patch @@ -11,12 +11,12 @@ This is a fully vanilla optimization. Improves: [Blast]Furnace/Campfire/Smoker/S This was mostly made for the auto crafting table, since the performance boost is much more visible while using that mod diff --git a/src/main/java/net/minecraft/world/item/crafting/RecipeManager.java b/src/main/java/net/minecraft/world/item/crafting/RecipeManager.java -index 666fc85bc2079cb367b340f2605f29fe002f4d22..72fb1729f366a4ea6e3cb7f81d87472201be81e1 100644 +index b81e1802c8dcc8ebdef96d70088c18379598a66b..55e413c10b025435de20ff56954ce44cc8940ffa 100644 --- a/src/main/java/net/minecraft/world/item/crafting/RecipeManager.java +++ b/src/main/java/net/minecraft/world/item/crafting/RecipeManager.java -@@ -13,8 +13,8 @@ import com.mojang.datafixers.util.Pair; +@@ -11,8 +11,8 @@ import com.google.gson.JsonParseException; + import com.mojang.datafixers.util.Pair; import com.mojang.logging.LogUtils; - import com.mojang.serialization.Codec; import com.mojang.serialization.JsonOps; +import java.util.ArrayList; import java.util.Collection; diff --git a/patches/server/0022-Akarin-Save-Json-list-asynchronously.patch b/patches/server/0022-Akarin-Save-Json-list-asynchronously.patch index d10bfd94..d7c9b7e6 100644 --- a/patches/server/0022-Akarin-Save-Json-list-asynchronously.patch +++ b/patches/server/0022-Akarin-Save-Json-list-asynchronously.patch @@ -8,10 +8,10 @@ Original license: GPL v3 Original project: https://github.com/Akarin-project/Akarin diff --git a/src/main/java/net/minecraft/server/players/StoredUserList.java b/src/main/java/net/minecraft/server/players/StoredUserList.java -index ac64513e989500e76f8b0689dae655bcfc7f5b53..2be0b802bf03f6952334928464094bf6932eff6a 100644 +index 71e1c1a1ae59f74cfeea071aa6988f6fe47a286d..ca8f58aef40ff481dc3d620998f432dc23e48c1c 100644 --- a/src/main/java/net/minecraft/server/players/StoredUserList.java +++ b/src/main/java/net/minecraft/server/players/StoredUserList.java -@@ -25,6 +25,7 @@ import java.util.stream.Stream; +@@ -23,6 +23,7 @@ import java.util.stream.Stream; import javax.annotation.Nullable; import me.titaniumtown.ArrayConstants; @@ -19,7 +19,7 @@ index ac64513e989500e76f8b0689dae655bcfc7f5b53..2be0b802bf03f6952334928464094bf6 import net.minecraft.Util; import net.minecraft.util.GsonHelper; import org.slf4j.Logger; -@@ -144,37 +145,43 @@ public abstract class StoredUserList> { +@@ -127,37 +128,43 @@ public abstract class StoredUserList> { } public void save() throws IOException { diff --git a/patches/server/0023-Slice-Smooth-Teleports.patch b/patches/server/0023-Slice-Smooth-Teleports.patch index 8abf5b6d..118fcc9f 100644 --- a/patches/server/0023-Slice-Smooth-Teleports.patch +++ b/patches/server/0023-Slice-Smooth-Teleports.patch @@ -7,10 +7,10 @@ Original license: MIT Original project: https://github.com/Cryptite/Slice diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index 1b760a544616c9950f65071736cf34abcb10d7a1..fdaf8885039c2ed5dbee65b44825f200c89b9d7b 100644 +index 6096a1d08cb2018a178ed925e0a909ed8f5c3888..e3d27b570719839b461a99f6682c02722a3a18d7 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java -@@ -279,6 +279,7 @@ public class ServerPlayer extends Player { +@@ -286,6 +286,7 @@ public class ServerPlayer extends Player { private boolean tpsBar = false; // Purpur private boolean compassBar = false; // Purpur private boolean ramBar = false; // Purpur @@ -19,10 +19,10 @@ index 1b760a544616c9950f65071736cf34abcb10d7a1..fdaf8885039c2ed5dbee65b44825f200 // Paper start - replace player chunk loader private final java.util.concurrent.atomic.AtomicReference viewDistances = new java.util.concurrent.atomic.AtomicReference<>(new io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader.ViewDistances(-1, -1, -1)); diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index 1dd4bea0d5cf4aec51220253af8981c5aba29634..fa9264af129acc046822ac0a7769e45e42142baf 100644 +index 4158800ce4f86d20213dfd9ccba38d4baf10aa02..9e66c884c9a00263cb8f723f0a94cebed7d788c9 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java -@@ -972,10 +972,10 @@ public abstract class PlayerList { +@@ -970,10 +970,10 @@ public abstract class PlayerList { ServerLevel worldserver2 = entityplayer1.serverLevel(); LevelData worlddata = worldserver2.getLevelData(); @@ -36,10 +36,10 @@ index 1dd4bea0d5cf4aec51220253af8981c5aba29634..fa9264af129acc046822ac0a7769e45e entityplayer1.connection.send(new ClientboundChangeDifficultyPacket(worlddata.getDifficulty(), worlddata.isDifficultyLocked())); entityplayer1.connection.send(new ClientboundSetExperiencePacket(entityplayer1.experienceProgress, entityplayer1.totalExperience, entityplayer1.experienceLevel)); diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 5da0975b347261fc659f3c7710761c12307be493..84e75ba03da79bd761178fc22b746f1d38a9f44c 100644 +index c33661468d4f1e0cc668f5854b3df472c8646897..e89ecf6d99c4ca2e387774eedcd94959d00f1d6f 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -1273,6 +1273,15 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -1281,6 +1281,15 @@ public class CraftPlayer extends CraftHumanEntity implements Player { // Paper end } diff --git a/patches/server/0025-Leaves-Server-Utils.patch b/patches/server/0025-Leaves-Server-Utils.patch index 51a998b4..ae323a2d 100644 --- a/patches/server/0025-Leaves-Server-Utils.patch +++ b/patches/server/0025-Leaves-Server-Utils.patch @@ -7,10 +7,10 @@ Original license: GPLv3 Original project: https://github.com/LeavesMC/Leaves diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index dda34ad1f05302d0706710dc20766c4059229c83..3cf07a2d82ec9f0d6666fb27aee9acc9d9823ead 100644 +index 8d330441c3af704ef124599aaa237f3173a8cdea..510eb88b3d43da5f5e976a7affbdc79de9241130 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -419,6 +419,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -424,6 +424,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S public boolean freezeLocked = false; // Paper - Freeze Tick Lock API public boolean collidingWithWorldBorder; // Paper public boolean fixedPose = false; // Paper @@ -18,15 +18,15 @@ index dda34ad1f05302d0706710dc20766c4059229c83..3cf07a2d82ec9f0d6666fb27aee9acc9 public void setOrigin(@javax.annotation.Nonnull Location location) { this.origin = location.toVector(); -@@ -2507,6 +2508,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { - nbt.putBoolean("Paper.FreezeLock", true); +@@ -2530,6 +2531,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S + nbttagcompound.putBoolean("Paper.FreezeLock", true); } // Paper end -+ nbt.put("Leaves.Data", leavesData); // Leaves - leaves ex data - return nbt; ++ nbttagcompound.put("Leaves.Data", leavesData); // Leaves - leaves ex data + return nbttagcompound; } catch (Throwable throwable) { CrashReport crashreport = CrashReport.forThrowable(throwable, "Saving entity NBT"); -@@ -2654,6 +2656,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -2677,6 +2679,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S freezeLocked = nbt.getBoolean("Paper.FreezeLock"); } // Paper end @@ -38,7 +38,7 @@ index dda34ad1f05302d0706710dc20766c4059229c83..3cf07a2d82ec9f0d6666fb27aee9acc9 } catch (Throwable throwable) { CrashReport crashreport = CrashReport.forThrowable(throwable, "Loading entity NBT"); -@@ -5072,4 +5079,10 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -5114,4 +5121,10 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S return false; } // Purpur end diff --git a/patches/server/0026-Leaves-Protocol-Core.patch b/patches/server/0026-Leaves-Protocol-Core.patch index 3fa53059..99aaaf9d 100644 --- a/patches/server/0026-Leaves-Protocol-Core.patch +++ b/patches/server/0026-Leaves-Protocol-Core.patch @@ -25,10 +25,10 @@ index af86f752c33a2990405fea058b7c41c437ba9d46..bada9fae1e7178162429e1f5a1608b9c } diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 6dd82dca0c02a92e220d99ea4f2e6e3eaf0752ec..0a077053884d4303ff0ae360cebcd8d455d8d00f 100644 +index 138935ffe2f7852e8aa30a5fdea2d4ca340c4cdf..625822b060683bfdf3b79f82ed5eea68ff8ade85 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1560,6 +1560,8 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop { + if (object instanceof JukeboxBlockEntity jukebox) { -+ ItemStack stack = jukebox.getFirstItem(); ++ ItemStack stack = jukebox.getTheItem(); + if (!stack.isEmpty()) { + data.put("Record", stack.save(new CompoundTag())); + } diff --git a/patches/server/0029-Leaves-Xaero-Map-Protocol.patch b/patches/server/0029-Leaves-Xaero-Map-Protocol.patch index 015b8b61..a157bfe9 100644 --- a/patches/server/0029-Leaves-Xaero-Map-Protocol.patch +++ b/patches/server/0029-Leaves-Xaero-Map-Protocol.patch @@ -7,10 +7,10 @@ Original license: GPLv3 Original project: https://github.com/LeavesMC/Leaves diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index 032a682d6be24bbb3bdef1447ccdfe7da109f0e8..a5b21b5bc20b43c77cb6d276f89aceaef1ebc33a 100644 +index 7b184f16a7759ddfbdf430b2f79f1055a8e77064..f30825df1eb2a4a9383b1fe33fa76ebba98bc999 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java -@@ -1372,6 +1372,7 @@ public abstract class PlayerList { +@@ -1370,6 +1370,7 @@ public abstract class PlayerList { player.connection.send(new ClientboundInitializeBorderPacket(worldborder)); player.connection.send(new ClientboundSetTimePacket(world.getGameTime(), world.getDayTime(), world.getGameRules().getBoolean(GameRules.RULE_DAYLIGHT))); player.connection.send(new ClientboundSetDefaultSpawnPositionPacket(world.getSharedSpawnPos(), world.getSharedSpawnAngle())); diff --git a/patches/server/0030-Leaves-Syncmatica-Protocol.patch b/patches/server/0030-Leaves-Syncmatica-Protocol.patch index 5d027b47..602fc0da 100644 --- a/patches/server/0030-Leaves-Syncmatica-Protocol.patch +++ b/patches/server/0030-Leaves-Syncmatica-Protocol.patch @@ -9,18 +9,18 @@ Original project: https://github.com/LeavesMC/Leaves This patch is Powered by Syncmatica(https://github.com/End-Tech/syncmatica) diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 47f2568bacb06ffc7d756bbe2ea36ef9582dd4f2..23828b5d2300d64ac5a5c1a5da1bb1ee14f45d24 100644 +index 78374c798272f597067bcf2ff7d9d060c0f4f5b2..1acd2580294af4e7f07a5c5e767d8e3093efca17 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -308,6 +308,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl - player.getTextFilter().join(); - this.signedMessageDecoder = server.enforceSecureProfile() ? SignedMessageChain.Decoder.REJECT_ALL : SignedMessageChain.Decoder.unsigned(player.getUUID()); +@@ -311,6 +311,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl + Objects.requireNonNull(server); + this.signedMessageDecoder = SignedMessageChain.Decoder.unsigned(uuid, server::enforceSecureProfile); this.chatMessageChain = new FutureChain(server.chatExecutor); // CraftBukkit - async chat + this.exchangeTarget = new top.leavesmc.leaves.protocol.syncmatica.exchange.ExchangeTarget(this); // Leaves - Syncmatica Protocol } // CraftBukkit start - add fields -@@ -348,6 +349,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -351,6 +352,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl ); // Purpur end diff --git a/patches/server/0034-Petal-Async-Pathfinding.patch b/patches/server/0033-Petal-Async-Pathfinding.patch similarity index 98% rename from patches/server/0034-Petal-Async-Pathfinding.patch rename to patches/server/0033-Petal-Async-Pathfinding.patch index f2a2da1f..521686bc 100644 --- a/patches/server/0034-Petal-Async-Pathfinding.patch +++ b/patches/server/0033-Petal-Async-Pathfinding.patch @@ -14,10 +14,10 @@ This patch was ported downstream from the Petal fork. Makes most pathfinding-related work happen asynchronously diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java -index d6009cf7ea6857e98f86b6bd71e34d0f137921ad..4a029f394e9df35a5bcbc42f8e2731fc2d789326 100644 +index 86e1434a6361fda0d379dd67608752d0a2a30f5e..f921f961e62449b15a54f05d223c534c975b3f63 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java -@@ -293,6 +293,7 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -294,6 +294,7 @@ public abstract class Mob extends LivingEntity implements Targeting { @Nullable @Override public LivingEntity getTarget() { @@ -591,10 +591,10 @@ index 8db20db72cd51046213625fac46c35854c59ec5d..fc99483dfe248d26885c904b72c93b0d } } diff --git a/src/main/java/net/minecraft/world/entity/animal/Bee.java b/src/main/java/net/minecraft/world/entity/animal/Bee.java -index 38a3dcec138d9233a46e5d523bcc6d64bc7fffd0..4f53747d6b90db92ae12f656c3525c45fb051d3f 100644 +index bdb78cc701543cfe91a6bafd1786fe2ea0bf1ddc..8d2e60c24e8d48094a93fdd864d931d0c33d0ca0 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Bee.java +++ b/src/main/java/net/minecraft/world/entity/animal/Bee.java -@@ -1147,7 +1147,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -1154,7 +1154,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { } else { Bee.this.pathfindRandomlyTowards(Bee.this.hivePos); } @@ -603,7 +603,7 @@ index 38a3dcec138d9233a46e5d523bcc6d64bc7fffd0..4f53747d6b90db92ae12f656c3525c45 boolean flag = this.pathfindDirectlyTowards(Bee.this.hivePos); if (!flag) { -@@ -1209,7 +1209,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -1216,7 +1216,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { } else { Path pathentity = Bee.this.navigation.getPath(); @@ -613,7 +613,7 @@ index 38a3dcec138d9233a46e5d523bcc6d64bc7fffd0..4f53747d6b90db92ae12f656c3525c45 } } 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 afd2b1922f23148d25e0f2732d60f4da8ea3b063..56badde70e0833d1e4f0bc521fc67f3e90aa3e58 100644 +index 819445535895fbf79b99222bc6bf33cbd9089813..80a7197835531fa8cd276d9d31860f2b5ad3089f 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 @@ -66,6 +66,8 @@ import net.minecraft.world.level.pathfinder.Node; @@ -625,7 +625,7 @@ index afd2b1922f23148d25e0f2732d60f4da8ea3b063..56badde70e0833d1e4f0bc521fc67f3e public class Frog extends Animal implements VariantHolder { public static final Ingredient TEMPTATION_ITEM = Ingredient.of(Items.SLIME_BALL); -@@ -439,6 +441,17 @@ public class Frog extends Animal implements VariantHolder { +@@ -434,6 +436,17 @@ public class Frog extends Animal implements VariantHolder { super(frog, world); } @@ -643,7 +643,7 @@ index afd2b1922f23148d25e0f2732d60f4da8ea3b063..56badde70e0833d1e4f0bc521fc67f3e @Override public boolean canCutCorner(BlockPathTypes nodeType) { return nodeType != BlockPathTypes.WATER_BORDER && super.canCutCorner(nodeType); -@@ -448,6 +461,11 @@ public class Frog extends Animal implements VariantHolder { +@@ -443,6 +456,11 @@ public class Frog extends Animal implements VariantHolder { protected PathFinder createPathFinder(int range) { this.nodeEvaluator = new Frog.FrogNodeEvaluator(true); this.nodeEvaluator.setCanPassDoors(true); @@ -656,7 +656,7 @@ index afd2b1922f23148d25e0f2732d60f4da8ea3b063..56badde70e0833d1e4f0bc521fc67f3e } } diff --git a/src/main/java/net/minecraft/world/entity/monster/Drowned.java b/src/main/java/net/minecraft/world/entity/monster/Drowned.java -index 63a1cf5604c14025171d7be7434e2d6b64c98107..5058e53325b61a37e7b6398e59248bc3b339b5b6 100644 +index 034bb2d1292dde6276885c3ea71d886c3894311c..3556f9a37d6a4790f9311e1004d32156aff541e2 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Drowned.java +++ b/src/main/java/net/minecraft/world/entity/monster/Drowned.java @@ -282,7 +282,6 @@ public class Drowned extends Zombie implements RangedAttackMob { @@ -717,10 +717,10 @@ index 2f49b528601a1feb7246fe7a9b83ce828c2d78fc..a29f212f3b38f1d80d7d5023f86a7acf } diff --git a/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java b/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java -index 9e2498f8cb4a1a309aa037c01aa3039924f5b29e..2df6e3772ffb79f17c1e4097cbf3ea1ebc2a82ae 100644 +index 96f98389d8cdf588396bf6257a11236a577878a0..c23d192baf78890093b0e88d03735eef4569e75f 100644 --- a/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java +++ b/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java -@@ -622,6 +622,16 @@ public class Warden extends Monster implements VibrationSystem { +@@ -623,6 +623,16 @@ public class Warden extends Monster implements VibrationSystem { protected PathFinder createPathFinder(int range) { this.nodeEvaluator = new WalkNodeEvaluator(); this.nodeEvaluator.setCanPassDoors(true); @@ -738,10 +738,10 @@ index 9e2498f8cb4a1a309aa037c01aa3039924f5b29e..2df6e3772ffb79f17c1e4097cbf3ea1e @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 2b513fc2f6c33963e43093cb08594bff946d72fa..cc0c45b2042fe0add2ef4eab73b013bdf5ff3a54 100644 +index 42407c5c0c09cd9d19bc7af92af8868bb038c686..204a17ab514d63294e72d609b0b3574958b877d3 100644 --- a/src/main/java/net/minecraft/world/level/block/ShulkerBoxBlock.java +++ b/src/main/java/net/minecraft/world/level/block/ShulkerBoxBlock.java -@@ -238,8 +238,13 @@ public class ShulkerBoxBlock extends BaseEntityBlock { +@@ -254,8 +254,13 @@ public class ShulkerBoxBlock extends BaseEntityBlock { @Override public VoxelShape getShape(BlockState state, BlockGetter world, BlockPos pos, CollisionContext context) { @@ -935,7 +935,7 @@ index 0e2b14e7dfedf209d63279c81723fd7955122d78..079b278e2e262af433bb5bd0c12b3d8d public SwimNodeEvaluator(boolean canJumpOutOfWater) { diff --git a/src/main/java/org/dreeam/leaf/LeafConfig.java b/src/main/java/org/dreeam/leaf/LeafConfig.java -index 318d41b0e1849a729fd32fe9c5842174d2b1d532..d23cab4c405fb91c77a7d41af630656809a303de 100644 +index 5dcc4f3c3752ae48cb6728fa8cfc384466c24da0..78471417f9b57fb44de71357500ef4644d072945 100644 --- a/src/main/java/org/dreeam/leaf/LeafConfig.java +++ b/src/main/java/org/dreeam/leaf/LeafConfig.java @@ -5,6 +5,7 @@ import net.minecraft.core.registries.BuiltInRegistries; diff --git a/patches/server/0033-sync-with-Gale-s-Skip-unnecessary-mob-spawning-compu.patch b/patches/server/0033-sync-with-Gale-s-Skip-unnecessary-mob-spawning-compu.patch deleted file mode 100644 index 3272c50a..00000000 --- a/patches/server/0033-sync-with-Gale-s-Skip-unnecessary-mob-spawning-compu.patch +++ /dev/null @@ -1,20 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Dreeam <61569423+Dreeam-qwq@users.noreply.github.com> -Date: Tue, 24 Oct 2023 17:50:49 -0400 -Subject: [PATCH] sync with Gale's - Skip-unnecessary-mob-spawning-computations.patch - - -diff --git a/src/main/java/net/minecraft/server/level/ServerChunkCache.java b/src/main/java/net/minecraft/server/level/ServerChunkCache.java -index 25bbb4afdb616d827db4a511ebc503445bec27fa..448f3a5197901c9d861bfca92ab3105056726624 100644 ---- a/src/main/java/net/minecraft/server/level/ServerChunkCache.java -+++ b/src/main/java/net/minecraft/server/level/ServerChunkCache.java -@@ -629,7 +629,7 @@ public class ServerChunkCache extends ChunkSource { - // Paper end - optimise chunk tick iteration - if (tick && chunk1.chunkStatus.isOrAfter(net.minecraft.server.level.FullChunkStatus.ENTITY_TICKING)) { // Paper - optimise chunk tick iteration - chunk1.incrementInhabitedTime(j); -- if (spawn && flag2 && (!org.dreeam.leaf.LeafConfig.enableAsyncMobSpawning || _pufferfish_spawnCountsReady.get()) && (this.spawnEnemies || this.spawnFriendlies) && this.level.getWorldBorder().isWithinBounds(chunkcoordintpair)) { // Spigot // Paper - optimise chunk tick iteration // Pufferfish -+ if (spawn && flag2AndHasNaturalSpawn && (!org.dreeam.leaf.LeafConfig.enableAsyncMobSpawning || _pufferfish_spawnCountsReady.get()) && (this.spawnEnemies || this.spawnFriendlies) && this.level.getWorldBorder().isWithinBounds(chunkcoordintpair)) { // Spigot // Paper - optimise chunk tick iteration // Gale - MultiPaper - skip unnecessary mob spawning computations // Pufferfish - NaturalSpawner.spawnForChunk(this.level, chunk1, lastSpawnState, this.spawnFriendlies, this.spawnEnemies, flag1); // Pufferfish - } - diff --git a/patches/server/0035-Fix-tracker-NPE.patch b/patches/server/0034-Fix-tracker-NPE.patch similarity index 94% rename from patches/server/0035-Fix-tracker-NPE.patch rename to patches/server/0034-Fix-tracker-NPE.patch index aaf847e0..e08bfec6 100644 --- a/patches/server/0035-Fix-tracker-NPE.patch +++ b/patches/server/0034-Fix-tracker-NPE.patch @@ -27,19 +27,19 @@ index 6c3c4ec6cef581da45f6cdbb68cb74ea099a93a0..80badf34e9af7ef656f33e1bfe762083 public TrackedEntity(Entity entity, int i, int j, boolean flag) { this.serverEntity = new ServerEntity(ChunkMap.this.level, entity, j, flag, this::broadcast, this.seenBy); // CraftBukkit diff --git a/src/main/java/net/minecraft/server/level/ServerChunkCache.java b/src/main/java/net/minecraft/server/level/ServerChunkCache.java -index ba0fe0786479fcfd81202a02fe8feb382986116e..e413ebfb34a10b1ca8a323a9511ed48721919cea 100644 +index 76b64eb4a69e2d02c23d5375f1e80ab8ad19e403..7be009953587e3beb0e823ea722cbfe01cc37041 100644 --- a/src/main/java/net/minecraft/server/level/ServerChunkCache.java +++ b/src/main/java/net/minecraft/server/level/ServerChunkCache.java -@@ -10,6 +10,7 @@ import java.util.Arrays; - import java.util.Collections; +@@ -9,6 +9,7 @@ import java.io.IOException; + import java.util.Arrays; import java.util.Iterator; import java.util.List; +import java.util.ArrayList; // Leaf import java.util.Objects; import java.util.Optional; import java.util.concurrent.CompletableFuture; -@@ -652,7 +653,7 @@ public class ServerChunkCache extends ChunkSource { - +@@ -684,7 +685,7 @@ public class ServerChunkCache extends ChunkSource { + // Paper - optimise chunk tick iteration // Paper start - optimise chunk tick iteration if (!this.chunkMap.needsChangeBroadcasting.isEmpty()) { - it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet copy = this.chunkMap.needsChangeBroadcasting.clone(); diff --git a/patches/server/0036-Cache-minecart-vehicle-collision-results.patch b/patches/server/0035-Cache-minecart-vehicle-collision-results.patch similarity index 92% rename from patches/server/0036-Cache-minecart-vehicle-collision-results.patch rename to patches/server/0035-Cache-minecart-vehicle-collision-results.patch index 9064fc02..45e5d995 100644 --- a/patches/server/0036-Cache-minecart-vehicle-collision-results.patch +++ b/patches/server/0035-Cache-minecart-vehicle-collision-results.patch @@ -9,7 +9,7 @@ Cache minecart vehicle collision results to prevent lag causing by massive stack The known issue: entity can't enter the minecart after enabling this! diff --git a/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java b/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java -index faf449dfb4f95a300796db46833f3b6a51cb961b..3a5a13e1d921703a9f32ec5169ed8805a09fa84f 100644 +index 0eca1c61991b0d344d0810239d9cab2873216f04..bb29b40fb7ce9d24be8f04af51add749652007ee 100644 --- a/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java +++ b/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java @@ -5,6 +5,8 @@ import com.google.common.collect.ImmutableMap; @@ -21,7 +21,7 @@ index faf449dfb4f95a300796db46833f3b6a51cb961b..3a5a13e1d921703a9f32ec5169ed8805 import java.util.Iterator; import java.util.List; import java.util.Map; -@@ -342,6 +344,21 @@ public abstract class AbstractMinecart extends Entity { +@@ -294,6 +296,21 @@ public abstract class AbstractMinecart extends VehicleEntity { return this.flipped ? this.getDirection().getOpposite().getClockWise() : this.getDirection().getClockWise(); } @@ -43,7 +43,7 @@ index faf449dfb4f95a300796db46833f3b6a51cb961b..3a5a13e1d921703a9f32ec5169ed8805 @Override public void tick() { // Purpur start -@@ -437,8 +454,9 @@ public abstract class AbstractMinecart extends Entity { +@@ -389,8 +406,9 @@ public abstract class AbstractMinecart extends VehicleEntity { this.level().getCraftServer().getPluginManager().callEvent(new org.bukkit.event.vehicle.VehicleMoveEvent(vehicle, from, to)); } // CraftBukkit end @@ -54,7 +54,7 @@ index faf449dfb4f95a300796db46833f3b6a51cb961b..3a5a13e1d921703a9f32ec5169ed8805 if (!list.isEmpty()) { Iterator iterator = list.iterator(); -@@ -472,7 +490,7 @@ public abstract class AbstractMinecart extends Entity { +@@ -424,7 +442,7 @@ public abstract class AbstractMinecart extends VehicleEntity { } } } else { @@ -64,7 +64,7 @@ index faf449dfb4f95a300796db46833f3b6a51cb961b..3a5a13e1d921703a9f32ec5169ed8805 while (iterator1.hasNext()) { Entity entity1 = (Entity) iterator1.next(); diff --git a/src/main/java/org/dreeam/leaf/LeafConfig.java b/src/main/java/org/dreeam/leaf/LeafConfig.java -index d23cab4c405fb91c77a7d41af630656809a303de..5c61144904bac178d40d8cb43253730c7d1e150f 100644 +index 78471417f9b57fb44de71357500ef4644d072945..02df29518c43408c74a32ed1d90313da925ab377 100644 --- a/src/main/java/org/dreeam/leaf/LeafConfig.java +++ b/src/main/java/org/dreeam/leaf/LeafConfig.java @@ -201,6 +201,7 @@ public class LeafConfig { diff --git a/patches/server/0037-Reduce-canSee-work.patch b/patches/server/0036-Reduce-canSee-work.patch similarity index 87% rename from patches/server/0037-Reduce-canSee-work.patch rename to patches/server/0036-Reduce-canSee-work.patch index dbcd4f23..ef18abe8 100644 --- a/patches/server/0037-Reduce-canSee-work.patch +++ b/patches/server/0036-Reduce-canSee-work.patch @@ -6,10 +6,10 @@ Subject: [PATCH] Reduce canSee work Credit by: Martijn Muijsers , MachineBreaker diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index 192026f9edab53248dbd6db4fdb7d3955dff247e..bbfa6415fad20f3380c169c325d138e34b5e001b 100644 +index afe0fa16ced3cae40737c8017875901e4809df24..3414b9f7d1908e264540306a2062d35462841033 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java -@@ -383,11 +383,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -386,11 +386,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { for (int i = 0, len = entities.size(); i < len; ++i) { Entity entity = entities.get(i); @@ -22,7 +22,7 @@ index 192026f9edab53248dbd6db4fdb7d3955dff247e..bbfa6415fad20f3380c169c325d138e3 // !entity1.dead && entity1.i && (entity == null || !entity1.x(entity)); // elide the last check since vanilla calls with entity = null // only we care about the source for the canSee check -@@ -395,6 +391,11 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -398,6 +394,11 @@ public abstract class Level implements LevelAccessor, AutoCloseable { continue; } @@ -35,10 +35,10 @@ index 192026f9edab53248dbd6db4fdb7d3955dff247e..bbfa6415fad20f3380c169c325d138e3 return false; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 84e75ba03da79bd761178fc22b746f1d38a9f44c..718d6341fb440b8139b6ee75a17b07ed07221627 100644 +index e89ecf6d99c4ca2e387774eedcd94959d00f1d6f..09f18678bb015c2109e087da4f9c1f9fe1776e9c 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -580,12 +580,14 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -588,12 +588,14 @@ public class CraftPlayer extends CraftHumanEntity implements Player { this.getHandle().connection.send(packet); } @@ -53,7 +53,7 @@ index 84e75ba03da79bd761178fc22b746f1d38a9f44c..718d6341fb440b8139b6ee75a17b07ed if ((this.getUniqueId() == null) || (other.getUniqueId() == null)) { return false; } -@@ -2108,6 +2110,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -2116,6 +2118,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { return this.canSee((org.bukkit.entity.Entity) player); } diff --git a/patches/server/0038-Faster-Natural-Spawning.patch b/patches/server/0037-Faster-Natural-Spawning.patch similarity index 96% rename from patches/server/0038-Faster-Natural-Spawning.patch rename to patches/server/0037-Faster-Natural-Spawning.patch index f8b23643..97f2585a 100644 --- a/patches/server/0038-Faster-Natural-Spawning.patch +++ b/patches/server/0037-Faster-Natural-Spawning.patch @@ -22,10 +22,10 @@ index ff1ad1024419182f7f3de578442c1c033d4c9ebb..5e51a1c79811291a740ad4d5e79a7d67 @Deprecated static RandomSource createThreadSafe() { diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index 1916e5f1d6bc4c2b14a138a46477adea939caf81..275557da9faa7f27dd2fbfbdfbda620d4add0f8a 100644 +index 3414b9f7d1908e264540306a2062d35462841033..d39919b746f0824fecc62ba01c94c5fe0fad9616 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java -@@ -125,6 +125,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -128,6 +128,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { protected float oThunderLevel; public float thunderLevel; public final RandomSource random = RandomSource.create(); diff --git a/patches/server/0039-Faster-Random-for-xaeroMapServerID-generation.patch b/patches/server/0038-Faster-Random-for-xaeroMapServerID-generation.patch similarity index 93% rename from patches/server/0039-Faster-Random-for-xaeroMapServerID-generation.patch rename to patches/server/0038-Faster-Random-for-xaeroMapServerID-generation.patch index 8b725be4..e551ae92 100644 --- a/patches/server/0039-Faster-Random-for-xaeroMapServerID-generation.patch +++ b/patches/server/0038-Faster-Random-for-xaeroMapServerID-generation.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Faster Random for xaeroMapServerID generation diff --git a/src/main/java/org/dreeam/leaf/LeafConfig.java b/src/main/java/org/dreeam/leaf/LeafConfig.java -index 5c61144904bac178d40d8cb43253730c7d1e150f..ec64cbc95cbdff883c92bf3f2785780dc5e3e269 100644 +index 02df29518c43408c74a32ed1d90313da925ab377..53bde816ca9bf8b704fb2e9794de260a9eba402f 100644 --- a/src/main/java/org/dreeam/leaf/LeafConfig.java +++ b/src/main/java/org/dreeam/leaf/LeafConfig.java @@ -2,7 +2,7 @@ package org.dreeam.leaf; diff --git a/patches/server/0040-Fix-casting-in-Purpur-world-config.patch b/patches/server/0039-Fix-casting-in-Purpur-world-config.patch similarity index 89% rename from patches/server/0040-Fix-casting-in-Purpur-world-config.patch rename to patches/server/0039-Fix-casting-in-Purpur-world-config.patch index 2d6b1891..35628262 100644 --- a/patches/server/0040-Fix-casting-in-Purpur-world-config.patch +++ b/patches/server/0039-Fix-casting-in-Purpur-world-config.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Fix casting in Purpur world config diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index bdbf6efd723d93866b2d24f869b9e964c09fa9ab..c434bf2bab763013d4377773a98b0dfae28be205 100644 +index ff9efaa4455e1030e54aab46bc7bfd2f390793c6..22a61c89007e624586e7ed518f0aa18372bc4593 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -643,7 +643,7 @@ public class PurpurWorldConfig { +@@ -678,7 +678,7 @@ public class PurpurWorldConfig { dropsMap.forEach((itemId, chance) -> { Item item = BuiltInRegistries.ITEM.get(new ResourceLocation(itemId.toString())); if (item == Items.AIR) { PurpurConfig.log(Level.SEVERE, "Invalid item for `tools.axe.strippables." + blockId + ".drops`: " + itemId); return; } @@ -17,7 +17,7 @@ index bdbf6efd723d93866b2d24f869b9e964c09fa9ab..c434bf2bab763013d4377773a98b0dfa }); axeStrippables.put(block, new Strippable(into, drops)); }); -@@ -677,7 +677,7 @@ public class PurpurWorldConfig { +@@ -732,7 +732,7 @@ public class PurpurWorldConfig { dropsMap.forEach((itemId, chance) -> { Item item = BuiltInRegistries.ITEM.get(new ResourceLocation(itemId.toString())); if (item == Items.AIR) { PurpurConfig.log(Level.SEVERE, "Invalid item for `tools.axe.waxables." + blockId + ".drops`: " + itemId); return; } @@ -26,7 +26,7 @@ index bdbf6efd723d93866b2d24f869b9e964c09fa9ab..c434bf2bab763013d4377773a98b0dfa }); axeWaxables.put(block, new Waxable(into, drops)); }); -@@ -707,7 +707,7 @@ public class PurpurWorldConfig { +@@ -777,7 +777,7 @@ public class PurpurWorldConfig { dropsMap.forEach((itemId, chance) -> { Item item = BuiltInRegistries.ITEM.get(new ResourceLocation(itemId.toString())); if (item == Items.AIR) { PurpurConfig.log(Level.SEVERE, "Invalid item for `tools.axe.weatherables." + blockId + ".drops`: " + itemId); return; } @@ -35,7 +35,7 @@ index bdbf6efd723d93866b2d24f869b9e964c09fa9ab..c434bf2bab763013d4377773a98b0dfa }); axeWeatherables.put(block, new Weatherable(into, drops)); }); -@@ -733,7 +733,7 @@ public class PurpurWorldConfig { +@@ -803,7 +803,7 @@ public class PurpurWorldConfig { dropsMap.forEach((itemId, chance) -> { Item item = BuiltInRegistries.ITEM.get(new ResourceLocation(itemId.toString())); if (item == Items.AIR) { PurpurConfig.log(Level.SEVERE, "Invalid item for `tools.hoe.tillables." + blockId + ".drops`: " + itemId); return; } @@ -44,7 +44,7 @@ index bdbf6efd723d93866b2d24f869b9e964c09fa9ab..c434bf2bab763013d4377773a98b0dfa }); hoeTillables.put(block, new Tillable(condition, into, drops)); }); -@@ -757,7 +757,7 @@ public class PurpurWorldConfig { +@@ -827,7 +827,7 @@ public class PurpurWorldConfig { dropsMap.forEach((itemId, chance) -> { Item item = BuiltInRegistries.ITEM.get(new ResourceLocation(itemId.toString())); if (item == Items.AIR) { PurpurConfig.log(Level.SEVERE, "Invalid item for `tools.shovel.flattenables." + blockId + ".drops`: " + itemId); return; } diff --git a/patches/server/0041-Fix-sprint-glitch.patch b/patches/server/0040-Fix-sprint-glitch.patch similarity index 84% rename from patches/server/0041-Fix-sprint-glitch.patch rename to patches/server/0040-Fix-sprint-glitch.patch index 6276f2d1..a6755985 100644 --- a/patches/server/0041-Fix-sprint-glitch.patch +++ b/patches/server/0040-Fix-sprint-glitch.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Fix sprint glitch diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index d811a2456b7c2b8c4766f4b7943eeb438e88e3fd..1a9eb22266c83a6fb49f53f34190d661fa0be53a 100644 +index 8047aeddf587e2387359291d6640eb4a005ef944..1ea62a6914e7368a1b618314121e6fdf617765c5 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -1430,7 +1430,8 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -1429,7 +1429,8 @@ public abstract class LivingEntity extends Entity implements Attackable { player.setRealHealth(health); } diff --git a/patches/server/0042-Fix-keepalive-kicked-name.patch b/patches/server/0041-Fix-keepalive-kicked-name.patch similarity index 93% rename from patches/server/0042-Fix-keepalive-kicked-name.patch rename to patches/server/0041-Fix-keepalive-kicked-name.patch index 2aac7c1b..db660e37 100644 --- a/patches/server/0042-Fix-keepalive-kicked-name.patch +++ b/patches/server/0041-Fix-keepalive-kicked-name.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Fix keepalive kicked name diff --git a/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java -index 1cb6c157331f6ab7f63e88a6d5fc1237fecde35d..0cea82dda72d16e059e159b039b9fd58e08dd5ca 100644 +index 9eebc93178929cb3e7bad202e6ff308e39863da0..f0e4a0ce4021d254ead091885a5006a1704ee901 100644 --- a/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java @@ -228,7 +228,7 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack diff --git a/patches/unapplied/0035-Matter-Secure-Seed.patch b/patches/unapplied/todo-server/0035-Matter-Secure-Seed.patch similarity index 100% rename from patches/unapplied/0035-Matter-Secure-Seed.patch rename to patches/unapplied/todo-server/0035-Matter-Secure-Seed.patch diff --git a/patches/unapplied/0036-Matter-Seed-Command.patch b/patches/unapplied/todo-server/0036-Matter-Seed-Command.patch similarity index 100% rename from patches/unapplied/0036-Matter-Seed-Command.patch rename to patches/unapplied/todo-server/0036-Matter-Seed-Command.patch