diff --git a/build.gradle.kts b/build.gradle.kts index f898c85a..d7e9534f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -3,7 +3,7 @@ import org.gradle.api.tasks.testing.logging.TestLogEvent plugins { `maven-publish` - id("io.papermc.paperweight.patcher") version "2.0.0-beta.16" + id("io.papermc.paperweight.patcher") version "2.0.0-beta.17" } val paperMavenPublicUrl = "https://repo.papermc.io/repository/maven-public/" diff --git a/gradle.properties b/gradle.properties index eace4a2b..4373b1f0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ group=cn.dreeam.leaf mcVersion=1.21.5 version=1.21.5-R0.1-SNAPSHOT -paperCommit=6f1f5b67e044b151feec164e4fad13ce282417c1 +paperCommit=b70bca6b698cfc172891d7bfa149649160d08ba2 org.gradle.configuration-cache=true org.gradle.caching=true diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index a4b76b95..1b33c55b 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 37f853b1..002b867c 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index f3b75f3b..23d15a93 100755 --- a/gradlew +++ b/gradlew @@ -114,7 +114,7 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar +CLASSPATH="\\\"\\\"" # Determine the Java command to use to start the JVM. @@ -205,7 +205,7 @@ fi DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, # and any embedded shellness will be escaped. # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be # treated as '${Hostname}' itself on the command line. @@ -213,7 +213,7 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/gradlew.bat b/gradlew.bat index 9d21a218..db3a6ac2 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -70,11 +70,11 @@ goto fail :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar +set CLASSPATH= @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell diff --git a/leaf-api/paper-patches/features/0001-Rebrand.patch b/leaf-api/paper-patches/features/0001-Rebrand.patch index cf5ff32e..32eec108 100644 --- a/leaf-api/paper-patches/features/0001-Rebrand.patch +++ b/leaf-api/paper-patches/features/0001-Rebrand.patch @@ -75,10 +75,10 @@ index 652ff54e7c50412503725d628bfe72ed03059790..f738bbcefe288474c5f591dda03d7138 * Gets the {@code ServerBuildInfo}. * diff --git a/src/main/java/org/bukkit/command/defaults/VersionCommand.java b/src/main/java/org/bukkit/command/defaults/VersionCommand.java -index 26bc02a534cbf77fb3f605ee9d27cea6258fea0f..3c4e127cbd3b8310070f94e38d501d68860710a3 100644 +index 29756f4ea6c6abf3b35106ee05a4f9ffd404a6af..d14d29364c4f180053158c1af0d9b49aba6cb641 100644 --- a/src/main/java/org/bukkit/command/defaults/VersionCommand.java +++ b/src/main/java/org/bukkit/command/defaults/VersionCommand.java -@@ -213,7 +213,7 @@ public class VersionCommand extends BukkitCommand { +@@ -214,7 +214,7 @@ public class VersionCommand extends BukkitCommand { String version = Bukkit.getVersion(); // Paper start if (version.startsWith("null")) { // running from ide? diff --git a/leaf-api/paper-patches/features/0002-Leaf-config.patch b/leaf-api/paper-patches/features/0002-Leaf-config.patch index 433989bc..58fed9a8 100644 --- a/leaf-api/paper-patches/features/0002-Leaf-config.patch +++ b/leaf-api/paper-patches/features/0002-Leaf-config.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Leaf config diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java -index 5f649c86c919666297db94b9dffed9a8fed3eb9b..6d94c4f06988a3bcfe3a56821fde606af9abd818 100644 +index ed899c4cb4b5261ceff56bbc9ca806e20904508e..68e2cf06b59b1e3353ad57544d7edfeebcfc3ae0 100644 --- a/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java -@@ -2368,6 +2368,14 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi +@@ -2380,6 +2380,14 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi } // Paper end diff --git a/leaf-api/paper-patches/features/0003-Gale-configuration.patch b/leaf-api/paper-patches/features/0003-Gale-configuration.patch index 0a3d66ae..91fa6dd4 100644 --- a/leaf-api/paper-patches/features/0003-Gale-configuration.patch +++ b/leaf-api/paper-patches/features/0003-Gale-configuration.patch @@ -13,10 +13,10 @@ As part of: Paper (https://github.com/PaperMC/Paper) Licensed under: MIT (https://opensource.org/licenses/MIT) diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java -index 6d94c4f06988a3bcfe3a56821fde606af9abd818..99dd957604e0408b91b5459e28d9c04dbb161793 100644 +index 68e2cf06b59b1e3353ad57544d7edfeebcfc3ae0..c1e4f01dbec2a796025ef35b6fdd68a82fa319d1 100644 --- a/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java -@@ -2366,6 +2366,15 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi +@@ -2378,6 +2378,15 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi { throw new UnsupportedOperationException("Not supported yet."); } diff --git a/leaf-api/paper-patches/features/0009-Specific-interval-TPS-API.patch b/leaf-api/paper-patches/features/0009-Specific-interval-TPS-API.patch index c16d674b..fd013efa 100644 --- a/leaf-api/paper-patches/features/0009-Specific-interval-TPS-API.patch +++ b/leaf-api/paper-patches/features/0009-Specific-interval-TPS-API.patch @@ -7,10 +7,10 @@ License: GPL-3.0 (https://www.gnu.org/licenses/gpl-3.0.html) Gale - https://galemc.org diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java -index ee791bf6299d654fb56300fbda1f6ea50620a3e2..da63ffc2deedc0f431ed84bce2f8750162d30e3c 100644 +index c9ea6559f809a6732588b8908001807be3d91196..1e810d7f61e07cddd99d3f827673b724ac93b6b5 100644 --- a/src/main/java/org/bukkit/Bukkit.java +++ b/src/main/java/org/bukkit/Bukkit.java -@@ -2428,6 +2428,35 @@ public final class Bukkit { +@@ -2438,6 +2438,35 @@ public final class Bukkit { return server.getTPS(); } @@ -47,10 +47,10 @@ index ee791bf6299d654fb56300fbda1f6ea50620a3e2..da63ffc2deedc0f431ed84bce2f87501 * Get a sample of the servers last tick times (in nanos) * diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java -index 99dd957604e0408b91b5459e28d9c04dbb161793..078edd89f599d7309feb4740d1a905ad2442803a 100644 +index c1e4f01dbec2a796025ef35b6fdd68a82fa319d1..cfe600ed503994376284d71d6754d1a736048401 100644 --- a/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java -@@ -2118,6 +2118,29 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi +@@ -2126,6 +2126,29 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi */ public double @NotNull [] getTPS(); diff --git a/leaf-api/paper-patches/features/0010-5-second-TPS-average.patch b/leaf-api/paper-patches/features/0010-5-second-TPS-average.patch index ed9508a6..dc31011d 100644 --- a/leaf-api/paper-patches/features/0010-5-second-TPS-average.patch +++ b/leaf-api/paper-patches/features/0010-5-second-TPS-average.patch @@ -37,10 +37,10 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java -index da63ffc2deedc0f431ed84bce2f8750162d30e3c..ccdd6fba261cb148cf02017c2bf779b3d3bb070b 100644 +index 1e810d7f61e07cddd99d3f827673b724ac93b6b5..f998208e0b26132d29d79fc2653d9f5572046f70 100644 --- a/src/main/java/org/bukkit/Bukkit.java +++ b/src/main/java/org/bukkit/Bukkit.java -@@ -2428,7 +2428,30 @@ public final class Bukkit { +@@ -2438,7 +2438,30 @@ public final class Bukkit { return server.getTPS(); } @@ -72,10 +72,10 @@ index da63ffc2deedc0f431ed84bce2f8750162d30e3c..ccdd6fba261cb148cf02017c2bf779b3 * Gets the average server TPS over the last 1 minute * diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java -index 078edd89f599d7309feb4740d1a905ad2442803a..4265607a6f5ca535a17756b417e22ac3478cfa5c 100644 +index cfe600ed503994376284d71d6754d1a736048401..d57a77ff531e8bc5c0fa41e66c64c28f9a4a1515 100644 --- a/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java -@@ -2118,7 +2118,27 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi +@@ -2126,7 +2126,27 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi */ public double @NotNull [] getTPS(); diff --git a/leaf-api/paper-patches/features/0011-Last-tick-time-API.patch b/leaf-api/paper-patches/features/0011-Last-tick-time-API.patch index 56912ca1..96f4cc79 100644 --- a/leaf-api/paper-patches/features/0011-Last-tick-time-API.patch +++ b/leaf-api/paper-patches/features/0011-Last-tick-time-API.patch @@ -23,10 +23,10 @@ The above copyright notice and this permission notice shall be included in all c THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java -index ccdd6fba261cb148cf02017c2bf779b3d3bb070b..10662089e8a08bae6c6077b72c30b14bb94cc2c7 100644 +index f998208e0b26132d29d79fc2653d9f5572046f70..2e316238da9377c046105249273b260912ebfcab 100644 --- a/src/main/java/org/bukkit/Bukkit.java +++ b/src/main/java/org/bukkit/Bukkit.java -@@ -3034,6 +3034,20 @@ public final class Bukkit { +@@ -3044,6 +3044,20 @@ public final class Bukkit { } // Paper end - Folia region threading API @@ -48,10 +48,10 @@ index ccdd6fba261cb148cf02017c2bf779b3d3bb070b..10662089e8a08bae6c6077b72c30b14b * @deprecated All methods on this class have been deprecated, see the individual methods for replacements. */ diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java -index 4265607a6f5ca535a17756b417e22ac3478cfa5c..ea27c7ba247e7726ca623e6a22110f94f70f81c9 100644 +index d57a77ff531e8bc5c0fa41e66c64c28f9a4a1515..e8f192bad2ffa3cb1c5217293420a863d57b5377 100644 --- a/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java -@@ -2764,4 +2764,29 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi +@@ -2776,4 +2776,29 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi */ void allowPausing(@NotNull org.bukkit.plugin.Plugin plugin, boolean value); // Paper end - API to check if the server is sleeping diff --git a/leaf-api/paper-patches/features/0013-Purpur-API-Changes.patch b/leaf-api/paper-patches/features/0013-Purpur-API-Changes.patch index 6b032b17..7e3c2072 100644 --- a/leaf-api/paper-patches/features/0013-Purpur-API-Changes.patch +++ b/leaf-api/paper-patches/features/0013-Purpur-API-Changes.patch @@ -6,7 +6,7 @@ Subject: [PATCH] Purpur API Changes Original license: MIT Original project: https://github.com/PurpurMC/Purpur -Commit: 8c77678e81c813e57dda10c646599b0ab3144218 +Commit: fd78b90f2041e50b2a94110859b951fc8fa320e9 Patches listed below are removed in this patch, They exists in Gale or Leaf: * "co/aikar/timings/TimedEventExecutor.java.patch" @@ -69,10 +69,10 @@ index f738bbcefe288474c5f591dda03d713850633854..5c10ab3deb359bd0045ba5999bcbce19 /** * The brand id for Gale. diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java -index 10662089e8a08bae6c6077b72c30b14bb94cc2c7..6a599344d3cf2df5219f7afac3b3bc3722e9f26a 100644 +index 2e316238da9377c046105249273b260912ebfcab..98cfd68226494dbb1a2eaa6680e23a76c2129a62 100644 --- a/src/main/java/org/bukkit/Bukkit.java +++ b/src/main/java/org/bukkit/Bukkit.java -@@ -3063,4 +3063,133 @@ public final class Bukkit { +@@ -3073,4 +3073,133 @@ public final class Bukkit { public static void restart() { server.restart(); } @@ -443,10 +443,10 @@ index 6f83097b1097d0ffa81a95e6f0300cb410dfee2b..c1f19d5c1b819873fce1185b4fbf4c72 + // Purpur end - OfflinePlayer API } diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java -index ea27c7ba247e7726ca623e6a22110f94f70f81c9..e5684bffdcc68ede5952c6ce28e3e16752c49b37 100644 +index e8f192bad2ffa3cb1c5217293420a863d57b5377..002c998368dea33872d65beb79eb4931ce1158d2 100644 --- a/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java -@@ -2420,6 +2420,18 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi +@@ -2432,6 +2432,18 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi // Paper end @@ -465,7 +465,7 @@ index ea27c7ba247e7726ca623e6a22110f94f70f81c9..e5684bffdcc68ede5952c6ce28e3e167 // Leaf start - Leaf config - API @NotNull public org.bukkit.configuration.file.YamlConfiguration getLeafConfig() -@@ -2789,4 +2801,121 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi +@@ -2801,4 +2813,121 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi */ long getLastTickOversleepTime(); // Gale end - YAPFA - last tick time - API @@ -709,10 +709,10 @@ index 739911cda33b373f99df627a3a378b37d7d461aa..58e16c12b06fa11d30b67f5038844ff9 * Add an entity to the block. * diff --git a/src/main/java/org/bukkit/command/SimpleCommandMap.java b/src/main/java/org/bukkit/command/SimpleCommandMap.java -index 5df19bd701c67506689fc7f49d91f99ebfbc83f0..32c81559507a8e5085c91d466cda69d0dc11327e 100644 +index 4acda947b7d69ab4133b4cc94e76d945e4d148d5..613a0bad5c07cf14098218652eba1f4deaf77c6d 100644 --- a/src/main/java/org/bukkit/command/SimpleCommandMap.java +++ b/src/main/java/org/bukkit/command/SimpleCommandMap.java -@@ -153,6 +153,19 @@ public class SimpleCommandMap implements CommandMap { +@@ -146,6 +146,19 @@ public class SimpleCommandMap implements CommandMap { return false; } @@ -732,7 +732,7 @@ index 5df19bd701c67506689fc7f49d91f99ebfbc83f0..32c81559507a8e5085c91d466cda69d0 // Paper start - Plugins do weird things to workaround normal registration if (target.timings == null) { target.timings = co.aikar.timings.TimingsManager.getCommandTiming(null, target); -@@ -162,7 +175,7 @@ public class SimpleCommandMap implements CommandMap { +@@ -155,7 +168,7 @@ public class SimpleCommandMap implements CommandMap { try { try (co.aikar.timings.Timing ignored = target.timings.startTiming()) { // Paper - use try with resources // Note: we don't return the result of target.execute as thats success / failure, we return handled (true) or not handled (false) @@ -811,10 +811,10 @@ index 332c55fd6b4b3a8c0cad920a6e765ecc40e684e4..10a8d64ad2da0be2c14f34c3e7d1957c // Paper start /** diff --git a/src/main/java/org/bukkit/entity/Entity.java b/src/main/java/org/bukkit/entity/Entity.java -index dc91a3cf3bd706ab9b2b02967adf18c07f186c5b..3a3c6ab87a164df706f59f6b59bfe977492658d7 100644 +index 66a31c5d83b78dddb43e70cfd5ce7c7fb8a551b6..b6ee04873c1ee57f7e8804f6d247806f2c0e448f 100644 --- a/src/main/java/org/bukkit/entity/Entity.java +++ b/src/main/java/org/bukkit/entity/Entity.java -@@ -1224,4 +1224,59 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent +@@ -1261,4 +1261,59 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent */ void broadcastHurtAnimation(@NotNull java.util.Collection players); // Paper end - broadcast hurt animation @@ -1017,7 +1017,7 @@ 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 28a3224c32e1890c95d540080fc5c04bc930a1e9..953ee95c692d91e1bd222f9224ea990f9d4feca0 100644 +index 868085a98ec22841d0337583ade3e4fb291abcbc..72f0c460cb06c386f2ee6228de214ae130a38cbb 100644 --- a/src/main/java/org/bukkit/entity/Player.java +++ b/src/main/java/org/bukkit/entity/Player.java @@ -3920,4 +3920,123 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM @@ -1213,10 +1213,10 @@ index 11ae1b3ad8c215f9245945d223c52f4a62ac47d9..7f23eb5a60ff08fb31e8ba3731a43bd7 + // Purpur end } diff --git a/src/main/java/org/bukkit/entity/Wolf.java b/src/main/java/org/bukkit/entity/Wolf.java -index a1c7b6ba655f40e0b48202a511267f606114bca5..af4f8ba59d00eadb26dbbc3b92492088e6bf5fac 100644 +index a6414ffc4a6d8ebef3486abc877688507e34e5c8..ade8b061f0a3d94f990e997659d5ad32aa1631c4 100644 --- a/src/main/java/org/bukkit/entity/Wolf.java +++ b/src/main/java/org/bukkit/entity/Wolf.java -@@ -164,4 +164,20 @@ public interface Wolf extends Tameable, Sittable, io.papermc.paper.entity.Collar +@@ -163,4 +163,20 @@ public interface Wolf extends Tameable, Sittable, io.papermc.paper.entity.Collar return RegistryAccess.registryAccess().getRegistry(RegistryKey.WOLF_SOUND_VARIANT).getOrThrow(NamespacedKey.minecraft(key)); } } diff --git a/leaf-api/paper-patches/features/0014-Remove-Timings.patch b/leaf-api/paper-patches/features/0014-Remove-Timings.patch index 5237e222..f03ab68e 100644 --- a/leaf-api/paper-patches/features/0014-Remove-Timings.patch +++ b/leaf-api/paper-patches/features/0014-Remove-Timings.patch @@ -2861,18 +2861,18 @@ index 59fada9b1eb78238d280c6bbb711f52facba52c6..eb4d78c6111a530d015a0b91d14c40ad return i >= j && i <= k; } diff --git a/src/main/java/org/bukkit/command/SimpleCommandMap.java b/src/main/java/org/bukkit/command/SimpleCommandMap.java -index 32c81559507a8e5085c91d466cda69d0dc11327e..7e9f1237f197094318fc41df2e2fa58fbc81e528 100644 +index 613a0bad5c07cf14098218652eba1f4deaf77c6d..25a0414cc9482925ad0426dde57e65012d62e637 100644 --- a/src/main/java/org/bukkit/command/SimpleCommandMap.java +++ b/src/main/java/org/bukkit/command/SimpleCommandMap.java -@@ -39,7 +39,6 @@ public class SimpleCommandMap implements CommandMap { - register("bukkit", new VersionCommand("version")); +@@ -32,7 +32,6 @@ public class SimpleCommandMap implements CommandMap { + + private void setDefaultCommands() { register("bukkit", new ReloadCommand("reload")); - //register("bukkit", new PluginsCommand("plugins")); // Paper -- register("bukkit", new co.aikar.timings.TimingsCommand("timings")); // Paper +- register("bukkit", new co.aikar.timings.TimingsCommand("timings")); } public void setFallbackCommands() { -@@ -71,7 +70,6 @@ public class SimpleCommandMap implements CommandMap { +@@ -64,7 +63,6 @@ public class SimpleCommandMap implements CommandMap { */ @Override public boolean register(@NotNull String label, @NotNull String fallbackPrefix, @NotNull Command command) { @@ -2880,7 +2880,7 @@ index 32c81559507a8e5085c91d466cda69d0dc11327e..7e9f1237f197094318fc41df2e2fa58f label = label.toLowerCase(Locale.ROOT).trim(); fallbackPrefix = fallbackPrefix.toLowerCase(Locale.ROOT).trim(); boolean registered = register(label, command, false, fallbackPrefix); -@@ -166,23 +164,13 @@ public class SimpleCommandMap implements CommandMap { +@@ -159,23 +157,13 @@ public class SimpleCommandMap implements CommandMap { parsedArgs = event.getArgs(); // Purpur end - ExecuteCommandEvent diff --git a/leaf-server/build.gradle.kts.patch b/leaf-server/build.gradle.kts.patch index a4f74d37..43adef24 100644 --- a/leaf-server/build.gradle.kts.patch +++ b/leaf-server/build.gradle.kts.patch @@ -7,7 +7,7 @@ +val leafMavenPublicUrl = "https://maven.nostal.ink/repository/maven-snapshots/" // Leaf - project setup - Add publish repo dependencies { - mache("io.papermc:mache:1.21.5+build.1") + mache("io.papermc:mache:1.21.5+build.2") - paperclip("io.papermc:paperclip:3.0.3") + paperclip("cn.dreeam:quantumleaper:1.0.0-SNAPSHOT") // Leaf - project setup - Use own paperclip fork testRuntimeOnly("org.junit.platform:junit-platform-launcher") diff --git a/leaf-server/minecraft-patches/features/0002-Gale-configuration.patch b/leaf-server/minecraft-patches/features/0002-Gale-configuration.patch index deeb591e..c3806897 100644 --- a/leaf-server/minecraft-patches/features/0002-Gale-configuration.patch +++ b/leaf-server/minecraft-patches/features/0002-Gale-configuration.patch @@ -93,7 +93,7 @@ index 31e02f50edd46220dac81500dbb273f1ccdbe0b9..aa44476e7d732a51d226533ccf6fb550 // Paper start - fix converting txt to json file; convert old users earlier after PlayerList creation but before file load/save if (this.convertOldUsers()) { diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java -index d50d2928ad9f8b34a14621b1fe5c188547e04bd1..845d03dc893df2200327e9ee2710474874750c93 100644 +index bfbfbaa9660d21071c420b60b10be0a02a1bc87e..f66aca0b506390ca5c2f95aacb9495417de325e7 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java @@ -580,7 +580,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe @@ -106,7 +106,7 @@ index d50d2928ad9f8b34a14621b1fe5c188547e04bd1..845d03dc893df2200327e9ee27104748 this.levelStorageAccess = levelStorageAccess; this.uuid = org.bukkit.craftbukkit.util.WorldUUID.getOrCreate(levelStorageAccess.levelDirectory.path().toFile()); diff --git a/net/minecraft/world/level/Level.java b/net/minecraft/world/level/Level.java -index 013ed7dbe2309f562f63e66203179a90566e8115..e2829222337ed5a5061b60a153c8224eb53de9e8 100644 +index 418d3958b7510d469142178f9427c829b6387d83..4c31b039eb697ba84598dd1fdded707a2f155ce5 100644 --- a/net/minecraft/world/level/Level.java +++ b/net/minecraft/world/level/Level.java @@ -159,6 +159,12 @@ public abstract class Level implements LevelAccessor, UUIDLookup, AutoCl @@ -123,7 +123,7 @@ index 013ed7dbe2309f562f63e66203179a90566e8115..e2829222337ed5a5061b60a153c8224e public static @Nullable BlockPos lastPhysicsProblem; // Spigot private int tileTickPosition; @@ -827,6 +833,8 @@ public abstract class Level implements LevelAccessor, UUIDLookup, AutoCl - org.bukkit.World.Environment env, // CraftBukkit + org.bukkit.World.Environment environment, // Paper java.util.function.Function paperWorldConfigCreator, // Paper - create paper world config + java.util.function.Function 2147483647L ? Integer.MAX_VALUE : (int)l1; int coprime = this.getCoprime(i); @@ -52,7 +52,7 @@ index 0b8d279a53196f3998b1f6901738ca8e02ef7311..9add567d2ec2f5e9cd5bee84423c5a44 } diff --git a/net/minecraft/world/entity/projectile/FishingHook.java b/net/minecraft/world/entity/projectile/FishingHook.java -index 9476a33ff4ec272a2c3b3cf9685cb4653138c57e..1ecfcb37a0d1c3f3810c5c8ce8043626ce8c25a9 100644 +index ca5cd9354d53c6c05bd7ba50c6e1dbd1ed548f67..6cfd384aea8c8e90b4e4ae08ece86d52640c95d7 100644 --- a/net/minecraft/world/entity/projectile/FishingHook.java +++ b/net/minecraft/world/entity/projectile/FishingHook.java @@ -48,7 +48,7 @@ import org.slf4j.Logger; diff --git a/leaf-server/minecraft-patches/features/0099-Purpur-Server-Minecraft-Changes.patch b/leaf-server/minecraft-patches/features/0099-Purpur-Server-Minecraft-Changes.patch index a60685ee..1f3bd0b7 100644 --- a/leaf-server/minecraft-patches/features/0099-Purpur-Server-Minecraft-Changes.patch +++ b/leaf-server/minecraft-patches/features/0099-Purpur-Server-Minecraft-Changes.patch @@ -6,7 +6,7 @@ Subject: [PATCH] Purpur Server Minecraft Changes Original license: MIT Original project: https://github.com/PurpurMC/Purpur -Commit: 8c77678e81c813e57dda10c646599b0ab3144218 +Commit: fd78b90f2041e50b2a94110859b951fc8fa320e9 Patches listed below are removed in this patch, They exists in Gale or Leaf: * "net/minecraft/CrashReport.java.patch" @@ -118,7 +118,7 @@ index cb63e4c264a31788cd1405428af70f7a018910e9..4d06587cd55af988eecdda5186577ab7 boolean flag = this.source.acceptsSuccess() && !this.silent; boolean flag1 = allowLogging && this.source.shouldInformAdmins() && !this.silent; diff --git a/net/minecraft/commands/Commands.java b/net/minecraft/commands/Commands.java -index 287edc8caecfd1ebb399d52789161f4d57d0801c..bcecf48b43eef377354e32695d4258ea8020f73d 100644 +index 006b5502eda66909a971278aa5751ec187bb8a3c..eb600398e4802bb47231bbc0c55fb24ce24a6efb 100644 --- a/net/minecraft/commands/Commands.java +++ b/net/minecraft/commands/Commands.java @@ -219,7 +219,7 @@ public class Commands { @@ -695,7 +695,7 @@ index f262a7c5ae4e7d56f16f5c0f4f145a2e428abbe4..614c7d9f673c926562acc8fa3b378862 private JComponent buildOnboardingPanel() { String onboardingLink = "https://docs.papermc.io/paper/next-steps"; diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java -index 29c78f74d63061f89e6c1d5555f6581834a135d0..99d0b94ba4fa6fc166fb7aa22abcf1402aa81794 100644 +index 074869245407abb32775b17140e1ffadabc5fcd5..e6730996dfd4c2422b6c13f10309fc58af4ac595 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java @@ -201,6 +201,8 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe @@ -912,10 +912,10 @@ index 29c78f74d63061f89e6c1d5555f6581834a135d0..99d0b94ba4fa6fc166fb7aa22abcf140 } // Paper end - Fix merchant inventory not closing on entity removal diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index 29e61a4cc550e4a627f4da99d116da5d4af9a45d..5e9c02f66f6606fd2eaa8298eddbdff2889cffed 100644 +index 7f18fb7f61e9219eb23073d9215f3bd6c57dc320..6bc6000c45f35ff85b36bede9d6010d8452b1f21 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java -@@ -427,6 +427,10 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -419,6 +419,10 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc public @Nullable com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent playerNaturallySpawnedEvent; // Paper - PlayerNaturallySpawnCreaturesEvent public @Nullable String clientBrandName = null; // Paper - Brand support public @Nullable org.bukkit.event.player.PlayerQuitEvent.QuitReason quitReason = null; // Paper - Add API for quit reason; there are a lot of changes to do if we change all methods leading to the event @@ -926,7 +926,7 @@ index 29e61a4cc550e4a627f4da99d116da5d4af9a45d..5e9c02f66f6606fd2eaa8298eddbdff2 // Paper start - rewrite chunk system private ca.spottedleaf.moonrise.patches.chunk_system.player.RegionizedPlayerChunkLoader.PlayerChunkLoaderData chunkLoader; -@@ -560,6 +564,10 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -552,6 +556,10 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc this.respawnConfig = compound.read("respawn", ServerPlayer.RespawnConfig.CODEC).orElse(null); this.spawnExtraParticlesOnFall = compound.getBooleanOr("spawn_extra_particles_on_fall", false); this.raidOmenPosition = compound.read("raid_omen_position", BlockPos.CODEC).orElse(null); @@ -937,7 +937,7 @@ index 29e61a4cc550e4a627f4da99d116da5d4af9a45d..5e9c02f66f6606fd2eaa8298eddbdff2 } @Override -@@ -577,6 +585,9 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -569,6 +577,9 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc compound.storeNullable("raid_omen_position", BlockPos.CODEC, this.raidOmenPosition); this.saveEnderPearls(compound); this.getBukkitEntity().setExtraData(compound); // CraftBukkit @@ -947,7 +947,7 @@ index 29e61a4cc550e4a627f4da99d116da5d4af9a45d..5e9c02f66f6606fd2eaa8298eddbdff2 } private void saveParentVehicle(CompoundTag tag) { -@@ -788,6 +799,15 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -780,6 +791,15 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc this.trackEnteredOrExitedLavaOnVehicle(); this.updatePlayerAttributes(); this.advancements.flushDirty(this, true); @@ -963,15 +963,15 @@ index 29e61a4cc550e4a627f4da99d116da5d4af9a45d..5e9c02f66f6606fd2eaa8298eddbdff2 } private void updatePlayerAttributes() { -@@ -1059,6 +1079,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc - ) - ); +@@ -1062,6 +1082,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc + // Paper - moved up to sendClientboundPlayerCombatKillPacket() + sendClientboundPlayerCombatKillPacket(event.getShowDeathMessages(), deathScreenMessage); // Paper - Expand PlayerDeathEvent Team team = this.getTeam(); + if (org.purpurmc.purpur.PurpurConfig.deathMessageOnlyBroadcastToAffectedPlayer) this.sendSystemMessage(deathMessage); else // Purpur - Configurable broadcast settings if (team == null || team.getDeathMessageVisibility() == Team.Visibility.ALWAYS) { this.server.getPlayerList().broadcastSystemMessage(deathMessage, false); } else if (team.getDeathMessageVisibility() == Team.Visibility.HIDE_FOR_OTHER_TEAMS) { -@@ -1165,6 +1186,18 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -1168,6 +1189,18 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc if (this.isInvulnerableTo(level, damageSource)) { return false; } else { @@ -990,7 +990,7 @@ index 29e61a4cc550e4a627f4da99d116da5d4af9a45d..5e9c02f66f6606fd2eaa8298eddbdff2 Entity entity = damageSource.getEntity(); if (!( // Paper - split the if statement. If below statement is false, hurtServer would not have been evaluated. Return false. !(entity instanceof Player player && !this.canHarmPlayer(player)) -@@ -1387,6 +1420,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -1390,6 +1423,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc serverLevel.removePlayerImmediately(this, Entity.RemovalReason.CHANGED_DIMENSION); this.unsetRemoved(); // CraftBukkit end @@ -998,7 +998,7 @@ index 29e61a4cc550e4a627f4da99d116da5d4af9a45d..5e9c02f66f6606fd2eaa8298eddbdff2 this.setServerLevel(level); this.connection.internalTeleport(PositionMoveRotation.of(teleportTransition), teleportTransition.relatives()); // CraftBukkit - use internal teleport without event this.connection.resetPosition(); -@@ -1503,7 +1537,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -1506,7 +1540,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc new AABB(vec3.x() - 8.0, vec3.y() - 5.0, vec3.z() - 8.0, vec3.x() + 8.0, vec3.y() + 5.0, vec3.z() + 8.0), monster -> monster.isPreventingPlayerRest(this.serverLevel(), this) ); @@ -1007,7 +1007,7 @@ index 29e61a4cc550e4a627f4da99d116da5d4af9a45d..5e9c02f66f6606fd2eaa8298eddbdff2 return Either.left(Player.BedSleepingProblem.NOT_SAFE); } } -@@ -1540,7 +1574,19 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -1543,7 +1577,19 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc CriteriaTriggers.SLEPT_IN_BED.trigger(this); }); if (!this.serverLevel().canSleepThroughNights()) { @@ -1028,7 +1028,7 @@ index 29e61a4cc550e4a627f4da99d116da5d4af9a45d..5e9c02f66f6606fd2eaa8298eddbdff2 } ((ServerLevel)this.level()).updateSleepingPlayerList(); -@@ -1632,6 +1678,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -1635,6 +1681,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc @Override public void openTextEdit(SignBlockEntity signEntity, boolean isFrontText) { @@ -1036,7 +1036,7 @@ index 29e61a4cc550e4a627f4da99d116da5d4af9a45d..5e9c02f66f6606fd2eaa8298eddbdff2 this.connection.send(new ClientboundBlockUpdatePacket(this.level(), signEntity.getBlockPos())); this.connection.send(new ClientboundOpenSignEditorPacket(signEntity.getBlockPos(), isFrontText)); } -@@ -1934,6 +1981,26 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -1937,6 +1984,26 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc this.lastSentExp = -1; // CraftBukkit - Added to reset } @@ -1063,7 +1063,7 @@ index 29e61a4cc550e4a627f4da99d116da5d4af9a45d..5e9c02f66f6606fd2eaa8298eddbdff2 @Override public void displayClientMessage(Component chatComponent, boolean actionBar) { this.sendSystemMessage(chatComponent, actionBar); -@@ -2157,6 +2224,20 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -2160,6 +2227,20 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc ); } @@ -1084,7 +1084,7 @@ index 29e61a4cc550e4a627f4da99d116da5d4af9a45d..5e9c02f66f6606fd2eaa8298eddbdff2 public void sendSystemMessage(Component mesage) { this.sendSystemMessage(mesage, false); } -@@ -2295,8 +2376,68 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -2298,8 +2379,68 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc public void resetLastActionTime() { this.lastActionTime = Util.getMillis(); @@ -1153,7 +1153,7 @@ index 29e61a4cc550e4a627f4da99d116da5d4af9a45d..5e9c02f66f6606fd2eaa8298eddbdff2 public ServerStatsCounter getStats() { return this.stats; } -@@ -2923,4 +3064,56 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -2926,4 +3067,56 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc return (org.bukkit.craftbukkit.entity.CraftPlayer) super.getBukkitEntity(); } // CraftBukkit end @@ -1211,7 +1211,7 @@ index 29e61a4cc550e4a627f4da99d116da5d4af9a45d..5e9c02f66f6606fd2eaa8298eddbdff2 + // Purpur end - Add rambar command } diff --git a/net/minecraft/server/level/ServerPlayerGameMode.java b/net/minecraft/server/level/ServerPlayerGameMode.java -index b604cba2490a747661d6819251bc3b9a1d35c7d4..d1f74d10e5e3d65895d7e87dd77f298cd9689b33 100644 +index b604cba2490a747661d6819251bc3b9a1d35c7d4..3a596650feb96123c5684bb5065e20c5b005c0b9 100644 --- a/net/minecraft/server/level/ServerPlayerGameMode.java +++ b/net/minecraft/server/level/ServerPlayerGameMode.java @@ -348,6 +348,7 @@ public class ServerPlayerGameMode { @@ -1249,7 +1249,7 @@ index b604cba2490a747661d6819251bc3b9a1d35c7d4..d1f74d10e5e3d65895d7e87dd77f298c + if (this.player.level().purpurConfig.shiftRightClickRepairsMendingPoints > 0 && this.player.isShiftKeyDown() && this.player.getBukkitEntity().hasPermission("purpur.mending_shift_click")) { + int points = Math.min(this.player.totalExperience, this.player.level().purpurConfig.shiftRightClickRepairsMendingPoints); + if (points > 0 && itemstack.isDamaged() && net.minecraft.world.item.enchantment.EnchantmentHelper.getItemEnchantmentLevel(net.minecraft.world.item.enchantment.Enchantments.MENDING, itemstack) > 0) { -+ this.player.giveExperiencePoints(-points); ++ this.player.giveExperiencePoints(itemstack.getDamageValue() == 1 ? -2 : -points); + this.player.level().addFreshEntity(new net.minecraft.world.entity.ExperienceOrb(this.player.level(), this.player.getX(), this.player.getY(), this.player.getZ(), points, org.bukkit.entity.ExperienceOrb.SpawnReason.UNKNOWN, this.player, this.player)); + return true; + } @@ -1674,10 +1674,10 @@ index d5524038314591a10c9f08a68e2ac91f6079a897..bf82de45bf98e8605a1fdb69803f75f4 } } diff --git a/net/minecraft/world/damagesource/CombatTracker.java b/net/minecraft/world/damagesource/CombatTracker.java -index 54adc730ba257c047b3be71d427e56ff6b7b5eb1..806ebefdafd74e33b9f8220ef8a597c265b83e9a 100644 +index 4cec197634fac341cca1ed108f1ecb0561f72461..aa6213ca382e4901363317df1e30332c5166f271 100644 --- a/net/minecraft/world/damagesource/CombatTracker.java +++ b/net/minecraft/world/damagesource/CombatTracker.java -@@ -62,7 +62,7 @@ public class CombatTracker { +@@ -64,7 +64,7 @@ public class CombatTracker { private Component getMessageForAssistedFall(Entity entity, Component entityDisplayName, String hasWeaponTranslationKey, String noWeaponTranslationKey) { ItemStack itemStack = entity instanceof LivingEntity livingEntity ? livingEntity.getMainHandItem() : ItemStack.EMPTY; @@ -1686,7 +1686,7 @@ index 54adc730ba257c047b3be71d427e56ff6b7b5eb1..806ebefdafd74e33b9f8220ef8a597c2 ? Component.translatable(hasWeaponTranslationKey, this.mob.getDisplayName(), entityDisplayName, itemStack.getDisplayName()) : Component.translatable(noWeaponTranslationKey, this.mob.getDisplayName(), entityDisplayName); } -@@ -106,6 +106,15 @@ public class CombatTracker { +@@ -108,6 +108,15 @@ public class CombatTracker { Component component = ComponentUtils.wrapInSquareBrackets(Component.translatable(string + ".link")).withStyle(INTENTIONAL_GAME_DESIGN_STYLE); return Component.translatable(string + ".message", this.mob.getDisplayName(), component); } else { @@ -1888,7 +1888,7 @@ index 1fc9e1ad541c46124183a401b2a7d99aea69cecf..881271f0bc77a8a8a7d31daad9a8188b } diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java -index 27ea5c82b3e327f6a1817ade22651046b83fc10a..30e341bd5fca8b95d6911ca94f4aac17962f3269 100644 +index a65ba74904d7f573d95c39eeeec8ce0373e06821..b714c64a318d38e309351f34426406c70d35d384 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java @@ -139,6 +139,7 @@ import net.minecraft.world.scores.Team; @@ -1995,7 +1995,7 @@ index 27ea5c82b3e327f6a1817ade22651046b83fc10a..30e341bd5fca8b95d6911ca94f4aac17 if (this.getVehicle() instanceof AbstractBoat abstractBoat && !abstractBoat.isUnderWater()) { this.wasTouchingWater = false; } else if (this.updateFluidHeightAndDoFluidPushing(FluidTags.WATER, 0.014)) { -@@ -2534,6 +2567,13 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -2537,6 +2570,13 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess compound.putBoolean("Paper.FreezeLock", true); } // Paper end @@ -2009,7 +2009,7 @@ index 27ea5c82b3e327f6a1817ade22651046b83fc10a..30e341bd5fca8b95d6911ca94f4aac17 return compound; } catch (Throwable var8) { CrashReport crashReport = CrashReport.forThrowable(var8, "Saving entity NBT"); -@@ -2651,6 +2691,13 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -2667,6 +2707,13 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess freezeLocked = compound.getBooleanOr("Paper.FreezeLock", false); } // Paper end @@ -2023,7 +2023,7 @@ index 27ea5c82b3e327f6a1817ade22651046b83fc10a..30e341bd5fca8b95d6911ca94f4aac17 } catch (Throwable var8) { CrashReport crashReport = CrashReport.forThrowable(var8, "Loading entity NBT"); CrashReportCategory crashReportCategory = crashReport.addCategory("Entity being loaded"); -@@ -2879,6 +2926,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -2895,6 +2942,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess if (this.isAlive() && this instanceof Leashable leashable) { if (leashable.getLeashHolder() == player) { if (!this.level().isClientSide()) { @@ -2031,7 +2031,7 @@ index 27ea5c82b3e327f6a1817ade22651046b83fc10a..30e341bd5fca8b95d6911ca94f4aac17 // CraftBukkit start - fire PlayerUnleashEntityEvent // Paper start - Expand EntityUnleashEvent org.bukkit.event.player.PlayerUnleashEntityEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerUnleashEntityEvent(this, player, hand, !player.hasInfiniteMaterials()); -@@ -3085,6 +3133,13 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -3101,6 +3149,13 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess this.passengers = ImmutableList.copyOf(list); } @@ -2045,7 +2045,7 @@ index 27ea5c82b3e327f6a1817ade22651046b83fc10a..30e341bd5fca8b95d6911ca94f4aac17 this.gameEvent(GameEvent.ENTITY_MOUNT, passenger); } } -@@ -3126,6 +3181,14 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -3142,6 +3197,14 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess return false; } // CraftBukkit end @@ -2060,7 +2060,7 @@ index 27ea5c82b3e327f6a1817ade22651046b83fc10a..30e341bd5fca8b95d6911ca94f4aac17 if (this.passengers.size() == 1 && this.passengers.get(0) == passenger) { this.passengers = ImmutableList.of(); } else { -@@ -3195,15 +3258,18 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -3211,15 +3274,18 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess return Vec3.directionFromRotation(this.getRotationVector()); } @@ -2080,7 +2080,7 @@ index 27ea5c82b3e327f6a1817ade22651046b83fc10a..30e341bd5fca8b95d6911ca94f4aac17 } } } -@@ -3405,7 +3471,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -3421,7 +3487,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess } public int getMaxAirSupply() { @@ -2089,7 +2089,7 @@ index 27ea5c82b3e327f6a1817ade22651046b83fc10a..30e341bd5fca8b95d6911ca94f4aac17 } public int getAirSupply() { -@@ -3926,7 +3992,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -3942,7 +4008,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess // CraftBukkit end public boolean canUsePortal(boolean allowPassengers) { @@ -2098,7 +2098,7 @@ index 27ea5c82b3e327f6a1817ade22651046b83fc10a..30e341bd5fca8b95d6911ca94f4aac17 } public boolean canTeleport(Level fromLevel, Level toLevel) { -@@ -4468,6 +4534,12 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -4484,6 +4550,12 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess return Mth.lerp(partialTick, this.yRotO, this.yRot); } @@ -2111,7 +2111,7 @@ index 27ea5c82b3e327f6a1817ade22651046b83fc10a..30e341bd5fca8b95d6911ca94f4aac17 // Paper start - optimise collisions public boolean updateFluidHeightAndDoFluidPushing(final TagKey fluid, final double flowScale) { if (this.touchingUnloadedChunk()) { -@@ -4886,7 +4958,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -4902,7 +4974,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess } public float maxUpStep() { @@ -2120,7 +2120,7 @@ index 27ea5c82b3e327f6a1817ade22651046b83fc10a..30e341bd5fca8b95d6911ca94f4aac17 } public void onExplosionHit(@Nullable Entity entity) { -@@ -5124,4 +5196,44 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -5140,4 +5212,44 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess return ((ServerLevel) this.level()).isPositionEntityTicking(this.blockPosition()); } // Paper end - Expose entity id counter @@ -2230,7 +2230,7 @@ index a1379aa8eaf84868ceb8b3762f7ca3b87a2d7785..d92045528d1a63799322418d86fab0bc } diff --git a/net/minecraft/world/entity/ExperienceOrb.java b/net/minecraft/world/entity/ExperienceOrb.java -index a890d5d95ad6e8d9f729a7ce61bf316bef10f405..c9ddd8db21d21f93c7f8353df13d2d9bc78fe58f 100644 +index c97a0e500e889b406cb2d679a3870715775f5393..81aa1a91a2ecda3053b22c2eb9e59f0ea2faf7b5 100644 --- a/net/minecraft/world/entity/ExperienceOrb.java +++ b/net/minecraft/world/entity/ExperienceOrb.java @@ -328,7 +328,7 @@ public class ExperienceOrb extends Entity { @@ -2304,7 +2304,7 @@ index 3f351fdb3cb76612d88bde713a2639d4319a7c6d..745f73e1f80d9c433630e31769b404ee protected ParticleOptions getInkParticle() { return ParticleTypes.GLOW_SQUID_INK; diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index befed81ecf698d27971d18fe2743562742e4e1d3..eb17ef1e0c350e97149452dbdc79398d71370fb1 100644 +index befed81ecf698d27971d18fe2743562742e4e1d3..cd8c764f9aa2321c6e157abe958d89868a9f7bd1 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java @@ -224,9 +224,9 @@ public abstract class LivingEntity extends Entity implements Attackable { @@ -2503,7 +2503,7 @@ index befed81ecf698d27971d18fe2743562742e4e1d3..eb17ef1e0c350e97149452dbdc79398d boolean var6 = false; if (this.dead && entitySource instanceof WitherBoss) { // Paper - if (serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { -+ if (serverLevel.purpurConfig.witherBypassMobGriefing ^ serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { // Purpur - Add mobGriefing bypass to everything affected ++ if (serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, serverLevel.purpurConfig.witherMobGriefingOverride)) { // Purpur - Add mobGriefing override to everything affected BlockPos blockPos = this.blockPosition(); BlockState blockState = Blocks.WITHER_ROSE.defaultBlockState(); if (this.level().getBlockState(blockPos).isAir() && blockState.canSurvive(this.level(), blockPos)) { @@ -2631,7 +2631,7 @@ index befed81ecf698d27971d18fe2743562742e4e1d3..eb17ef1e0c350e97149452dbdc79398d return slot != EquipmentSlot.HEAD && slot != EquipmentSlot.MAINHAND && slot != EquipmentSlot.OFFHAND ? SlotAccess.forEquipmentSlot(entity, slot, itemStack -> itemStack.isEmpty() || entity.getEquipmentSlotForItem(itemStack) == slot) diff --git a/net/minecraft/world/entity/Mob.java b/net/minecraft/world/entity/Mob.java -index 92ebc61aa7f6f70292a384b56bd8ef77a15e485c..ba2f9ab55e52e25788b38c81e1070ae953b66371 100644 +index 92ebc61aa7f6f70292a384b56bd8ef77a15e485c..6a94f42c8e048985b94db64fa0405e12824a8a0f 100644 --- a/net/minecraft/world/entity/Mob.java +++ b/net/minecraft/world/entity/Mob.java @@ -134,13 +134,14 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab @@ -2709,7 +2709,7 @@ index 92ebc61aa7f6f70292a384b56bd8ef77a15e485c..ba2f9ab55e52e25788b38c81e1070ae9 && this.isAlive() && !this.dead - && serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { -+ && serverLevel.purpurConfig.entitiesPickUpLootBypassMobGriefing ^ serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { // Purpur - Add mobGriefing bypass to everything affected ++ && serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, serverLevel.purpurConfig.entitiesPickUpLootMobGriefingOverride)) { // Purpur - Add mobGriefing override to everything affected Vec3i pickupReach = this.getPickupReach(); for (ItemEntity itemEntity : this.level() @@ -2919,7 +2919,7 @@ index 751e91a922b20c96f27885c3eb085ec4ae39091b..7f0975f8bd6d5f8ca28f503f93c8cb5c for (final Pair, BlockPos> poiPose : poiposes) { if (predicate.test(level, poiPose.getSecond())) { diff --git a/net/minecraft/world/entity/ai/behavior/HarvestFarmland.java b/net/minecraft/world/entity/ai/behavior/HarvestFarmland.java -index de89e45ecd4ac4c6db8b74bbe3dd6b4a7cf21671..d90a616eca474ae940d46cda94e816bddda70183 100644 +index de89e45ecd4ac4c6db8b74bbe3dd6b4a7cf21671..ec03365dc786596521d280ea4d6948c651ee8deb 100644 --- a/net/minecraft/world/entity/ai/behavior/HarvestFarmland.java +++ b/net/minecraft/world/entity/ai/behavior/HarvestFarmland.java @@ -32,6 +32,7 @@ public class HarvestFarmland extends Behavior { @@ -2935,7 +2935,7 @@ index de89e45ecd4ac4c6db8b74bbe3dd6b4a7cf21671..d90a616eca474ae940d46cda94e816bd @Override protected boolean checkExtraStartConditions(ServerLevel level, Villager owner) { - if (!level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { -+ if (!level.purpurConfig.villagerBypassMobGriefing == !level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { // Purpur - Add mobGriefing bypass to everything affected ++ if (!level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, level.purpurConfig.villagerMobGriefingOverride)) { // Purpur - Add mobGriefing override to everything affected return false; - } else if (!owner.getVillagerData().profession().is(VillagerProfession.FARMER)) { + } else if (!owner.getVillagerData().profession().is(VillagerProfession.FARMER) && !(level.purpurConfig.villagerClericsFarmWarts && owner.getVillagerData().profession().is(VillagerProfession.CLERIC))) { // Purpur - Option for Villager Clerics to farm Nether Wart @@ -3129,7 +3129,7 @@ index d7f9b3b2b1077ea10e8f64b87c8f4c4354e90858..713f62b34a91fa76f40e49a5e390145f this.lookAtCooldown--; this.getYRotD().ifPresent(rotationWanted -> this.mob.yHeadRot = this.rotateTowards(this.mob.yHeadRot, rotationWanted + 20.0F, this.yMaxRotSpeed)); diff --git a/net/minecraft/world/entity/ai/goal/BreakDoorGoal.java b/net/minecraft/world/entity/ai/goal/BreakDoorGoal.java -index e026e07ca86700c864a3dceda6817fb7b6cb11e9..f1dfe0bf047e7d331b2379a672ff7b8eae4c9c90 100644 +index e026e07ca86700c864a3dceda6817fb7b6cb11e9..cf380a13d6d54d1a9e8d10b31124942d59fca80c 100644 --- a/net/minecraft/world/entity/ai/goal/BreakDoorGoal.java +++ b/net/minecraft/world/entity/ai/goal/BreakDoorGoal.java @@ -30,7 +30,7 @@ public class BreakDoorGoal extends DoorInteractGoal { @@ -3137,12 +3137,12 @@ index e026e07ca86700c864a3dceda6817fb7b6cb11e9..f1dfe0bf047e7d331b2379a672ff7b8e public boolean canUse() { return super.canUse() - && getServerLevel(this.mob).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) -+ && this.mob.level().purpurConfig.zombieBypassMobGriefing == !getServerLevel(this.mob).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) // Purpur - Add mobGriefing bypass to everything affected ++ && getServerLevel(this.mob).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, this.mob.level().purpurConfig.zombieMobGriefingOverride) // Purpur - Add mobGriefing override to everything affected && this.isValidDifficulty(this.mob.level().getDifficulty()) && !this.isOpen(); } diff --git a/net/minecraft/world/entity/ai/goal/EatBlockGoal.java b/net/minecraft/world/entity/ai/goal/EatBlockGoal.java -index 7a75415a469bc99f45a5cfaab038181717903f1d..fc244a1fbd401f6ea92e7428b9738939e0cb2b1e 100644 +index 7a75415a469bc99f45a5cfaab038181717903f1d..3c0b94e011f029a54460c878f1f7d4f603a5e3b0 100644 --- a/net/minecraft/world/entity/ai/goal/EatBlockGoal.java +++ b/net/minecraft/world/entity/ai/goal/EatBlockGoal.java @@ -67,7 +67,7 @@ public class EatBlockGoal extends Goal { @@ -3150,7 +3150,7 @@ index 7a75415a469bc99f45a5cfaab038181717903f1d..fc244a1fbd401f6ea92e7428b9738939 final BlockState blockState = this.level.getBlockState(blockPos); // Paper - fix wrong block state if (IS_EDIBLE.test(blockState)) { // Paper - fix wrong block state - if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.mob, blockPos, blockState.getFluidState().createLegacyBlock(), !getServerLevel(this.level).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING))) { // CraftBukkit // Paper - fix wrong block state -+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.mob, blockPos, blockState.getFluidState().createLegacyBlock(), !getServerLevel(this.level).purpurConfig.sheepBypassMobGriefing == !getServerLevel(this.level).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING))) { // CraftBukkit // Paper - fix wrong block state // Purpur - Add mobGriefing bypass to everything affected ++ if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.mob, blockPos, blockState.getFluidState().createLegacyBlock(), !getServerLevel(this.level).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, getServerLevel(this.level).purpurConfig.sheepMobGriefingOverride))) { // CraftBukkit // Paper - fix wrong block state // Purpur - Add mobGriefing override to everything affected this.level.destroyBlock(blockPos, false); } @@ -3159,7 +3159,7 @@ index 7a75415a469bc99f45a5cfaab038181717903f1d..fc244a1fbd401f6ea92e7428b9738939 BlockPos blockPos1 = blockPos.below(); if (this.level.getBlockState(blockPos1).is(Blocks.GRASS_BLOCK)) { - if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.mob, blockPos1, Blocks.DIRT.defaultBlockState(), !getServerLevel(this.level).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING))) { // CraftBukkit // Paper - Fix wrong block state -+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.mob, blockPos1, Blocks.DIRT.defaultBlockState(), !getServerLevel(this.level).purpurConfig.sheepBypassMobGriefing == !getServerLevel(this.level).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING))) { // CraftBukkit // Paper - Fix wrong block state // Purpur - Add mobGriefing bypass to everything affected ++ if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.mob, blockPos1, Blocks.DIRT.defaultBlockState(), !getServerLevel(this.level).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, getServerLevel(this.level).purpurConfig.sheepMobGriefingOverride))) { // CraftBukkit // Paper - Fix wrong block state // Purpur - Add mobGriefing override to everything affected this.level.levelEvent(2001, blockPos1, Block.getId(Blocks.GRASS_BLOCK.defaultBlockState())); this.level.setBlock(blockPos1, Blocks.DIRT.defaultBlockState(), 2); } @@ -3184,7 +3184,7 @@ index 6eaf0bd944349cd0c6084462ac385fa2caafe933..be59d0c27a83b329ec3f97c029cfb9c1 double d = this.llama.distanceToSqr(this.llama.getCaravanHead()); if (d > 676.0) { diff --git a/net/minecraft/world/entity/ai/goal/RemoveBlockGoal.java b/net/minecraft/world/entity/ai/goal/RemoveBlockGoal.java -index 5d025e0e4381a045fd82c26cdd3907e1a8710b45..084156166905562beb8d36db400bc9cab5c14be2 100644 +index 5d025e0e4381a045fd82c26cdd3907e1a8710b45..16ec032d84f128fc44a836843fafef303f52b699 100644 --- a/net/minecraft/world/entity/ai/goal/RemoveBlockGoal.java +++ b/net/minecraft/world/entity/ai/goal/RemoveBlockGoal.java @@ -35,7 +35,7 @@ public class RemoveBlockGoal extends MoveToBlockGoal { @@ -3192,7 +3192,7 @@ index 5d025e0e4381a045fd82c26cdd3907e1a8710b45..084156166905562beb8d36db400bc9ca @Override public boolean canUse() { - if (!getServerLevel(this.removerMob).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { -+ if (!getServerLevel(this.removerMob).purpurConfig.zombieBypassMobGriefing == !getServerLevel(this.removerMob).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { // Purpur - Add mobGriefing bypass to everything affected ++ if (!getServerLevel(this.removerMob).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, getServerLevel(this.removerMob).purpurConfig.zombieMobGriefingOverride)) { // Purpur - Add mobGriefing override to everything affected return false; } else if (this.nextStartTick > 0) { this.nextStartTick--; @@ -4366,7 +4366,7 @@ index 8f2af65c58da50be2776a21b10db5eb9cb5f3076..87ba416479df56bad5d13c01e96e92e4 } diff --git a/net/minecraft/world/entity/animal/Fox.java b/net/minecraft/world/entity/animal/Fox.java -index 5c7572b75afcfa9965fcda5965f6ae2e59babb46..fcda990a5575288b39f6aa16b0ec48d2a57542e9 100644 +index 5c7572b75afcfa9965fcda5965f6ae2e59babb46..ff20a6e9745c7724dfae41d5868912c8cc19eb8e 100644 --- a/net/minecraft/world/entity/animal/Fox.java +++ b/net/minecraft/world/entity/animal/Fox.java @@ -141,6 +141,73 @@ public class Fox extends Animal { @@ -4527,7 +4527,7 @@ index 5c7572b75afcfa9965fcda5965f6ae2e59babb46..fcda990a5575288b39f6aa16b0ec48d2 protected void onReachedTarget() { - if (getServerLevel(Fox.this.level()).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { -+ if (getServerLevel(Fox.this.level()).purpurConfig.foxBypassMobGriefing ^ getServerLevel(Fox.this.level()).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { // Purpur - Add mobGriefing bypass to everything affected ++ if (getServerLevel(Fox.this.level()).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, getServerLevel(Fox.this.level()).purpurConfig.foxMobGriefingOverride)) { // Purpur - Add mobGriefing override to everything affected BlockState blockState = Fox.this.level().getBlockState(this.blockPos); if (blockState.is(Blocks.SWEET_BERRY_BUSH)) { this.pickSweetBerries(blockState); @@ -5397,7 +5397,7 @@ index 4a7201fe9e946fc20ed04e729d00f7986a748bad..3b815f3ad9068eb2bdf93eac1c1aff38 protected void defineSynchedData(SynchedEntityData.Builder builder) { super.defineSynchedData(builder); diff --git a/net/minecraft/world/entity/animal/Rabbit.java b/net/minecraft/world/entity/animal/Rabbit.java -index cc7d990f271af1371aa62e8a2ee2ee1bfffb621a..38e2698c5084f0c14c7fde5de542ed61a7cb7f1d 100644 +index cc7d990f271af1371aa62e8a2ee2ee1bfffb621a..fd8026cf1d884e95e8260ad52d4e0bbad20b0fdf 100644 --- a/net/minecraft/world/entity/animal/Rabbit.java +++ b/net/minecraft/world/entity/animal/Rabbit.java @@ -90,6 +90,7 @@ public class Rabbit extends Animal { @@ -5576,7 +5576,7 @@ index cc7d990f271af1371aa62e8a2ee2ee1bfffb621a..38e2698c5084f0c14c7fde5de542ed61 public boolean canUse() { if (this.nextStartTick <= 0) { - if (!getServerLevel(this.rabbit).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { -+ if (!getServerLevel(this.rabbit).purpurConfig.rabbitBypassMobGriefing == !getServerLevel(this.rabbit).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { // Purpur - Add mobGriefing bypass to everything affected ++ if (!getServerLevel(this.rabbit).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, getServerLevel(this.rabbit).purpurConfig.rabbitMobGriefingOverride)) { // Purpur - Add mobGriefing override to everything affected return false; } @@ -5625,7 +5625,7 @@ index 1786205346bb02835b10676155b65d2f11f0c221..25811130990e680174a0e930a6d066ad public int getMaxSchoolSize() { return 5; diff --git a/net/minecraft/world/entity/animal/SnowGolem.java b/net/minecraft/world/entity/animal/SnowGolem.java -index 7d73f02efb37aeafe41c23325a02d641d57bdaf4..ed7492af66a2ad678fe7a19f779ab7c4fb3dd8ae 100644 +index 7d73f02efb37aeafe41c23325a02d641d57bdaf4..291769d23d43f3e601d460bded72799dd6f97288 100644 --- a/net/minecraft/world/entity/animal/SnowGolem.java +++ b/net/minecraft/world/entity/animal/SnowGolem.java @@ -45,17 +45,63 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM @@ -5720,7 +5720,7 @@ index 7d73f02efb37aeafe41c23325a02d641d57bdaf4..ed7492af66a2ad678fe7a19f779ab7c4 } - if (!serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { -+ if (!serverLevel.purpurConfig.snowGolemBypassMobGriefing == !serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { // Purpur - Add mobGriefing bypass to everything affected ++ if (!serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, serverLevel.purpurConfig.snowGolemMobGriefingOverride)) { // Purpur - Add mobGriefing override to everything affected return; } @@ -7598,7 +7598,7 @@ index d813427cf20117014bc42af0eb7cdee037fbcd9c..90ac1e4bdca5b6233eeae9bc84549770 this.remove(Entity.RemovalReason.KILLED, org.bukkit.event.entity.EntityRemoveEvent.Cause.DEATH); // Paper - add Bukkit remove cause // CraftBukkit end diff --git a/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java b/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java -index 0f3c88601357399d3b8efd2f0e3a531482bc1f3d..b782ddd14d68717c387754300fc1be69d05df66f 100644 +index 0f3c88601357399d3b8efd2f0e3a531482bc1f3d..6305e56f38e25f330b0eaf8ab5b9258c1dd87f4e 100644 --- a/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java +++ b/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java @@ -91,6 +91,7 @@ public class EnderDragon extends Mob implements Enemy { @@ -7773,7 +7773,7 @@ index 0f3c88601357399d3b8efd2f0e3a531482bc1f3d..b782ddd14d68717c387754300fc1be69 BlockState blockState = level.getBlockState(blockPos); if (!blockState.isAir() && !blockState.is(BlockTags.DRAGON_TRANSPARENT)) { - if (level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) && !blockState.is(BlockTags.DRAGON_IMMUNE)) { -+ if (level.purpurConfig.enderDragonBypassMobGriefing ^ level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) && !blockState.is(BlockTags.DRAGON_IMMUNE)) { // Purpur - Add mobGriefing bypass to everything affected ++ if (level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, level.purpurConfig.enderDragonMobGriefingOverride) && !blockState.is(BlockTags.DRAGON_IMMUNE)) { // Purpur - Add mobGriefing override to everything affected // CraftBukkit start - Add blocks to list rather than destroying them //flag1 = level.removeBlock(blockPos, false) || flag1; flag1 = true; @@ -7804,7 +7804,7 @@ index 0f3c88601357399d3b8efd2f0e3a531482bc1f3d..b782ddd14d68717c387754300fc1be69 } diff --git a/net/minecraft/world/entity/boss/wither/WitherBoss.java b/net/minecraft/world/entity/boss/wither/WitherBoss.java -index 09924cccf9208abda22cc7e1635b567ed166e95a..bbcb03548052b28bd622d7d8ce161ccaed1ed386 100644 +index 09924cccf9208abda22cc7e1635b567ed166e95a..633a3d351fe613a4e4e531cd9e891f06051659bd 100644 --- a/net/minecraft/world/entity/boss/wither/WitherBoss.java +++ b/net/minecraft/world/entity/boss/wither/WitherBoss.java @@ -70,6 +70,7 @@ public class WitherBoss extends Monster implements RangedAttackMob { @@ -8046,7 +8046,7 @@ index 09924cccf9208abda22cc7e1635b567ed166e95a..bbcb03548052b28bd622d7d8ce161cca if (this.destroyBlocksTick > 0) { this.destroyBlocksTick--; - if (this.destroyBlocksTick == 0 && level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { -+ if (this.destroyBlocksTick == 0 && level.purpurConfig.witherBypassMobGriefing ^ level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { // Purpur - Add mobGriefing bypass to everything affected ++ if (this.destroyBlocksTick == 0 && level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, level.purpurConfig.witherMobGriefingOverride)) { // Purpur - Add mobGriefing override to everything affected boolean flag = false; int alternativeTarget = Mth.floor(this.getBbWidth() / 2.0F + 1.0F); int floor = Mth.floor(this.getBbHeight()); @@ -8913,7 +8913,7 @@ index fd33a8b59f40299ab644a4c52921b66a9b6552ca..a708692a71014aabc1fc842837e1c0a8 return Guardian.createAttributes().add(Attributes.MOVEMENT_SPEED, 0.3F).add(Attributes.ATTACK_DAMAGE, 8.0).add(Attributes.MAX_HEALTH, 80.0); } diff --git a/net/minecraft/world/entity/monster/EnderMan.java b/net/minecraft/world/entity/monster/EnderMan.java -index 6c2bfad0ad7a5c20cd6eeba9fdc713c85c357ef4..b9160f939894f784e8a733b0c00055b51aec694a 100644 +index 6c2bfad0ad7a5c20cd6eeba9fdc713c85c357ef4..b57f16d8faca315a2b080407e007e9a18ca3c2fc 100644 --- a/net/minecraft/world/entity/monster/EnderMan.java +++ b/net/minecraft/world/entity/monster/EnderMan.java @@ -88,12 +88,45 @@ public class EnderMan extends Monster implements NeutralMob { @@ -9032,7 +9032,7 @@ index 6c2bfad0ad7a5c20cd6eeba9fdc713c85c357ef4..b9160f939894f784e8a733b0c00055b5 + if (!enderman.level().purpurConfig.endermanAllowGriefing) return false; // Purpur - Add enderman and creeper griefing controls return this.enderman.getCarriedBlock() != null - && getServerLevel(this.enderman).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) -+ && getServerLevel(this.enderman).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) == !this.enderman.level().purpurConfig.endermanBypassMobGriefing // Purpur - Add mobGriefing bypass to everything affected ++ && getServerLevel(this.enderman).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, this.enderman.level().purpurConfig.endermanMobGriefingOverride) // Purpur - Add mobGriefing override to everything affected && this.enderman.getRandom().nextInt(reducedTickDelay(2000)) == 0; } @@ -9043,7 +9043,7 @@ index 6c2bfad0ad7a5c20cd6eeba9fdc713c85c357ef4..b9160f939894f784e8a733b0c00055b5 + if (!enderman.level().purpurConfig.endermanAllowGriefing) return false; // Purpur - Add enderman and creeper griefing controls return this.enderman.getCarriedBlock() == null - && getServerLevel(this.enderman).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) -+ && getServerLevel(this.enderman).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) == !this.enderman.level().purpurConfig.endermanBypassMobGriefing // Purpur - Add mobGriefing bypass to everything affected ++ && getServerLevel(this.enderman).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, this.enderman.level().purpurConfig.endermanMobGriefingOverride) // Purpur - Add mobGriefing override to everything affected && this.enderman.getRandom().nextInt(reducedTickDelay(20)) == 0; } @@ -9140,7 +9140,7 @@ index 7fad96756972308e71fd38033f06148467a7aecd..7d3932dcb263500357e9aad288812294 @Override diff --git a/net/minecraft/world/entity/monster/Evoker.java b/net/minecraft/world/entity/monster/Evoker.java -index cf9f0c60efc4f7cbc275ed9b154c979e82b4d50c..f32fa187ba6b16f1e8b1f308dc9073f808d52d86 100644 +index cf9f0c60efc4f7cbc275ed9b154c979e82b4d50c..76b1886e78918eccb8e2ecfe6dca033fcad5f9e1 100644 --- a/net/minecraft/world/entity/monster/Evoker.java +++ b/net/minecraft/world/entity/monster/Evoker.java @@ -50,10 +50,50 @@ public class Evoker extends SpellcasterIllager { @@ -9207,7 +9207,7 @@ index cf9f0c60efc4f7cbc275ed9b154c979e82b4d50c..f32fa187ba6b16f1e8b1f308dc9073f8 } else { ServerLevel serverLevel = getServerLevel(Evoker.this.level()); - if (!serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { -+ if (!serverLevel.purpurConfig.evokerBypassMobGriefing == !serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { // Purpur - Add mobGriefing bypass to everything affected ++ if (!serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, serverLevel.purpurConfig.evokerMobGriefingOverride)) { // Purpur - Add mobGriefing override to everything affected return false; } else { List nearbyEntities = serverLevel.getNearbyEntities( @@ -10259,7 +10259,7 @@ index d7b05fed206cfb63a75fab94f687d69fb230de9c..3d12b509a9b57f0326ec48eed93b2962 this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractVillager.class, false)); diff --git a/net/minecraft/world/entity/monster/Ravager.java b/net/minecraft/world/entity/monster/Ravager.java -index ca1856b18878b94ebfb566395e5eee13cf3c1cd5..56b844a8252c7f7ece12db98775230134e1898d6 100644 +index ca1856b18878b94ebfb566395e5eee13cf3c1cd5..a9a2d38b896ea3620e557a5fd12149557c33c6a8 100644 --- a/net/minecraft/world/entity/monster/Ravager.java +++ b/net/minecraft/world/entity/monster/Ravager.java @@ -69,14 +69,62 @@ public class Ravager extends Raider { @@ -10339,7 +10339,7 @@ index ca1856b18878b94ebfb566395e5eee13cf3c1cd5..56b844a8252c7f7ece12db9877523013 if (this.level() instanceof ServerLevel serverLevel && this.horizontalCollision - && serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { -+ && serverLevel.purpurConfig.ravagerBypassMobGriefing ^ serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { // Purpur - Add mobGriefing bypass to everything affected ++ && serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, serverLevel.purpurConfig.ravagerMobGriefingOverride)) { // Purpur - Add mobGriefing override to everything affected boolean flag = false; AABB aabb = this.getBoundingBox().inflate(0.2); @@ -10487,7 +10487,7 @@ index 1b8a4c548c1376d9cdd16a10d434da070c85f41d..56401c993d9a4c41b0782831a8b85764 super(mob); } diff --git a/net/minecraft/world/entity/monster/Silverfish.java b/net/minecraft/world/entity/monster/Silverfish.java -index 4e34833ea5c71b817c9f42a58320fe100981ec93..a6d6cb3e122488328ff980ed5902caff5490671b 100644 +index 4e34833ea5c71b817c9f42a58320fe100981ec93..bcae390578519fef362a126fbcf2b5cfd18c3dc4 100644 --- a/net/minecraft/world/entity/monster/Silverfish.java +++ b/net/minecraft/world/entity/monster/Silverfish.java @@ -39,14 +39,57 @@ public class Silverfish extends Monster { @@ -10553,7 +10553,7 @@ index 4e34833ea5c71b817c9f42a58320fe100981ec93..a6d6cb3e122488328ff980ed5902caff } else { RandomSource random = this.mob.getRandom(); - if (getServerLevel(this.mob).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) && random.nextInt(reducedTickDelay(10)) == 0) { -+ if (getServerLevel(this.mob).purpurConfig.silverfishBypassMobGriefing ^ getServerLevel(this.mob).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) && random.nextInt(reducedTickDelay(10)) == 0) { // Purpur - Add mobGriefing bypass to everything affected ++ if (getServerLevel(this.mob).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, getServerLevel(this.mob).purpurConfig.silverfishMobGriefingOverride) && random.nextInt(reducedTickDelay(10)) == 0) { // Purpur - Add mobGriefing override to everything affected this.selectedDirection = Direction.getRandom(random); BlockPos blockPos = BlockPos.containing(this.mob.getX(), this.mob.getY() + 0.5, this.mob.getZ()).relative(this.selectedDirection); BlockState blockState = this.mob.level().getBlockState(blockPos); @@ -10562,7 +10562,7 @@ index 4e34833ea5c71b817c9f42a58320fe100981ec93..a6d6cb3e122488328ff980ed5902caff if (block instanceof InfestedBlock) { // CraftBukkit start - BlockState afterState = getServerLevel(level).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) ? blockState.getFluidState().createLegacyBlock() : ((InfestedBlock) block).hostStateByInfested(level.getBlockState(blockPos1)); // Paper - fix wrong block state -+ BlockState afterState = getServerLevel(level).purpurConfig.silverfishBypassMobGriefing ^ getServerLevel(level).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) ? blockState.getFluidState().createLegacyBlock() : ((InfestedBlock) block).hostStateByInfested(level.getBlockState(blockPos1)); // Paper - fix wrong block state // Purpur - Add mobGriefing bypass to everything affected ++ BlockState afterState = getServerLevel(level).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, getServerLevel(level).purpurConfig.silverfishMobGriefingOverride) ? blockState.getFluidState().createLegacyBlock() : ((InfestedBlock) block).hostStateByInfested(level.getBlockState(blockPos1)); // Paper - fix wrong block state // Purpur - Add mobGriefing override to everything affected if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.silverfish, blockPos1, afterState)) { // Paper - fix wrong block state continue; } @@ -11998,7 +11998,7 @@ index 6691dc90c35d05a7c28c4e3ac887ed9d3bb88de9..584955d151e95727406bc68d6a6f15a3 this.getBrain().tick(level, this); HoglinAi.updateActivity(this); diff --git a/net/minecraft/world/entity/monster/piglin/Piglin.java b/net/minecraft/world/entity/monster/piglin/Piglin.java -index 634c518c105c8dc50838a4a6690641d82fd637fb..bac328ebdf9f94d156211e03d3913157e2b80374 100644 +index 634c518c105c8dc50838a4a6690641d82fd637fb..0afdfdc07764a26316c171c2a6722caf786875f2 100644 --- a/net/minecraft/world/entity/monster/piglin/Piglin.java +++ b/net/minecraft/world/entity/monster/piglin/Piglin.java @@ -134,6 +134,45 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento @@ -12060,7 +12060,7 @@ index 634c518c105c8dc50838a4a6690641d82fd637fb..bac328ebdf9f94d156211e03d3913157 @Override public boolean wantsToPickUp(ServerLevel level, ItemStack stack) { - return level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) && this.canPickUpLoot() && PiglinAi.wantsToPickup(this, stack); -+ return level.purpurConfig.piglinBypassMobGriefing ^ level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) && this.canPickUpLoot() && PiglinAi.wantsToPickup(this, stack); // Purpur - Add mobGriefing bypass to everything affected ++ return level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, level.purpurConfig.piglinMobGriefingOverride) && this.canPickUpLoot() && PiglinAi.wantsToPickup(this, stack); // Purpur - Add mobGriefing override to everything affected } protected boolean canReplaceCurrentItem(ItemStack candidate) { @@ -12775,7 +12775,7 @@ index b8f04b98d2117cfb274a5888d34b9836d3390ae9..6bb0653d1d033745ff419d4a59b4d890 return SoundEvents.ARROW_HIT; } diff --git a/net/minecraft/world/entity/projectile/LargeFireball.java b/net/minecraft/world/entity/projectile/LargeFireball.java -index db1b5bce212a5147be82504469f1fa9660812ebc..b97ea6fea26182945b6360644f17d172166574d3 100644 +index db1b5bce212a5147be82504469f1fa9660812ebc..9e994953a8a8757496892441c155fba5a511c19b 100644 --- a/net/minecraft/world/entity/projectile/LargeFireball.java +++ b/net/minecraft/world/entity/projectile/LargeFireball.java @@ -19,20 +19,20 @@ public class LargeFireball extends Fireball { @@ -12783,14 +12783,14 @@ index db1b5bce212a5147be82504469f1fa9660812ebc..b97ea6fea26182945b6360644f17d172 public LargeFireball(EntityType entityType, Level level) { super(entityType, level); - this.isIncendiary = (level instanceof ServerLevel serverLevel) && serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); // CraftBukkit -+ this.isIncendiary = (level instanceof ServerLevel serverLevel) && serverLevel.purpurConfig.fireballsBypassMobGriefing ^ serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); // CraftBukkit // Purpur - Add mobGriefing bypass to everything affected ++ this.isIncendiary = (level instanceof ServerLevel serverLevel) && serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, serverLevel.purpurConfig.fireballsMobGriefingOverride); // CraftBukkit // Purpur - Add mobGriefing override to everything affected } public LargeFireball(Level level, LivingEntity owner, Vec3 movement, int explosionPower) { super(EntityType.FIREBALL, owner, movement, level); this.explosionPower = explosionPower; - this.isIncendiary = (level instanceof ServerLevel serverLevel) && serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); // CraftBukkit -+ this.isIncendiary = (level instanceof ServerLevel serverLevel) && serverLevel.purpurConfig.fireballsBypassMobGriefing ^ serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); // CraftBukkit // Purpur - Add mobGriefing bypass to everything affected ++ this.isIncendiary = (level instanceof ServerLevel serverLevel) && serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, serverLevel.purpurConfig.fireballsMobGriefingOverride); // CraftBukkit // Purpur - Add mobGriefing override to everything affected } @Override @@ -12798,7 +12798,7 @@ index db1b5bce212a5147be82504469f1fa9660812ebc..b97ea6fea26182945b6360644f17d172 super.onHit(result); if (this.level() instanceof ServerLevel serverLevel) { - boolean _boolean = serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); -+ boolean _boolean = serverLevel.purpurConfig.fireballsBypassMobGriefing ^ serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); // Purpur - Add mobGriefing bypass to everything affected ++ boolean _boolean = serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, serverLevel.purpurConfig.fireballsMobGriefingOverride); // Purpur - Add mobGriefing override to everything affected // CraftBukkit start - fire ExplosionPrimeEvent org.bukkit.event.entity.ExplosionPrimeEvent event = new org.bukkit.event.entity.ExplosionPrimeEvent((org.bukkit.entity.Explosive) this.getBukkitEntity()); if (event.callEvent()) { @@ -12820,7 +12820,7 @@ index f736f72b8e76dd82236badcdd2756f0d4da89aa4..0dbfbadcabcf1b719addb034e676cb51 protected double getDefaultGravity() { return 0.06; diff --git a/net/minecraft/world/entity/projectile/Projectile.java b/net/minecraft/world/entity/projectile/Projectile.java -index 84c846d2ef4990befb2891631ac5ae16d881401b..bde9370798c037c494a9c73f328cb251e68c21b1 100644 +index 84c846d2ef4990befb2891631ac5ae16d881401b..9f1c07be83999b7bafdee9238e8bad8c646d42f1 100644 --- a/net/minecraft/world/entity/projectile/Projectile.java +++ b/net/minecraft/world/entity/projectile/Projectile.java @@ -515,7 +515,7 @@ public abstract class Projectile extends Entity implements TraceableEntity { @@ -12828,12 +12828,12 @@ index 84c846d2ef4990befb2891631ac5ae16d881401b..bde9370798c037c494a9c73f328cb251 public boolean mayInteract(ServerLevel level, BlockPos pos) { Entity owner = this.getOwner(); - return owner instanceof Player ? owner.mayInteract(level, pos) : owner == null || level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); -+ return owner instanceof Player ? owner.mayInteract(level, pos) : owner == null || level.purpurConfig.projectilesBypassMobGriefing ^ level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); // Purpur - Add mobGriefing bypass to everything affected ++ return owner instanceof Player ? owner.mayInteract(level, pos) : owner == null || level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, level.purpurConfig.projectilesMobGriefingOverride); // Purpur - Add mobGriefing override to everything affected } public boolean mayBreak(ServerLevel level) { diff --git a/net/minecraft/world/entity/projectile/SmallFireball.java b/net/minecraft/world/entity/projectile/SmallFireball.java -index 8c84cea43fc0e42a576004663670977eac99f1a6..808aa5dcb27c87b6ba5c1eee639486067447e370 100644 +index 8c84cea43fc0e42a576004663670977eac99f1a6..6a0ec832226894687b28f35e1a8a190ba1542201 100644 --- a/net/minecraft/world/entity/projectile/SmallFireball.java +++ b/net/minecraft/world/entity/projectile/SmallFireball.java @@ -25,7 +25,7 @@ public class SmallFireball extends Fireball { @@ -12841,7 +12841,7 @@ index 8c84cea43fc0e42a576004663670977eac99f1a6..808aa5dcb27c87b6ba5c1eee63948606 // CraftBukkit start if (this.getOwner() != null && this.getOwner() instanceof Mob) { - this.isIncendiary = (level instanceof ServerLevel serverLevel) && serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); -+ this.isIncendiary = (level instanceof ServerLevel serverLevel) && serverLevel.purpurConfig.fireballsBypassMobGriefing ^ serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); // Purpur - Add mobGriefing bypass to everything affected ++ this.isIncendiary = (level instanceof ServerLevel serverLevel) && serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, serverLevel.purpurConfig.fireballsMobGriefingOverride); // Purpur - Add mobGriefing override to everything affected } // CraftBukkit end } @@ -12965,7 +12965,7 @@ index a2fdc87bedd1a63064cb8c7a7615978483268fdc..8e95577de28fc4834dcfc3d4fed747d9 protected void defineSynchedData(SynchedEntityData.Builder builder) { builder.define(DATA_DANGEROUS, false); diff --git a/net/minecraft/world/entity/raid/Raider.java b/net/minecraft/world/entity/raid/Raider.java -index e81ae747fe95c22321fc69791a6509d601826fd6..77bb3aa7ff042aab6464aac55c846cb9082e5b97 100644 +index e81ae747fe95c22321fc69791a6509d601826fd6..76ebbab40f5bac6d5f588410d3c5e6716cbe0679 100644 --- a/net/minecraft/world/entity/raid/Raider.java +++ b/net/minecraft/world/entity/raid/Raider.java @@ -400,7 +400,7 @@ public abstract class Raider extends PatrollingMonster { @@ -12973,7 +12973,7 @@ index e81ae747fe95c22321fc69791a6509d601826fd6..77bb3aa7ff042aab6464aac55c846cb9 private boolean cannotPickUpBanner() { - if (!getServerLevel(this.mob).getGameRules().getBoolean(net.minecraft.world.level.GameRules.RULE_MOBGRIEFING) || !this.mob.canPickUpLoot()) return false; // Paper - respect game and entity rules for picking up items -+ if (!this.mob.level().purpurConfig.pillagerBypassMobGriefing == !getServerLevel(this.mob).getGameRules().getBoolean(net.minecraft.world.level.GameRules.RULE_MOBGRIEFING) || !this.mob.canPickUpLoot()) return false; // Paper - respect game and entity rules for picking up items // Purpur - Add mobGriefing bypass to everything affected ++ if (!getServerLevel(this.mob).getGameRules().getBoolean(net.minecraft.world.level.GameRules.RULE_MOBGRIEFING, this.mob.level().purpurConfig.pillagerMobGriefingOverride) || !this.mob.canPickUpLoot()) return false; // Paper - respect game and entity rules for picking up items // Purpur - Add mobGriefing override to everything affected if (!this.mob.hasActiveRaid()) { return true; } else if (this.mob.getCurrentRaid().isOver()) { @@ -14384,10 +14384,10 @@ index 879c8fe1f20decc793cfa39e686b61d521bd76ba..9c383a1028988cdd3de8b29ba72a4d7b } diff --git a/net/minecraft/world/item/enchantment/EnchantmentHelper.java b/net/minecraft/world/item/enchantment/EnchantmentHelper.java -index 074ceb74d90285ab6d16c73e8f40f310caa9d3b8..52dfe090a637e9d3c19b1df821ed353d4d4b53d3 100644 +index b86bc2e0aca5a7ef5b01be6a21c3a8bcd1ebcca0..7afb0ee8f92f4241ce3ebcd8e5fd9f50033e3a42 100644 --- a/net/minecraft/world/item/enchantment/EnchantmentHelper.java +++ b/net/minecraft/world/item/enchantment/EnchantmentHelper.java -@@ -602,4 +602,58 @@ public class EnchantmentHelper { +@@ -608,4 +608,58 @@ public class EnchantmentHelper { interface EnchantmentVisitor { void accept(Holder enchantment, int level); } @@ -14527,8 +14527,26 @@ index 892a7c1eb1b321ca6d5ca709142e7feae1220815..7719bc8ff1fbbc67cdf15e1fec28dc92 double d = player.distanceToSqr(x, y, z); if (distance < 0.0 || d < distance * distance) { return true; +diff --git a/net/minecraft/world/level/GameRules.java b/net/minecraft/world/level/GameRules.java +index a3a2d51cf53ce4dba8caaaf73967ae714ed16a36..e0bc8e8d0a3414af452d6a889f37a828128c8d59 100644 +--- a/net/minecraft/world/level/GameRules.java ++++ b/net/minecraft/world/level/GameRules.java +@@ -343,6 +343,13 @@ public class GameRules { + this.getRule(key).setFrom(rule, level); // CraftBukkit - per-world + } + ++ public boolean getBoolean(GameRules.Key key, Boolean gameRuleOverride) { ++ if (gameRuleOverride != null) { ++ return gameRuleOverride; ++ } ++ return this.getBoolean(key); ++ } ++ + public boolean getBoolean(GameRules.Key key) { + return this.getRule(key).get(); + } diff --git a/net/minecraft/world/level/Level.java b/net/minecraft/world/level/Level.java -index 96f29ce52dfbaebdaff287e4ae249f6628b22cf7..3b814983b91165ecee1a15d24cc0352247316a9f 100644 +index 439b8619e9f0ed3dc1974ba2ee6214b63447ea96..a94f6eb93a4271d8b50cbb55dce04affd1ac4a13 100644 --- a/net/minecraft/world/level/Level.java +++ b/net/minecraft/world/level/Level.java @@ -163,6 +163,7 @@ public abstract class Level implements LevelAccessor, UUIDLookup, AutoCl @@ -14592,10 +14610,10 @@ index 96f29ce52dfbaebdaff287e4ae249f6628b22cf7..3b814983b91165ecee1a15d24cc03522 this.spigotConfig = new org.spigotmc.SpigotWorldConfig(((net.minecraft.world.level.storage.PrimaryLevelData) levelData).getLevelName()); // Spigot this.paperConfig = paperWorldConfigCreator.apply(this.spigotConfig); // Paper - create paper world config this.galeConfig = galeWorldConfigCreator.apply(this.spigotConfig); // Gale - Gale configuration -+ this.purpurConfig = new org.purpurmc.purpur.PurpurWorldConfig(((net.minecraft.world.level.storage.PrimaryLevelData) levelData).getLevelName(), env); // Purpur - Purpur config files ++ this.purpurConfig = new org.purpurmc.purpur.PurpurWorldConfig(((net.minecraft.world.level.storage.PrimaryLevelData) levelData).getLevelName(), environment); // Purpur - Purpur config files + this.playerBreedingCooldowns = this.getNewBreedingCooldownCache(); // Purpur - Add adjustable breeding cooldown to config - this.generator = gen; - this.world = new CraftWorld((ServerLevel) this, gen, biomeProvider, env); + this.generator = generator; + this.world = new CraftWorld((ServerLevel) this, generator, biomeProvider, environment); @@ -2127,4 +2172,14 @@ public abstract class Level implements LevelAccessor, UUIDLookup, AutoCl return this.id; @@ -15189,7 +15207,7 @@ index e0be02eaa07d40d0738931383426517d20fe3b0b..b747af5f3c65f4b79a304b0e903f7b82 FluidState fluidState = level.getFluidState(pos.relative(direction)); if (fluidState.is(FluidTags.WATER)) { diff --git a/net/minecraft/world/level/block/CropBlock.java b/net/minecraft/world/level/block/CropBlock.java -index a38ce03a4dab6c83a0b54f47fd3c36d6da46fa24..275eabf64977cdf262de55124c3e5f88d8667213 100644 +index a38ce03a4dab6c83a0b54f47fd3c36d6da46fa24..d345235db5a8d5f1ebbeb5bbb5e7924cb1a75518 100644 --- a/net/minecraft/world/level/block/CropBlock.java +++ b/net/minecraft/world/level/block/CropBlock.java @@ -169,7 +169,7 @@ public class CropBlock extends VegetationBlock implements BonemealableBlock { @@ -15197,7 +15215,7 @@ index a38ce03a4dab6c83a0b54f47fd3c36d6da46fa24..275eabf64977cdf262de55124c3e5f88 protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity, InsideBlockEffectApplier effectApplier) { if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(level, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent - if (level instanceof ServerLevel serverLevel && entity instanceof Ravager && org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entity, pos, Blocks.AIR.defaultBlockState(), !serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING))) { // CraftBukkit -+ if (level instanceof ServerLevel serverLevel && entity instanceof Ravager && serverLevel.purpurConfig.ravagerGriefableBlocks.contains(serverLevel.getBlockState(pos).getBlock()) && org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entity, pos, Blocks.AIR.defaultBlockState(), !serverLevel.purpurConfig.ravagerBypassMobGriefing == !serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING))) { // CraftBukkit // Purpur - Configurable ravager griefable blocks list // Purpur - Add mobGriefing bypass to everything affected ++ if (level instanceof ServerLevel serverLevel && entity instanceof Ravager && serverLevel.purpurConfig.ravagerGriefableBlocks.contains(serverLevel.getBlockState(pos).getBlock()) && org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entity, pos, Blocks.AIR.defaultBlockState(), !serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, serverLevel.purpurConfig.ravagerMobGriefingOverride))) { // CraftBukkit // Purpur - Configurable ravager griefable blocks list // Purpur - Add mobGriefing override to everything affected serverLevel.destroyBlock(pos, true, entity); } @@ -15369,7 +15387,7 @@ index 5077a9ff7b78801bdc53536a37aee07b8d86ee4d..72794e204f7fcc31ece94913b7fd9f36 public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { return new EnderChestBlockEntity(pos, state); diff --git a/net/minecraft/world/level/block/FarmBlock.java b/net/minecraft/world/level/block/FarmBlock.java -index a31ac95237515b874f59941ec24c74e2c357b3d8..c816bd47577cbc898b10d0cfd9c40404429ef929 100644 +index a31ac95237515b874f59941ec24c74e2c357b3d8..dc1ad33f801c308871931d271f97ff9185e9effb 100644 --- a/net/minecraft/world/level/block/FarmBlock.java +++ b/net/minecraft/world/level/block/FarmBlock.java @@ -112,9 +112,9 @@ public class FarmBlock extends Block { @@ -15380,7 +15398,7 @@ index a31ac95237515b874f59941ec24c74e2c357b3d8..c816bd47577cbc898b10d0cfd9c40404 + && (serverLevel.purpurConfig.farmlandTrampleHeight >= 0D ? fallDistance >= serverLevel.purpurConfig.farmlandTrampleHeight : level.random.nextFloat() < fallDistance - 0.5) // Purpur - Configurable farmland trample height && entity instanceof LivingEntity - && (entity instanceof Player || serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) -+ && (entity instanceof Player || serverLevel.purpurConfig.farmlandBypassMobGriefing ^ serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) // Purpur - Add mobGriefing bypass to everything affected ++ && (entity instanceof Player || serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, serverLevel.purpurConfig.farmlandMobGriefingOverride)) // Purpur - Add mobGriefing override to everything affected && entity.getBbWidth() * entity.getBbWidth() * entity.getBbHeight() > 0.512F) { // CraftBukkit start - Interact soil org.bukkit.event.Cancellable cancellable; @@ -15719,7 +15737,7 @@ index ef164fb4f24412e506b8abce74d509e8be6c4676..85e9aecc2045e1599488d6a137f5f971 if (!(randChance >= f)) { diff --git a/net/minecraft/world/level/block/PowderSnowBlock.java b/net/minecraft/world/level/block/PowderSnowBlock.java -index 248ac9bc820a96fc7653471308b18834fc735a77..5c6ebde129289f2f7feb44dc1083aa030f55fbff 100644 +index 248ac9bc820a96fc7653471308b18834fc735a77..ef70ba88e492904c426c7d35df442fa6f8d68844 100644 --- a/net/minecraft/world/level/block/PowderSnowBlock.java +++ b/net/minecraft/world/level/block/PowderSnowBlock.java @@ -89,7 +89,7 @@ public class PowderSnowBlock extends Block implements BucketPickup { @@ -15727,7 +15745,7 @@ index 248ac9bc820a96fc7653471308b18834fc735a77..5c6ebde129289f2f7feb44dc1083aa03 && entity1.mayInteract(serverLevel, blockPos)) { // CraftBukkit start - if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entity1, pos, Blocks.AIR.defaultBlockState(), !(serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) || entity1 instanceof Player))) { -+ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entity1, pos, Blocks.AIR.defaultBlockState(), !(serverLevel.purpurConfig.powderSnowBypassMobGriefing ^ serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) || entity1 instanceof Player))) { // Purpur - Add mobGriefing bypass to everything affected ++ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entity1, pos, Blocks.AIR.defaultBlockState(), !(serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, serverLevel.purpurConfig.powderSnowMobGriefingOverride) || entity1 instanceof Player))) { // Purpur - Add mobGriefing override to everything affected return; } // CraftBukkit end @@ -15987,7 +16005,7 @@ index a8de37e173e244d7a16c19ac8805e0e4327c837a..baa56c6422c0924bb8b7c5a78db17acf + // Purpur end - bonemealable sugarcane } diff --git a/net/minecraft/world/level/block/TurtleEggBlock.java b/net/minecraft/world/level/block/TurtleEggBlock.java -index 8ee103e2752290db4cb4b22bb3552bf80e2ceb92..bb3bba0d0bf89e82b929fe95247f50ccba964c02 100644 +index 8ee103e2752290db4cb4b22bb3552bf80e2ceb92..41e51cb4f1a2443361b52c8523688e2c307a1d75 100644 --- a/net/minecraft/world/level/block/TurtleEggBlock.java +++ b/net/minecraft/world/level/block/TurtleEggBlock.java @@ -156,7 +156,7 @@ public class TurtleEggBlock extends Block { @@ -16032,7 +16050,7 @@ index 8ee103e2752290db4cb4b22bb3552bf80e2ceb92..bb3bba0d0bf89e82b929fe95247f50cc + // Purpur end - Option to disable turtle egg trampling with feather falling + if (entity instanceof Player) return true; + -+ return level.purpurConfig.turtleEggsBypassMobGriefing ^ level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); // Purpur - Add mobGriefing bypass to everything affected ++ return level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, level.purpurConfig.turtleEggsMobGriefingOverride); // Purpur - Add mobGriefing override to everything affected + // Purpur end - Add turtle egg block options } } @@ -16578,6 +16596,19 @@ index f9fb1380be9cbe960127c208c65c19f770e50b6d..17315201b8d3546058e2440b8fb8a5bb if (entity.save(compoundTag1)) { listTag.add(compoundTag1); } +diff --git a/net/minecraft/world/level/levelgen/DensityFunctions.java b/net/minecraft/world/level/levelgen/DensityFunctions.java +index 04527a5c65ad630f794fed9071d485aedd02257a..77731406cb3dc417aa2fe1cb4352f3d2d7d498aa 100644 +--- a/net/minecraft/world/level/levelgen/DensityFunctions.java ++++ b/net/minecraft/world/level/levelgen/DensityFunctions.java +@@ -528,7 +528,7 @@ public final class DensityFunctions { + int i1 = z / 2; + int i2 = x % 2; + int i3 = z % 2; +- float f = 100.0F - Mth.sqrt((long)x * (long)x + (long)z * (long)z) * 8.0F; // Paper - cast ints to long to avoid integer overflow ++ float f = 100.0F - Mth.sqrt(org.purpurmc.purpur.PurpurConfig.generateEndVoidRings ? x * x + z * z : (long)x * (long)x + (long)z * (long)z) * 8.0F; // Paper - cast ints to long to avoid integer overflow // Purpur - Setting to reintroduce end void rings + f = Mth.clamp(f, -100.0F, 80.0F); + + NoiseCache cache = noiseCache.get().computeIfAbsent(noise, noiseKey -> new NoiseCache()); // Paper - Perf: Optimize end generation diff --git a/net/minecraft/world/level/levelgen/PhantomSpawner.java b/net/minecraft/world/level/levelgen/PhantomSpawner.java index 1ec7abf2c82a5371fe1dacd57d90386fdae67f56..d9fca70ff61f20401643fe95833d3f7fbf3117e0 100644 --- a/net/minecraft/world/level/levelgen/PhantomSpawner.java @@ -16759,10 +16790,10 @@ index c22acc8889fbb3c9ee698624189c195ee4b5eefb..5767fbfd7f33c5276fb4335ce473b2e1 } diff --git a/org/purpurmc/purpur/PurpurConfig.java b/org/purpurmc/purpur/PurpurConfig.java new file mode 100644 -index 0000000000000000000000000000000000000000..f71afc2b7f32dfe2c10ba2c14713778208cd6de3 +index 0000000000000000000000000000000000000000..234f123959830cc2adb78b9dc8752906140e5b11 --- /dev/null +++ b/org/purpurmc/purpur/PurpurConfig.java -@@ -0,0 +1,592 @@ +@@ -0,0 +1,597 @@ +package org.purpurmc.purpur; + +import com.google.common.base.Throwables; @@ -16839,8 +16870,8 @@ index 0000000000000000000000000000000000000000..f71afc2b7f32dfe2c10ba2c147137782 + commands = new HashMap<>(); + commands.put("purpur", new PurpurCommand("purpur")); + -+ version = getInt("config-version", 42); -+ set("config-version", 42); ++ version = getInt("config-version", 43); ++ set("config-version", 43); + + readConfig(PurpurConfig.class, null); + @@ -17354,13 +17385,18 @@ index 0000000000000000000000000000000000000000..f71afc2b7f32dfe2c10ba2c147137782 + startupCommands.add(command); + }); + } ++ ++ public static boolean generateEndVoidRings = false; ++ private static void generateEndVoidRings() { ++ generateEndVoidRings = getBoolean("settings.generate-end-void-rings", generateEndVoidRings); ++ } +} diff --git a/org/purpurmc/purpur/PurpurWorldConfig.java b/org/purpurmc/purpur/PurpurWorldConfig.java new file mode 100644 -index 0000000000000000000000000000000000000000..f1080f62f22c3580f3e059ab80a766f54e237b0d +index 0000000000000000000000000000000000000000..31cc4e6e68a9743aaaeb296cb31e64526d3f1f73 --- /dev/null +++ b/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -0,0 +1,3471 @@ +@@ -0,0 +1,3596 @@ +package org.purpurmc.purpur; + +import java.util.ArrayList; @@ -17412,8 +17448,10 @@ index 0000000000000000000000000000000000000000..f1080f62f22c3580f3e059ab80a766f5 + } + + private void set(String path, Object val) { -+ PurpurConfig.config.addDefault("world-settings.default." + path, val); -+ PurpurConfig.config.set("world-settings.default." + path, val); ++ if (PurpurConfig.config.get("world-settings.default." + path) == null || val == null) { ++ PurpurConfig.config.addDefault("world-settings.default." + path, val); ++ PurpurConfig.config.set("world-settings.default." + path, val); ++ } + if (PurpurConfig.config.get("world-settings." + worldName + "." + path) != null) { + PurpurConfig.config.addDefault("world-settings." + worldName + "." + path, val); + PurpurConfig.config.set("world-settings." + worldName + "." + path, val); @@ -17426,12 +17464,16 @@ index 0000000000000000000000000000000000000000..f1080f62f22c3580f3e059ab80a766f5 + } + + private String getString(String path, String def) { -+ PurpurConfig.config.addDefault("world-settings.default." + path, def); ++ if (PurpurConfig.config.get("world-settings.default." + path) == null) { ++ PurpurConfig.config.addDefault("world-settings.default." + path, def); ++ } + return PurpurConfig.config.getString("world-settings." + worldName + "." + path, PurpurConfig.config.getString("world-settings.default." + path)); + } + + private boolean getBoolean(String path, boolean def) { -+ PurpurConfig.config.addDefault("world-settings.default." + path, def); ++ if (PurpurConfig.config.get("world-settings.default." + path) == null) { ++ PurpurConfig.config.addDefault("world-settings.default." + path, def); ++ } + return PurpurConfig.config.getBoolean("world-settings." + worldName + "." + path, PurpurConfig.config.getBoolean("world-settings.default." + path)); + } + @@ -17441,18 +17483,29 @@ index 0000000000000000000000000000000000000000..f1080f62f22c3580f3e059ab80a766f5 + return predicate.test(bool); + } + ++ private Boolean getBooleanOrDefault(String path, Boolean def) { ++ String val = getString(path, BooleanUtils.toString(def, "true", "false", "default")).toLowerCase(); ++ return BooleanUtils.toBooleanObject(val, "true", "false", "default"); ++ } ++ + private double getDouble(String path, double def) { -+ PurpurConfig.config.addDefault("world-settings.default." + path, def); ++ if (PurpurConfig.config.get("world-settings.default." + path) == null) { ++ PurpurConfig.config.addDefault("world-settings.default." + path, def); ++ } + return PurpurConfig.config.getDouble("world-settings." + worldName + "." + path, PurpurConfig.config.getDouble("world-settings.default." + path)); + } + + private int getInt(String path, int def) { -+ PurpurConfig.config.addDefault("world-settings.default." + path, def); ++ if (PurpurConfig.config.get("world-settings.default." + path) == null) { ++ PurpurConfig.config.addDefault("world-settings.default." + path, def); ++ } + return PurpurConfig.config.getInt("world-settings." + worldName + "." + path, PurpurConfig.config.getInt("world-settings.default." + path)); + } + + private List getList(String path, T def) { -+ PurpurConfig.config.addDefault("world-settings.default." + path, def); ++ if (PurpurConfig.config.get("world-settings.default." + path) == null) { ++ PurpurConfig.config.addDefault("world-settings.default." + path, def); ++ } + return PurpurConfig.config.getList("world-settings." + worldName + "." + path, PurpurConfig.config.getList("world-settings.default." + path)); + } + @@ -17479,6 +17532,11 @@ index 0000000000000000000000000000000000000000..f1080f62f22c3580f3e059ab80a766f5 + armorstandPlaceWithArms = getBoolean("gameplay-mechanics.armorstand.place-with-arms-visible", armorstandPlaceWithArms); + } + ++ public boolean arrowMovementResetsDespawnCounter = true; ++ private void arrowSettings() { ++ arrowMovementResetsDespawnCounter = getBoolean("gameplay-mechanics.arrow.movement-resets-despawn-counter", arrowMovementResetsDespawnCounter); ++ } ++ + public boolean useBetterMending = false; + public boolean alwaysTameInCreative = false; + public boolean boatEjectPlayersOnLand = false; @@ -17490,9 +17548,9 @@ index 0000000000000000000000000000000000000000..f1080f62f22c3580f3e059ab80a766f5 + public int raidCooldownSeconds = 0; + public int animalBreedingCooldownSeconds = 0; + public boolean persistentDroppableEntityDisplayNames = true; -+ public boolean entitiesPickUpLootBypassMobGriefing = false; -+ public boolean fireballsBypassMobGriefing = false; -+ public boolean projectilesBypassMobGriefing = false; ++ public Boolean entitiesPickUpLootMobGriefingOverride = null; ++ public Boolean fireballsMobGriefingOverride = null; ++ public Boolean projectilesMobGriefingOverride = null; + public boolean noteBlockIgnoreAbove = false; + public boolean imposeTeleportRestrictionsOnGateways = false; + public boolean imposeTeleportRestrictionsOnNetherPortals = false; @@ -17519,9 +17577,20 @@ index 0000000000000000000000000000000000000000..f1080f62f22c3580f3e059ab80a766f5 + raidCooldownSeconds = getInt("gameplay-mechanics.raid-cooldown-seconds", raidCooldownSeconds); + animalBreedingCooldownSeconds = getInt("gameplay-mechanics.animal-breeding-cooldown-seconds", animalBreedingCooldownSeconds); + persistentDroppableEntityDisplayNames = getBoolean("gameplay-mechanics.persistent-droppable-entity-display-names", persistentDroppableEntityDisplayNames); -+ entitiesPickUpLootBypassMobGriefing = getBoolean("gameplay-mechanics.entities-pick-up-loot-bypass-mob-griefing", entitiesPickUpLootBypassMobGriefing); -+ fireballsBypassMobGriefing = getBoolean("gameplay-mechanics.fireballs-bypass-mob-griefing", fireballsBypassMobGriefing); -+ projectilesBypassMobGriefing = getBoolean("gameplay-mechanics.projectiles-bypass-mob-griefing", projectilesBypassMobGriefing); ++ if (PurpurConfig.version < 43) { ++ boolean oldVal = getBoolean("gameplay-mechanics.entities-pick-up-loot-bypass-mob-griefing", false); ++ set("gameplay-mechanics.entities-pick-up-loot-bypass-mob-griefing", null); ++ set("gameplay-mechanics.entities-pick-up-loot-mob-griefing-override", oldVal ? true : "default"); ++ boolean oldVal2 = getBoolean("gameplay-mechanics.fireballs-bypass-mob-griefing", false); ++ set("gameplay-mechanics.fireballs-bypass-mob-griefing", null); ++ set("gameplay-mechanics.fireballs-mob-griefing-override", oldVal2 ? true : "default"); ++ boolean oldVal3 = getBoolean("gameplay-mechanics.projectiles-bypass-mob-griefing", false); ++ set("gameplay-mechanics.projectiles-bypass-mob-griefing", null); ++ set("gameplay-mechanics.projectiles-mob-griefing-override", oldVal3 ? true : "default"); ++ } ++ entitiesPickUpLootMobGriefingOverride = getBooleanOrDefault("gameplay-mechanics.entities-pick-up-loot-mob-griefing-override", entitiesPickUpLootMobGriefingOverride); ++ fireballsMobGriefingOverride = getBooleanOrDefault("gameplay-mechanics.fireballs-mob-griefing-override", fireballsMobGriefingOverride); ++ projectilesMobGriefingOverride = getBooleanOrDefault("gameplay-mechanics.projectiles-mob-griefing-override", projectilesMobGriefingOverride); + noteBlockIgnoreAbove = getBoolean("gameplay-mechanics.note-block-ignore-above", noteBlockIgnoreAbove); + imposeTeleportRestrictionsOnGateways = getBoolean("gameplay-mechanics.impose-teleport-restrictions-on-gateways", imposeTeleportRestrictionsOnGateways); + imposeTeleportRestrictionsOnNetherPortals = getBoolean("gameplay-mechanics.impose-teleport-restrictions-on-nether-portals", imposeTeleportRestrictionsOnNetherPortals); @@ -18338,7 +18407,7 @@ index 0000000000000000000000000000000000000000..f1080f62f22c3580f3e059ab80a766f5 + endCrystalPlaceAnywhere = getBoolean("gameplay-mechanics.item.end-crystal.place-anywhere", endCrystalPlaceAnywhere); + } + -+ public boolean farmlandBypassMobGriefing = false; ++ public Boolean farmlandMobGriefingOverride = null; + public boolean farmlandGetsMoistFromBelow = false; + public boolean farmlandAlpha = false; + public boolean farmlandTramplingDisabled = false; @@ -18346,7 +18415,12 @@ index 0000000000000000000000000000000000000000..f1080f62f22c3580f3e059ab80a766f5 + public boolean farmlandTramplingFeatherFalling = false; + public double farmlandTrampleHeight = -1D; + private void farmlandSettings() { -+ farmlandBypassMobGriefing = getBoolean("blocks.farmland.bypass-mob-griefing", farmlandBypassMobGriefing); ++ if (PurpurConfig.version < 43) { ++ boolean oldVal = getBoolean("blocks.farmland.bypass-mob-griefing", false); ++ set("blocks.farmland.bypass-mob-griefing", null); ++ set("blocks.farmland.mob-griefing-override", oldVal ? true : "default"); ++ } ++ farmlandMobGriefingOverride = getBooleanOrDefault("blocks.farmland.mob-griefing-override", farmlandMobGriefingOverride); + farmlandGetsMoistFromBelow = getBoolean("blocks.farmland.gets-moist-from-below", farmlandGetsMoistFromBelow); + farmlandAlpha = getBoolean("blocks.farmland.use-alpha-farmland", farmlandAlpha); + farmlandTramplingDisabled = getBoolean("blocks.farmland.disable-trampling", farmlandTramplingDisabled); @@ -18399,9 +18473,14 @@ index 0000000000000000000000000000000000000000..f1080f62f22c3580f3e059ab80a766f5 + magmaBlockDamageWhenSneaking = getBoolean("blocks.magma-block.damage-when-sneaking", magmaBlockDamageWhenSneaking); + } + -+ public boolean powderSnowBypassMobGriefing = false; ++ public Boolean powderSnowMobGriefingOverride = null; + private void powderSnowSettings() { -+ powderSnowBypassMobGriefing = getBoolean("blocks.powder_snow.bypass-mob-griefing", powderSnowBypassMobGriefing); ++ if (PurpurConfig.version < 43) { ++ boolean oldVal = getBoolean("blocks.powder_snow.bypass-mob-griefing", false); ++ set("blocks.powder_snow.bypass-mob-griefing", null); ++ set("blocks.powder_snow.mob-griefing-override", oldVal ? true : "default"); ++ } ++ powderSnowMobGriefingOverride = getBooleanOrDefault("blocks.powder_snow.mob-griefing-override", powderSnowMobGriefingOverride); + } + + public int railActivationRange = 8; @@ -18446,8 +18525,10 @@ index 0000000000000000000000000000000000000000..f1080f62f22c3580f3e059ab80a766f5 + } + + public boolean spawnerDeactivateByRedstone = false; ++ public boolean spawnerFixMC238526 = false; + private void spawnerSettings() { + spawnerDeactivateByRedstone = getBoolean("blocks.spawner.deactivate-by-redstone", spawnerDeactivateByRedstone); ++ spawnerFixMC238526 = getBoolean("blocks.spawner.fix-mc-238526", spawnerFixMC238526); + } + + public int spongeAbsorptionArea = 65; @@ -18469,14 +18550,19 @@ index 0000000000000000000000000000000000000000..f1080f62f22c3580f3e059ab80a766f5 + public boolean turtleEggsBreakFromExpOrbs = false; + public boolean turtleEggsBreakFromItems = false; + public boolean turtleEggsBreakFromMinecarts = false; -+ public boolean turtleEggsBypassMobGriefing = false; ++ public Boolean turtleEggsMobGriefingOverride = null; + public int turtleEggsRandomTickCrackChance = 500; + public boolean turtleEggsTramplingFeatherFalling = false; + private void turtleEggSettings() { + turtleEggsBreakFromExpOrbs = getBoolean("blocks.turtle_egg.break-from-exp-orbs", turtleEggsBreakFromExpOrbs); + turtleEggsBreakFromItems = getBoolean("blocks.turtle_egg.break-from-items", turtleEggsBreakFromItems); + turtleEggsBreakFromMinecarts = getBoolean("blocks.turtle_egg.break-from-minecarts", turtleEggsBreakFromMinecarts); -+ turtleEggsBypassMobGriefing = getBoolean("blocks.turtle_egg.bypass-mob-griefing", turtleEggsBypassMobGriefing); ++ if (PurpurConfig.version < 43) { ++ boolean oldVal = getBoolean("blocks.turtle_egg.bypass-mob-griefing", false); ++ set("blocks.turtle_egg.bypass-mob-griefing", null); ++ set("blocks.turtle_egg.mob-griefing-override", oldVal ? true : "default"); ++ } ++ turtleEggsMobGriefingOverride = getBooleanOrDefault("blocks.turtle_egg.mob-griefing-override", turtleEggsMobGriefingOverride); + turtleEggsRandomTickCrackChance = getInt("blocks.turtle_egg.random-tick-crack-chance", turtleEggsRandomTickCrackChance); + turtleEggsTramplingFeatherFalling = getBoolean("blocks.turtle_egg.feather-fall-distance-affects-trampling", turtleEggsTramplingFeatherFalling); + } @@ -18832,7 +18918,7 @@ index 0000000000000000000000000000000000000000..f1080f62f22c3580f3e059ab80a766f5 + public double creeperScale = 1.0D; + public double creeperChargedChance = 0.0D; + public boolean creeperAllowGriefing = true; -+ public boolean creeperBypassMobGriefing = false; ++ public Boolean creeperMobGriefingOverride = null; + public boolean creeperTakeDamageFromWater = false; + public boolean creeperExplodeWhenKilled = false; + public boolean creeperHealthRadius = false; @@ -18852,7 +18938,12 @@ index 0000000000000000000000000000000000000000..f1080f62f22c3580f3e059ab80a766f5 + creeperScale = Mth.clamp(getDouble("mobs.creeper.attributes.scale", creeperScale), 0.0625D, 16.0D); + creeperChargedChance = getDouble("mobs.creeper.naturally-charged-chance", creeperChargedChance); + creeperAllowGriefing = getBoolean("mobs.creeper.allow-griefing", creeperAllowGriefing); -+ creeperBypassMobGriefing = getBoolean("mobs.creeper.bypass-mob-griefing", creeperBypassMobGriefing); ++ if (PurpurConfig.version < 43) { ++ boolean oldVal = getBoolean("mobs.creeper.bypass-mob-griefing", false); ++ set("mobs.creeper.bypass-mob-griefing", null); ++ set("mobs.creeper.mob-griefing-override", oldVal ? true : "default"); ++ } ++ creeperMobGriefingOverride = getBooleanOrDefault("mobs.creeper.mob-griefing-override", creeperMobGriefingOverride); + creeperTakeDamageFromWater = getBoolean("mobs.creeper.takes-damage-from-water", creeperTakeDamageFromWater); + creeperExplodeWhenKilled = getBoolean("mobs.creeper.explode-when-killed", creeperExplodeWhenKilled); + creeperHealthRadius = getBoolean("mobs.creeper.health-impacts-explosion", creeperHealthRadius); @@ -18984,7 +19075,7 @@ index 0000000000000000000000000000000000000000..f1080f62f22c3580f3e059ab80a766f5 + public double enderDragonMaxY = 320D; + public double enderDragonMaxHealth = 200.0D; + public boolean enderDragonAlwaysDropsFullExp = false; -+ public boolean enderDragonBypassMobGriefing = false; ++ public Boolean enderDragonMobGriefingOverride = null; + public boolean enderDragonTakeDamageFromWater = false; + public boolean enderDragonCanRideVehicles = false; + private void enderDragonSettings() { @@ -19003,7 +19094,12 @@ index 0000000000000000000000000000000000000000..f1080f62f22c3580f3e059ab80a766f5 + } + enderDragonMaxHealth = getDouble("mobs.ender_dragon.attributes.max_health", enderDragonMaxHealth); + enderDragonAlwaysDropsFullExp = getBoolean("mobs.ender_dragon.always-drop-full-exp", enderDragonAlwaysDropsFullExp); -+ enderDragonBypassMobGriefing = getBoolean("mobs.ender_dragon.bypass-mob-griefing", enderDragonBypassMobGriefing); ++ if (PurpurConfig.version < 43) { ++ boolean oldVal = getBoolean("mobs.ender_dragon.bypass-mob-griefing", false); ++ set("mobs.ender_dragon.bypass-mob-griefing", null); ++ set("mobs.ender_dragon.mob-griefing-override", oldVal ? true : "default"); ++ } ++ enderDragonMobGriefingOverride = getBooleanOrDefault("mobs.ender_dragon.mob-griefing-override", enderDragonMobGriefingOverride); + enderDragonTakeDamageFromWater = getBoolean("mobs.ender_dragon.takes-damage-from-water", enderDragonTakeDamageFromWater); + enderDragonCanRideVehicles = getBoolean("mobs.ender_dragon.can-ride-vehicles", enderDragonCanRideVehicles); + } @@ -19015,7 +19111,7 @@ index 0000000000000000000000000000000000000000..f1080f62f22c3580f3e059ab80a766f5 + public double endermanScale = 1.0D; + public boolean endermanAllowGriefing = true; + public boolean endermanDespawnEvenWithBlock = false; -+ public boolean endermanBypassMobGriefing = false; ++ public Boolean endermanMobGriefingOverride = null; + public boolean endermanTakeDamageFromWater = true; + public boolean endermanAggroEndermites = true; + public boolean endermanAggroEndermitesOnlyIfPlayerSpawned = false; @@ -19039,7 +19135,12 @@ index 0000000000000000000000000000000000000000..f1080f62f22c3580f3e059ab80a766f5 + endermanScale = Mth.clamp(getDouble("mobs.enderman.attributes.scale", endermanScale), 0.0625D, 16.0D); + endermanAllowGriefing = getBoolean("mobs.enderman.allow-griefing", endermanAllowGriefing); + endermanDespawnEvenWithBlock = getBoolean("mobs.enderman.can-despawn-with-held-block", endermanDespawnEvenWithBlock); -+ endermanBypassMobGriefing = getBoolean("mobs.enderman.bypass-mob-griefing", endermanBypassMobGriefing); ++ if (PurpurConfig.version < 43) { ++ boolean oldVal = getBoolean("mobs.enderman.bypass-mob-griefing", false); ++ set("mobs.enderman.bypass-mob-griefing", null); ++ set("mobs.enderman.mob-griefing-override", oldVal ? true : "default"); ++ } ++ endermanMobGriefingOverride = getBooleanOrDefault("mobs.enderman.mob-griefing-override", endermanMobGriefingOverride); + endermanTakeDamageFromWater = getBoolean("mobs.enderman.takes-damage-from-water", endermanTakeDamageFromWater); + endermanAggroEndermites = getBoolean("mobs.enderman.aggressive-towards-endermites", endermanAggroEndermites); + endermanAggroEndermitesOnlyIfPlayerSpawned = getBoolean("mobs.enderman.aggressive-towards-endermites-only-spawned-by-player-thrown-ender-pearls", endermanAggroEndermitesOnlyIfPlayerSpawned); @@ -19075,7 +19176,7 @@ index 0000000000000000000000000000000000000000..f1080f62f22c3580f3e059ab80a766f5 + public boolean evokerControllable = true; + public double evokerMaxHealth = 24.0D; + public double evokerScale = 1.0D; -+ public boolean evokerBypassMobGriefing = false; ++ public Boolean evokerMobGriefingOverride = null; + public boolean evokerTakeDamageFromWater = false; + public boolean evokerAlwaysDropExp = false; + private void evokerSettings() { @@ -19089,7 +19190,12 @@ index 0000000000000000000000000000000000000000..f1080f62f22c3580f3e059ab80a766f5 + } + evokerMaxHealth = getDouble("mobs.evoker.attributes.max_health", evokerMaxHealth); + evokerScale = Mth.clamp(getDouble("mobs.evoker.attributes.scale", evokerScale), 0.0625D, 16.0D); -+ evokerBypassMobGriefing = getBoolean("mobs.evoker.bypass-mob-griefing", evokerBypassMobGriefing); ++ if (PurpurConfig.version < 43) { ++ boolean oldVal = getBoolean("mobs.evoker.bypass-mob-griefing", false); ++ set("mobs.evoker.bypass-mob-griefing", null); ++ set("mobs.evoker.mob-griefing-override", oldVal ? true : "default"); ++ } ++ evokerMobGriefingOverride = getBooleanOrDefault("mobs.evoker.mob-griefing-override", evokerMobGriefingOverride); + evokerTakeDamageFromWater = getBoolean("mobs.evoker.takes-damage-from-water", evokerTakeDamageFromWater); + evokerAlwaysDropExp = getBoolean("mobs.evoker.always-drop-exp", evokerAlwaysDropExp); + } @@ -19101,7 +19207,7 @@ index 0000000000000000000000000000000000000000..f1080f62f22c3580f3e059ab80a766f5 + public double foxScale = 1.0D; + public boolean foxTypeChangesWithTulips = false; + public int foxBreedingTicks = 6000; -+ public boolean foxBypassMobGriefing = false; ++ public Boolean foxMobGriefingOverride = null; + public boolean foxTakeDamageFromWater = false; + public boolean foxAlwaysDropExp = false; + private void foxSettings() { @@ -19117,7 +19223,12 @@ index 0000000000000000000000000000000000000000..f1080f62f22c3580f3e059ab80a766f5 + foxScale = Mth.clamp(getDouble("mobs.fox.attributes.scale", foxScale), 0.0625D, 16.0D); + foxTypeChangesWithTulips = getBoolean("mobs.fox.tulips-change-type", foxTypeChangesWithTulips); + foxBreedingTicks = getInt("mobs.fox.breeding-delay-ticks", foxBreedingTicks); -+ foxBypassMobGriefing = getBoolean("mobs.fox.bypass-mob-griefing", foxBypassMobGriefing); ++ if (PurpurConfig.version < 43) { ++ boolean oldVal = getBoolean("mobs.fox.bypass-mob-griefing", false); ++ set("mobs.fox.bypass-mob-griefing", null); ++ set("mobs.fox.mob-griefing-override", oldVal ? true : "default"); ++ } ++ foxMobGriefingOverride = getBooleanOrDefault("mobs.fox.mob-griefing-override", foxMobGriefingOverride); + foxTakeDamageFromWater = getBoolean("mobs.fox.takes-damage-from-water", foxTakeDamageFromWater); + foxAlwaysDropExp = getBoolean("mobs.fox.always-drop-exp", foxAlwaysDropExp); + } @@ -19698,7 +19809,7 @@ index 0000000000000000000000000000000000000000..f1080f62f22c3580f3e059ab80a766f5 + public boolean piglinControllable = true; + public double piglinMaxHealth = 16.0D; + public double piglinScale = 1.0D; -+ public boolean piglinBypassMobGriefing = false; ++ public Boolean piglinMobGriefingOverride = null; + public boolean piglinTakeDamageFromWater = false; + public int piglinPortalSpawnModifier = 2000; + public boolean piglinAlwaysDropExp = false; @@ -19715,7 +19826,12 @@ index 0000000000000000000000000000000000000000..f1080f62f22c3580f3e059ab80a766f5 + } + piglinMaxHealth = getDouble("mobs.piglin.attributes.max_health", piglinMaxHealth); + piglinScale = Mth.clamp(getDouble("mobs.piglin.attributes.scale", piglinScale), 0.0625D, 16.0D); -+ piglinBypassMobGriefing = getBoolean("mobs.piglin.bypass-mob-griefing", piglinBypassMobGriefing); ++ if (PurpurConfig.version < 43) { ++ boolean oldVal = getBoolean("mobs.piglin.bypass-mob-griefing", false); ++ set("mobs.piglin.bypass-mob-griefing", null); ++ set("mobs.piglin.mob-griefing-override", oldVal ? true : "default"); ++ } ++ piglinMobGriefingOverride = getBooleanOrDefault("mobs.piglin.mob-griefing-override", piglinMobGriefingOverride); + piglinTakeDamageFromWater = getBoolean("mobs.piglin.takes-damage-from-water", piglinTakeDamageFromWater); + piglinPortalSpawnModifier = getInt("mobs.piglin.portal-spawn-modifier", piglinPortalSpawnModifier); + piglinAlwaysDropExp = getBoolean("mobs.piglin.always-drop-exp", piglinAlwaysDropExp); @@ -19750,7 +19866,7 @@ index 0000000000000000000000000000000000000000..f1080f62f22c3580f3e059ab80a766f5 + public boolean pillagerControllable = true; + public double pillagerMaxHealth = 24.0D; + public double pillagerScale = 1.0D; -+ public boolean pillagerBypassMobGriefing = false; ++ public Boolean pillagerMobGriefingOverride = null; + public boolean pillagerTakeDamageFromWater = false; + public boolean pillagerAlwaysDropExp = false; + private void pillagerSettings() { @@ -19764,7 +19880,12 @@ index 0000000000000000000000000000000000000000..f1080f62f22c3580f3e059ab80a766f5 + } + pillagerMaxHealth = getDouble("mobs.pillager.attributes.max_health", pillagerMaxHealth); + pillagerScale = Mth.clamp(getDouble("mobs.pillager.attributes.scale", pillagerScale), 0.0625D, 16.0D); -+ pillagerBypassMobGriefing = getBoolean("mobs.pillager.bypass-mob-griefing", pillagerBypassMobGriefing); ++ if (PurpurConfig.version < 43) { ++ boolean oldVal = getBoolean("mobs.pillager.bypass-mob-griefing", false); ++ set("mobs.pillager.bypass-mob-griefing", null); ++ set("mobs.pillager.mob-griefing-override", oldVal ? true : "default"); ++ } ++ pillagerMobGriefingOverride = getBooleanOrDefault("mobs.pillager.mob-griefing-override", pillagerMobGriefingOverride); + pillagerTakeDamageFromWater = getBoolean("mobs.pillager.takes-damage-from-water", pillagerTakeDamageFromWater); + pillagerAlwaysDropExp = getBoolean("mobs.pillager.always-drop-exp", pillagerAlwaysDropExp); + } @@ -19826,7 +19947,7 @@ index 0000000000000000000000000000000000000000..f1080f62f22c3580f3e059ab80a766f5 + public double rabbitNaturalToast = 0.0D; + public double rabbitNaturalKiller = 0.0D; + public int rabbitBreedingTicks = 6000; -+ public boolean rabbitBypassMobGriefing = false; ++ public Boolean rabbitMobGriefingOverride = null; + public boolean rabbitTakeDamageFromWater = false; + public boolean rabbitAlwaysDropExp = false; + private void rabbitSettings() { @@ -19843,7 +19964,12 @@ index 0000000000000000000000000000000000000000..f1080f62f22c3580f3e059ab80a766f5 + rabbitNaturalToast = getDouble("mobs.rabbit.spawn-toast-chance", rabbitNaturalToast); + rabbitNaturalKiller = getDouble("mobs.rabbit.spawn-killer-rabbit-chance", rabbitNaturalKiller); + rabbitBreedingTicks = getInt("mobs.rabbit.breeding-delay-ticks", rabbitBreedingTicks); -+ rabbitBypassMobGriefing = getBoolean("mobs.rabbit.bypass-mob-griefing", rabbitBypassMobGriefing); ++ if (PurpurConfig.version < 43) { ++ boolean oldVal = getBoolean("mobs.rabbit.bypass-mob-griefing", false); ++ set("mobs.rabbit.bypass-mob-griefing", null); ++ set("mobs.rabbit.mob-griefing-override", oldVal ? true : "default"); ++ } ++ rabbitMobGriefingOverride = getBooleanOrDefault("mobs.rabbit.mob-griefing-override", rabbitMobGriefingOverride); + rabbitTakeDamageFromWater = getBoolean("mobs.rabbit.takes-damage-from-water", rabbitTakeDamageFromWater); + rabbitAlwaysDropExp = getBoolean("mobs.rabbit.always-drop-exp", rabbitAlwaysDropExp); + } @@ -19853,7 +19979,7 @@ index 0000000000000000000000000000000000000000..f1080f62f22c3580f3e059ab80a766f5 + public boolean ravagerControllable = true; + public double ravagerMaxHealth = 100.0D; + public double ravagerScale = 1.0D; -+ public boolean ravagerBypassMobGriefing = false; ++ public Boolean ravagerMobGriefingOverride = null; + public boolean ravagerTakeDamageFromWater = false; + public List ravagerGriefableBlocks = new ArrayList<>(); + public boolean ravagerAlwaysDropExp = false; @@ -19869,7 +19995,12 @@ index 0000000000000000000000000000000000000000..f1080f62f22c3580f3e059ab80a766f5 + } + ravagerMaxHealth = getDouble("mobs.ravager.attributes.max_health", ravagerMaxHealth); + ravagerScale = Mth.clamp(getDouble("mobs.ravager.attributes.scale", ravagerScale), 0.0625D, 16.0D); -+ ravagerBypassMobGriefing = getBoolean("mobs.ravager.bypass-mob-griefing", ravagerBypassMobGriefing); ++ if (PurpurConfig.version < 43) { ++ boolean oldVal = getBoolean("mobs.ravager.bypass-mob-griefing", false); ++ set("mobs.ravager.bypass-mob-griefing", null); ++ set("mobs.ravager.mob-griefing-override", oldVal ? true : "default"); ++ } ++ ravagerMobGriefingOverride = getBooleanOrDefault("mobs.ravager.mob-griefing-override", ravagerMobGriefingOverride); + ravagerTakeDamageFromWater = getBoolean("mobs.ravager.takes-damage-from-water", ravagerTakeDamageFromWater); + List defaultRavagerGriefableBlocks = List.of( + "minecraft:oak_leaves", @@ -19939,7 +20070,7 @@ index 0000000000000000000000000000000000000000..f1080f62f22c3580f3e059ab80a766f5 + public double sheepMaxHealth = 8.0D; + public double sheepScale = 1.0D; + public int sheepBreedingTicks = 6000; -+ public boolean sheepBypassMobGriefing = false; ++ public Boolean sheepMobGriefingOverride = null; + public boolean sheepTakeDamageFromWater = false; + public boolean sheepAlwaysDropExp = false; + private void sheepSettings() { @@ -19954,7 +20085,12 @@ index 0000000000000000000000000000000000000000..f1080f62f22c3580f3e059ab80a766f5 + sheepMaxHealth = getDouble("mobs.sheep.attributes.max_health", sheepMaxHealth); + sheepScale = Mth.clamp(getDouble("mobs.sheep.attributes.scale", sheepScale), 0.0625D, 16.0D); + sheepBreedingTicks = getInt("mobs.sheep.breeding-delay-ticks", sheepBreedingTicks); -+ sheepBypassMobGriefing = getBoolean("mobs.sheep.bypass-mob-griefing", sheepBypassMobGriefing); ++ if (PurpurConfig.version < 43) { ++ boolean oldVal = getBoolean("mobs.sheep.bypass-mob-griefing", false); ++ set("mobs.sheep.bypass-mob-griefing", null); ++ set("mobs.sheep.mob-griefing-override", oldVal ? true : "default"); ++ } ++ sheepMobGriefingOverride = getBooleanOrDefault("mobs.sheep.mob-griefing-override", sheepMobGriefingOverride); + sheepTakeDamageFromWater = getBoolean("mobs.sheep.takes-damage-from-water", sheepTakeDamageFromWater); + sheepAlwaysDropExp = getBoolean("mobs.sheep.always-drop-exp", sheepAlwaysDropExp); + } @@ -20000,7 +20136,7 @@ index 0000000000000000000000000000000000000000..f1080f62f22c3580f3e059ab80a766f5 + public double silverfishScale = 1.0D; + public double silverfishMovementSpeed = 0.25D; + public double silverfishAttackDamage = 1.0D; -+ public boolean silverfishBypassMobGriefing = false; ++ public Boolean silverfishMobGriefingOverride = null; + public boolean silverfishTakeDamageFromWater = false; + public boolean silverfishAlwaysDropExp = false; + private void silverfishSettings() { @@ -20016,7 +20152,12 @@ index 0000000000000000000000000000000000000000..f1080f62f22c3580f3e059ab80a766f5 + silverfishScale = Mth.clamp(getDouble("mobs.silverfish.attributes.scale", silverfishScale), 0.0625D, 16.0D); + silverfishMovementSpeed = getDouble("mobs.silverfish.attributes.movement_speed", silverfishMovementSpeed); + silverfishAttackDamage = getDouble("mobs.silverfish.attributes.attack_damage", silverfishAttackDamage); -+ silverfishBypassMobGriefing = getBoolean("mobs.silverfish.bypass-mob-griefing", silverfishBypassMobGriefing); ++ if (PurpurConfig.version < 43) { ++ boolean oldVal = getBoolean("mobs.silverfish.bypass-mob-griefing", false); ++ set("mobs.silverfish.bypass-mob-griefing", null); ++ set("mobs.silverfish.mob-griefing-override", oldVal ? true : "default"); ++ } ++ silverfishMobGriefingOverride = getBooleanOrDefault("mobs.silverfish.mob-griefing-override", silverfishMobGriefingOverride); + silverfishTakeDamageFromWater = getBoolean("mobs.silverfish.takes-damage-from-water", silverfishTakeDamageFromWater); + silverfishAlwaysDropExp = getBoolean("mobs.silverfish.always-drop-exp", silverfishAlwaysDropExp); + } @@ -20129,7 +20270,7 @@ index 0000000000000000000000000000000000000000..f1080f62f22c3580f3e059ab80a766f5 + public int snowGolemSnowBallMax = 20; + public float snowGolemSnowBallModifier = 10.0F; + public double snowGolemAttackDistance = 1.25D; -+ public boolean snowGolemBypassMobGriefing = false; ++ public Boolean snowGolemMobGriefingOverride = null; + public boolean snowGolemTakeDamageFromWater = true; + public boolean snowGolemAlwaysDropExp = false; + private void snowGolemSettings() { @@ -20149,7 +20290,12 @@ index 0000000000000000000000000000000000000000..f1080f62f22c3580f3e059ab80a766f5 + snowGolemSnowBallMax = getInt("mobs.snow_golem.max-shoot-interval-ticks", snowGolemSnowBallMax); + snowGolemSnowBallModifier = (float) getDouble("mobs.snow_golem.snow-ball-modifier", snowGolemSnowBallModifier); + snowGolemAttackDistance = getDouble("mobs.snow_golem.attack-distance", snowGolemAttackDistance); -+ snowGolemBypassMobGriefing = getBoolean("mobs.snow_golem.bypass-mob-griefing", snowGolemBypassMobGriefing); ++ if (PurpurConfig.version < 43) { ++ boolean oldVal = getBoolean("mobs.snow_golem.bypass-mob-griefing", false); ++ set("mobs.snow_golem.bypass-mob-griefing", null); ++ set("mobs.snow_golem.mob-griefing-override", oldVal ? true : "default"); ++ } ++ snowGolemMobGriefingOverride = getBooleanOrDefault("mobs.snow_golem.mob-griefing-override", snowGolemMobGriefingOverride); + snowGolemTakeDamageFromWater = getBoolean("mobs.snow_golem.takes-damage-from-water", snowGolemTakeDamageFromWater); + snowGolemAlwaysDropExp = getBoolean("mobs.snow_golem.always-drop-exp", snowGolemAlwaysDropExp); + } @@ -20388,7 +20534,7 @@ index 0000000000000000000000000000000000000000..f1080f62f22c3580f3e059ab80a766f5 + public int villagerBreedingTicks = 6000; + public boolean villagerClericsFarmWarts = false; + public boolean villagerClericFarmersThrowWarts = true; -+ public boolean villagerBypassMobGriefing = false; ++ public Boolean villagerMobGriefingOverride = null; + public boolean villagerTakeDamageFromWater = false; + public boolean villagerAllowTrading = true; + public boolean villagerAlwaysDropExp = false; @@ -20419,7 +20565,12 @@ index 0000000000000000000000000000000000000000..f1080f62f22c3580f3e059ab80a766f5 + villagerBreedingTicks = getInt("mobs.villager.breeding-delay-ticks", villagerBreedingTicks); + villagerClericsFarmWarts = getBoolean("mobs.villager.clerics-farm-warts", villagerClericsFarmWarts); + villagerClericFarmersThrowWarts = getBoolean("mobs.villager.cleric-wart-farmers-throw-warts-at-villagers", villagerClericFarmersThrowWarts); -+ villagerBypassMobGriefing = getBoolean("mobs.villager.bypass-mob-griefing", villagerBypassMobGriefing); ++ if (PurpurConfig.version < 43) { ++ boolean oldVal = getBoolean("mobs.villager.bypass-mob-griefing", false); ++ set("mobs.villager.bypass-mob-griefing", null); ++ set("mobs.villager.mob-griefing-override", oldVal ? true : "default"); ++ } ++ villagerMobGriefingOverride = getBooleanOrDefault("mobs.villager.mob-griefing-override", villagerMobGriefingOverride); + villagerTakeDamageFromWater = getBoolean("mobs.villager.takes-damage-from-water", villagerTakeDamageFromWater); + villagerAllowTrading = getBoolean("mobs.villager.allow-trading", villagerAllowTrading); + villagerAlwaysDropExp = getBoolean("mobs.villager.always-drop-exp", villagerAlwaysDropExp); @@ -20536,7 +20687,7 @@ index 0000000000000000000000000000000000000000..f1080f62f22c3580f3e059ab80a766f5 + public double witherScale = 1.0D; + public float witherHealthRegenAmount = 1.0f; + public int witherHealthRegenDelay = 20; -+ public boolean witherBypassMobGriefing = false; ++ public Boolean witherMobGriefingOverride = null; + public boolean witherTakeDamageFromWater = false; + public boolean witherCanRideVehicles = false; + public float witherExplosionRadius = 1.0F; @@ -20560,7 +20711,12 @@ index 0000000000000000000000000000000000000000..f1080f62f22c3580f3e059ab80a766f5 + witherScale = Mth.clamp(getDouble("mobs.wither.attributes.scale", witherScale), 0.0625D, 16.0D); + witherHealthRegenAmount = (float) getDouble("mobs.wither.health-regen-amount", witherHealthRegenAmount); + witherHealthRegenDelay = getInt("mobs.wither.health-regen-delay", witherHealthRegenDelay); -+ witherBypassMobGriefing = getBoolean("mobs.wither.bypass-mob-griefing", witherBypassMobGriefing); ++ if (PurpurConfig.version < 43) { ++ boolean oldVal = getBoolean("mobs.wither.bypass-mob-griefing", false); ++ set("mobs.wither.bypass-mob-griefing", null); ++ set("mobs.wither.mob-griefing-override", oldVal ? true : "default"); ++ } ++ witherMobGriefingOverride = getBooleanOrDefault("mobs.wither.mob-griefing-override", witherMobGriefingOverride); + witherTakeDamageFromWater = getBoolean("mobs.wither.takes-damage-from-water", witherTakeDamageFromWater); + witherCanRideVehicles = getBoolean("mobs.wither.can-ride-vehicles", witherCanRideVehicles); + witherExplosionRadius = (float) getDouble("mobs.wither.explosion-radius", witherExplosionRadius); @@ -20656,7 +20812,7 @@ index 0000000000000000000000000000000000000000..f1080f62f22c3580f3e059ab80a766f5 + public double zombieJockeyChance = 0.05D; + public boolean zombieJockeyTryExistingChickens = true; + public boolean zombieAggressiveTowardsVillagerWhenLagging = true; -+ public boolean zombieBypassMobGriefing = false; ++ public Boolean zombieMobGriefingOverride = null; + public boolean zombieTakeDamageFromWater = false; + public boolean zombieAlwaysDropExp = false; + public double zombieHeadVisibilityPercent = 0.5D; @@ -20676,7 +20832,12 @@ index 0000000000000000000000000000000000000000..f1080f62f22c3580f3e059ab80a766f5 + zombieJockeyChance = getDouble("mobs.zombie.jockey.chance", zombieJockeyChance); + zombieJockeyTryExistingChickens = getBoolean("mobs.zombie.jockey.try-existing-chickens", zombieJockeyTryExistingChickens); + zombieAggressiveTowardsVillagerWhenLagging = getBoolean("mobs.zombie.aggressive-towards-villager-when-lagging", zombieAggressiveTowardsVillagerWhenLagging); -+ zombieBypassMobGriefing = getBoolean("mobs.zombie.bypass-mob-griefing", zombieBypassMobGriefing); ++ if (PurpurConfig.version < 43) { ++ boolean oldVal = getBoolean("mobs.zombie.bypass-mob-griefing", false); ++ set("mobs.zombie.bypass-mob-griefing", null); ++ set("mobs.zombie.mob-griefing-override", oldVal ? true : "default"); ++ } ++ zombieMobGriefingOverride = getBooleanOrDefault("mobs.zombie.mob-griefing-override", zombieMobGriefingOverride); + zombieTakeDamageFromWater = getBoolean("mobs.zombie.takes-damage-from-water", zombieTakeDamageFromWater); + zombieAlwaysDropExp = getBoolean("mobs.zombie.always-drop-exp", zombieAlwaysDropExp); + zombieHeadVisibilityPercent = getDouble("mobs.zombie.head-visibility-percent", zombieHeadVisibilityPercent); @@ -20772,15 +20933,15 @@ index 0000000000000000000000000000000000000000..f1080f62f22c3580f3e059ab80a766f5 + set("mobs.zombified_piglin.attributes.max-health", null); + set("mobs.zombified_piglin.attributes.max_health", oldValue); + } -+ if (PurpurConfig.version < 42) { -+ set("mobs.zombified_piglin.count-as-player-kill-when-angry", false); -+ } + zombifiedPiglinMaxHealth = getDouble("mobs.zombified_piglin.attributes.max_health", zombifiedPiglinMaxHealth); + zombifiedPiglinScale = Mth.clamp(getDouble("mobs.zombified_piglin.attributes.scale", zombifiedPiglinScale), 0.0625D, 16.0D); + zombifiedPiglinSpawnReinforcements = getDouble("mobs.zombified_piglin.attributes.spawn_reinforcements", zombifiedPiglinSpawnReinforcements); + zombifiedPiglinJockeyOnlyBaby = getBoolean("mobs.zombified_piglin.jockey.only-babies", zombifiedPiglinJockeyOnlyBaby); + zombifiedPiglinJockeyChance = getDouble("mobs.zombified_piglin.jockey.chance", zombifiedPiglinJockeyChance); + zombifiedPiglinJockeyTryExistingChickens = getBoolean("mobs.zombified_piglin.jockey.try-existing-chickens", zombifiedPiglinJockeyTryExistingChickens); ++ if (PurpurConfig.version < 42) { ++ set("mobs.zombified_piglin.count-as-player-kill-when-angry", false); ++ } + zombifiedPiglinCountAsPlayerKillWhenAngry = getBoolean("mobs.zombified_piglin.count-as-player-kill-when-angry", zombifiedPiglinCountAsPlayerKillWhenAngry); + zombifiedPiglinTakeDamageFromWater = getBoolean("mobs.zombified_piglin.takes-damage-from-water", zombifiedPiglinTakeDamageFromWater); + zombifiedPiglinAlwaysDropExp = getBoolean("mobs.zombified_piglin.always-drop-exp", zombifiedPiglinAlwaysDropExp); diff --git a/leaf-server/minecraft-patches/features/0111-Slice-Smooth-Teleports.patch b/leaf-server/minecraft-patches/features/0111-Slice-Smooth-Teleports.patch index 9021ddd8..858d6b61 100644 --- a/leaf-server/minecraft-patches/features/0111-Slice-Smooth-Teleports.patch +++ b/leaf-server/minecraft-patches/features/0111-Slice-Smooth-Teleports.patch @@ -9,10 +9,10 @@ Original project: https://github.com/Cryptite/Slice Co-authored-by: HaHaWTH <102713261+HaHaWTH@users.noreply.github.com> diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index 5e9c02f66f6606fd2eaa8298eddbdff2889cffed..f3ccabaf4ff9bd0265415193831fd22b1868c00e 100644 +index 6bc6000c45f35ff85b36bede9d6010d8452b1f21..a05cd22bfe3a2c25a5e37c973766a162ce8e7244 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java -@@ -431,6 +431,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -423,6 +423,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc private boolean tpsBar = false; // Purpur - Implement TPSBar private boolean compassBar = false; // Purpur - Add compass command private boolean ramBar = false; // Purpur - Implement rambar commands diff --git a/leaf-server/minecraft-patches/features/0117-Configurable-movement-speed-of-more-entities.patch b/leaf-server/minecraft-patches/features/0117-Configurable-movement-speed-of-more-entities.patch index e182a1d9..bcd3649e 100644 --- a/leaf-server/minecraft-patches/features/0117-Configurable-movement-speed-of-more-entities.patch +++ b/leaf-server/minecraft-patches/features/0117-Configurable-movement-speed-of-more-entities.patch @@ -83,10 +83,10 @@ index 39489c8a347031fb4f73faca46039786e35762ac..4de1d0966157b20526386becee10b9be } diff --git a/org/purpurmc/purpur/PurpurWorldConfig.java b/org/purpurmc/purpur/PurpurWorldConfig.java -index ed5bbc49da258f8db249b1387f51ed1b22a29053..5bfb5228316441a913b506a438f7a0135582933a 100644 +index 31cc4e6e68a9743aaaeb296cb31e64526d3f1f73..67739ba7cb82d615a5f0c4db7aaa5552c53a42c5 100644 --- a/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1570,6 +1570,7 @@ public class PurpurWorldConfig { +@@ -1625,6 +1625,7 @@ public class PurpurWorldConfig { public boolean drownedTakeDamageFromWater = false; public boolean drownedBreakDoors = false; public boolean drownedAlwaysDropExp = false; @@ -94,7 +94,7 @@ index ed5bbc49da258f8db249b1387f51ed1b22a29053..5bfb5228316441a913b506a438f7a013 private void drownedSettings() { drownedRidable = getBoolean("mobs.drowned.ridable", drownedRidable); drownedRidableInWater = getBoolean("mobs.drowned.ridable-in-water", drownedRidableInWater); -@@ -1588,6 +1589,7 @@ public class PurpurWorldConfig { +@@ -1643,6 +1644,7 @@ public class PurpurWorldConfig { drownedTakeDamageFromWater = getBoolean("mobs.drowned.takes-damage-from-water", drownedTakeDamageFromWater); drownedBreakDoors = getBoolean("mobs.drowned.can-break-doors", drownedBreakDoors); drownedAlwaysDropExp = getBoolean("mobs.drowned.always-drop-exp", drownedAlwaysDropExp); @@ -102,7 +102,7 @@ index ed5bbc49da258f8db249b1387f51ed1b22a29053..5bfb5228316441a913b506a438f7a013 } public boolean elderGuardianRidable = false; -@@ -1962,6 +1964,7 @@ public class PurpurWorldConfig { +@@ -2037,6 +2039,7 @@ public class PurpurWorldConfig { public boolean huskJockeyTryExistingChickens = true; public boolean huskTakeDamageFromWater = false; public boolean huskAlwaysDropExp = false; @@ -110,7 +110,7 @@ index ed5bbc49da258f8db249b1387f51ed1b22a29053..5bfb5228316441a913b506a438f7a013 private void huskSettings() { huskRidable = getBoolean("mobs.husk.ridable", huskRidable); huskRidableInWater = getBoolean("mobs.husk.ridable-in-water", huskRidableInWater); -@@ -1979,6 +1982,7 @@ public class PurpurWorldConfig { +@@ -2054,6 +2057,7 @@ public class PurpurWorldConfig { huskJockeyTryExistingChickens = getBoolean("mobs.husk.jockey.try-existing-chickens", huskJockeyTryExistingChickens); huskTakeDamageFromWater = getBoolean("mobs.husk.takes-damage-from-water", huskTakeDamageFromWater); huskAlwaysDropExp = getBoolean("mobs.husk.always-drop-exp", huskAlwaysDropExp); @@ -118,7 +118,7 @@ index ed5bbc49da258f8db249b1387f51ed1b22a29053..5bfb5228316441a913b506a438f7a013 } public boolean illusionerRidable = false; -@@ -3297,6 +3301,7 @@ public class PurpurWorldConfig { +@@ -3417,6 +3421,7 @@ public class PurpurWorldConfig { public boolean zombieTakeDamageFromWater = false; public boolean zombieAlwaysDropExp = false; public double zombieHeadVisibilityPercent = 0.5D; @@ -126,7 +126,7 @@ index ed5bbc49da258f8db249b1387f51ed1b22a29053..5bfb5228316441a913b506a438f7a013 private void zombieSettings() { zombieRidable = getBoolean("mobs.zombie.ridable", zombieRidable); zombieRidableInWater = getBoolean("mobs.zombie.ridable-in-water", zombieRidableInWater); -@@ -3317,6 +3322,7 @@ public class PurpurWorldConfig { +@@ -3442,6 +3447,7 @@ public class PurpurWorldConfig { zombieTakeDamageFromWater = getBoolean("mobs.zombie.takes-damage-from-water", zombieTakeDamageFromWater); zombieAlwaysDropExp = getBoolean("mobs.zombie.always-drop-exp", zombieAlwaysDropExp); zombieHeadVisibilityPercent = getDouble("mobs.zombie.head-visibility-percent", zombieHeadVisibilityPercent); @@ -134,7 +134,7 @@ index ed5bbc49da258f8db249b1387f51ed1b22a29053..5bfb5228316441a913b506a438f7a013 } public boolean zombieHorseRidable = false; -@@ -3366,6 +3372,7 @@ public class PurpurWorldConfig { +@@ -3491,6 +3497,7 @@ public class PurpurWorldConfig { public int zombieVillagerCuringTimeMax = 6000; public boolean zombieVillagerCureEnabled = true; public boolean zombieVillagerAlwaysDropExp = false; @@ -142,7 +142,7 @@ index ed5bbc49da258f8db249b1387f51ed1b22a29053..5bfb5228316441a913b506a438f7a013 private void zombieVillagerSettings() { zombieVillagerRidable = getBoolean("mobs.zombie_villager.ridable", zombieVillagerRidable); zombieVillagerRidableInWater = getBoolean("mobs.zombie_villager.ridable-in-water", zombieVillagerRidableInWater); -@@ -3386,6 +3393,7 @@ public class PurpurWorldConfig { +@@ -3511,6 +3518,7 @@ public class PurpurWorldConfig { zombieVillagerCuringTimeMax = getInt("mobs.zombie_villager.curing_time.max", zombieVillagerCuringTimeMax); zombieVillagerCureEnabled = getBoolean("mobs.zombie_villager.cure.enabled", zombieVillagerCureEnabled); zombieVillagerAlwaysDropExp = getBoolean("mobs.zombie_villager.always-drop-exp", zombieVillagerAlwaysDropExp); @@ -150,7 +150,7 @@ index ed5bbc49da258f8db249b1387f51ed1b22a29053..5bfb5228316441a913b506a438f7a013 } public boolean zombifiedPiglinRidable = false; -@@ -3400,6 +3408,7 @@ public class PurpurWorldConfig { +@@ -3525,6 +3533,7 @@ public class PurpurWorldConfig { public boolean zombifiedPiglinCountAsPlayerKillWhenAngry = false; public boolean zombifiedPiglinTakeDamageFromWater = false; public boolean zombifiedPiglinAlwaysDropExp = false; @@ -158,7 +158,7 @@ index ed5bbc49da258f8db249b1387f51ed1b22a29053..5bfb5228316441a913b506a438f7a013 private void zombifiedPiglinSettings() { zombifiedPiglinRidable = getBoolean("mobs.zombified_piglin.ridable", zombifiedPiglinRidable); zombifiedPiglinRidableInWater = getBoolean("mobs.zombified_piglin.ridable-in-water", zombifiedPiglinRidableInWater); -@@ -3421,6 +3430,7 @@ public class PurpurWorldConfig { +@@ -3546,6 +3555,7 @@ public class PurpurWorldConfig { zombifiedPiglinCountAsPlayerKillWhenAngry = getBoolean("mobs.zombified_piglin.count-as-player-kill-when-angry", zombifiedPiglinCountAsPlayerKillWhenAngry); zombifiedPiglinTakeDamageFromWater = getBoolean("mobs.zombified_piglin.takes-damage-from-water", zombifiedPiglinTakeDamageFromWater); zombifiedPiglinAlwaysDropExp = getBoolean("mobs.zombified_piglin.always-drop-exp", zombifiedPiglinAlwaysDropExp); diff --git a/leaf-server/minecraft-patches/features/0121-Plazma-Add-missing-purpur-configuration-options.patch b/leaf-server/minecraft-patches/features/0121-Plazma-Add-missing-purpur-configuration-options.patch index c832e656..afcc7772 100644 --- a/leaf-server/minecraft-patches/features/0121-Plazma-Add-missing-purpur-configuration-options.patch +++ b/leaf-server/minecraft-patches/features/0121-Plazma-Add-missing-purpur-configuration-options.patch @@ -243,7 +243,7 @@ index 900c2fdd58da1ba6441f74175b6967b608248315..bf7f1338584d67ed93bd73f5de83a981 @Override diff --git a/org/purpurmc/purpur/PurpurConfig.java b/org/purpurmc/purpur/PurpurConfig.java -index f71afc2b7f32dfe2c10ba2c14713778208cd6de3..23e959e348a1875d63b5862411dae162625a1aac 100644 +index 234f123959830cc2adb78b9dc8752906140e5b11..e0dceff32b47b334ddcb76271e3cf3ea0d27e5f1 100644 --- a/org/purpurmc/purpur/PurpurConfig.java +++ b/org/purpurmc/purpur/PurpurConfig.java @@ -322,6 +322,7 @@ public class PurpurConfig { @@ -263,10 +263,10 @@ index f71afc2b7f32dfe2c10ba2c14713778208cd6de3..23e959e348a1875d63b5862411dae162 org.bukkit.event.inventory.InventoryType.ENDER_CHEST.setDefaultSize(enderChestSixRows ? 54 : 27); enderChestPermissionRows = getBoolean("settings.blocks.ender_chest.use-permissions-for-rows", enderChestPermissionRows); diff --git a/org/purpurmc/purpur/PurpurWorldConfig.java b/org/purpurmc/purpur/PurpurWorldConfig.java -index 5bfb5228316441a913b506a438f7a0135582933a..0bcc19dbd8f3107ea5f99e3ad81c3b8cd9ee5783 100644 +index 67739ba7cb82d615a5f0c4db7aaa5552c53a42c5..d81e06592aa9521f866c2c910b43a7364de3796e 100644 --- a/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1139,12 +1139,20 @@ public class PurpurWorldConfig { +@@ -1189,12 +1189,20 @@ public class PurpurWorldConfig { public boolean allayControllable = true; public double allayMaxHealth = 20.0D; public double allayScale = 1.0D; @@ -287,7 +287,7 @@ index 5bfb5228316441a913b506a438f7a0135582933a..0bcc19dbd8f3107ea5f99e3ad81c3b8c } public boolean armadilloRidable = false; -@@ -1299,6 +1307,10 @@ public class PurpurWorldConfig { +@@ -1349,6 +1357,10 @@ public class PurpurWorldConfig { public double camelMovementSpeedMin = 0.09D; public double camelMovementSpeedMax = 0.09D; public int camelBreedingTicks = 6000; @@ -298,7 +298,7 @@ index 5bfb5228316441a913b506a438f7a0135582933a..0bcc19dbd8f3107ea5f99e3ad81c3b8c private void camelSettings() { camelRidableInWater = getBoolean("mobs.camel.ridable-in-water", camelRidableInWater); camelMaxHealthMin = getDouble("mobs.camel.attributes.max_health.min", camelMaxHealthMin); -@@ -1308,6 +1320,10 @@ public class PurpurWorldConfig { +@@ -1358,6 +1370,10 @@ public class PurpurWorldConfig { camelMovementSpeedMin = getDouble("mobs.camel.attributes.movement_speed.min", camelMovementSpeedMin); camelMovementSpeedMax = getDouble("mobs.camel.attributes.movement_speed.max", camelMovementSpeedMax); camelBreedingTicks = getInt("mobs.camel.breeding-delay-ticks", camelBreedingTicks); @@ -309,7 +309,7 @@ index 5bfb5228316441a913b506a438f7a0135582933a..0bcc19dbd8f3107ea5f99e3ad81c3b8c } public boolean catRidable = false; -@@ -1454,12 +1470,20 @@ public class PurpurWorldConfig { +@@ -1504,12 +1520,20 @@ public class PurpurWorldConfig { public boolean creakingControllable = true; public double creakingMaxHealth = 1.0D; public double creakingScale = 1.0D; @@ -330,7 +330,7 @@ index 5bfb5228316441a913b506a438f7a0135582933a..0bcc19dbd8f3107ea5f99e3ad81c3b8c } public boolean creeperRidable = false; -@@ -1766,12 +1790,22 @@ public class PurpurWorldConfig { +@@ -1841,12 +1865,22 @@ public class PurpurWorldConfig { public boolean frogControllable = true; public float frogRidableJumpHeight = 0.65F; public int frogBreedingTicks = 6000; @@ -353,7 +353,7 @@ index 5bfb5228316441a913b506a438f7a0135582933a..0bcc19dbd8f3107ea5f99e3ad81c3b8c } public boolean ghastRidable = false; -@@ -2801,6 +2835,10 @@ public class PurpurWorldConfig { +@@ -2911,6 +2945,10 @@ public class PurpurWorldConfig { public double snifferMaxHealth = 14.0D; public double snifferScale = 1.0D; public int snifferBreedingTicks = 6000; @@ -364,7 +364,7 @@ index 5bfb5228316441a913b506a438f7a0135582933a..0bcc19dbd8f3107ea5f99e3ad81c3b8c private void snifferSettings() { snifferRidable = getBoolean("mobs.sniffer.ridable", snifferRidable); snifferRidableInWater = getBoolean("mobs.sniffer.ridable-in-water", snifferRidableInWater); -@@ -2808,6 +2846,10 @@ public class PurpurWorldConfig { +@@ -2918,6 +2956,10 @@ public class PurpurWorldConfig { snifferMaxHealth = getDouble("mobs.sniffer.attributes.max_health", snifferMaxHealth); snifferScale = Mth.clamp(getDouble("mobs.sniffer.attributes.scale", snifferScale), 0.0625D, 16.0D); snifferBreedingTicks = getInt("mobs.sniffer.breeding-delay-ticks", snifferBreedingTicks); @@ -375,7 +375,7 @@ index 5bfb5228316441a913b506a438f7a0135582933a..0bcc19dbd8f3107ea5f99e3ad81c3b8c } public boolean squidRidable = false; -@@ -2909,10 +2951,20 @@ public class PurpurWorldConfig { +@@ -3019,10 +3061,20 @@ public class PurpurWorldConfig { public boolean tadpoleRidable = false; public boolean tadpoleRidableInWater = true; public boolean tadpoleControllable = true; @@ -396,7 +396,7 @@ index 5bfb5228316441a913b506a438f7a0135582933a..0bcc19dbd8f3107ea5f99e3ad81c3b8c } public boolean traderLlamaRidable = false; -@@ -3141,10 +3193,20 @@ public class PurpurWorldConfig { +@@ -3256,10 +3308,20 @@ public class PurpurWorldConfig { public boolean wardenRidable = false; public boolean wardenRidableInWater = true; public boolean wardenControllable = true; diff --git a/leaf-server/minecraft-patches/features/0130-Improve-Purpur-AFK-system.patch b/leaf-server/minecraft-patches/features/0130-Improve-Purpur-AFK-system.patch index b0344ebc..484684b2 100644 --- a/leaf-server/minecraft-patches/features/0130-Improve-Purpur-AFK-system.patch +++ b/leaf-server/minecraft-patches/features/0130-Improve-Purpur-AFK-system.patch @@ -7,7 +7,7 @@ AFK command & command cooldown AFK title message diff --git a/net/minecraft/commands/Commands.java b/net/minecraft/commands/Commands.java -index bcecf48b43eef377354e32695d4258ea8020f73d..aba02a7e3139030050c3c61aabf7708c6c088a68 100644 +index eb600398e4802bb47231bbc0c55fb24ce24a6efb..54cc28bb1693be2077cb30d1dc85f9ae24a6c954 100644 --- a/net/minecraft/commands/Commands.java +++ b/net/minecraft/commands/Commands.java @@ -247,6 +247,7 @@ public class Commands { @@ -19,10 +19,10 @@ index bcecf48b43eef377354e32695d4258ea8020f73d..aba02a7e3139030050c3c61aabf7708c org.purpurmc.purpur.command.DemoCommand.register(this.dispatcher); // Purpur - Add demo command org.purpurmc.purpur.command.PingCommand.register(this.dispatcher); // Purpur - Add ping command diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index f3ccabaf4ff9bd0265415193831fd22b1868c00e..6d3b895fcbb3c2fe4438e1e30d87dc2150c7f462 100644 +index a05cd22bfe3a2c25a5e37c973766a162ce8e7244..602a087122a6baa3cb33e1bf5e6c4d98e500fa05 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java -@@ -2382,6 +2382,10 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -2385,6 +2385,10 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc // Purpur start - AFK API private boolean isAfk = false; @@ -33,7 +33,7 @@ index f3ccabaf4ff9bd0265415193831fd22b1868c00e..6d3b895fcbb3c2fe4438e1e30d87dc21 @Override public void setAfk(boolean afk) { -@@ -2419,6 +2423,18 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -2422,6 +2426,18 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc String prefix = (split.length > 0 ? split[0] : "").replace(org.purpurmc.purpur.PurpurConfig.afkTabListPrefix, ""); String suffix = (split.length > 1 ? split[1] : "").replace(org.purpurmc.purpur.PurpurConfig.afkTabListSuffix, ""); if (afk) { @@ -164,7 +164,7 @@ index 536fea9622cdec212aa61adbb627704c59a8999f..37ba75bd50f785da11a0127fb40d86ee player.awardStat(Stats.LEAVE_GAME); // CraftBukkit start - Quitting must be before we do final save of data, in case plugins need to modify it diff --git a/org/purpurmc/purpur/PurpurConfig.java b/org/purpurmc/purpur/PurpurConfig.java -index 23e959e348a1875d63b5862411dae162625a1aac..78e90d4e173c52c0dadc6c8e00326829a7c57575 100644 +index e0dceff32b47b334ddcb76271e3cf3ea0d27e5f1..ba206b753afe26a5b4c6a2fd1fc438d9a581c3dc 100644 --- a/org/purpurmc/purpur/PurpurConfig.java +++ b/org/purpurmc/purpur/PurpurConfig.java @@ -175,6 +175,11 @@ public class PurpurConfig { diff --git a/leaf-server/minecraft-patches/features/0141-Configurable-unknown-command-message.patch b/leaf-server/minecraft-patches/features/0141-Configurable-unknown-command-message.patch index 8db95490..6385c426 100644 --- a/leaf-server/minecraft-patches/features/0141-Configurable-unknown-command-message.patch +++ b/leaf-server/minecraft-patches/features/0141-Configurable-unknown-command-message.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Configurable unknown command message diff --git a/net/minecraft/commands/Commands.java b/net/minecraft/commands/Commands.java -index aba02a7e3139030050c3c61aabf7708c6c088a68..4bc1aa7a85596fa1bb275e88834b25f4fe2c6ea0 100644 +index 54cc28bb1693be2077cb30d1dc85f9ae24a6c954..1e84f726f23877ed4be1aa901d7df0b11aa95552 100644 --- a/net/minecraft/commands/Commands.java +++ b/net/minecraft/commands/Commands.java @@ -403,31 +403,8 @@ public class Commands { @@ -41,7 +41,7 @@ index aba02a7e3139030050c3c61aabf7708c6c088a68..4bc1aa7a85596fa1bb275e88834b25f4 org.bukkit.Bukkit.getServer().getPluginManager().callEvent(event); if (event.message() != null) { source.sendFailure(io.papermc.paper.adventure.PaperAdventure.asVanilla(event.message()), false); -@@ -677,6 +654,92 @@ public class Commands { +@@ -678,6 +655,92 @@ public class Commands { }; } diff --git a/leaf-server/minecraft-patches/features/0163-Fix-MC-119417.patch b/leaf-server/minecraft-patches/features/0163-Fix-MC-119417.patch index cb61e6ab..ac41d99e 100644 --- a/leaf-server/minecraft-patches/features/0163-Fix-MC-119417.patch +++ b/leaf-server/minecraft-patches/features/0163-Fix-MC-119417.patch @@ -6,10 +6,10 @@ Subject: [PATCH] Fix MC-119417 Related MC issue: https://bugs.mojang.com/browse/MC/issues/MC-119417 diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index 6d3b895fcbb3c2fe4438e1e30d87dc2150c7f462..87651c9286fa61a7eeed95d0679230ee77616c9e 100644 +index 602a087122a6baa3cb33e1bf5e6c4d98e500fa05..f898961de04ad0b224d0405e2cd43d61665cc1b1 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java -@@ -2186,6 +2186,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -2189,6 +2189,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc this.connection.send(new ClientboundGameEventPacket(ClientboundGameEventPacket.CHANGE_GAME_MODE, gameMode.getId())); if (gameMode == GameType.SPECTATOR) { this.removeEntitiesOnShoulder(); diff --git a/leaf-server/minecraft-patches/features/0177-Optimize-Entity-distanceToSqr.patch b/leaf-server/minecraft-patches/features/0177-Optimize-Entity-distanceToSqr.patch index 7992ae9f..69f6c85d 100644 --- a/leaf-server/minecraft-patches/features/0177-Optimize-Entity-distanceToSqr.patch +++ b/leaf-server/minecraft-patches/features/0177-Optimize-Entity-distanceToSqr.patch @@ -8,7 +8,7 @@ avoids multiple casting in Entity#distanceTo, using Math#sqrt directly instead o these methods more able to be inlined by the JIT compiler. diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java -index 689d5d215ab372b482ad715fc86df257ba04ed53..0fc0a69d377060aab39f179240c25031bebb2d97 100644 +index c3d4cdfece32a05acd03b892cd5b343f0d230e64..1cbc319a9b5ce3b15f79fcfec8cf9c46d0d3d1d0 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java @@ -2186,31 +2186,6 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess @@ -43,7 +43,7 @@ index 689d5d215ab372b482ad715fc86df257ba04ed53..0fc0a69d377060aab39f179240c25031 public void playerTouch(Player player) { } -@@ -5249,4 +5224,34 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -5265,4 +5240,34 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess return false; } // Purpur end - Ridables diff --git a/leaf-server/minecraft-patches/features/0185-Smooth-teleport-config.patch b/leaf-server/minecraft-patches/features/0185-Smooth-teleport-config.patch index e55d2f64..fa2324b6 100644 --- a/leaf-server/minecraft-patches/features/0185-Smooth-teleport-config.patch +++ b/leaf-server/minecraft-patches/features/0185-Smooth-teleport-config.patch @@ -9,10 +9,10 @@ happen but the visual "refresh" of a world change is hidden. Depending on the de this can act as a "smooth teleport" to a world if the new world is very similar looking to the old one. diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index 87651c9286fa61a7eeed95d0679230ee77616c9e..a909056b922ad29607a5f85b6affa4fb5aa82d67 100644 +index f898961de04ad0b224d0405e2cd43d61665cc1b1..afbac4f2da3aa58da82b9a06d656851f12756f32 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java -@@ -1414,6 +1414,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -1417,6 +1417,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc LevelData worlddata = level.getLevelData(); this.connection.send(new ClientboundRespawnPacket(this.createCommonSpawnInfo(level), (byte) 3)); @@ -20,7 +20,7 @@ index 87651c9286fa61a7eeed95d0679230ee77616c9e..a909056b922ad29607a5f85b6affa4fb this.connection.send(new ClientboundChangeDifficultyPacket(worlddata.getDifficulty(), worlddata.isDifficultyLocked())); PlayerList playerList = this.server.getPlayerList(); -@@ -1423,7 +1424,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -1426,7 +1427,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc // CraftBukkit end this.portalPos = org.bukkit.craftbukkit.util.CraftLocation.toBlockPosition(exit); // Purpur - Fix stuck in portals this.setServerLevel(level); diff --git a/leaf-server/minecraft-patches/features/0207-Cache-eligible-players-for-despawn-checks.patch b/leaf-server/minecraft-patches/features/0207-Cache-eligible-players-for-despawn-checks.patch index 27879a5b..60a0703f 100644 --- a/leaf-server/minecraft-patches/features/0207-Cache-eligible-players-for-despawn-checks.patch +++ b/leaf-server/minecraft-patches/features/0207-Cache-eligible-players-for-despawn-checks.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Cache eligible players for despawn checks diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java -index c8c99323b6397c3e595e7a9007e5d801ee2ac14a..7ca4fd418599cdb1bb1de44f4c3c57f1770a4038 100644 +index 1f3020f5a051d5f4e5c8fa088f844962c3105573..c6eb136e8db0aa232681ac9bd28c4b70fbbacb40 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java @@ -723,6 +723,8 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe @@ -38,10 +38,10 @@ index c8c99323b6397c3e595e7a9007e5d801ee2ac14a..7ca4fd418599cdb1bb1de44f4c3c57f1 .forEach( entity -> { diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index a909056b922ad29607a5f85b6affa4fb5aa82d67..ff4ca34dca8e0061977ea63707eb34c6e06dd66a 100644 +index afbac4f2da3aa58da82b9a06d656851f12756f32..f765cc0044282ad592a146773ab93f82fefcebc4 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java -@@ -1514,6 +1514,13 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -1517,6 +1517,13 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc this.containerMenu.broadcastChanges(); } @@ -56,7 +56,7 @@ index a909056b922ad29607a5f85b6affa4fb5aa82d67..ff4ca34dca8e0061977ea63707eb34c6 private Either getBedResult(BlockPos at, Direction direction) { if (this.isSleeping() || !this.isAlive()) { diff --git a/net/minecraft/world/entity/Mob.java b/net/minecraft/world/entity/Mob.java -index d473c09e98eb5d3ef7b3e096197c7bf9a6219c56..77075bf43e7e2301e58aa6d9f8bfe934cce42f55 100644 +index c15b6e32bd00650366dc4ecba2abeb6bfb98d638..81bd431e641be474f7a43a78df083756de1798de 100644 --- a/net/minecraft/world/entity/Mob.java +++ b/net/minecraft/world/entity/Mob.java @@ -705,7 +705,24 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab diff --git a/leaf-server/minecraft-patches/features/0232-Prevent-double-chunk-retrieving-in-entity-fluid-push.patch b/leaf-server/minecraft-patches/features/0232-Prevent-double-chunk-retrieving-in-entity-fluid-push.patch index 24bbcd2b..0c1ce6a3 100644 --- a/leaf-server/minecraft-patches/features/0232-Prevent-double-chunk-retrieving-in-entity-fluid-push.patch +++ b/leaf-server/minecraft-patches/features/0232-Prevent-double-chunk-retrieving-in-entity-fluid-push.patch @@ -11,10 +11,10 @@ As part of: Airplane (https://github.com/TECHNOVE/Airplane) Licensed under: GPL-3.0 (https://www.gnu.org/licenses/gpl-3.0.html) diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java -index 74b05983ae3e24f489ca9b0058c5d5c6dcd8cafb..658b8af9b1db252d5664956907a5c0db538018b0 100644 +index 309a31215cb63452215fd880590cffd569aee208..1db32873588673900a8afa9767c3af12c7b6742a 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java -@@ -4563,10 +4563,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -4579,10 +4579,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess // Paper start - optimise collisions public boolean updateFluidHeightAndDoFluidPushing(final TagKey fluid, final double flowScale) { @@ -26,7 +26,7 @@ index 74b05983ae3e24f489ca9b0058c5d5c6dcd8cafb..658b8af9b1db252d5664956907a5c0db final AABB boundingBox = this.getBoundingBox().deflate(1.0E-3); final Level world = this.level; -@@ -4602,7 +4599,11 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -4618,7 +4615,11 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess for (int currChunkZ = minChunkZ; currChunkZ <= maxChunkZ; ++currChunkZ) { for (int currChunkX = minChunkX; currChunkX <= maxChunkX; ++currChunkX) { diff --git a/leaf-server/minecraft-patches/features/0235-Async-target-finding.patch b/leaf-server/minecraft-patches/features/0235-Async-target-finding.patch index 9cae915b..60fa1527 100644 --- a/leaf-server/minecraft-patches/features/0235-Async-target-finding.patch +++ b/leaf-server/minecraft-patches/features/0235-Async-target-finding.patch @@ -149,7 +149,7 @@ index 54910c2e1d6e6bb556e536fda060bd09402e04e8..747eb54f84650a9a507398e3d5352e00 // Gale start - Pufferfish - SIMD support diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java -index 461b620b703c9fca2691f724a9b865ad54aa90a4..48e06770ee9789e0b64e7369e26f23eea72f691a 100644 +index 1346cff0018e6d17cb892892c3aeebfb86453b60..a753481afe02a2367c378c7f39206fde23eda00d 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java @@ -173,7 +173,16 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe @@ -237,7 +237,7 @@ index 461b620b703c9fca2691f724a9b865ad54aa90a4..48e06770ee9789e0b64e7369e26f23ee // Paper start - log detailed entity tick information diff --git a/net/minecraft/world/entity/Mob.java b/net/minecraft/world/entity/Mob.java -index 77075bf43e7e2301e58aa6d9f8bfe934cce42f55..edd9de6992489404f421164dd25edc4023fb14d6 100644 +index 81bd431e641be474f7a43a78df083756de1798de..7092599cfbce0c632775f70fc599172b51d9e2cd 100644 --- a/net/minecraft/world/entity/Mob.java +++ b/net/minecraft/world/entity/Mob.java @@ -135,6 +135,12 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab @@ -1327,12 +1327,12 @@ index 4ba5f7da27f7f6842790c0093bc0f25e138fa982..0f2841a9681997c0d4b915284f7f5b38 public boolean canContinueToUse() { return this.tick > 0; diff --git a/net/minecraft/world/entity/ai/goal/RemoveBlockGoal.java b/net/minecraft/world/entity/ai/goal/RemoveBlockGoal.java -index 084156166905562beb8d36db400bc9cab5c14be2..3eed1ac1cab130034f47da6efa33c0ad2a77a7e2 100644 +index 16ec032d84f128fc44a836843fafef303f52b699..767dff2aa4c1d71cc3c22104366605486a5004b9 100644 --- a/net/minecraft/world/entity/ai/goal/RemoveBlockGoal.java +++ b/net/minecraft/world/entity/ai/goal/RemoveBlockGoal.java @@ -37,7 +37,14 @@ public class RemoveBlockGoal extends MoveToBlockGoal { public boolean canUse() { - if (!getServerLevel(this.removerMob).purpurConfig.zombieBypassMobGriefing == !getServerLevel(this.removerMob).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { // Purpur - Add mobGriefing bypass to everything affected + if (!getServerLevel(this.removerMob).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, getServerLevel(this.removerMob).purpurConfig.zombieMobGriefingOverride)) { // Purpur - Add mobGriefing override to everything affected return false; - } else if (this.nextStartTick > 0) { + } @@ -1796,7 +1796,7 @@ index 002d3c0d8b1107a275020d5c582c37e9a5c536ee..6fa0b8defbd1d06b3bf5d9b32ffd08f3 // Gale start - Petal - reduce line of sight cache lookups - merge sets int cached = this.seen.get(id); diff --git a/net/minecraft/world/entity/animal/Fox.java b/net/minecraft/world/entity/animal/Fox.java -index fcda990a5575288b39f6aa16b0ec48d2a57542e9..fb956c0bd8a877117ec33f753f6e6bb096831f78 100644 +index ff20a6e9745c7724dfae41d5868912c8cc19eb8e..9eb9b978e2cc8570d8b884603172f2718e770d93 100644 --- a/net/minecraft/world/entity/animal/Fox.java +++ b/net/minecraft/world/entity/animal/Fox.java @@ -870,6 +870,11 @@ public class Fox extends Animal { @@ -1867,7 +1867,7 @@ index 99d99d59ec0eb13dc40bc88bd70ad884bb9e2859..d0be031cedcc895b8cca8666f826628a ServerLevel serverLevel = getServerLevel(this.mob); if (this.lookAtType == Player.class) { diff --git a/net/minecraft/world/entity/animal/Rabbit.java b/net/minecraft/world/entity/animal/Rabbit.java -index 38e2698c5084f0c14c7fde5de542ed61a7cb7f1d..d96eb5a6fde72a9e7e7799624b63ec72e9b77f90 100644 +index fd8026cf1d884e95e8260ad52d4e0bbad20b0fdf..7ea36f2de5ecad35651d5333235e079a28bd0101 100644 --- a/net/minecraft/world/entity/animal/Rabbit.java +++ b/net/minecraft/world/entity/animal/Rabbit.java @@ -669,7 +669,13 @@ public class Rabbit extends Animal { @@ -1987,7 +1987,7 @@ index 2e04078664cd723e3e0c80565e4b6e6416b13901..ed790a407b4be9e2f7fcb8cf36b8d03c static class DrownedGoToWaterGoal extends Goal { diff --git a/net/minecraft/world/entity/monster/EnderMan.java b/net/minecraft/world/entity/monster/EnderMan.java -index b9160f939894f784e8a733b0c00055b51aec694a..1baaf3dd103c1dd8a1c7d9457e5f878f5d31d04d 100644 +index b57f16d8faca315a2b080407e007e9a18ca3c2fc..13d4d25191c4ed262acc54eb6d3517587846c1ae 100644 --- a/net/minecraft/world/entity/monster/EnderMan.java +++ b/net/minecraft/world/entity/monster/EnderMan.java @@ -590,10 +590,34 @@ public class EnderMan extends Monster implements NeutralMob { @@ -2047,7 +2047,7 @@ index e1717b5c854aa81fdd7b7e715d7c3498d9f86072..3627e7479b4deea28e268245410ec4cd static class StriderPathNavigation extends GroundPathNavigation { diff --git a/net/minecraft/world/level/Level.java b/net/minecraft/world/level/Level.java -index 20be5c4200bfee01d62fa1103a3663b91107d5d8..3f5fb9d0002f7e11cd6dbe38eaa054c63a625d9a 100644 +index 309dbb3b7a485ef5e13f893e53bbdbec1401422e..1ef49db44e8dcfd944b600ef64dbcaee36546688 100644 --- a/net/minecraft/world/level/Level.java +++ b/net/minecraft/world/level/Level.java @@ -1525,6 +1525,7 @@ public abstract class Level implements LevelAccessor, UUIDLookup, AutoCl diff --git a/leaf-server/minecraft-patches/features/0242-Protocol-Core.patch b/leaf-server/minecraft-patches/features/0242-Protocol-Core.patch index 87fd99dd..e00c88dc 100644 --- a/leaf-server/minecraft-patches/features/0242-Protocol-Core.patch +++ b/leaf-server/minecraft-patches/features/0242-Protocol-Core.patch @@ -47,10 +47,10 @@ index 867936866d952c559b6ffa49fdf78acd70a9bab9..b1953701583ba88c524368a52988fea6 private Stream mountedOrDismounted(List entities) { diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index ff4ca34dca8e0061977ea63707eb34c6e06dd66a..30783379baee569ec7ff51d34524ccdcba38d764 100644 +index f765cc0044282ad592a146773ab93f82fefcebc4..4a611930d8b153f60611275b2b5acacf26add509 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java -@@ -809,6 +809,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -801,6 +801,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc } } // Purpur end - Ridables diff --git a/leaf-server/minecraft-patches/features/0247-Only-tick-items-at-hand.patch b/leaf-server/minecraft-patches/features/0247-Only-tick-items-at-hand.patch index edecdadd..78b23092 100644 --- a/leaf-server/minecraft-patches/features/0247-Only-tick-items-at-hand.patch +++ b/leaf-server/minecraft-patches/features/0247-Only-tick-items-at-hand.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Only tick items at hand diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index 30783379baee569ec7ff51d34524ccdcba38d764..e2178e12a5c41ab525eea2cd13f14aadd8d66f49 100644 +index 4a611930d8b153f60611275b2b5acacf26add509..487d3f1856ac9a0977bbc3a2c54cd1e85328ad73 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java -@@ -838,12 +838,19 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -830,12 +830,19 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc super.tick(); } diff --git a/leaf-server/minecraft-patches/features/0253-Add-configurable-death-item-drop-knockback-settings.patch b/leaf-server/minecraft-patches/features/0253-Add-configurable-death-item-drop-knockback-settings.patch index 0416a24b..99a8a11e 100644 --- a/leaf-server/minecraft-patches/features/0253-Add-configurable-death-item-drop-knockback-settings.patch +++ b/leaf-server/minecraft-patches/features/0253-Add-configurable-death-item-drop-knockback-settings.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add configurable death item drop knockback settings diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index e2178e12a5c41ab525eea2cd13f14aadd8d66f49..8cc4ee6b62a7f7bd86dce0b5cd7c470156872fdc 100644 +index 487d3f1856ac9a0977bbc3a2c54cd1e85328ad73..432362df2401ec5d05f80fea7756befd7f30e6d4 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java -@@ -1033,7 +1033,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -1049,7 +1049,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc if (!keepInventory) { for (ItemStack item : this.getInventory().getContents()) { if (!item.isEmpty() && !EnchantmentHelper.has(item, net.minecraft.world.item.enchantment.EnchantmentEffectComponents.PREVENT_EQUIPMENT_DROP)) { @@ -18,7 +18,7 @@ index e2178e12a5c41ab525eea2cd13f14aadd8d66f49..8cc4ee6b62a7f7bd86dce0b5cd7c4701 } } diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index 8461be7c6723925d26f7f162564a18f4aa162089..27dffa0a104b27687fd7ec0add46657bcab4299a 100644 +index c46bc07e6bd8f121bb6df922408a931ab01ce2ca..ebe8b4c51152e691322571750949e13a986ea7a5 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java @@ -4088,9 +4088,9 @@ public abstract class LivingEntity extends Entity implements Attackable { diff --git a/leaf-server/minecraft-patches/features/0258-Paw-optimization.patch b/leaf-server/minecraft-patches/features/0258-Paw-optimization.patch index 35c90d7d..03d67a9f 100644 --- a/leaf-server/minecraft-patches/features/0258-Paw-optimization.patch +++ b/leaf-server/minecraft-patches/features/0258-Paw-optimization.patch @@ -94,7 +94,7 @@ index 0f9d18dd29e210ad656da211a3cb1cb25cd4efb1..d1c36cd17c83e7e0167046093c4a2b84 for (LevelChunk levelChunk : list) { diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java -index 48e06770ee9789e0b64e7369e26f23eea72f691a..31599270e0827db49037d54b0bf5f7a78e3a5e5e 100644 +index a753481afe02a2367c378c7f39206fde23eda00d..753b4255d9e9b9628bc5825a6b4f0f2540f06e7a 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java @@ -1367,13 +1367,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe @@ -126,7 +126,7 @@ index 48e06770ee9789e0b64e7369e26f23eea72f691a..31599270e0827db49037d54b0bf5f7a7 private void tickPassenger(Entity ridingEntity, Entity passengerEntity, final boolean isActive) { // Paper - EAR 2 diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java -index fbdc7e54df6cf28264b1dc0d395b9f91206cd50e..fa315f46e9b917ef2329d7071c0790d7a4b8ed53 100644 +index f3a6c98fb803f2141be0ef8315ed9294515f1b73..6d8c7d90b0a64e99a2e811ccdb84a03be95e27b3 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java @@ -1140,16 +1140,6 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess @@ -177,7 +177,7 @@ index fbdc7e54df6cf28264b1dc0d395b9f91206cd50e..fa315f46e9b917ef2329d7071c0790d7 } private void applyMovementEmissionAndPlaySound(Entity.MovementEmission movementEmission, Vec3 movement, BlockPos pos, BlockState state) { -@@ -4801,9 +4775,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -4817,9 +4791,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess } public void setDeltaMovement(Vec3 deltaMovement) { @@ -187,7 +187,7 @@ index fbdc7e54df6cf28264b1dc0d395b9f91206cd50e..fa315f46e9b917ef2329d7071c0790d7 } public void addDeltaMovement(Vec3 addend) { -@@ -4911,9 +4883,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -4927,9 +4899,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess } // Paper end - Fix MC-4 if (this.position.x != x || this.position.y != y || this.position.z != z) { diff --git a/leaf-server/minecraft-patches/features/0260-optimize-getEntityStatus.patch b/leaf-server/minecraft-patches/features/0260-optimize-getEntityStatus.patch index ebe6b6cf..4889050b 100644 --- a/leaf-server/minecraft-patches/features/0260-optimize-getEntityStatus.patch +++ b/leaf-server/minecraft-patches/features/0260-optimize-getEntityStatus.patch @@ -5,7 +5,7 @@ Subject: [PATCH] optimize getEntityStatus diff --git a/ca/spottedleaf/moonrise/patches/chunk_system/level/entity/EntityLookup.java b/ca/spottedleaf/moonrise/patches/chunk_system/level/entity/EntityLookup.java -index 7554c109c35397bc1a43dd80e87764fd78645bbf..151476fd036839a416c226599279d0d8bf79717b 100644 +index 2d24d03bbdb5ee0d862cbfff2219f58afffafe12..11f4f2f3bc4c9f9f6a1f83b90f3de34c8edb9819 100644 --- a/ca/spottedleaf/moonrise/patches/chunk_system/level/entity/EntityLookup.java +++ b/ca/spottedleaf/moonrise/patches/chunk_system/level/entity/EntityLookup.java @@ -93,8 +93,14 @@ public abstract class EntityLookup implements LevelEntityGetter { @@ -25,7 +25,7 @@ index 7554c109c35397bc1a43dd80e87764fd78645bbf..151476fd036839a416c226599279d0d8 } @Override -@@ -394,7 +400,14 @@ public abstract class EntityLookup implements LevelEntityGetter { +@@ -398,7 +404,14 @@ public abstract class EntityLookup implements LevelEntityGetter { return Visibility.TICKING; } final FullChunkStatus entityStatus = ((ChunkSystemEntity)entity).moonrise$getChunkStatus(); @@ -42,7 +42,7 @@ index 7554c109c35397bc1a43dd80e87764fd78645bbf..151476fd036839a416c226599279d0d8 protected boolean addEntity(final Entity entity, final boolean fromDisk, final boolean event) { diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java -index fa315f46e9b917ef2329d7071c0790d7a4b8ed53..f130002b8bdfbf3ae9fa1a8166fd502924c5a42f 100644 +index 6d8c7d90b0a64e99a2e811ccdb84a03be95e27b3..f00a981ef03886f17852f38ba5e83baf856fd1c1 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java @@ -370,6 +370,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess diff --git a/leaf-server/paper-patches/features/0001-Rebrand.patch b/leaf-server/paper-patches/features/0001-Rebrand.patch index a92d221b..d50868cc 100644 --- a/leaf-server/paper-patches/features/0001-Rebrand.patch +++ b/leaf-server/paper-patches/features/0001-Rebrand.patch @@ -220,7 +220,7 @@ index 94a9ed024d3859793618152ea559a168bbcbb5e2..e60008693e017bec1b4eb49c84be3898 -. +. diff --git a/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java b/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java -index bad941054349efe53756d6ab53ba7f6872de8e6f..8f42fba5615c7e1bda4c27334e39a8e3e434db81 100644 +index d0554ed6631535815e5932930911e3fe1dee8710..8f42fba5615c7e1bda4c27334e39a8e3e434db81 100644 --- a/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java +++ b/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java @@ -9,6 +9,7 @@ import com.google.gson.JsonObject; @@ -271,7 +271,7 @@ index bad941054349efe53756d6ab53ba7f6872de8e6f..8f42fba5615c7e1bda4c27334e39a8e3 } @Override -- public Component getVersionMessage(final String serverVersion) { +- public Component getVersionMessage() { - final Component updateMessage; - final ServerBuildInfo build = ServerBuildInfo.buildInfo(); - if (build.buildNumber().isEmpty() && build.gitCommit().isEmpty()) { @@ -429,7 +429,7 @@ index 1354ccfbf525e5e64483ac5f443cc2325ba63850..f6f787db016f4d1ac14648ebf2b8e162 // (async tasks must live with race-conditions if they attempt to cancel between these few lines of code) } diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java -index f78cfd9c03014a10187dae58e2af1e137149dbc7..e0a7e8f97b1e00c9de7f764c686d4de9579cd93a 100644 +index a287ad5cce532229f2a514956d34a9358175bc45..d705eae9da291b7d3095994bc4baa7a2c570ddeb 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java +++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java @@ -485,7 +485,7 @@ public final class CraftMagicNumbers implements UnsafeValues { diff --git a/leaf-server/paper-patches/features/0004-Gale-configuration.patch b/leaf-server/paper-patches/features/0004-Gale-configuration.patch index 6010b85e..082ac3d2 100644 --- a/leaf-server/paper-patches/features/0004-Gale-configuration.patch +++ b/leaf-server/paper-patches/features/0004-Gale-configuration.patch @@ -13,10 +13,10 @@ As part of: Paper (https://github.com/PaperMC/Paper) Licensed under: GPL-3.0 (https://www.gnu.org/licenses/gpl-3.0.html) diff --git a/src/main/java/io/papermc/paper/configuration/Configurations.java b/src/main/java/io/papermc/paper/configuration/Configurations.java -index 4a9258b62db3a9d1150f0dfbe916fa549b596686..7c2f3b46f94989e532694ce3fbba90489caceb7f 100644 +index d0c4037c3cc60c54ea4c60ffc2c227107fecd01c..c01f3bd5022371b71f2bdc00ebf9d1340afe86d2 100644 --- a/src/main/java/io/papermc/paper/configuration/Configurations.java +++ b/src/main/java/io/papermc/paper/configuration/Configurations.java -@@ -94,7 +94,7 @@ public abstract class Configurations { +@@ -95,7 +95,7 @@ public abstract class Configurations { }; } @@ -25,7 +25,7 @@ index 4a9258b62db3a9d1150f0dfbe916fa549b596686..7c2f3b46f94989e532694ce3fbba9048 return node -> { ObjectMapper.Factory factory = (ObjectMapper.Factory) Objects.requireNonNull(node.options().serializers().get(type)); ObjectMapper.Mutable mutable = (ObjectMapper.Mutable) factory.get(type); -@@ -168,7 +168,7 @@ public abstract class Configurations { +@@ -169,7 +169,7 @@ public abstract class Configurations { final YamlConfigurationLoader loader = result.loader(); final ConfigurationNode node = loader.load(); if (result.isNewFile()) { // add version to new files @@ -34,7 +34,7 @@ index 4a9258b62db3a9d1150f0dfbe916fa549b596686..7c2f3b46f94989e532694ce3fbba9048 } else { this.verifyWorldConfigVersion(contextMap, node); } -@@ -230,7 +230,7 @@ public abstract class Configurations { +@@ -231,7 +231,7 @@ public abstract class Configurations { .build(); final ConfigurationNode worldNode = worldLoader.load(); if (newFile) { // set the version field if new file @@ -43,7 +43,7 @@ index 4a9258b62db3a9d1150f0dfbe916fa549b596686..7c2f3b46f94989e532694ce3fbba9048 } else { this.verifyWorldConfigVersion(contextMap, worldNode); } -@@ -356,4 +356,25 @@ public abstract class Configurations { +@@ -357,4 +357,25 @@ public abstract class Configurations { return "ContextKey{" + this.name + "}"; } } @@ -144,10 +144,10 @@ index 05339a176083af667c16f77d76dc1878dafce3f0..9ca55cba185b9de566f911b08d671bee } } diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 41bf483b13d43c8fd20d91c2d800677833674ebf..e299baae86bf0aa21294b2afc82623db838ce427 100644 +index 1da86b25e3b89c79d4f3920c8d2ef10ee2757f65..c92adb939892e1054f7b2d24070f43e6104dda2b 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -1070,6 +1070,7 @@ public final class CraftServer implements Server { +@@ -1073,6 +1073,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); @@ -155,7 +155,7 @@ index 41bf483b13d43c8fd20d91c2d800677833674ebf..e299baae86bf0aa21294b2afc82623db for (ServerLevel world : this.console.getAllLevels()) { // world.serverLevelData.setDifficulty(config.difficulty); // Paper - per level difficulty world.setSpawnSettings(world.serverLevelData.getDifficulty() != Difficulty.PEACEFUL && config.spawnMonsters); // Paper - per level difficulty (from MinecraftServer#setDifficulty(ServerLevel, Difficulty, boolean)) -@@ -2959,6 +2960,14 @@ public final class CraftServer implements Server { +@@ -2967,6 +2968,14 @@ public final class CraftServer implements Server { return CraftServer.this.console.paperConfigurations.createLegacyObject(CraftServer.this.console); } diff --git a/leaf-server/paper-patches/features/0009-Purpur-Server-Paper-Changes.patch b/leaf-server/paper-patches/features/0009-Purpur-Server-Paper-Changes.patch index 8dd6d18a..919d9c06 100644 --- a/leaf-server/paper-patches/features/0009-Purpur-Server-Paper-Changes.patch +++ b/leaf-server/paper-patches/features/0009-Purpur-Server-Paper-Changes.patch @@ -6,7 +6,7 @@ Subject: [PATCH] Purpur Server Paper Changes Original license: MIT Original project: https://github.com/PurpurMC/Purpur -Commit: 8c77678e81c813e57dda10c646599b0ab3144218 +Commit: fd78b90f2041e50b2a94110859b951fc8fa320e9 Patches listed below are removed in this patch, They exists in Gale or Leaf: * "Rebrand.patch" @@ -486,10 +486,10 @@ index 43ae147ae15668d3357ff1f7ae66bcad241d3ff3..ecd9e392e9e026cbeac4c65bfdb7467f + // 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 e299baae86bf0aa21294b2afc82623db838ce427..144bb76945677eaa63381db67ff8feac2e433021 100644 +index c92adb939892e1054f7b2d24070f43e6104dda2b..23bd30ad769507e3eeb4e397e57a2c0ac01f8b7a 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -426,6 +426,20 @@ public final class CraftServer implements Server { +@@ -429,6 +429,20 @@ public final class CraftServer implements Server { this.paperPluginManager = new io.papermc.paper.plugin.manager.PaperPluginManagerImpl(this, this.commandMap, pluginManager); this.pluginManager.paperPluginManager = this.paperPluginManager; // Paper end @@ -510,7 +510,7 @@ index e299baae86bf0aa21294b2afc82623db838ce427..144bb76945677eaa63381db67ff8feac CraftRegistry.setMinecraftRegistry(console.registryAccess()); -@@ -1071,6 +1085,7 @@ public final class CraftServer implements Server { +@@ -1074,6 +1088,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 @@ -518,7 +518,7 @@ index e299baae86bf0aa21294b2afc82623db838ce427..144bb76945677eaa63381db67ff8feac for (ServerLevel world : this.console.getAllLevels()) { // world.serverLevelData.setDifficulty(config.difficulty); // Paper - per level difficulty world.setSpawnSettings(world.serverLevelData.getDifficulty() != Difficulty.PEACEFUL && config.spawnMonsters); // Paper - per level difficulty (from MinecraftServer#setDifficulty(ServerLevel, Difficulty, boolean)) -@@ -1086,6 +1101,7 @@ public final class CraftServer implements Server { +@@ -1089,6 +1104,7 @@ public final class CraftServer implements Server { } } world.spigotConfig.init(); // Spigot @@ -526,7 +526,7 @@ index e299baae86bf0aa21294b2afc82623db838ce427..144bb76945677eaa63381db67ff8feac } Plugin[] pluginClone = pluginManager.getPlugins().clone(); // Paper -@@ -1103,6 +1119,7 @@ public final class CraftServer implements Server { +@@ -1106,6 +1122,7 @@ public final class CraftServer implements Server { org.spigotmc.SpigotConfig.registerCommands(); // Spigot io.papermc.paper.command.PaperCommands.registerCommands(this.console); // Paper this.spark.registerCommandBeforePlugins(this); // Paper - spark @@ -534,7 +534,7 @@ index e299baae86bf0aa21294b2afc82623db838ce427..144bb76945677eaa63381db67ff8feac this.overrideAllCommandBlockCommands = this.commandsConfiguration.getStringList("command-block-overrides").contains("*"); this.ignoreVanillaPermissions = this.commandsConfiguration.getBoolean("ignore-vanilla-permissions"); -@@ -1602,6 +1619,60 @@ public final class CraftServer implements Server { +@@ -1605,6 +1622,60 @@ public final class CraftServer implements Server { return true; } @@ -595,7 +595,7 @@ index e299baae86bf0aa21294b2afc82623db838ce427..144bb76945677eaa63381db67ff8feac @Override public List getRecipesFor(ItemStack result) { Preconditions.checkArgument(result != null, "ItemStack cannot be null"); -@@ -2968,6 +3039,18 @@ public final class CraftServer implements Server { +@@ -2976,6 +3047,18 @@ public final class CraftServer implements Server { } // Gale end - Gale configuration - API @@ -614,7 +614,7 @@ index e299baae86bf0aa21294b2afc82623db838ce427..144bb76945677eaa63381db67ff8feac @Override public void restart() { CraftServer.this.restart(); -@@ -3207,4 +3290,18 @@ public final class CraftServer implements Server { +@@ -3215,4 +3298,18 @@ public final class CraftServer implements Server { public void allowPausing(final Plugin plugin, final boolean value) { this.console.addPluginAllowingSleep(plugin.getName(), value); } @@ -634,7 +634,7 @@ index e299baae86bf0aa21294b2afc82623db838ce427..144bb76945677eaa63381db67ff8feac + // Purpur end - Lagging threshold } diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -index 4a405744061b2689a207aa085bec9a6a223342f2..28ece1167907558c21d292cb36960a026d0c0897 100644 +index aae378697b2f2e388d2a5dfaca24c9197b8abf3e..0ea7df63498492e320f98ddec5bdf33b203cc770 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java @@ -2352,6 +2352,50 @@ public class CraftWorld extends CraftRegionAccessor implements World { @@ -859,10 +859,10 @@ index 000c5ea5d39d5ab6e5592012ab1cc7ee547505dc..140da7078217f833f490d88faaf803ab @Override diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java -index cd145edc45776c3b7af6295872b65ca74e5b3107..58c60172c4e71afa5ac41f56b15d6b1592b7e082 100644 +index 3b41a37f852c3b494b158e447eade9b030f26556..395951c968e95adffa97e1851d104faf192744fd 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java -@@ -98,6 +98,25 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { +@@ -100,6 +100,25 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { this.entityType = CraftEntityType.minecraftToBukkit(entity.getType()); } @@ -888,7 +888,7 @@ index cd145edc45776c3b7af6295872b65ca74e5b3107..58c60172c4e71afa5ac41f56b15d6b15 public static CraftEntity getEntity(CraftServer server, T entity) { Preconditions.checkArgument(entity != null, "Unknown entity"); -@@ -287,6 +306,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { +@@ -289,6 +308,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { boolean retainPassengers = flagSet.contains(io.papermc.paper.entity.TeleportFlag.EntityState.RETAIN_PASSENGERS); // Don't allow teleporting between worlds while keeping passengers if (flagSet.contains(io.papermc.paper.entity.TeleportFlag.EntityState.RETAIN_PASSENGERS) && this.entity.isVehicle() && location.getWorld() != this.getWorld()) { @@ -896,7 +896,7 @@ index cd145edc45776c3b7af6295872b65ca74e5b3107..58c60172c4e71afa5ac41f56b15d6b15 return false; } -@@ -1293,4 +1313,26 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { +@@ -1313,4 +1333,26 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { return this.entity.get(io.papermc.paper.datacomponent.PaperDataComponentType.bukkitToMinecraft(type)) != null; } @@ -1016,10 +1016,10 @@ index ca656d97a00eef86773be9833fd908283002c885..01759ae999cd158e540f1e2824737407 + // Purpur end - Item entity immunities } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java -index ff8987ca8f0d88c80f7229b33e6b356f1e342010..fda6883bca79e99e486aef87866d8877eea9f140 100644 +index 13feb2f7a0e4be92cc8d57512475b7e335d581a8..5f30621d717bd0728ddc074072ab7a02c487b253 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java -@@ -518,7 +518,7 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { +@@ -513,7 +513,7 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { net.minecraft.server.level.ServerPlayer nmsKiller = killer == null ? null : ((CraftPlayer) killer).getHandle(); this.getHandle().setLastHurtByMob(nmsKiller); if (nmsKiller != null) { @@ -1028,9 +1028,9 @@ index ff8987ca8f0d88c80f7229b33e6b356f1e342010..fda6883bca79e99e486aef87866d8877 } else { this.getHandle().lastHurtByPlayer = null; this.getHandle().lastHurtByPlayerMemoryTime = 0; -@@ -1170,4 +1170,16 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { +@@ -1165,4 +1165,16 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { public CombatTracker getCombatTracker() { - return this.combatTracker; + return this.getHandle().getCombatTracker().paperCombatTracker; } + + // Purpur start - API for any mob to burn daylight @@ -1068,10 +1068,10 @@ index 02deb9c37250144be9afa0fe55df2a49017a7070..dfb597fcb8d01ed6cf20eae57e260949 + // Purpur end - Llama API } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index c6ca86dbbb483c2093cbedd8588755dad67c981a..09fc84319df0adb741dc29092ae33768878c8676 100644 +index 8a1e2785d4a3dd6f5d97c152e9b42d5c257d1ee6..616c25e3e447923235e2586f8a74d1eca39cbb32 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -612,10 +612,15 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -611,10 +611,15 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @Override public void setPlayerListName(String name) { @@ -1088,7 +1088,7 @@ index c6ca86dbbb483c2093cbedd8588755dad67c981a..09fc84319df0adb741dc29092ae33768 if (this.getHandle().connection == null) return; // Paper - Updates are possible before the player has fully joined for (ServerPlayer player : (List) this.server.getHandle().players) { if (player.getBukkitEntity().canSee(this)) { -@@ -1429,6 +1434,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -1428,6 +1433,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { // Paper start - Teleport passenger API // Don't allow teleporting between worlds while keeping passengers if (ignorePassengers && entity.isVehicle() && location.getWorld() != this.getWorld()) { @@ -1096,7 +1096,7 @@ index c6ca86dbbb483c2093cbedd8588755dad67c981a..09fc84319df0adb741dc29092ae33768 return false; } -@@ -1450,6 +1456,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -1449,6 +1455,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { } if (entity.isVehicle() && !ignorePassengers) { // Paper - Teleport API @@ -1104,13 +1104,13 @@ index c6ca86dbbb483c2093cbedd8588755dad67c981a..09fc84319df0adb741dc29092ae33768 return false; } -@@ -2723,6 +2730,28 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -2720,6 +2727,28 @@ public class CraftPlayer extends CraftHumanEntity implements Player { return this.getHandle().getAbilities().walkingSpeed * 2f; } + // Purpur start - OfflinePlayer API + @Override -+ public boolean teleportOffline(@NotNull Location destination) { ++ public boolean teleportOffline(Location destination) { + return this.teleport(destination); + } + @@ -1120,12 +1120,12 @@ index c6ca86dbbb483c2093cbedd8588755dad67c981a..09fc84319df0adb741dc29092ae33768 + } + + @Override -+ public java.util.concurrent.CompletableFuture teleportOfflineAsync(@NotNull Location destination) { ++ public java.util.concurrent.CompletableFuture teleportOfflineAsync(Location destination) { + return this.teleportAsync(destination); + } + + @Override -+ public java.util.concurrent.CompletableFuture teleportOfflineAsync(@NotNull Location destination, PlayerTeleportEvent.TeleportCause cause) { ++ public java.util.concurrent.CompletableFuture teleportOfflineAsync(Location destination, PlayerTeleportEvent.TeleportCause cause) { + return this.teleportAsync(destination, cause); + } + // Purpur end - OfflinePlayer API @@ -1133,9 +1133,9 @@ index c6ca86dbbb483c2093cbedd8588755dad67c981a..09fc84319df0adb741dc29092ae33768 private void validateSpeed(float value) { Preconditions.checkArgument(value <= 1f && value >= -1f, "Speed value (%s) need to be between -1f and 1f", value); } -@@ -3585,4 +3614,76 @@ public class CraftPlayer extends CraftHumanEntity implements Player { - public void setSimplifyContainerDesyncCheck(final boolean simplifyContainerDesyncCheck) { - this.simplifyContainerDesyncCheck = simplifyContainerDesyncCheck; +@@ -3566,4 +3595,76 @@ public class CraftPlayer extends CraftHumanEntity implements Player { + public void setDeathScreenScore(final int score) { + getHandle().setScore(score); } + + // Purpur start - Purpur client support @@ -1293,7 +1293,7 @@ index c3bd4cc1458bf62639d43854c2fdd0b479993b22..52a492ed8651e2ecb8b47cc3394fa4c7 + // Purpur end - Configurable chance for wolves to spawn rabid } diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java -index a7e3afe04ffbb0fd5fa5fcf7cd15efd7cea1c4e0..f32316b0357f1cb0501a052361a0221f8e9d1438 100644 +index 6f86a505c99010eb80e76e2fbe36414fcde80a39..3a3fbbfa0b82092cd9ac8eab2d179fb9f590aec8 100644 --- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java @@ -514,6 +514,15 @@ public class CraftEventFactory { @@ -1416,10 +1416,10 @@ index 792cb6adf0c7a6335cc5985fce8bed2e0f1149af..5734c5caffda79383ae30df20c3defb5 + // Purpur end - Anvil API } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java -index 1aa17423f4ecbba0b13f0ed3351916eb98dcd364..44a5cbd6ba26ea4f36188c48f2f9510d67a5c476 100644 +index 02109a3ca53796fa4733e98eefd5829f71681daa..9f30b3d8f457301a552440afc2e48d52179d6abb 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java -@@ -669,4 +669,285 @@ public final class CraftItemStack extends ItemStack { +@@ -667,4 +667,285 @@ public final class CraftItemStack extends ItemStack { } // Paper end - data component API diff --git a/leaf-server/paper-patches/features/0012-Print-stack-trace-for-plugins-not-shutting-down-task.patch b/leaf-server/paper-patches/features/0012-Print-stack-trace-for-plugins-not-shutting-down-task.patch index d55b11ab..85468675 100644 --- a/leaf-server/paper-patches/features/0012-Print-stack-trace-for-plugins-not-shutting-down-task.patch +++ b/leaf-server/paper-patches/features/0012-Print-stack-trace-for-plugins-not-shutting-down-task.patch @@ -31,10 +31,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/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 144bb76945677eaa63381db67ff8feac2e433021..2ca0a5e491e22fb049e8132dcfceaad97613ec1f 100644 +index 23bd30ad769507e3eeb4e397e57a2c0ac01f8b7a..889687ee9bcea490e8a7ee29d0a1f81011cd4a34 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -1181,6 +1181,13 @@ public final class CraftServer implements Server { +@@ -1184,6 +1184,13 @@ public final class CraftServer implements Server { plugin.getPluginMeta().getDisplayName(), "This plugin is not properly shutting down its async tasks when it is being shut down. This task may throw errors during the final shutdown logs and might not complete before process dies." )); diff --git a/leaf-server/paper-patches/features/0018-Reduce-array-allocations.patch b/leaf-server/paper-patches/features/0018-Reduce-array-allocations.patch index 0192deee..a75e6bde 100644 --- a/leaf-server/paper-patches/features/0018-Reduce-array-allocations.patch +++ b/leaf-server/paper-patches/features/0018-Reduce-array-allocations.patch @@ -98,10 +98,10 @@ index db92261a6cb3758391108361096417c61bc82cdc..1a14fddb36ca3c14d243304db629d0c5 public SortedList(final E[] elements, final Comparator comparator) { diff --git a/src/main/java/io/papermc/paper/command/brigadier/PaperCommands.java b/src/main/java/io/papermc/paper/command/brigadier/PaperCommands.java -index 4b6d845423ca845cb8780499757d627773c688da..9c2864675bc0b13ba088ba699be3c5692c2fa0a4 100644 +index 84fab94f38e8ee51f2c82fc8c3ddffe2a24d7148..6d1d05caa7c3b6a43770aa185070317a89c1bd74 100644 --- a/src/main/java/io/papermc/paper/command/brigadier/PaperCommands.java +++ b/src/main/java/io/papermc/paper/command/brigadier/PaperCommands.java -@@ -175,7 +175,7 @@ public class PaperCommands implements Commands, PaperRegistrar { diff --git a/leaf-server/paper-patches/features/0019-CraftBukkit-UUID-to-world-map.patch b/leaf-server/paper-patches/features/0019-CraftBukkit-UUID-to-world-map.patch index 3f9b602b..000b3d59 100644 --- a/leaf-server/paper-patches/features/0019-CraftBukkit-UUID-to-world-map.patch +++ b/leaf-server/paper-patches/features/0019-CraftBukkit-UUID-to-world-map.patch @@ -13,10 +13,10 @@ As part of: MultiPaper (https://github.com/MultiPaper/MultiPaper) Licensed under: GPL-3.0 (https://www.gnu.org/licenses/gpl-3.0.html) diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 2ca0a5e491e22fb049e8132dcfceaad97613ec1f..d2b9af1ddf67d751422ff994475669a00c187a4e 100644 +index 889687ee9bcea490e8a7ee29d0a1f81011cd4a34..616eeec8a0d075064727a69a08341d853a3f5482 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -285,6 +285,7 @@ public final class CraftServer implements Server { +@@ -287,6 +287,7 @@ public final class CraftServer implements Server { final DedicatedServer console; private final DedicatedPlayerList playerList; private final Map worlds = new LinkedHashMap<>(); @@ -24,7 +24,7 @@ index 2ca0a5e491e22fb049e8132dcfceaad97613ec1f..d2b9af1ddf67d751422ff994475669a0 private YamlConfiguration configuration; private YamlConfiguration commandsConfiguration; private final Yaml yaml = new Yaml(new SafeConstructor(new LoaderOptions())); -@@ -1509,6 +1510,7 @@ public final class CraftServer implements Server { +@@ -1512,6 +1513,7 @@ public final class CraftServer implements Server { this.getLogger().log(Level.SEVERE, null, ex); } @@ -32,7 +32,7 @@ index 2ca0a5e491e22fb049e8132dcfceaad97613ec1f..d2b9af1ddf67d751422ff994475669a0 this.worlds.remove(world.getName().toLowerCase(Locale.ROOT)); this.console.removeLevel(handle); return true; -@@ -1527,12 +1529,7 @@ public final class CraftServer implements Server { +@@ -1530,12 +1532,7 @@ public final class CraftServer implements Server { @Override public World getWorld(UUID uid) { @@ -46,7 +46,7 @@ index 2ca0a5e491e22fb049e8132dcfceaad97613ec1f..d2b9af1ddf67d751422ff994475669a0 } @Override -@@ -1548,6 +1545,7 @@ public final class CraftServer implements Server { +@@ -1551,6 +1548,7 @@ public final class CraftServer implements Server { System.out.println("World " + world.getName() + " is a duplicate of another world and has been prevented from loading. Please delete the uid.dat file from " + world.getName() + "'s world directory if you want to be able to load the duplicate world."); return; } diff --git a/leaf-server/paper-patches/features/0020-Specific-interval-TPS-API.patch b/leaf-server/paper-patches/features/0020-Specific-interval-TPS-API.patch index dc75875c..66997f59 100644 --- a/leaf-server/paper-patches/features/0020-Specific-interval-TPS-API.patch +++ b/leaf-server/paper-patches/features/0020-Specific-interval-TPS-API.patch @@ -7,10 +7,10 @@ License: GPL-3.0 (https://www.gnu.org/licenses/gpl-3.0.html) Gale - https://galemc.org diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index d2b9af1ddf67d751422ff994475669a00c187a4e..2a79af83a4a2f0c28bf8f54eac46b5b9f14714fc 100644 +index 616eeec8a0d075064727a69a08341d853a3f5482..8876ab2bb2f01b89caab2951de09c7b989a985fb 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -3094,6 +3094,23 @@ public final class CraftServer implements Server { +@@ -3102,6 +3102,23 @@ public final class CraftServer implements Server { }; } diff --git a/leaf-server/paper-patches/features/0021-5-second-TPS-average.patch b/leaf-server/paper-patches/features/0021-5-second-TPS-average.patch index 5a87e363..bfe4e2f6 100644 --- a/leaf-server/paper-patches/features/0021-5-second-TPS-average.patch +++ b/leaf-server/paper-patches/features/0021-5-second-TPS-average.patch @@ -58,10 +58,10 @@ index 12b327eea95e0de9e9c39b7d039badee8ec46508..6178f0212214a2a075cea60c758dca79 } diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 2a79af83a4a2f0c28bf8f54eac46b5b9f14714fc..7f7f0cdfd07ba4cece20d11c580c7956efeea3ed 100644 +index 8876ab2bb2f01b89caab2951de09c7b989a985fb..d2fb5f28293bffe72fd312b76a8317350924028f 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -3094,7 +3094,26 @@ public final class CraftServer implements Server { +@@ -3102,7 +3102,26 @@ public final class CraftServer implements Server { }; } diff --git a/leaf-server/paper-patches/features/0022-Last-tick-time-API.patch b/leaf-server/paper-patches/features/0022-Last-tick-time-API.patch index ac2f0eb7..ffafdf76 100644 --- a/leaf-server/paper-patches/features/0022-Last-tick-time-API.patch +++ b/leaf-server/paper-patches/features/0022-Last-tick-time-API.patch @@ -23,10 +23,10 @@ The above copyright notice and this permission notice shall be included in all c THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 7f7f0cdfd07ba4cece20d11c580c7956efeea3ed..28c3404f5d578b0f389cad9130150191d36cae66 100644 +index d2fb5f28293bffe72fd312b76a8317350924028f..fd956a7c81e4b7407f70dee6a65f973d43f747b2 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -3345,4 +3345,21 @@ public final class CraftServer implements Server { +@@ -3353,4 +3353,21 @@ public final class CraftServer implements Server { return getServer().lagging; } // Purpur end - Lagging threshold diff --git a/leaf-server/paper-patches/features/0028-KeYi-Player-Skull-API.patch b/leaf-server/paper-patches/features/0028-KeYi-Player-Skull-API.patch index af0f5730..e5d41c41 100644 --- a/leaf-server/paper-patches/features/0028-KeYi-Player-Skull-API.patch +++ b/leaf-server/paper-patches/features/0028-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 09fc84319df0adb741dc29092ae33768878c8676..3136caefa8c663b27cda29ff4de911ac71a1110d 100644 +index 616c25e3e447923235e2586f8a74d1eca39cbb32..ce96e14ac8b2ebb8c651360564b75c9dacb496e8 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -3686,4 +3686,31 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -3667,4 +3667,31 @@ 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 - Death screen API diff --git a/leaf-server/paper-patches/features/0029-Slice-Smooth-Teleports.patch b/leaf-server/paper-patches/features/0029-Slice-Smooth-Teleports.patch index 7af4c236..2fd3c0e7 100644 --- a/leaf-server/paper-patches/features/0029-Slice-Smooth-Teleports.patch +++ b/leaf-server/paper-patches/features/0029-Slice-Smooth-Teleports.patch @@ -9,10 +9,10 @@ Original project: https://github.com/Cryptite/Slice Co-authored-by: HaHaWTH <102713261+HaHaWTH@users.noreply.github.com> diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 3136caefa8c663b27cda29ff4de911ac71a1110d..43ddb8b40563542212c96df4459be4f61bf254ee 100644 +index ce96e14ac8b2ebb8c651360564b75c9dacb496e8..ba42606bb754aaad29eec238ccc1acac3f47683e 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -1379,6 +1379,25 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -1378,6 +1378,25 @@ public class CraftPlayer extends CraftHumanEntity implements Player { // Paper end - Teleportation API } diff --git a/leaf-server/paper-patches/features/0031-SparklyPaper-Skip-EntityScheduler-s-executeTick-chec.patch b/leaf-server/paper-patches/features/0031-SparklyPaper-Skip-EntityScheduler-s-executeTick-chec.patch index ad9cbff5..d6b55612 100644 --- a/leaf-server/paper-patches/features/0031-SparklyPaper-Skip-EntityScheduler-s-executeTick-chec.patch +++ b/leaf-server/paper-patches/features/0031-SparklyPaper-Skip-EntityScheduler-s-executeTick-chec.patch @@ -88,10 +88,10 @@ index c03608fec96b51e1867f43d8f42e5aefb1520e46..56268cf8d184e0b6cd46de8c2e893ad3 + // Leaf end - SparklyPaper - skip EntityScheduler's executeTick checks if there isn't any tasks to be run } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java -index 8f9af0c5396abf25534eaee17b81982024eb9fcd..31fe8bd91b5d2825af445e3d37d582a206202bf8 100644 +index 395951c968e95adffa97e1851d104faf192744fd..2a63e8e725fa97da5d4b9fba6bfe19377c7cfbe1 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java -@@ -83,7 +83,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { +@@ -85,7 +85,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { private final CraftPersistentDataContainer persistentDataContainer = new CraftPersistentDataContainer(CraftEntity.DATA_TYPE_REGISTRY); protected net.kyori.adventure.pointer.Pointers adventure$pointers; // Paper - implement pointers // Paper start - Folia shedulers @@ -100,7 +100,7 @@ index 8f9af0c5396abf25534eaee17b81982024eb9fcd..31fe8bd91b5d2825af445e3d37d582a2 private final io.papermc.paper.threadedregions.scheduler.FoliaEntityScheduler apiScheduler = new io.papermc.paper.threadedregions.scheduler.FoliaEntityScheduler(this); @Override -@@ -96,6 +96,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { +@@ -98,6 +98,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { this.server = server; this.entity = entity; this.entityType = CraftEntityType.minecraftToBukkit(entity.getType()); diff --git a/leaf-server/paper-patches/features/0032-SparklyPaper-Optimize-canSee-checks.patch b/leaf-server/paper-patches/features/0032-SparklyPaper-Optimize-canSee-checks.patch index 67105533..ac59cd8d 100644 --- a/leaf-server/paper-patches/features/0032-SparklyPaper-Optimize-canSee-checks.patch +++ b/leaf-server/paper-patches/features/0032-SparklyPaper-Optimize-canSee-checks.patch @@ -16,10 +16,10 @@ This seems stupid, but it does seem that it improves the performance a bit, and We also create a "canSee" method tailored for "ChunkMap#updatePlayer()", a method without the equals check (the "updatePlayer()" already checks if the entity is the same entity) because the CraftPlayer's `equals()` check is a *bit* expensive compared to only checking the object's identity, and because the identity has already been check, we don't need to check it twice. diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 43ddb8b40563542212c96df4459be4f61bf254ee..6355c24d0feed63b139433b49986d3337f8c44db 100644 +index ba42606bb754aaad29eec238ccc1acac3f47683e..e95510055134be9c85f43b0640b6ac9feba73780 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -212,7 +212,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -213,7 +213,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { private boolean hasPlayedBefore = false; private final ConversationTracker conversationTracker = new ConversationTracker(); private final Set channels = new HashSet(); @@ -28,7 +28,7 @@ index 43ddb8b40563542212c96df4459be4f61bf254ee..6355c24d0feed63b139433b49986d333 private final Set unlistedEntities = new HashSet<>(); // Paper - Add Listing API for Player private static final WeakHashMap> pluginWeakReferences = new WeakHashMap<>(); private int hash = 0; -@@ -2287,9 +2287,16 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -2285,9 +2285,16 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @Override public boolean canSee(org.bukkit.entity.Entity entity) { diff --git a/leaf-server/paper-patches/features/0033-Including-5s-in-getTPS.patch b/leaf-server/paper-patches/features/0033-Including-5s-in-getTPS.patch index 97e6a0a2..3ddcb88d 100644 --- a/leaf-server/paper-patches/features/0033-Including-5s-in-getTPS.patch +++ b/leaf-server/paper-patches/features/0033-Including-5s-in-getTPS.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Including 5s in getTPS() diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 28c3404f5d578b0f389cad9130150191d36cae66..ebabca940f34f31176e9b82c1a9f584229571b6b 100644 +index fd956a7c81e4b7407f70dee6a65f973d43f747b2..f258a36b960048cb89d445639b822f030b31f8f9 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -3087,6 +3087,8 @@ public final class CraftServer implements Server { +@@ -3095,6 +3095,8 @@ public final class CraftServer implements Server { @Override public double[] getTPS() { diff --git a/leaf-server/paper-patches/features/0037-Matter-Secure-Seed.patch b/leaf-server/paper-patches/features/0037-Matter-Secure-Seed.patch index be394e46..3e86739b 100644 --- a/leaf-server/paper-patches/features/0037-Matter-Secure-Seed.patch +++ b/leaf-server/paper-patches/features/0037-Matter-Secure-Seed.patch @@ -34,10 +34,10 @@ index 400e632208d133a3f49fc7f14bceb48a1026769b..8c4e5b0c81d90a0eeee4ab9e5882b137 @Override diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index ebabca940f34f31176e9b82c1a9f584229571b6b..b4cddcf1075df81224e25ecdc298eb7fd6446ba6 100644 +index f258a36b960048cb89d445639b822f030b31f8f9..619fa9c092dbdbb428d7254c171c02eb73b27c7f 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -1377,7 +1377,11 @@ public final class CraftServer implements Server { +@@ -1380,7 +1380,11 @@ public final class CraftServer implements Server { registryAccess = levelDataAndDimensions.dimensions().dimensionsRegistryAccess(); } else { LevelSettings levelSettings; diff --git a/leaf-server/paper-patches/features/0040-Replace-world-map-with-optimized-collection.patch b/leaf-server/paper-patches/features/0040-Replace-world-map-with-optimized-collection.patch index c05e3057..6d0208ca 100644 --- a/leaf-server/paper-patches/features/0040-Replace-world-map-with-optimized-collection.patch +++ b/leaf-server/paper-patches/features/0040-Replace-world-map-with-optimized-collection.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Replace world map with optimized collection diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index b4cddcf1075df81224e25ecdc298eb7fd6446ba6..78fe9bea28907ac18746f8851f474f2c1cec0864 100644 +index 619fa9c092dbdbb428d7254c171c02eb73b27c7f..828f454c73f042610940cbe62cc7ed1ae8294e9b 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -284,7 +284,7 @@ public final class CraftServer implements Server { +@@ -286,7 +286,7 @@ public final class CraftServer implements Server { private final StructureManager structureManager; final DedicatedServer console; private final DedicatedPlayerList playerList; diff --git a/leaf-server/paper-patches/features/0042-Multithreaded-Tracker.patch b/leaf-server/paper-patches/features/0042-Multithreaded-Tracker.patch index 4ee9acbc..a70c2802 100644 --- a/leaf-server/paper-patches/features/0042-Multithreaded-Tracker.patch +++ b/leaf-server/paper-patches/features/0042-Multithreaded-Tracker.patch @@ -41,10 +41,10 @@ index db031298c2090eb36032de4b52335c62186e4cfb..84905d7802f8a5c3f68e15f1b17ef082 } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java -index d891595b25cf04980cc24a6e6b9bd95553527100..216a273d65fc7eda8f2e229e4257b2708294849c 100644 +index 2a63e8e725fa97da5d4b9fba6bfe19377c7cfbe1..0c286eabd8e4d5e599d93a151874af6bf3642265 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java -@@ -738,7 +738,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { +@@ -758,7 +758,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { ChunkMap.TrackedEntity entityTracker = world.getChunkSource().chunkMap.entityMap.get(this.getEntityId()); if (entityTracker != null) { @@ -53,7 +53,7 @@ index d891595b25cf04980cc24a6e6b9bd95553527100..216a273d65fc7eda8f2e229e4257b270 players.add(connection.getPlayer().getBukkitEntity()); } } -@@ -1054,7 +1054,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { +@@ -1074,7 +1074,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { return; } @@ -62,7 +62,7 @@ index d891595b25cf04980cc24a6e6b9bd95553527100..216a273d65fc7eda8f2e229e4257b270 this.getHandle().resendPossiblyDesyncedEntityData(connection.getPlayer()); } } -@@ -1201,7 +1201,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { +@@ -1221,7 +1221,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { } Set set = new java.util.HashSet<>(tracker.seenBy.size()); @@ -72,7 +72,7 @@ index d891595b25cf04980cc24a6e6b9bd95553527100..216a273d65fc7eda8f2e229e4257b270 } return set; diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java -index f32316b0357f1cb0501a052361a0221f8e9d1438..ebb07b9b9f6bef9195978c8ecdd5f4ef3ee198bc 100644 +index 3a3fbbfa0b82092cd9ac8eab2d179fb9f590aec8..566eab1add471266c8617747c8c25ee04e13c02f 100644 --- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java @@ -1751,6 +1751,26 @@ public class CraftEventFactory { diff --git a/leaf-server/paper-patches/features/0045-Faster-CraftServer-getworlds-list-creation.patch b/leaf-server/paper-patches/features/0045-Faster-CraftServer-getworlds-list-creation.patch index 58907936..8828e5da 100644 --- a/leaf-server/paper-patches/features/0045-Faster-CraftServer-getworlds-list-creation.patch +++ b/leaf-server/paper-patches/features/0045-Faster-CraftServer-getworlds-list-creation.patch @@ -8,10 +8,10 @@ replacing ArrayList with Fastutil ObjectArrayList brings about 40% performance improvement in benchmark. diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 78fe9bea28907ac18746f8851f474f2c1cec0864..65e1ba2e51e1114fc31c2083152441ab5633cf1a 100644 +index 828f454c73f042610940cbe62cc7ed1ae8294e9b..80ea506bacb206dabb6d12aeea1cc2000f8ea4b7 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -974,7 +974,7 @@ public final class CraftServer implements Server { +@@ -977,7 +977,7 @@ public final class CraftServer implements Server { @Override public List getWorlds() { diff --git a/leaf-server/src/main/java/org/galemc/gale/version/AbstractPaperVersionFetcher.java b/leaf-server/src/main/java/org/galemc/gale/version/AbstractPaperVersionFetcher.java index 6c99f64e..1280aff4 100644 --- a/leaf-server/src/main/java/org/galemc/gale/version/AbstractPaperVersionFetcher.java +++ b/leaf-server/src/main/java/org/galemc/gale/version/AbstractPaperVersionFetcher.java @@ -24,6 +24,7 @@ import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URI; +import java.nio.charset.StandardCharsets; import java.util.Optional; import static net.kyori.adventure.text.Component.text; @@ -66,7 +67,7 @@ public abstract class AbstractPaperVersionFetcher implements VersionFetcher { } @Override - public @NotNull Component getVersionMessage(final @NotNull String serverVersion) { + public @NotNull Component getVersionMessage() { final Component updateMessage; final ServerBuildInfo build = ServerBuildInfo.buildInfo(); if (build.buildNumber().isEmpty() && build.gitCommit().isEmpty()) { @@ -118,9 +119,8 @@ public abstract class AbstractPaperVersionFetcher implements VersionFetcher { try { final HttpURLConnection connection = (HttpURLConnection) URI.create("https://api.github.com/repos/%s/compare/%s...%s".formatted(repo, branch, hash)).toURL().openConnection(); connection.connect(); - if (connection.getResponseCode() == HttpURLConnection.HTTP_NOT_FOUND) - return DISTANCE_UNKNOWN; // Unknown commit - try (final BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), Charsets.UTF_8))) { + if (connection.getResponseCode() == HttpURLConnection.HTTP_NOT_FOUND) return DISTANCE_UNKNOWN; // Unknown commit + try (final BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8))) { final JsonObject obj = new Gson().fromJson(reader, JsonObject.class); final String status = obj.get("status").getAsString(); return switch (status) { diff --git a/settings.gradle.kts b/settings.gradle.kts index 4fdb2d6a..333c3f27 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -8,7 +8,7 @@ pluginManagement { } plugins { - id("org.gradle.toolchains.foojay-resolver-convention") version "0.9.0" + id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0" } if (!file(".git").exists()) { diff --git a/todos.md b/todos.md index f1cd597d..42ecc57f 100644 --- a/todos.md +++ b/todos.md @@ -12,4 +12,5 @@ - [ ] Remove stream in Inventory and check new changes - [ ] Check Purpur's Projectile offset config, in BowItem shoot - [ ] Remove Gale's attribute patch +- [ ] Check SparklyPaper's mapitem update skip - [ ] Update from Leaf 1.21.4 (curr commit: `a022d84c5b5b52f7e8a62f6bff774d0c23176ed5`)