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
-[](https://github.com/Winds-Studio/Leaf/releases)
+[](https://github.com/Winds-Studio/Leaf/releases)
[](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 extends Mob> 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 extends Bat> 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 extends Animal> 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 extends EnderDragon> 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 extends ItemEntity> 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