diff --git a/build.gradle.kts b/build.gradle.kts index a3563444f..fc0a9edb1 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -48,7 +48,7 @@ repositories { dependencies { remapper("net.fabricmc:tiny-remapper:0.8.6:fat") - decompiler("net.minecraftforge:forgeflower:1.5.605.7") + decompiler("net.minecraftforge:forgeflower:2.0.605.1") paperclip("io.papermc:paperclip:3.0.2") } diff --git a/gradle.properties b/gradle.properties index 97e4916ac..04c7279e7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,7 +1,7 @@ group = org.purpurmc.purpur -version = 1.19.2-R0.1-SNAPSHOT +version = 1.19.3-R0.1-SNAPSHOT -paperCommit = 476ef25d053c523aea416487a38f72011d72a9cf +paperCommit = f6ffbc27206df240756c99ebc05fe31bbbfad910 org.gradle.caching = true org.gradle.parallel = true diff --git a/patches/api/0002-Fix-pufferfish-issues.patch b/patches/api/0001-Fix-pufferfish-issues.patch similarity index 90% rename from patches/api/0002-Fix-pufferfish-issues.patch rename to patches/api/0001-Fix-pufferfish-issues.patch index b2f08398c..66de07685 100644 --- a/patches/api/0002-Fix-pufferfish-issues.patch +++ b/patches/api/0001-Fix-pufferfish-issues.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Fix pufferfish issues diff --git a/src/test/java/org/bukkit/AnnotationTest.java b/src/test/java/org/bukkit/AnnotationTest.java -index bbe81f7a420f913ffdcad913a3c43ff41ead41f5..49de298146814fdf238929e10270ac6717dd73bd 100644 +index 4bca64b2a44ae032730575ecba39f9737a5a1ec7..7769e19a5a86b5c76094058d31269fc6cc9f0ac3 100644 --- a/src/test/java/org/bukkit/AnnotationTest.java +++ b/src/test/java/org/bukkit/AnnotationTest.java @@ -47,6 +47,10 @@ public class AnnotationTest { diff --git a/patches/api/0001-Pufferfish-API-Changes.patch b/patches/api/0001-Pufferfish-API-Changes.patch deleted file mode 100644 index 51cb50dbe..000000000 --- a/patches/api/0001-Pufferfish-API-Changes.patch +++ /dev/null @@ -1,523 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Kevin Raneri -Date: Tue, 9 Nov 2021 14:01:56 -0500 -Subject: [PATCH] Pufferfish API Changes - -Pufferfish -Copyright (C) 2022 Pufferfish Studios LLC - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . - -diff --git a/build.gradle.kts b/build.gradle.kts -index 428e7777906aa5177c5c6489838e6400349bb62f..c873a0537186ebe8a0fe2d15c7a7950793fd9a37 100644 ---- a/build.gradle.kts -+++ b/build.gradle.kts -@@ -41,6 +41,7 @@ dependencies { - apiAndDocs("net.kyori:adventure-text-logger-slf4j") - api("org.apache.logging.log4j:log4j-api:2.17.1") - api("org.slf4j:slf4j-api:1.8.0-beta4") -+ api("io.sentry:sentry:5.4.0") // Pufferfish - - implementation("org.ow2.asm:asm:9.2") - implementation("org.ow2.asm:asm-commons:9.2") -@@ -83,6 +84,13 @@ val generateApiVersioningFile by tasks.registering { - } - } - -+// Pufferfish Start -+tasks.withType { -+ val compilerArgs = options.compilerArgs -+ compilerArgs.add("--add-modules=jdk.incubator.vector") -+} -+// Pufferfish End -+ - tasks.jar { - from(generateApiVersioningFile.map { it.outputs.files.singleFile }) { - into("META-INF/maven/${project.group}/${project.name}") -diff --git a/src/main/java/gg/pufferfish/pufferfish/sentry/SentryContext.java b/src/main/java/gg/pufferfish/pufferfish/sentry/SentryContext.java -new file mode 100644 -index 0000000000000000000000000000000000000000..10310fdd53de28efb8a8250f6d3b0c8eb08fb68a ---- /dev/null -+++ b/src/main/java/gg/pufferfish/pufferfish/sentry/SentryContext.java -@@ -0,0 +1,161 @@ -+package gg.pufferfish.pufferfish.sentry; -+ -+import com.google.gson.Gson; -+import java.lang.reflect.Field; -+import java.lang.reflect.Modifier; -+import java.util.Map; -+import java.util.TreeMap; -+import org.apache.logging.log4j.ThreadContext; -+import org.bukkit.command.Command; -+import org.bukkit.command.CommandSender; -+import org.bukkit.entity.Player; -+import org.bukkit.event.Event; -+import org.bukkit.event.player.PlayerEvent; -+import org.bukkit.plugin.Plugin; -+import org.bukkit.plugin.RegisteredListener; -+import org.jetbrains.annotations.Nullable; -+ -+public class SentryContext { -+ -+ private static final Gson GSON = new Gson(); -+ -+ public static void setPluginContext(@Nullable Plugin plugin) { -+ if (plugin != null) { -+ ThreadContext.put("pufferfishsentry_pluginname", plugin.getName()); -+ ThreadContext.put("pufferfishsentry_pluginversion", plugin.getDescription().getVersion()); -+ } -+ } -+ -+ public static void removePluginContext() { -+ ThreadContext.remove("pufferfishsentry_pluginname"); -+ ThreadContext.remove("pufferfishsentry_pluginversion"); -+ } -+ -+ public static void setSenderContext(@Nullable CommandSender sender) { -+ if (sender != null) { -+ ThreadContext.put("pufferfishsentry_playername", sender.getName()); -+ if (sender instanceof Player player) { -+ ThreadContext.put("pufferfishsentry_playerid", player.getUniqueId().toString()); -+ } -+ } -+ } -+ -+ public static void removeSenderContext() { -+ ThreadContext.remove("pufferfishsentry_playername"); -+ ThreadContext.remove("pufferfishsentry_playerid"); -+ } -+ -+ public static void setEventContext(Event event, RegisteredListener registration) { -+ setPluginContext(registration.getPlugin()); -+ -+ try { -+ // Find the player that was involved with this event -+ Player player = null; -+ if (event instanceof PlayerEvent) { -+ player = ((PlayerEvent) event).getPlayer(); -+ } else { -+ Class eventClass = event.getClass(); -+ -+ Field playerField = null; -+ -+ for (Field field : eventClass.getDeclaredFields()) { -+ if (field.getType().equals(Player.class)) { -+ playerField = field; -+ break; -+ } -+ } -+ -+ if (playerField != null) { -+ playerField.setAccessible(true); -+ player = (Player) playerField.get(event); -+ } -+ } -+ -+ if (player != null) { -+ setSenderContext(player); -+ } -+ } catch (Exception e) {} // We can't really safely log exceptions. -+ -+ ThreadContext.put("pufferfishsentry_eventdata", GSON.toJson(serializeFields(event))); -+ } -+ -+ public static void removeEventContext() { -+ removePluginContext(); -+ removeSenderContext(); -+ ThreadContext.remove("pufferfishsentry_eventdata"); -+ } -+ -+ private static Map serializeFields(Object object) { -+ Map fields = new TreeMap<>(); -+ fields.put("_class", object.getClass().getName()); -+ for (Field declaredField : object.getClass().getDeclaredFields()) { -+ try { -+ if (Modifier.isStatic(declaredField.getModifiers())) { -+ continue; -+ } -+ -+ String fieldName = declaredField.getName(); -+ if (fieldName.equals("handlers")) { -+ continue; -+ } -+ declaredField.setAccessible(true); -+ Object value = declaredField.get(object); -+ if (value != null) { -+ fields.put(fieldName, value.toString()); -+ } else { -+ fields.put(fieldName, ""); -+ } -+ } catch (Exception e) {} // We can't really safely log exceptions. -+ } -+ return fields; -+ } -+ -+ public static class State { -+ -+ private Plugin plugin; -+ private Command command; -+ private String commandLine; -+ private Event event; -+ private RegisteredListener registeredListener; -+ -+ public Plugin getPlugin() { -+ return plugin; -+ } -+ -+ public void setPlugin(Plugin plugin) { -+ this.plugin = plugin; -+ } -+ -+ public Command getCommand() { -+ return command; -+ } -+ -+ public void setCommand(Command command) { -+ this.command = command; -+ } -+ -+ public String getCommandLine() { -+ return commandLine; -+ } -+ -+ public void setCommandLine(String commandLine) { -+ this.commandLine = commandLine; -+ } -+ -+ public Event getEvent() { -+ return event; -+ } -+ -+ public void setEvent(Event event) { -+ this.event = event; -+ } -+ -+ public RegisteredListener getRegisteredListener() { -+ return registeredListener; -+ } -+ -+ public void setRegisteredListener(RegisteredListener registeredListener) { -+ this.registeredListener = registeredListener; -+ } -+ } -+} -diff --git a/src/main/java/gg/pufferfish/pufferfish/simd/SIMDChecker.java b/src/main/java/gg/pufferfish/pufferfish/simd/SIMDChecker.java -new file mode 100644 -index 0000000000000000000000000000000000000000..93f5d7ca36e043e6c0f959450d38e6946b348eaf ---- /dev/null -+++ b/src/main/java/gg/pufferfish/pufferfish/simd/SIMDChecker.java -@@ -0,0 +1,40 @@ -+package gg.pufferfish.pufferfish.simd; -+ -+import java.util.logging.Level; -+import java.util.logging.Logger; -+import jdk.incubator.vector.FloatVector; -+import jdk.incubator.vector.IntVector; -+import jdk.incubator.vector.VectorSpecies; -+ -+/** -+ * Basically, java is annoying and we have to push this out to its own class. -+ */ -+@Deprecated -+public class SIMDChecker { -+ -+ @Deprecated -+ public static boolean canEnable(Logger logger) { -+ try { -+ if (SIMDDetection.getJavaVersion() != 17 && SIMDDetection.getJavaVersion() != 18) { -+ return false; -+ } else { -+ SIMDDetection.testRun = true; -+ -+ VectorSpecies ISPEC = IntVector.SPECIES_PREFERRED; -+ VectorSpecies FSPEC = FloatVector.SPECIES_PREFERRED; -+ -+ logger.log(Level.INFO, "Max SIMD vector size on this system is " + ISPEC.vectorBitSize() + " bits (int)"); -+ logger.log(Level.INFO, "Max SIMD vector size on this system is " + FSPEC.vectorBitSize() + " bits (float)"); -+ -+ if (ISPEC.elementSize() < 2 || FSPEC.elementSize() < 2) { -+ logger.log(Level.WARNING, "SIMD is not properly supported on this system!"); -+ return false; -+ } -+ -+ return true; -+ } -+ } catch (NoClassDefFoundError | Exception ignored) {} // Basically, we don't do anything. This lets us detect if it's not functional and disable it. -+ return false; -+ } -+ -+} -diff --git a/src/main/java/gg/pufferfish/pufferfish/simd/SIMDDetection.java b/src/main/java/gg/pufferfish/pufferfish/simd/SIMDDetection.java -new file mode 100644 -index 0000000000000000000000000000000000000000..a84889d3e9cfc4d7ab5f867820a6484c6070711b ---- /dev/null -+++ b/src/main/java/gg/pufferfish/pufferfish/simd/SIMDDetection.java -@@ -0,0 +1,35 @@ -+package gg.pufferfish.pufferfish.simd; -+ -+import java.util.logging.Logger; -+ -+@Deprecated -+public class SIMDDetection { -+ -+ public static boolean isEnabled = false; -+ public static boolean versionLimited = false; -+ public static boolean testRun = false; -+ -+ @Deprecated -+ public static boolean canEnable(Logger logger) { -+ try { -+ return SIMDChecker.canEnable(logger); -+ } catch (NoClassDefFoundError | Exception ignored) { -+ return false; -+ } -+ } -+ -+ @Deprecated -+ public static int getJavaVersion() { -+ // https://stackoverflow.com/a/2591122 -+ String version = System.getProperty("java.version"); -+ if(version.startsWith("1.")) { -+ version = version.substring(2, 3); -+ } else { -+ int dot = version.indexOf("."); -+ if(dot != -1) { version = version.substring(0, dot); } -+ } -+ version = version.split("-")[0]; // Azul is stupid -+ return Integer.parseInt(version); -+ } -+ -+} -diff --git a/src/main/java/gg/pufferfish/pufferfish/simd/VectorMapPalette.java b/src/main/java/gg/pufferfish/pufferfish/simd/VectorMapPalette.java -new file mode 100644 -index 0000000000000000000000000000000000000000..ae2464920c9412ac90b819a540ee58be0741465f ---- /dev/null -+++ b/src/main/java/gg/pufferfish/pufferfish/simd/VectorMapPalette.java -@@ -0,0 +1,83 @@ -+package gg.pufferfish.pufferfish.simd; -+ -+import java.awt.Color; -+import jdk.incubator.vector.FloatVector; -+import jdk.incubator.vector.IntVector; -+import jdk.incubator.vector.VectorMask; -+import jdk.incubator.vector.VectorSpecies; -+import org.bukkit.map.MapPalette; -+ -+@Deprecated -+public class VectorMapPalette { -+ -+ private static final VectorSpecies I_SPEC = IntVector.SPECIES_PREFERRED; -+ private static final VectorSpecies F_SPEC = FloatVector.SPECIES_PREFERRED; -+ -+ @Deprecated -+ public static void matchColorVectorized(int[] in, byte[] out) { -+ int speciesLength = I_SPEC.length(); -+ int i; -+ for (i = 0; i < in.length - speciesLength; i += speciesLength) { -+ float[] redsArr = new float[speciesLength]; -+ float[] bluesArr = new float[speciesLength]; -+ float[] greensArr = new float[speciesLength]; -+ int[] alphasArr = new int[speciesLength]; -+ -+ for (int j = 0; j < speciesLength; j++) { -+ alphasArr[j] = (in[i + j] >> 24) & 0xFF; -+ redsArr[j] = (in[i + j] >> 16) & 0xFF; -+ greensArr[j] = (in[i + j] >> 8) & 0xFF; -+ bluesArr[j] = (in[i + j] >> 0) & 0xFF; -+ } -+ -+ IntVector alphas = IntVector.fromArray(I_SPEC, alphasArr, 0); -+ FloatVector reds = FloatVector.fromArray(F_SPEC, redsArr, 0); -+ FloatVector greens = FloatVector.fromArray(F_SPEC, greensArr, 0); -+ FloatVector blues = FloatVector.fromArray(F_SPEC, bluesArr, 0); -+ IntVector resultIndex = IntVector.zero(I_SPEC); -+ VectorMask modificationMask = VectorMask.fromLong(I_SPEC, 0xffffffff); -+ -+ modificationMask = modificationMask.and(alphas.lt(128).not()); -+ FloatVector bestDistances = FloatVector.broadcast(F_SPEC, Float.MAX_VALUE); -+ -+ for (int c = 4; c < MapPalette.colors.length; c++) { -+ // We're using 32-bit floats here because it's 2x faster and nobody will know the difference. -+ // For correctness, the original algorithm uses 64-bit floats instead. Completely unnecessary. -+ FloatVector compReds = FloatVector.broadcast(F_SPEC, MapPalette.colors[c].getRed()); -+ FloatVector compGreens = FloatVector.broadcast(F_SPEC, MapPalette.colors[c].getGreen()); -+ FloatVector compBlues = FloatVector.broadcast(F_SPEC, MapPalette.colors[c].getBlue()); -+ -+ FloatVector rMean = reds.add(compReds).div(2.0f); -+ FloatVector rDiff = reds.sub(compReds); -+ FloatVector gDiff = greens.sub(compGreens); -+ FloatVector bDiff = blues.sub(compBlues); -+ -+ FloatVector weightR = rMean.div(256.0f).add(2); -+ FloatVector weightG = FloatVector.broadcast(F_SPEC, 4.0f); -+ FloatVector weightB = FloatVector.broadcast(F_SPEC, 255.0f).sub(rMean).div(256.0f).add(2.0f); -+ -+ FloatVector distance = weightR.mul(rDiff).mul(rDiff).add(weightG.mul(gDiff).mul(gDiff)).add(weightB.mul(bDiff).mul(bDiff)); -+ -+ // Now we compare to the best distance we've found. -+ // This mask contains a "1" if better, and a "0" otherwise. -+ VectorMask bestDistanceMask = distance.lt(bestDistances); -+ bestDistances = bestDistances.blend(distance, bestDistanceMask); // Update the best distances -+ -+ // Update the result array -+ // We also AND with the modification mask because we don't want to interfere if the alpha value isn't large enough. -+ resultIndex = resultIndex.blend(c, bestDistanceMask.cast(I_SPEC).and(modificationMask)); // Update the results -+ } -+ -+ for (int j = 0; j < speciesLength; j++) { -+ int index = resultIndex.lane(j); -+ out[i + j] = (byte) (index < 128 ? index : -129 + (index - 127)); -+ } -+ } -+ -+ // For the final ones, fall back to the regular method -+ for (; i < in.length; i++) { -+ out[i] = MapPalette.matchColor(new Color(in[i], true)); -+ } -+ } -+ -+} -diff --git a/src/main/java/org/bukkit/map/MapPalette.java b/src/main/java/org/bukkit/map/MapPalette.java -index 3a9aaca2e76411a9c27f9f5e0f22d060d5a66d06..9584e245144b561b4f6745b2f26a4f69a6f92891 100644 ---- a/src/main/java/org/bukkit/map/MapPalette.java -+++ b/src/main/java/org/bukkit/map/MapPalette.java -@@ -1,6 +1,7 @@ - package org.bukkit.map; - - import com.google.common.base.Preconditions; -+import gg.pufferfish.pufferfish.simd.SIMDDetection; // Pufferfish - import java.awt.Color; - import java.awt.Graphics2D; - import java.awt.Image; -@@ -40,7 +41,7 @@ public final class MapPalette { - } - - @NotNull -- static final Color[] colors = { -+ public static final Color[] colors = { // Pufferfish - public access - c(0, 0, 0, 0), c(0, 0, 0, 0), c(0, 0, 0, 0), c(0, 0, 0, 0), - c(89, 125, 39), c(109, 153, 48), c(127, 178, 56), c(67, 94, 29), - c(174, 164, 115), c(213, 201, 140), c(247, 233, 163), c(130, 123, 86), -@@ -211,9 +212,15 @@ public final class MapPalette { - temp.getRGB(0, 0, temp.getWidth(), temp.getHeight(), pixels, 0, temp.getWidth()); - - byte[] result = new byte[temp.getWidth() * temp.getHeight()]; -+ // Pufferfish start -+ if (!SIMDDetection.isEnabled) { - for (int i = 0; i < pixels.length; i++) { - result[i] = matchColor(new Color(pixels[i], true)); - } -+ } else { -+ gg.pufferfish.pufferfish.simd.VectorMapPalette.matchColorVectorized(pixels, result); -+ } -+ // Pufferfish end - return result; - } - -diff --git a/src/main/java/org/bukkit/plugin/SimplePluginManager.java b/src/main/java/org/bukkit/plugin/SimplePluginManager.java -index 9db611841b73fed8dc8a71f4d7fdef95af3cf89d..49a4611ed4891cce10fd6e01b4062740ad18ee6f 100644 ---- a/src/main/java/org/bukkit/plugin/SimplePluginManager.java -+++ b/src/main/java/org/bukkit/plugin/SimplePluginManager.java -@@ -623,7 +623,9 @@ public final class SimplePluginManager implements PluginManager { - - // Paper start - private void handlePluginException(String msg, Throwable ex, Plugin plugin) { -+ gg.pufferfish.pufferfish.sentry.SentryContext.setPluginContext(plugin); // Pufferfish - server.getLogger().log(Level.SEVERE, msg, ex); -+ gg.pufferfish.pufferfish.sentry.SentryContext.removePluginContext(); // Pufferfish - callEvent(new com.destroystokyo.paper.event.server.ServerExceptionEvent(new com.destroystokyo.paper.exception.ServerPluginEnableDisableException(msg, ex, plugin))); - } - // Paper end -@@ -682,9 +684,11 @@ public final class SimplePluginManager implements PluginManager { - )); - } - } catch (Throwable ex) { -+ gg.pufferfish.pufferfish.sentry.SentryContext.setEventContext(event, registration); // Pufferfish - // Paper start - error reporting - String msg = "Could not pass event " + event.getEventName() + " to " + registration.getPlugin().getDescription().getFullName(); - server.getLogger().log(Level.SEVERE, msg, ex); -+ gg.pufferfish.pufferfish.sentry.SentryContext.removeEventContext(); // Pufferfish - if (!(event instanceof com.destroystokyo.paper.event.server.ServerExceptionEvent)) { // We don't want to cause an endless event loop - callEvent(new com.destroystokyo.paper.event.server.ServerExceptionEvent(new com.destroystokyo.paper.exception.ServerEventException(msg, ex, registration.getPlugin(), registration.getListener(), event))); - } -diff --git a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java -index 8ff78fad47f6086aa289e32590f4fbec24b3d500..a16c841751bc44e46d27fc4efbfc2ab23cc7b0d7 100644 ---- a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java -+++ b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java -@@ -369,7 +369,9 @@ public final class JavaPluginLoader implements PluginLoader { - try { - jPlugin.setEnabled(true); - } catch (Throwable ex) { -+ gg.pufferfish.pufferfish.sentry.SentryContext.setPluginContext(plugin); // Pufferfish - server.getLogger().log(Level.SEVERE, "Error occurred while enabling " + plugin.getDescription().getFullName() + " (Is it up to date?)", ex); -+ gg.pufferfish.pufferfish.sentry.SentryContext.removePluginContext(); // Pufferfish - // Paper start - Disable plugins that fail to load - this.server.getPluginManager().disablePlugin(jPlugin); - return; -@@ -398,7 +400,9 @@ public final class JavaPluginLoader implements PluginLoader { - try { - jPlugin.setEnabled(false); - } catch (Throwable ex) { -+ gg.pufferfish.pufferfish.sentry.SentryContext.setPluginContext(plugin); // Pufferfish - server.getLogger().log(Level.SEVERE, "Error occurred while disabling " + plugin.getDescription().getFullName() + " (Is it up to date?)", ex); -+ gg.pufferfish.pufferfish.sentry.SentryContext.removePluginContext(); // Pufferfish - } - - if (cloader instanceof PluginClassLoader) { -diff --git a/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java b/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java -index 06daf7e7b9f177256a7a15b91e72ff53f89ccb68..0011c228b10316b09a62579dfc3d37794ee8e61a 100644 ---- a/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java -+++ b/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java -@@ -46,6 +46,8 @@ public final class PluginClassLoader extends URLClassLoader { // Spigot - private final Set seenIllegalAccess = Collections.newSetFromMap(new ConcurrentHashMap<>()); - private java.util.logging.Logger logger; // Paper - add field - -+ private boolean closed = false; // Pufferfish -+ - static { - ClassLoader.registerAsParallelCapable(); - } -@@ -177,6 +179,7 @@ public final class PluginClassLoader extends URLClassLoader { // Spigot - throw new ClassNotFoundException(name); - } - -+ public boolean _airplane_hasClass(@NotNull String name) { return this.classes.containsKey(name); } // Pufferfish - @Override - protected Class findClass(String name) throws ClassNotFoundException { - if (name.startsWith("org.bukkit.") || name.startsWith("net.minecraft.")) { -@@ -184,7 +187,7 @@ public final class PluginClassLoader extends URLClassLoader { // Spigot - } - Class result = classes.get(name); - -- if (result == null) { -+ if (result == null && !this.closed) { // Pufferfish - String path = name.replace('.', '/').concat(".class"); - JarEntry entry = jar.getJarEntry(path); - -@@ -231,6 +234,7 @@ public final class PluginClassLoader extends URLClassLoader { // Spigot - classes.put(name, result); - } - -+ if (result == null) throw new ClassNotFoundException(name); // Pufferfish - return result; - } - -@@ -239,6 +243,7 @@ public final class PluginClassLoader extends URLClassLoader { // Spigot - try { - super.close(); - } finally { -+ this.closed = true; // Pufferfish - jar.close(); - } - } diff --git a/patches/api/0003-Build-System-Changes.patch b/patches/api/0002-Build-System-Changes.patch similarity index 85% rename from patches/api/0003-Build-System-Changes.patch rename to patches/api/0002-Build-System-Changes.patch index 3ed3f4a53..65bb6f5d8 100644 --- a/patches/api/0003-Build-System-Changes.patch +++ b/patches/api/0002-Build-System-Changes.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Build System Changes diff --git a/build.gradle.kts b/build.gradle.kts -index 10716b2c866631badb99b1fb79b66c62b117b038..a141e5cdcec4d09b05252782e8a0ab5fac532680 100644 +index f6da2209c9853bc7c5e2f8805389041946872f1b..aba9d75153445923b04a218fd85dad37a4901225 100644 --- a/build.gradle.kts +++ b/build.gradle.kts -@@ -103,6 +103,8 @@ tasks.jar { +@@ -95,6 +95,8 @@ tasks.jar { } tasks.withType { diff --git a/patches/api/0004-Purpur-config-files.patch b/patches/api/0003-Purpur-config-files.patch similarity index 85% rename from patches/api/0004-Purpur-config-files.patch rename to patches/api/0003-Purpur-config-files.patch index 2c2dc917c..c786956c5 100644 --- a/patches/api/0004-Purpur-config-files.patch +++ b/patches/api/0003-Purpur-config-files.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Purpur config files diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java -index 1982fc2d7f1cb80d3e324ee283211b251a976c6e..61590b93f07b8b197b5ea69423e9cfb7a149c0e6 100644 +index 2204336d8800311b65e894739ab1b27273e7c6f2..bd749cfa7b0b0f08f63dd125e7d82a0b0bd232eb 100644 --- a/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java -@@ -1969,6 +1969,18 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi +@@ -1971,6 +1971,18 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi } // Paper end diff --git a/patches/api/0005-Purpur-client-support.patch b/patches/api/0004-Purpur-client-support.patch similarity index 82% rename from patches/api/0005-Purpur-client-support.patch rename to patches/api/0004-Purpur-client-support.patch index a34574fc2..26f7f1957 100644 --- a/patches/api/0005-Purpur-client-support.patch +++ b/patches/api/0004-Purpur-client-support.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Purpur client support diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java -index 1e27b9de47f111b9c000243214e22890e323f7fc..5360b67d63a732e3412ae8cb0dc7631b0bed58f1 100644 +index 19995314b01f19c312efa2a4584ccfba2d700c52..8c44c6e41a1751acf417c4d26c6335139fa6d36d 100644 --- a/src/main/java/org/bukkit/entity/Player.java +++ b/src/main/java/org/bukkit/entity/Player.java -@@ -2903,4 +2903,13 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM +@@ -2901,4 +2901,13 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM @Override Spigot spigot(); // Spigot end diff --git a/patches/api/0006-Default-permissions.patch b/patches/api/0005-Default-permissions.patch similarity index 100% rename from patches/api/0006-Default-permissions.patch rename to patches/api/0005-Default-permissions.patch diff --git a/patches/api/0007-Ridables.patch b/patches/api/0006-Ridables.patch similarity index 97% rename from patches/api/0007-Ridables.patch rename to patches/api/0006-Ridables.patch index 5f2dd40c8..58487eae2 100644 --- a/patches/api/0007-Ridables.patch +++ b/patches/api/0006-Ridables.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Ridables diff --git a/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java b/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java -index 8fd399f791b45eb7fc62693ca954eea0c68e2881..22705359d5b3b1af522ff5575c07ca5e20fac255 100644 +index 998f629852e1103767e005405d1f39c2251ecd28..49cba8a3226e4e2f2b11f3171c29e975bc6ec52b 100644 --- a/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java +++ b/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java -@@ -199,6 +199,12 @@ public interface VanillaGoal extends Goal { +@@ -200,6 +200,12 @@ public interface VanillaGoal extends Goal { GoalKey CLIMB_ON_TOP_OF_POWDER_SNOW = GoalKey.of(Mob.class, NamespacedKey.minecraft("climb_on_top_of_powder_snow")); GoalKey WOLF_PANIC = GoalKey.of(Wolf.class, NamespacedKey.minecraft("wolf_panic")); diff --git a/patches/api/0008-Allow-inventory-resizing.patch b/patches/api/0007-Allow-inventory-resizing.patch similarity index 50% rename from patches/api/0008-Allow-inventory-resizing.patch rename to patches/api/0007-Allow-inventory-resizing.patch index 87dcae968..069146875 100644 --- a/patches/api/0008-Allow-inventory-resizing.patch +++ b/patches/api/0007-Allow-inventory-resizing.patch @@ -5,28 +5,15 @@ Subject: [PATCH] Allow inventory resizing diff --git a/src/main/java/org/bukkit/event/inventory/InventoryType.java b/src/main/java/org/bukkit/event/inventory/InventoryType.java -index e1e7f45fd0f65d0874dd0698da436c7ac2e7951b..a31841b93964338c9325631dbfa59b3cad77b4f1 100644 +index 8d7ad84c2bdafa8c8a385fe31acb887a883194ff..11230fb25270b06700efc61954556bfcd0135699 100644 --- a/src/main/java/org/bukkit/event/inventory/InventoryType.java +++ b/src/main/java/org/bukkit/event/inventory/InventoryType.java -@@ -136,7 +136,7 @@ public enum InventoryType { - COMPOSTER(1, "Composter") +@@ -141,7 +141,7 @@ public enum InventoryType { + CHISELED_BOOKSHELF(6, "Chiseled Bookshelf"), ; - private final int size; -+ private int size; // Purpur - remove final ++ private int size; public void setDefaultSize(int size) { this.size = size; } // Purpur - remove file and add setter private final String title; private final boolean isCreatable; -@@ -163,6 +163,12 @@ public enum InventoryType { - this.defaultTitleComponent = net.kyori.adventure.text.Component.text(defaultTitle); // Paper - Adventure - } - -+ // Purpur start -+ public void setDefaultSize(int size) { -+ this.size = size; -+ } -+ // Purpur end -+ - public int getDefaultSize() { - return size; - } diff --git a/patches/api/0009-Llama-API.patch b/patches/api/0008-Llama-API.patch similarity index 100% rename from patches/api/0009-Llama-API.patch rename to patches/api/0008-Llama-API.patch diff --git a/patches/api/0010-AFK-API.patch b/patches/api/0009-AFK-API.patch similarity index 94% rename from patches/api/0010-AFK-API.patch rename to patches/api/0009-AFK-API.patch index b75e7503d..b64fb0e08 100644 --- a/patches/api/0010-AFK-API.patch +++ b/patches/api/0009-AFK-API.patch @@ -5,10 +5,10 @@ Subject: [PATCH] AFK API diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java -index 5360b67d63a732e3412ae8cb0dc7631b0bed58f1..edc09706c8a79d2e91440e164fc1ceb6c85d15d3 100644 +index 8c44c6e41a1751acf417c4d26c6335139fa6d36d..1aafdd20390a33298e154de5798cf4d0f5d2c022 100644 --- a/src/main/java/org/bukkit/entity/Player.java +++ b/src/main/java/org/bukkit/entity/Player.java -@@ -2911,5 +2911,24 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM +@@ -2909,5 +2909,24 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM * @return True if Player uses Purpur Client */ public boolean usesPurpurClient(); diff --git a/patches/api/0011-Bring-back-server-name.patch b/patches/api/0010-Bring-back-server-name.patch similarity index 79% rename from patches/api/0011-Bring-back-server-name.patch rename to patches/api/0010-Bring-back-server-name.patch index ad894d966..a80cf97c5 100644 --- a/patches/api/0011-Bring-back-server-name.patch +++ b/patches/api/0010-Bring-back-server-name.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Bring back server name diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java -index b5a7d6ab4e458843f2e163bf06b5668627012f91..d76cfd8fbc96a592f79d2ffaf838268b2aade1b2 100644 +index ac9b690fcccb60b587e5345f12f1383afd0a73a1..d0b36ad1492ce00d89a5cac123985328ecb77a5a 100644 --- a/src/main/java/org/bukkit/Bukkit.java +++ b/src/main/java/org/bukkit/Bukkit.java -@@ -2462,4 +2462,15 @@ public final class Bukkit { +@@ -2464,4 +2464,15 @@ public final class Bukkit { public static Server.Spigot spigot() { return server.spigot(); } @@ -25,10 +25,10 @@ index b5a7d6ab4e458843f2e163bf06b5668627012f91..d76cfd8fbc96a592f79d2ffaf838268b + // Purpur end } diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java -index 61590b93f07b8b197b5ea69423e9cfb7a149c0e6..025503596d9febf8d76c82b4fe940e8661de9dce 100644 +index bd749cfa7b0b0f08f63dd125e7d82a0b0bd232eb..c21d840f8874409651146b717fd122e10d882464 100644 --- a/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java -@@ -2149,4 +2149,13 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi +@@ -2151,4 +2151,13 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi */ @NotNull org.bukkit.potion.PotionBrewer getPotionBrewer(); // Paper end diff --git a/patches/api/0012-ExecuteCommandEvent.patch b/patches/api/0011-ExecuteCommandEvent.patch similarity index 100% rename from patches/api/0012-ExecuteCommandEvent.patch rename to patches/api/0011-ExecuteCommandEvent.patch diff --git a/patches/api/0013-LivingEntity-safeFallDistance.patch b/patches/api/0012-LivingEntity-safeFallDistance.patch similarity index 100% rename from patches/api/0013-LivingEntity-safeFallDistance.patch rename to patches/api/0012-LivingEntity-safeFallDistance.patch diff --git a/patches/api/0014-Lagging-threshold.patch b/patches/api/0013-Lagging-threshold.patch similarity index 79% rename from patches/api/0014-Lagging-threshold.patch rename to patches/api/0013-Lagging-threshold.patch index a79325022..6c5134221 100644 --- a/patches/api/0014-Lagging-threshold.patch +++ b/patches/api/0013-Lagging-threshold.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Lagging threshold diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java -index d76cfd8fbc96a592f79d2ffaf838268b2aade1b2..b507eb5bccf3689cc28a7bce7f4e31114b52a342 100644 +index d0b36ad1492ce00d89a5cac123985328ecb77a5a..731aaf6090d0ea6c5a4cc40e03067456a12ffb6f 100644 --- a/src/main/java/org/bukkit/Bukkit.java +++ b/src/main/java/org/bukkit/Bukkit.java -@@ -2472,5 +2472,14 @@ public final class Bukkit { +@@ -2474,5 +2474,14 @@ public final class Bukkit { public static String getServerName() { return server.getServerName(); } @@ -24,10 +24,10 @@ index d76cfd8fbc96a592f79d2ffaf838268b2aade1b2..b507eb5bccf3689cc28a7bce7f4e3111 // Purpur end } diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java -index 025503596d9febf8d76c82b4fe940e8661de9dce..6843701a22af21d0610bfa1c0eb85f8b0fed82df 100644 +index c21d840f8874409651146b717fd122e10d882464..ee0e26ffc49088011e06489684a2bfce486648ba 100644 --- a/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java -@@ -2157,5 +2157,12 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi +@@ -2159,5 +2159,12 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi */ @NotNull String getServerName(); diff --git a/patches/api/0015-PlayerSetSpawnerTypeWithEggEvent.patch b/patches/api/0014-PlayerSetSpawnerTypeWithEggEvent.patch similarity index 100% rename from patches/api/0015-PlayerSetSpawnerTypeWithEggEvent.patch rename to patches/api/0014-PlayerSetSpawnerTypeWithEggEvent.patch diff --git a/patches/api/0016-EMC-MonsterEggSpawnEvent.patch b/patches/api/0015-EMC-MonsterEggSpawnEvent.patch similarity index 100% rename from patches/api/0016-EMC-MonsterEggSpawnEvent.patch rename to patches/api/0015-EMC-MonsterEggSpawnEvent.patch diff --git a/patches/api/0017-Player-invulnerabilities.patch b/patches/api/0016-Player-invulnerabilities.patch similarity index 87% rename from patches/api/0017-Player-invulnerabilities.patch rename to patches/api/0016-Player-invulnerabilities.patch index 32acbbb01..721648705 100644 --- a/patches/api/0017-Player-invulnerabilities.patch +++ b/patches/api/0016-Player-invulnerabilities.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Player invulnerabilities diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java -index edc09706c8a79d2e91440e164fc1ceb6c85d15d3..7f499e420074d7550a50e832c0b11b205012e74b 100644 +index 1aafdd20390a33298e154de5798cf4d0f5d2c022..e349de85d5e3733cdaf564f3ff29c23bd92405d3 100644 --- a/src/main/java/org/bukkit/entity/Player.java +++ b/src/main/java/org/bukkit/entity/Player.java -@@ -2930,5 +2930,26 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM +@@ -2928,5 +2928,26 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM * Reset the idle timer back to 0 */ void resetIdleTimer(); diff --git a/patches/api/0018-Anvil-API.patch b/patches/api/0017-Anvil-API.patch similarity index 100% rename from patches/api/0018-Anvil-API.patch rename to patches/api/0017-Anvil-API.patch diff --git a/patches/api/0019-ItemStack-convenience-methods.patch b/patches/api/0018-ItemStack-convenience-methods.patch similarity index 99% rename from patches/api/0019-ItemStack-convenience-methods.patch rename to patches/api/0018-ItemStack-convenience-methods.patch index 91da19406..5d6ebce89 100644 --- a/patches/api/0019-ItemStack-convenience-methods.patch +++ b/patches/api/0018-ItemStack-convenience-methods.patch @@ -5,10 +5,10 @@ Subject: [PATCH] ItemStack convenience methods diff --git a/src/main/java/org/bukkit/Material.java b/src/main/java/org/bukkit/Material.java -index cb00e050cd5fff3a037a32ac34e02eeea3827357..6c82d84c190dee87cc72ed0d06f089348c6fddf4 100644 +index e5b94299793ba7cb9071a3f3a35ddbe08b0b9906..0a3013843f7e1d3fcedfaca6a7b288642ebcb407 100644 --- a/src/main/java/org/bukkit/Material.java +++ b/src/main/java/org/bukkit/Material.java -@@ -10235,4 +10235,39 @@ public enum Material implements Keyed, net.kyori.adventure.translation.Translata +@@ -10688,4 +10688,39 @@ public enum Material implements Keyed, net.kyori.adventure.translation.Translata return Bukkit.getUnsafe().getCreativeCategory(this); } diff --git a/patches/api/0020-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch b/patches/api/0019-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch similarity index 87% rename from patches/api/0020-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch rename to patches/api/0019-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch index ac4b12f34..dec53486b 100644 --- a/patches/api/0020-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch +++ b/patches/api/0019-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Phantoms attracted to crystals and crystals shoot phantoms diff --git a/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java b/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java -index 22705359d5b3b1af522ff5575c07ca5e20fac255..ba4587a434d40fae7aeff655c1cd4cd3346d496a 100644 +index 49cba8a3226e4e2f2b11f3171c29e975bc6ec52b..c26a094d7874985dd0aa9fbfc0b6ac9ebd7f0499 100644 --- a/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java +++ b/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java -@@ -203,6 +203,8 @@ public interface VanillaGoal extends Goal { +@@ -204,6 +204,8 @@ public interface VanillaGoal extends Goal { GoalKey MOB_HAS_RIDER = GoalKey.of(Mob.class, NamespacedKey.minecraft("has_rider")); GoalKey HORSE_HAS_RIDER = GoalKey.of(AbstractHorse.class, NamespacedKey.minecraft("horse_has_rider")); GoalKey LLAMA_HAS_RIDER = GoalKey.of(Llama.class, NamespacedKey.minecraft("llama_has_rider")); diff --git a/patches/api/0021-ChatColor-conveniences.patch b/patches/api/0020-ChatColor-conveniences.patch similarity index 100% rename from patches/api/0021-ChatColor-conveniences.patch rename to patches/api/0020-ChatColor-conveniences.patch diff --git a/patches/api/0022-LivingEntity-broadcastItemBreak.patch b/patches/api/0021-LivingEntity-broadcastItemBreak.patch similarity index 100% rename from patches/api/0022-LivingEntity-broadcastItemBreak.patch rename to patches/api/0021-LivingEntity-broadcastItemBreak.patch diff --git a/patches/api/0023-Item-entity-immunities.patch b/patches/api/0022-Item-entity-immunities.patch similarity index 100% rename from patches/api/0023-Item-entity-immunities.patch rename to patches/api/0022-Item-entity-immunities.patch diff --git a/patches/api/0024-Spigot-Improve-output-of-plugins-command.patch b/patches/api/0023-Spigot-Improve-output-of-plugins-command.patch similarity index 100% rename from patches/api/0024-Spigot-Improve-output-of-plugins-command.patch rename to patches/api/0023-Spigot-Improve-output-of-plugins-command.patch diff --git a/patches/api/0025-Add-option-to-disable-zombie-aggressiveness-towards-.patch b/patches/api/0024-Add-option-to-disable-zombie-aggressiveness-towards-.patch similarity index 87% rename from patches/api/0025-Add-option-to-disable-zombie-aggressiveness-towards-.patch rename to patches/api/0024-Add-option-to-disable-zombie-aggressiveness-towards-.patch index 3d35f7ab5..bd46aa8c3 100644 --- a/patches/api/0025-Add-option-to-disable-zombie-aggressiveness-towards-.patch +++ b/patches/api/0024-Add-option-to-disable-zombie-aggressiveness-towards-.patch @@ -6,10 +6,10 @@ Subject: [PATCH] Add option to disable zombie aggressiveness towards villagers diff --git a/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java b/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java -index ba4587a434d40fae7aeff655c1cd4cd3346d496a..2a8c6da0f9ffa1f94cfd37d1068511c8941d27ce 100644 +index c26a094d7874985dd0aa9fbfc0b6ac9ebd7f0499..0d62664985f28468867087c240d53ff0d049a263 100644 --- a/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java +++ b/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java -@@ -205,6 +205,8 @@ public interface VanillaGoal extends Goal { +@@ -206,6 +206,8 @@ public interface VanillaGoal extends Goal { GoalKey LLAMA_HAS_RIDER = GoalKey.of(Llama.class, NamespacedKey.minecraft("llama_has_rider")); GoalKey FIND_CRYSTAL = GoalKey.of(Phantom.class, NamespacedKey.minecraft("find_crystal")); GoalKey ORBIT_CRYSTAL = GoalKey.of(Phantom.class, NamespacedKey.minecraft("orbit_crystal")); diff --git a/patches/api/0026-Add-predicate-to-recipe-s-ExactChoice-ingredient.patch b/patches/api/0025-Add-predicate-to-recipe-s-ExactChoice-ingredient.patch similarity index 100% rename from patches/api/0026-Add-predicate-to-recipe-s-ExactChoice-ingredient.patch rename to patches/api/0025-Add-predicate-to-recipe-s-ExactChoice-ingredient.patch diff --git a/patches/api/0027-Alphabetize-in-game-plugins-list.patch b/patches/api/0026-Alphabetize-in-game-plugins-list.patch similarity index 100% rename from patches/api/0027-Alphabetize-in-game-plugins-list.patch rename to patches/api/0026-Alphabetize-in-game-plugins-list.patch diff --git a/patches/api/0028-Rabid-Wolf-API.patch b/patches/api/0027-Rabid-Wolf-API.patch similarity index 91% rename from patches/api/0028-Rabid-Wolf-API.patch rename to patches/api/0027-Rabid-Wolf-API.patch index 6d78c8bed..5294ebe16 100644 --- a/patches/api/0028-Rabid-Wolf-API.patch +++ b/patches/api/0027-Rabid-Wolf-API.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Rabid Wolf API diff --git a/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java b/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java -index 2a8c6da0f9ffa1f94cfd37d1068511c8941d27ce..aa0a081819672c14d9f04c07f4685768cbe8d914 100644 +index 0d62664985f28468867087c240d53ff0d049a263..354928945035897b0f0d329b826142aaa4a1e4f5 100644 --- a/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java +++ b/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java -@@ -207,6 +207,7 @@ public interface VanillaGoal extends Goal { +@@ -208,6 +208,7 @@ public interface VanillaGoal extends Goal { GoalKey ORBIT_CRYSTAL = GoalKey.of(Phantom.class, NamespacedKey.minecraft("orbit_crystal")); GoalKey DROWNED_ATTACK_VILLAGER = GoalKey.of(Drowned.class, NamespacedKey.minecraft("drowned_attack_villager")); GoalKey ZOMBIE_ATTACK_VILLAGER = GoalKey.of(Zombie.class, NamespacedKey.minecraft("zombie_attack_villager")); diff --git a/patches/api/0029-PlayerBookTooLargeEvent.patch b/patches/api/0028-PlayerBookTooLargeEvent.patch similarity index 100% rename from patches/api/0029-PlayerBookTooLargeEvent.patch rename to patches/api/0028-PlayerBookTooLargeEvent.patch diff --git a/patches/api/0030-Full-netherite-armor-grants-fire-resistance.patch b/patches/api/0029-Full-netherite-armor-grants-fire-resistance.patch similarity index 91% rename from patches/api/0030-Full-netherite-armor-grants-fire-resistance.patch rename to patches/api/0029-Full-netherite-armor-grants-fire-resistance.patch index 08279d395..0ef9d9170 100644 --- a/patches/api/0030-Full-netherite-armor-grants-fire-resistance.patch +++ b/patches/api/0029-Full-netherite-armor-grants-fire-resistance.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Full netherite armor grants fire resistance diff --git a/src/main/java/org/bukkit/event/entity/EntityPotionEffectEvent.java b/src/main/java/org/bukkit/event/entity/EntityPotionEffectEvent.java -index b915c3cab168a2bbdca740e662baaa708d425e41..476b33dd26af55f787f64c37d9a8cd2d0dc2a7f7 100644 +index 01c5e8b71338fbb4b1605e45bf2a2e705188f6b5..118d53ec9d1dc9c01cedfbedaf0b8edcbda7b3a5 100644 --- a/src/main/java/org/bukkit/event/entity/EntityPotionEffectEvent.java +++ b/src/main/java/org/bukkit/event/entity/EntityPotionEffectEvent.java @@ -217,6 +217,12 @@ public class EntityPotionEffectEvent extends EntityEvent implements Cancellable diff --git a/patches/api/0031-Add-EntityTeleportHinderedEvent.patch b/patches/api/0030-Add-EntityTeleportHinderedEvent.patch similarity index 100% rename from patches/api/0031-Add-EntityTeleportHinderedEvent.patch rename to patches/api/0030-Add-EntityTeleportHinderedEvent.patch diff --git a/patches/api/0032-Add-enchantment-target-for-bows-and-crossbows.patch b/patches/api/0031-Add-enchantment-target-for-bows-and-crossbows.patch similarity index 87% rename from patches/api/0032-Add-enchantment-target-for-bows-and-crossbows.patch rename to patches/api/0031-Add-enchantment-target-for-bows-and-crossbows.patch index c166b9889..ddd497ce5 100644 --- a/patches/api/0032-Add-enchantment-target-for-bows-and-crossbows.patch +++ b/patches/api/0031-Add-enchantment-target-for-bows-and-crossbows.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add enchantment target for bows and crossbows diff --git a/src/main/java/org/bukkit/enchantments/EnchantmentTarget.java b/src/main/java/org/bukkit/enchantments/EnchantmentTarget.java -index 635e07a6b0e255c4fdad58ba9d281c807af4e229..93d5fad641c5afa679b59dc712f0d0faaddcfe2e 100644 +index cb9e8b53da300a911f84e15ee9be2261cf1cc340..ec0b5f504c920adb9aec9023dce653ba370f7526 100644 --- a/src/main/java/org/bukkit/enchantments/EnchantmentTarget.java +++ b/src/main/java/org/bukkit/enchantments/EnchantmentTarget.java -@@ -226,6 +226,18 @@ public enum EnchantmentTarget { +@@ -227,6 +227,18 @@ public enum EnchantmentTarget { public boolean includes(@NotNull Material item) { return BREAKABLE.includes(item) || (WEARABLE.includes(item) && !item.equals(Material.ELYTRA)) || item.equals(Material.COMPASS); } diff --git a/patches/api/0033-Iron-golem-poppy-calms-anger.patch b/patches/api/0032-Iron-golem-poppy-calms-anger.patch similarity index 86% rename from patches/api/0033-Iron-golem-poppy-calms-anger.patch rename to patches/api/0032-Iron-golem-poppy-calms-anger.patch index 06653eb40..6688f1169 100644 --- a/patches/api/0033-Iron-golem-poppy-calms-anger.patch +++ b/patches/api/0032-Iron-golem-poppy-calms-anger.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Iron golem poppy calms anger diff --git a/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java b/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java -index aa0a081819672c14d9f04c07f4685768cbe8d914..c18940f5c3b3436c19ca6ea466bc8a78579c795f 100644 +index 354928945035897b0f0d329b826142aaa4a1e4f5..3c05b03bb5ff3bfec6c69a5cc4b23f0633ab473f 100644 --- a/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java +++ b/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java -@@ -208,6 +208,7 @@ public interface VanillaGoal extends Goal { +@@ -209,6 +209,7 @@ public interface VanillaGoal extends Goal { GoalKey DROWNED_ATTACK_VILLAGER = GoalKey.of(Drowned.class, NamespacedKey.minecraft("drowned_attack_villager")); GoalKey ZOMBIE_ATTACK_VILLAGER = GoalKey.of(Zombie.class, NamespacedKey.minecraft("zombie_attack_villager")); GoalKey AVOID_RABID_WOLF = GoalKey.of(Wolf.class, NamespacedKey.minecraft("avoid_rabid_wolf")); diff --git a/patches/api/0034-API-for-any-mob-to-burn-daylight.patch b/patches/api/0033-API-for-any-mob-to-burn-daylight.patch similarity index 100% rename from patches/api/0034-API-for-any-mob-to-burn-daylight.patch rename to patches/api/0033-API-for-any-mob-to-burn-daylight.patch diff --git a/patches/api/0035-Flying-Fall-Damage-API.patch b/patches/api/0034-Flying-Fall-Damage-API.patch similarity index 87% rename from patches/api/0035-Flying-Fall-Damage-API.patch rename to patches/api/0034-Flying-Fall-Damage-API.patch index 73de0384d..bdad21d68 100644 --- a/patches/api/0035-Flying-Fall-Damage-API.patch +++ b/patches/api/0034-Flying-Fall-Damage-API.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Flying Fall Damage API diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java -index 7f499e420074d7550a50e832c0b11b205012e74b..d56f4f177919a501a5fa4ba544ea6500694cf9d2 100644 +index e349de85d5e3733cdaf564f3ff29c23bd92405d3..9d67c03f6afa5bc9b4ea35399e4fbb9d96bbed68 100644 --- a/src/main/java/org/bukkit/entity/Player.java +++ b/src/main/java/org/bukkit/entity/Player.java -@@ -2951,5 +2951,19 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM +@@ -2949,5 +2949,19 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM * @param invulnerableTicks Invulnerable ticks remaining */ void setSpawnInvulnerableTicks(int invulnerableTicks); diff --git a/patches/api/0036-Add-back-player-spawned-endermite-API.patch b/patches/api/0035-Add-back-player-spawned-endermite-API.patch similarity index 100% rename from patches/api/0036-Add-back-player-spawned-endermite-API.patch rename to patches/api/0035-Add-back-player-spawned-endermite-API.patch diff --git a/patches/api/0037-Fix-default-permission-system.patch b/patches/api/0036-Fix-default-permission-system.patch similarity index 100% rename from patches/api/0037-Fix-default-permission-system.patch rename to patches/api/0036-Fix-default-permission-system.patch diff --git a/patches/api/0038-Summoner-API.patch b/patches/api/0037-Summoner-API.patch similarity index 100% rename from patches/api/0038-Summoner-API.patch rename to patches/api/0037-Summoner-API.patch diff --git a/patches/api/0039-Clean-up-version-command-output.patch b/patches/api/0038-Clean-up-version-command-output.patch similarity index 100% rename from patches/api/0039-Clean-up-version-command-output.patch rename to patches/api/0038-Clean-up-version-command-output.patch diff --git a/patches/api/0040-Extended-OfflinePlayer-API.patch b/patches/api/0039-Extended-OfflinePlayer-API.patch similarity index 100% rename from patches/api/0040-Extended-OfflinePlayer-API.patch rename to patches/api/0039-Extended-OfflinePlayer-API.patch diff --git a/patches/api/0041-Added-the-ability-to-add-combustible-items.patch b/patches/api/0040-Added-the-ability-to-add-combustible-items.patch similarity index 85% rename from patches/api/0041-Added-the-ability-to-add-combustible-items.patch rename to patches/api/0040-Added-the-ability-to-add-combustible-items.patch index 09905ab7e..a18c601b4 100644 --- a/patches/api/0041-Added-the-ability-to-add-combustible-items.patch +++ b/patches/api/0040-Added-the-ability-to-add-combustible-items.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Added the ability to add combustible items diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java -index b507eb5bccf3689cc28a7bce7f4e31114b52a342..581c797b660cd190dc368a4d3f1c01717e98a4a6 100644 +index 731aaf6090d0ea6c5a4cc40e03067456a12ffb6f..9ea6210439d680d550b661783874e21cd92b6422 100644 --- a/src/main/java/org/bukkit/Bukkit.java +++ b/src/main/java/org/bukkit/Bukkit.java -@@ -2481,5 +2481,24 @@ public final class Bukkit { +@@ -2483,5 +2483,24 @@ public final class Bukkit { public static boolean isLagging() { return server.isLagging(); } @@ -34,10 +34,10 @@ index b507eb5bccf3689cc28a7bce7f4e31114b52a342..581c797b660cd190dc368a4d3f1c0171 // Purpur end } diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java -index 6843701a22af21d0610bfa1c0eb85f8b0fed82df..7b499d4501e2123b22fd8311c68b8f7b3c41beed 100644 +index ee0e26ffc49088011e06489684a2bfce486648ba..2b64836fcfd22c7b11030aca4de44784440e285b 100644 --- a/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java -@@ -2164,5 +2164,20 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi +@@ -2166,5 +2166,20 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi * @return True if lagging */ boolean isLagging(); diff --git a/patches/api/0042-Potion-NamespacedKey.patch b/patches/api/0041-Potion-NamespacedKey.patch similarity index 100% rename from patches/api/0042-Potion-NamespacedKey.patch rename to patches/api/0041-Potion-NamespacedKey.patch diff --git a/patches/api/0043-Grindstone-API.patch b/patches/api/0042-Grindstone-API.patch similarity index 100% rename from patches/api/0043-Grindstone-API.patch rename to patches/api/0042-Grindstone-API.patch diff --git a/patches/api/0044-Shears-can-have-looting-enchantment.patch b/patches/api/0043-Shears-can-have-looting-enchantment.patch similarity index 86% rename from patches/api/0044-Shears-can-have-looting-enchantment.patch rename to patches/api/0043-Shears-can-have-looting-enchantment.patch index d00633431..21e936a1e 100644 --- a/patches/api/0044-Shears-can-have-looting-enchantment.patch +++ b/patches/api/0043-Shears-can-have-looting-enchantment.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Shears can have looting enchantment diff --git a/src/main/java/org/bukkit/enchantments/EnchantmentTarget.java b/src/main/java/org/bukkit/enchantments/EnchantmentTarget.java -index 93d5fad641c5afa679b59dc712f0d0faaddcfe2e..1f478844707352072cbcefe34318637c74ff3e15 100644 +index ec0b5f504c920adb9aec9023dce653ba370f7526..c8a603bb614f891d8eb43acd3eddd0504816566f 100644 --- a/src/main/java/org/bukkit/enchantments/EnchantmentTarget.java +++ b/src/main/java/org/bukkit/enchantments/EnchantmentTarget.java -@@ -237,6 +237,16 @@ public enum EnchantmentTarget { +@@ -238,6 +238,16 @@ public enum EnchantmentTarget { public boolean includes(@NotNull Material item) { return item.equals(Material.BOW) || item.equals(Material.CROSSBOW); } diff --git a/patches/api/0045-Lobotomize-stuck-villagers.patch b/patches/api/0044-Lobotomize-stuck-villagers.patch similarity index 100% rename from patches/api/0045-Lobotomize-stuck-villagers.patch rename to patches/api/0044-Lobotomize-stuck-villagers.patch diff --git a/patches/api/0046-Spark-Profiler.patch b/patches/api/0045-Spark-Profiler.patch similarity index 87% rename from patches/api/0046-Spark-Profiler.patch rename to patches/api/0045-Spark-Profiler.patch index ba8ec631a..592a33213 100644 --- a/patches/api/0046-Spark-Profiler.patch +++ b/patches/api/0045-Spark-Profiler.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Spark Profiler diff --git a/src/main/java/org/bukkit/plugin/SimplePluginManager.java b/src/main/java/org/bukkit/plugin/SimplePluginManager.java -index e42a2d631fd7eaa455132e0cf64c9be7707dadb9..cc67217ff6003c83f10c6eeb7d4a2205cb0129c4 100644 +index b012ce40d82389c29d1b841ff685425ac10a7f9e..653961e083aec13c1551be5439ad73bbe7540bab 100644 --- a/src/main/java/org/bukkit/plugin/SimplePluginManager.java +++ b/src/main/java/org/bukkit/plugin/SimplePluginManager.java -@@ -165,6 +165,12 @@ public final class SimplePluginManager implements PluginManager { +@@ -167,6 +167,12 @@ public final class SimplePluginManager implements PluginManager { server.getLogger().log(Level.SEVERE, "Could not load '" + file.getPath() + "' in folder '" + file.getParentFile().getPath() + "'", ex); // Paper continue; } diff --git a/patches/api/0047-Add-local-difficulty-api.patch b/patches/api/0046-Add-local-difficulty-api.patch similarity index 90% rename from patches/api/0047-Add-local-difficulty-api.patch rename to patches/api/0046-Add-local-difficulty-api.patch index 8ff8bd3c4..d761cc37f 100644 --- a/patches/api/0047-Add-local-difficulty-api.patch +++ b/patches/api/0046-Add-local-difficulty-api.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add local difficulty api diff --git a/src/main/java/org/bukkit/World.java b/src/main/java/org/bukkit/World.java -index e8c0c853eb52d1473c20231660355f77b1f7e016..3d053490dc87724f57893a553f1ab9cf1a3b73c0 100644 +index 9e71e519cda72a1e2a01474f238b97015ec5115e..8effbbd33c0af0ac421e5aef1586e8579ef097e4 100644 --- a/src/main/java/org/bukkit/World.java +++ b/src/main/java/org/bukkit/World.java @@ -3985,6 +3985,16 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient diff --git a/patches/api/0048-Remove-Timings.patch b/patches/api/0047-Remove-Timings.patch similarity index 100% rename from patches/api/0048-Remove-Timings.patch rename to patches/api/0047-Remove-Timings.patch diff --git a/patches/api/0049-Add-Bee-API.patch b/patches/api/0048-Add-Bee-API.patch similarity index 100% rename from patches/api/0049-Add-Bee-API.patch rename to patches/api/0048-Add-Bee-API.patch diff --git a/patches/api/0050-Debug-Marker-API.patch b/patches/api/0049-Debug-Marker-API.patch similarity index 97% rename from patches/api/0050-Debug-Marker-API.patch rename to patches/api/0049-Debug-Marker-API.patch index 1b7d28705..6a70e0733 100644 --- a/patches/api/0050-Debug-Marker-API.patch +++ b/patches/api/0049-Debug-Marker-API.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Debug Marker API diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java -index 6d46cc8674e488aa988722e09749f756a423b9e4..e5943f1313f97dd6a353873d54424ae70d46dcef 100644 +index 9ea6210439d680d550b661783874e21cd92b6422..83571abfe9a2eb8736b481de35dfd7fd4c663f5a 100644 --- a/src/main/java/org/bukkit/Bukkit.java +++ b/src/main/java/org/bukkit/Bukkit.java -@@ -2500,5 +2500,89 @@ public final class Bukkit { +@@ -2502,5 +2502,89 @@ public final class Bukkit { public static void removeFuel(@NotNull Material material) { server.removeFuel(material); } @@ -99,10 +99,10 @@ index 6d46cc8674e488aa988722e09749f756a423b9e4..e5943f1313f97dd6a353873d54424ae7 // Purpur end } diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java -index 3ebce913ff1063de417aa3dc3b4af6d538078db2..a7e2fab3e174fe2c1d79d904f7eaff88dd0c3c82 100644 +index 2b64836fcfd22c7b11030aca4de44784440e285b..e0f69edf603c2ec99bc92b16b18912272cc41bd9 100644 --- a/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java -@@ -2179,5 +2179,75 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi +@@ -2181,5 +2181,75 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi * @param material The material that will no longer be a fuel */ public void removeFuel(@NotNull Material material); @@ -260,10 +260,10 @@ index 8effbbd33c0af0ac421e5aef1586e8579ef097e4..0cd49cb31b21e52009f6220d505aa2a3 /** diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java -index d56f4f177919a501a5fa4ba544ea6500694cf9d2..36eaa0c8d63eaf7f4c5ff40155b109f064f21553 100644 +index 9d67c03f6afa5bc9b4ea35399e4fbb9d96bbed68..d02953cd68f7161eba76752dfe1d3282367f2dfd 100644 --- a/src/main/java/org/bukkit/entity/Player.java +++ b/src/main/java/org/bukkit/entity/Player.java -@@ -2965,5 +2965,75 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM +@@ -2963,5 +2963,75 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM * @return True if fall damage is enabled when {@link #getAllowFlight()} is true */ public boolean hasFlyingFallDamage(); diff --git a/patches/api/0051-add-Player-showCreditScreen.patch b/patches/api/0050-add-Player-showCreditScreen.patch similarity index 84% rename from patches/api/0051-add-Player-showCreditScreen.patch rename to patches/api/0050-add-Player-showCreditScreen.patch index 29bd499ac..fba77656c 100644 --- a/patches/api/0051-add-Player-showCreditScreen.patch +++ b/patches/api/0050-add-Player-showCreditScreen.patch @@ -5,10 +5,10 @@ Subject: [PATCH] add Player#showCreditScreen diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java -index 3e9b58f1f63e472fa292d25002c5aff8c474fca1..d0d617284248065e728e4940d240be5bff1103e4 100644 +index d02953cd68f7161eba76752dfe1d3282367f2dfd..a1e8bee97d0eae927e2a3ad66592d6c78acb6471 100644 --- a/src/main/java/org/bukkit/entity/Player.java +++ b/src/main/java/org/bukkit/entity/Player.java -@@ -2411,6 +2411,14 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM +@@ -2409,6 +2409,14 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM */ public void showDemoScreen(); diff --git a/patches/api/0052-Add-death-screen-API.patch b/patches/api/0051-Add-death-screen-API.patch similarity index 87% rename from patches/api/0052-Add-death-screen-API.patch rename to patches/api/0051-Add-death-screen-API.patch index 4d46c7f77..a704c58e6 100644 --- a/patches/api/0052-Add-death-screen-API.patch +++ b/patches/api/0051-Add-death-screen-API.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add death screen API diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java -index caf710fbfa91c2e2bba51ad395cf14cec91feb21..93e18658bb7a83a35f812811c2c87630a4b7eb0b 100644 +index a1e8bee97d0eae927e2a3ad66592d6c78acb6471..35bff85031b1e1b06af7d2bc1c76540d17ae3f3e 100644 --- a/src/main/java/org/bukkit/entity/Player.java +++ b/src/main/java/org/bukkit/entity/Player.java -@@ -3043,5 +3043,21 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM +@@ -3041,5 +3041,21 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM * Clears all debug block highlights */ void clearBlockHighlights(); diff --git a/patches/api/0053-Add-item-packet-serialize-event.patch b/patches/api/0052-Add-item-packet-serialize-event.patch similarity index 100% rename from patches/api/0053-Add-item-packet-serialize-event.patch rename to patches/api/0052-Add-item-packet-serialize-event.patch diff --git a/patches/api/0054-Language-API.patch b/patches/api/0053-Language-API.patch similarity index 100% rename from patches/api/0054-Language-API.patch rename to patches/api/0053-Language-API.patch diff --git a/patches/api/0055-Add-log-suppression-for-LibraryLoader.patch b/patches/api/0054-Add-log-suppression-for-LibraryLoader.patch similarity index 93% rename from patches/api/0055-Add-log-suppression-for-LibraryLoader.patch rename to patches/api/0054-Add-log-suppression-for-LibraryLoader.patch index 43fc78836..3917bb8a4 100644 --- a/patches/api/0055-Add-log-suppression-for-LibraryLoader.patch +++ b/patches/api/0054-Add-log-suppression-for-LibraryLoader.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add log suppression for LibraryLoader diff --git a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java -index a16c841751bc44e46d27fc4efbfc2ab23cc7b0d7..4dd9306c13aff0e54521e1c157b8a9c16db7387a 100644 +index 7e5149a21b6747f64425a277c142e69f0ef43b3f..bde06934a397ca2305407d5f23617efd02d361ac 100644 --- a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java +++ b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java -@@ -57,6 +57,7 @@ public final class JavaPluginLoader implements PluginLoader { +@@ -58,6 +58,7 @@ public final class JavaPluginLoader implements PluginLoader { private final Map classLoadLockCount = new java.util.HashMap(); // Paper private final List loaders = new CopyOnWriteArrayList(); private final LibraryLoader libraryLoader; diff --git a/patches/api/0056-Fire-Immunity-API.patch b/patches/api/0055-Fire-Immunity-API.patch similarity index 100% rename from patches/api/0056-Fire-Immunity-API.patch rename to patches/api/0055-Fire-Immunity-API.patch diff --git a/patches/api/0057-Added-goat-ram-event.patch b/patches/api/0056-Added-goat-ram-event.patch similarity index 100% rename from patches/api/0057-Added-goat-ram-event.patch rename to patches/api/0056-Added-goat-ram-event.patch diff --git a/patches/server/0001-Pufferfish-Server-Changes.patch b/patches/server/0001-Pufferfish-Server-Changes.patch deleted file mode 100644 index 875f2450e..000000000 --- a/patches/server/0001-Pufferfish-Server-Changes.patch +++ /dev/null @@ -1,3666 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Kevin Raneri -Date: Wed, 3 Feb 2021 23:02:38 -0600 -Subject: [PATCH] Pufferfish Server Changes - -Pufferfish -Copyright (C) 2022 Pufferfish Studios LLC - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . - -diff --git a/build.gradle.kts b/build.gradle.kts -index b0e4f11e8af4b909a56bb5576d05ef0537fb25f7..9d4fc7b32e4b3f232748b7f6808c33f989649f5c 100644 ---- a/build.gradle.kts -+++ b/build.gradle.kts -@@ -7,8 +7,12 @@ plugins { - } - - dependencies { -- implementation(project(":paper-api")) -- implementation(project(":paper-mojangapi")) -+ implementation(project(":pufferfish-api")) // Pufferfish // Paper -+ // Pufferfish start -+ implementation("io.papermc.paper:paper-mojangapi:1.19.2-R0.1-SNAPSHOT") { -+ exclude("io.papermc.paper", "paper-api") -+ } -+ // Pufferfish end - // Paper start - implementation("org.jline:jline-terminal-jansi:3.21.0") - implementation("net.minecrell:terminalconsoleappender:1.3.0") -@@ -42,6 +46,13 @@ dependencies { - runtimeOnly("org.apache.maven.resolver:maven-resolver-connector-basic:1.7.3") - runtimeOnly("org.apache.maven.resolver:maven-resolver-transport-http:1.7.3") - -+ // Pufferfish start -+ implementation("org.yaml:snakeyaml:1.32") -+ implementation ("me.carleslc.Simple-YAML:Simple-Yaml:1.8.2") { -+ exclude(group="org.yaml", module="snakeyaml") -+ } -+ // Pufferfish end -+ - testImplementation("io.github.classgraph:classgraph:4.8.47") // Paper - mob goal test - testImplementation("junit:junit:4.13.2") - testImplementation("org.hamcrest:hamcrest-library:1.3") -@@ -50,6 +61,14 @@ dependencies { - } - - val craftbukkitPackageVersion = "1_19_R1" // Paper -+ -+// Pufferfish Start -+tasks.withType { -+ val compilerArgs = options.compilerArgs -+ compilerArgs.add("--add-modules=jdk.incubator.vector") -+} -+// Pufferfish End -+ - tasks.jar { - archiveClassifier.set("dev") - -@@ -62,7 +81,7 @@ tasks.jar { - attributes( - "Main-Class" to "org.bukkit.craftbukkit.Main", - "Implementation-Title" to "CraftBukkit", -- "Implementation-Version" to "git-Paper-$implementationVersion", -+ "Implementation-Version" to "git-Pufferfish-$implementationVersion", // Pufferfish - "Implementation-Vendor" to date, // Paper - "Specification-Title" to "Bukkit", - "Specification-Version" to project.version, -diff --git a/src/main/java/co/aikar/timings/TimingsExport.java b/src/main/java/co/aikar/timings/TimingsExport.java -index 06bff37e4c1fddd3be6343049a66787c63fb420c..2cc44fbf8e5bd436b6d4e19f6c06b351e750cb31 100644 ---- a/src/main/java/co/aikar/timings/TimingsExport.java -+++ b/src/main/java/co/aikar/timings/TimingsExport.java -@@ -241,7 +241,8 @@ public class TimingsExport extends Thread { - parent.put("config", createObject( - pair("spigot", mapAsJSON(Bukkit.spigot().getSpigotConfig(), null)), - pair("bukkit", mapAsJSON(Bukkit.spigot().getBukkitConfig(), null)), -- pair("paper", mapAsJSON(Bukkit.spigot().getPaperConfig(), null)) -+ pair("paper", mapAsJSON(Bukkit.spigot().getPaperConfig(), null)), // Pufferfish -+ pair("pufferfish", mapAsJSON(gg.pufferfish.pufferfish.PufferfishConfig.getConfigCopy(), null)) // Pufferfish - )); - - new TimingsExport(listeners, parent, history).start(); -diff --git a/src/main/java/com/destroystokyo/paper/Metrics.java b/src/main/java/com/destroystokyo/paper/Metrics.java -index 7b1843e16745ca8db2244e17490d291401f22679..061716934ba0a1f01e4d85d664034f72b3c7a765 100644 ---- a/src/main/java/com/destroystokyo/paper/Metrics.java -+++ b/src/main/java/com/destroystokyo/paper/Metrics.java -@@ -593,7 +593,7 @@ public class Metrics { - boolean logFailedRequests = config.getBoolean("logFailedRequests", false); - // Only start Metrics, if it's enabled in the config - if (config.getBoolean("enabled", true)) { -- Metrics metrics = new Metrics("Paper", serverUUID, logFailedRequests, Bukkit.getLogger()); -+ Metrics metrics = new Metrics("Pufferfish", serverUUID, logFailedRequests, Bukkit.getLogger()); // Pufferfish - - metrics.addCustomChart(new Metrics.SimplePie("minecraft_version", () -> { - String minecraftVersion = Bukkit.getVersion(); -@@ -603,7 +603,7 @@ public class Metrics { - - metrics.addCustomChart(new Metrics.SingleLineChart("players", () -> Bukkit.getOnlinePlayers().size())); - metrics.addCustomChart(new Metrics.SimplePie("online_mode", () -> Bukkit.getOnlineMode() ? "online" : "offline")); -- metrics.addCustomChart(new Metrics.SimplePie("paper_version", () -> (Metrics.class.getPackage().getImplementationVersion() != null) ? Metrics.class.getPackage().getImplementationVersion() : "unknown")); -+ metrics.addCustomChart(new Metrics.SimplePie("pufferfish_version", () -> (Metrics.class.getPackage().getImplementationVersion() != null) ? Metrics.class.getPackage().getImplementationVersion() : "unknown")); - - metrics.addCustomChart(new Metrics.DrilldownPie("java_version", () -> { - Map> map = new HashMap<>(); -diff --git a/src/main/java/com/destroystokyo/paper/util/misc/AreaMap.java b/src/main/java/com/destroystokyo/paper/util/misc/AreaMap.java -index 41b9405d6759d865e0d14dd4f95163e9690e967d..091b1ae822e1c0517e59572e7a9bda11e998c0ee 100644 ---- a/src/main/java/com/destroystokyo/paper/util/misc/AreaMap.java -+++ b/src/main/java/com/destroystokyo/paper/util/misc/AreaMap.java -@@ -26,7 +26,7 @@ public abstract class AreaMap { - - // we use linked for better iteration. - // map of: coordinate to set of objects in coordinate -- protected final Long2ObjectOpenHashMap> areaMap = new Long2ObjectOpenHashMap<>(1024, 0.7f); -+ protected Long2ObjectOpenHashMap> areaMap = new Long2ObjectOpenHashMap<>(1024, 0.7f); // Pufferfish - not actually final - protected final PooledLinkedHashSets pooledHashSets; - - protected final ChangeCallback addCallback; -@@ -160,7 +160,8 @@ public abstract class AreaMap { - protected abstract PooledLinkedHashSets.PooledObjectLinkedOpenHashSet getEmptySetFor(final E object); - - // expensive op, only for debug -- protected void validate(final E object, final int viewDistance) { -+ protected void validate0(final E object, final int viewDistance) { // Pufferfish - rename this thing just in case it gets used I'd rather a compile time error. -+ if (true) throw new UnsupportedOperationException(); // Pufferfish - not going to put in the effort to fix this if it doesn't ever get used. - int entiesGot = 0; - int expectedEntries = (2 * viewDistance + 1); - expectedEntries *= expectedEntries; -diff --git a/src/main/java/com/destroystokyo/paper/util/misc/PlayerAreaMap.java b/src/main/java/com/destroystokyo/paper/util/misc/PlayerAreaMap.java -index 46954db7ecd35ac4018fdf476df7c8020d7ce6c8..1ad890a244bdf6df48a8db68cb43450e08c788a6 100644 ---- a/src/main/java/com/destroystokyo/paper/util/misc/PlayerAreaMap.java -+++ b/src/main/java/com/destroystokyo/paper/util/misc/PlayerAreaMap.java -@@ -5,7 +5,7 @@ import net.minecraft.server.level.ServerPlayer; - /** - * @author Spottedleaf - */ --public final class PlayerAreaMap extends AreaMap { -+public class PlayerAreaMap extends AreaMap { // Pufferfish - not actually final - - public PlayerAreaMap() { - super(); -diff --git a/src/main/java/gg/airplane/structs/FluidDirectionCache.java b/src/main/java/gg/airplane/structs/FluidDirectionCache.java -new file mode 100644 -index 0000000000000000000000000000000000000000..aa8467b9dda1f7707e41f50ac7b3e9d7343723ec ---- /dev/null -+++ b/src/main/java/gg/airplane/structs/FluidDirectionCache.java -@@ -0,0 +1,136 @@ -+package gg.airplane.structs; -+ -+import it.unimi.dsi.fastutil.HashCommon; -+ -+/** -+ * This is a replacement for the cache used in FluidTypeFlowing. -+ * The requirements for the previous cache were: -+ * - Store 200 entries -+ * - Look for the flag in the cache -+ * - If it exists, move to front of cache -+ * - If it doesn't exist, remove last entry in cache and insert in front -+ * -+ * This class accomplishes something similar, however has a few different -+ * requirements put into place to make this more optimize: -+ * -+ * - maxDistance is the most amount of entries to be checked, instead -+ * of having to check the entire list. -+ * - In combination with that, entries are all tracked by age and how -+ * frequently they're used. This enables us to remove old entries, -+ * without constantly shifting any around. -+ * -+ * Usage of the previous map would have to reset the head every single usage, -+ * shifting the entire map. Here, nothing happens except an increment when -+ * the cache is hit, and when it needs to replace an old element only a single -+ * element is modified. -+ */ -+public class FluidDirectionCache { -+ -+ private static class FluidDirectionEntry { -+ private final T data; -+ private final boolean flag; -+ private int uses = 0; -+ private int age = 0; -+ -+ private FluidDirectionEntry(T data, boolean flag) { -+ this.data = data; -+ this.flag = flag; -+ } -+ -+ public int getValue() { -+ return this.uses - (this.age >> 1); // age isn't as important as uses -+ } -+ -+ public void incrementUses() { -+ this.uses = this.uses + 1 & Integer.MAX_VALUE; -+ } -+ -+ public void incrementAge() { -+ this.age = this.age + 1 & Integer.MAX_VALUE; -+ } -+ } -+ -+ private final FluidDirectionEntry[] entries; -+ private final int mask; -+ private final int maxDistance; // the most amount of entries to check for a value -+ -+ public FluidDirectionCache(int size) { -+ int arraySize = HashCommon.nextPowerOfTwo(size); -+ this.entries = new FluidDirectionEntry[arraySize]; -+ this.mask = arraySize - 1; -+ this.maxDistance = Math.min(arraySize, 4); -+ } -+ -+ public Boolean getValue(T data) { -+ FluidDirectionEntry curr; -+ int pos; -+ -+ if ((curr = this.entries[pos = HashCommon.mix(data.hashCode()) & this.mask]) == null) { -+ return null; -+ } else if (data.equals(curr.data)) { -+ curr.incrementUses(); -+ return curr.flag; -+ } -+ -+ int checked = 1; // start at 1 because we already checked the first spot above -+ -+ while ((curr = this.entries[pos = (pos + 1) & this.mask]) != null) { -+ if (data.equals(curr.data)) { -+ curr.incrementUses(); -+ return curr.flag; -+ } else if (++checked >= this.maxDistance) { -+ break; -+ } -+ } -+ -+ return null; -+ } -+ -+ public void putValue(T data, boolean flag) { -+ FluidDirectionEntry curr; -+ int pos; -+ -+ if ((curr = this.entries[pos = HashCommon.mix(data.hashCode()) & this.mask]) == null) { -+ this.entries[pos] = new FluidDirectionEntry<>(data, flag); // add -+ return; -+ } else if (data.equals(curr.data)) { -+ curr.incrementUses(); -+ return; -+ } -+ -+ int checked = 1; // start at 1 because we already checked the first spot above -+ -+ while ((curr = this.entries[pos = (pos + 1) & this.mask]) != null) { -+ if (data.equals(curr.data)) { -+ curr.incrementUses(); -+ return; -+ } else if (++checked >= this.maxDistance) { -+ this.forceAdd(data, flag); -+ return; -+ } -+ } -+ -+ this.entries[pos] = new FluidDirectionEntry<>(data, flag); // add -+ } -+ -+ private void forceAdd(T data, boolean flag) { -+ int expectedPos = HashCommon.mix(data.hashCode()) & this.mask; -+ -+ int toRemovePos = expectedPos; -+ FluidDirectionEntry entryToRemove = this.entries[toRemovePos]; -+ -+ for (int i = expectedPos + 1; i < expectedPos + this.maxDistance; i++) { -+ int pos = i & this.mask; -+ FluidDirectionEntry entry = this.entries[pos]; -+ if (entry.getValue() < entryToRemove.getValue()) { -+ toRemovePos = pos; -+ entryToRemove = entry; -+ } -+ -+ entry.incrementAge(); // use this as a mechanism to age the other entries -+ } -+ -+ // remove the least used/oldest entry -+ this.entries[toRemovePos] = new FluidDirectionEntry(data, flag); -+ } -+} -diff --git a/src/main/java/gg/airplane/structs/ItemListWithBitset.java b/src/main/java/gg/airplane/structs/ItemListWithBitset.java -new file mode 100644 -index 0000000000000000000000000000000000000000..1b7a4ee47f4445d7f2ac91d3a73ae113edbdddb2 ---- /dev/null -+++ b/src/main/java/gg/airplane/structs/ItemListWithBitset.java -@@ -0,0 +1,114 @@ -+package gg.airplane.structs; -+ -+import net.minecraft.core.NonNullList; -+import net.minecraft.world.item.ItemStack; -+import org.apache.commons.lang.Validate; -+import org.jetbrains.annotations.NotNull; -+import org.jetbrains.annotations.Nullable; -+ -+import java.util.AbstractList; -+import java.util.Arrays; -+import java.util.List; -+ -+public class ItemListWithBitset extends AbstractList { -+ public static ItemListWithBitset fromList(List list) { -+ if (list instanceof ItemListWithBitset ours) { -+ return ours; -+ } -+ return new ItemListWithBitset(list); -+ } -+ -+ private static ItemStack[] createArray(int size) { -+ ItemStack[] array = new ItemStack[size]; -+ Arrays.fill(array, ItemStack.EMPTY); -+ return array; -+ } -+ -+ private final ItemStack[] items; -+ -+ private long bitSet = 0; -+ private final long allBits; -+ -+ private static class OurNonNullList extends NonNullList { -+ protected OurNonNullList(List delegate) { -+ super(delegate, ItemStack.EMPTY); -+ } -+ } -+ -+ public final NonNullList nonNullList = new OurNonNullList(this); -+ -+ private ItemListWithBitset(List list) { -+ this(list.size()); -+ -+ for (int i = 0; i < list.size(); i++) { -+ this.set(i, list.get(i)); -+ } -+ } -+ -+ public ItemListWithBitset(int size) { -+ Validate.isTrue(size < Long.BYTES * 8, "size is too large"); -+ -+ this.items = createArray(size); -+ this.allBits = ((1L << size) - 1); -+ } -+ -+ public boolean isCompletelyEmpty() { -+ return this.bitSet == 0; -+ } -+ -+ public boolean hasFullStacks() { -+ return (this.bitSet & this.allBits) == allBits; -+ } -+ -+ @Override -+ public ItemStack set(int index, @NotNull ItemStack itemStack) { -+ ItemStack existing = this.items[index]; -+ -+ this.items[index] = itemStack; -+ -+ if (itemStack == ItemStack.EMPTY) { -+ this.bitSet &= ~(1L << index); -+ } else { -+ this.bitSet |= 1L << index; -+ } -+ -+ return existing; -+ } -+ -+ @NotNull -+ @Override -+ public ItemStack get(int var0) { -+ return this.items[var0]; -+ } -+ -+ @Override -+ public int size() { -+ return this.items.length; -+ } -+ -+ @Override -+ public void clear() { -+ Arrays.fill(this.items, ItemStack.EMPTY); -+ } -+ -+ // these are unsupported for block inventories which have a static size -+ @Override -+ public void add(int var0, ItemStack var1) { -+ throw new UnsupportedOperationException(); -+ } -+ -+ @Override -+ public ItemStack remove(int var0) { -+ throw new UnsupportedOperationException(); -+ } -+ -+ @Override -+ public String toString() { -+ return "ItemListWithBitset{" + -+ "items=" + Arrays.toString(items) + -+ ", bitSet=" + Long.toString(bitSet, 2) + -+ ", allBits=" + Long.toString(allBits, 2) + -+ ", size=" + this.items.length + -+ '}'; -+ } -+} -diff --git a/src/main/java/gg/airplane/structs/Long2FloatAgingCache.java b/src/main/java/gg/airplane/structs/Long2FloatAgingCache.java -new file mode 100644 -index 0000000000000000000000000000000000000000..a7f297ebb569f7c1f205e967ca485be70013a714 ---- /dev/null -+++ b/src/main/java/gg/airplane/structs/Long2FloatAgingCache.java -@@ -0,0 +1,119 @@ -+package gg.airplane.structs; -+ -+import it.unimi.dsi.fastutil.HashCommon; -+ -+/** -+ * A replacement for the cache used in Biome. -+ */ -+public class Long2FloatAgingCache { -+ -+ private static class AgingEntry { -+ private long data; -+ private float value; -+ private int uses = 0; -+ private int age = 0; -+ -+ private AgingEntry(long data, float value) { -+ this.data = data; -+ this.value = value; -+ } -+ -+ public void replace(long data, float flag) { -+ this.data = data; -+ this.value = flag; -+ } -+ -+ public int getValue() { -+ return this.uses - (this.age >> 1); // age isn't as important as uses -+ } -+ -+ public void incrementUses() { -+ this.uses = this.uses + 1 & Integer.MAX_VALUE; -+ } -+ -+ public void incrementAge() { -+ this.age = this.age + 1 & Integer.MAX_VALUE; -+ } -+ } -+ -+ private final AgingEntry[] entries; -+ private final int mask; -+ private final int maxDistance; // the most amount of entries to check for a value -+ -+ public Long2FloatAgingCache(int size) { -+ int arraySize = HashCommon.nextPowerOfTwo(size); -+ this.entries = new AgingEntry[arraySize]; -+ this.mask = arraySize - 1; -+ this.maxDistance = Math.min(arraySize, 4); -+ } -+ -+ public float getValue(long data) { -+ AgingEntry curr; -+ int pos; -+ -+ if ((curr = this.entries[pos = HashCommon.mix(HashCommon.long2int(data)) & this.mask]) == null) { -+ return Float.NaN; -+ } else if (data == curr.data) { -+ curr.incrementUses(); -+ return curr.value; -+ } -+ -+ int checked = 1; // start at 1 because we already checked the first spot above -+ -+ while ((curr = this.entries[pos = (pos + 1) & this.mask]) != null) { -+ if (data == curr.data) { -+ curr.incrementUses(); -+ return curr.value; -+ } else if (++checked >= this.maxDistance) { -+ break; -+ } -+ } -+ -+ return Float.NaN; -+ } -+ -+ public void putValue(long data, float value) { -+ AgingEntry curr; -+ int pos; -+ -+ if ((curr = this.entries[pos = HashCommon.mix(HashCommon.long2int(data)) & this.mask]) == null) { -+ this.entries[pos] = new AgingEntry(data, value); // add -+ return; -+ } else if (data == curr.data) { -+ curr.incrementUses(); -+ return; -+ } -+ -+ int checked = 1; // start at 1 because we already checked the first spot above -+ -+ while ((curr = this.entries[pos = (pos + 1) & this.mask]) != null) { -+ if (data == curr.data) { -+ curr.incrementUses(); -+ return; -+ } else if (++checked >= this.maxDistance) { -+ this.forceAdd(data, value); -+ return; -+ } -+ } -+ -+ this.entries[pos] = new AgingEntry(data, value); // add -+ } -+ -+ private void forceAdd(long data, float value) { -+ int expectedPos = HashCommon.mix(HashCommon.long2int(data)) & this.mask; -+ AgingEntry entryToRemove = this.entries[expectedPos]; -+ -+ for (int i = expectedPos + 1; i < expectedPos + this.maxDistance; i++) { -+ int pos = i & this.mask; -+ AgingEntry entry = this.entries[pos]; -+ if (entry.getValue() < entryToRemove.getValue()) { -+ entryToRemove = entry; -+ } -+ -+ entry.incrementAge(); // use this as a mechanism to age the other entries -+ } -+ -+ // remove the least used/oldest entry -+ entryToRemove.replace(data, value); -+ } -+} -diff --git a/src/main/java/gg/pufferfish/pufferfish/PufferfishCommand.java b/src/main/java/gg/pufferfish/pufferfish/PufferfishCommand.java -new file mode 100644 -index 0000000000000000000000000000000000000000..020368da69b9a492155f6de6297f74732f4ab6ea ---- /dev/null -+++ b/src/main/java/gg/pufferfish/pufferfish/PufferfishCommand.java -@@ -0,0 +1,68 @@ -+package gg.pufferfish.pufferfish; -+ -+import java.io.IOException; -+import java.util.Collections; -+import java.util.List; -+import java.util.stream.Collectors; -+import java.util.stream.Stream; -+import net.kyori.adventure.text.Component; -+import net.kyori.adventure.text.format.NamedTextColor; -+import net.md_5.bungee.api.ChatColor; -+import net.minecraft.server.MinecraftServer; -+import org.bukkit.Bukkit; -+import org.bukkit.Location; -+import org.bukkit.command.Command; -+import org.bukkit.command.CommandSender; -+ -+public class PufferfishCommand extends Command { -+ -+ public PufferfishCommand() { -+ super("pufferfish"); -+ this.description = "Pufferfish related commands"; -+ this.usageMessage = "/pufferfish [reload | version]"; -+ this.setPermission("bukkit.command.pufferfish"); -+ } -+ -+ public static void init() { -+ MinecraftServer.getServer().server.getCommandMap().register("pufferfish", "Pufferfish", new PufferfishCommand()); -+ } -+ -+ @Override -+ public List tabComplete(CommandSender sender, String alias, String[] args, Location location) throws IllegalArgumentException { -+ if (args.length == 1) { -+ return Stream.of("reload", "version") -+ .filter(arg -> arg.startsWith(args[0].toLowerCase())) -+ .collect(Collectors.toList()); -+ } -+ return Collections.emptyList(); -+ } -+ -+ @Override -+ public boolean execute(CommandSender sender, String commandLabel, String[] args) { -+ if (!testPermission(sender)) return true; -+ String prefix = ChatColor.of("#12fff6") + "" + ChatColor.BOLD + "Pufferfish » " + ChatColor.of("#e8f9f9"); -+ -+ if (args.length != 1) { -+ sender.sendMessage(prefix + "Usage: " + usageMessage); -+ args = new String[]{"version"}; -+ } -+ -+ if (args[0].equalsIgnoreCase("reload")) { -+ MinecraftServer console = MinecraftServer.getServer(); -+ try { -+ PufferfishConfig.load(); -+ } catch (IOException e) { -+ sender.sendMessage(Component.text("Failed to reload.", NamedTextColor.RED)); -+ e.printStackTrace(); -+ return true; -+ } -+ console.server.reloadCount++; -+ -+ Command.broadcastCommandMessage(sender, prefix + "Pufferfish configuration has been reloaded."); -+ } else if (args[0].equalsIgnoreCase("version")) { -+ Command.broadcastCommandMessage(sender, prefix + "This server is running " + Bukkit.getName() + " version " + Bukkit.getVersion() + " (Implementing API version " + Bukkit.getBukkitVersion() + ")"); -+ } -+ -+ return true; -+ } -+} -diff --git a/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java b/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java -new file mode 100644 -index 0000000000000000000000000000000000000000..ed9c8e882739c02d0d04129d251e4c726b422c07 ---- /dev/null -+++ b/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java -@@ -0,0 +1,283 @@ -+package gg.pufferfish.pufferfish; -+ -+import gg.pufferfish.pufferfish.simd.SIMDDetection; -+import java.io.File; -+import java.io.IOException; -+import java.util.Collections; -+import java.util.Locale; -+import java.util.Map; -+import net.minecraft.server.MinecraftServer; -+import net.minecraft.tags.TagKey; -+import org.apache.logging.log4j.Level; -+import org.bukkit.configuration.ConfigurationSection; -+import net.minecraft.core.Registry; -+import net.minecraft.world.entity.EntityType; -+import java.lang.reflect.Method; -+import java.lang.reflect.Modifier; -+import java.util.List; -+import net.minecraft.server.MinecraftServer; -+import org.apache.logging.log4j.Level; -+import org.bukkit.configuration.ConfigurationSection; -+import org.bukkit.configuration.MemoryConfiguration; -+import org.jetbrains.annotations.Nullable; -+import org.simpleyaml.configuration.comments.CommentType; -+import org.simpleyaml.configuration.file.YamlFile; -+import org.simpleyaml.exceptions.InvalidConfigurationException; -+ -+public class PufferfishConfig { -+ -+ private static final YamlFile config = new YamlFile(); -+ private static int updates = 0; -+ -+ private static ConfigurationSection convertToBukkit(org.simpleyaml.configuration.ConfigurationSection section) { -+ ConfigurationSection newSection = new MemoryConfiguration(); -+ for (String key : section.getKeys(false)) { -+ if (section.isConfigurationSection(key)) { -+ newSection.set(key, convertToBukkit(section.getConfigurationSection(key))); -+ } else { -+ newSection.set(key, section.get(key)); -+ } -+ } -+ return newSection; -+ } -+ -+ public static ConfigurationSection getConfigCopy() { -+ return convertToBukkit(config); -+ } -+ -+ public static int getUpdates() { -+ return updates; -+ } -+ -+ public static void load() throws IOException { -+ File configFile = new File("pufferfish.yml"); -+ -+ if (configFile.exists()) { -+ try { -+ config.load(configFile); -+ } catch (InvalidConfigurationException e) { -+ throw new IOException(e); -+ } -+ } -+ -+ getString("info.version", "1.0"); -+ setComment("info", -+ "Pufferfish Configuration", -+ "Check out Pufferfish Host for maximum performance server hosting: https://pufferfish.host", -+ "Join our Discord for support: https://discord.gg/reZw4vQV9H", -+ "Download new builds at https://ci.pufferfish.host/job/Pufferfish"); -+ -+ for (Method method : PufferfishConfig.class.getDeclaredMethods()) { -+ if (Modifier.isStatic(method.getModifiers()) && Modifier.isPrivate(method.getModifiers()) && method.getParameterCount() == 0 && -+ method.getReturnType() == Void.TYPE && !method.getName().startsWith("lambda")) { -+ method.setAccessible(true); -+ try { -+ method.invoke(null); -+ } catch (Throwable t) { -+ MinecraftServer.LOGGER.warn("Failed to load configuration option from " + method.getName(), t); -+ } -+ } -+ } -+ -+ updates++; -+ -+ config.save(configFile); -+ -+ // Attempt to detect vectorization -+ try { -+ SIMDDetection.isEnabled = SIMDDetection.canEnable(PufferfishLogger.LOGGER); -+ SIMDDetection.versionLimited = SIMDDetection.getJavaVersion() != 17 && SIMDDetection.getJavaVersion() != 18; -+ } catch (NoClassDefFoundError | Exception ignored) {} -+ -+ if (SIMDDetection.isEnabled) { -+ PufferfishLogger.LOGGER.info("SIMD operations detected as functional. Will replace some operations with faster versions."); -+ } else if (SIMDDetection.versionLimited) { -+ PufferfishLogger.LOGGER.warning("Will not enable SIMD! These optimizations are only safely supported on Java 17 and Java 18."); -+ } else { -+ PufferfishLogger.LOGGER.warning("SIMD operations are available for your server, but are not configured!"); -+ PufferfishLogger.LOGGER.warning("To enable additional optimizations, add \"--add-modules=jdk.incubator.vector\" to your startup flags, BEFORE the \"-jar\"."); -+ PufferfishLogger.LOGGER.warning("If you have already added this flag, then SIMD operations are not supported on your JVM or CPU."); -+ PufferfishLogger.LOGGER.warning("Debug: Java: " + System.getProperty("java.version") + ", test run: " + SIMDDetection.testRun); -+ } -+ } -+ -+ private static void setComment(String key, String... comment) { -+ if (config.contains(key)) { -+ config.setComment(key, String.join("\n", comment), CommentType.BLOCK); -+ } -+ } -+ -+ private static void ensureDefault(String key, Object defaultValue, String... comment) { -+ if (!config.contains(key)) { -+ config.set(key, defaultValue); -+ config.setComment(key, String.join("\n", comment), CommentType.BLOCK); -+ } -+ } -+ -+ private static boolean getBoolean(String key, boolean defaultValue, String... comment) { -+ return getBoolean(key, null, defaultValue, comment); -+ } -+ -+ private static boolean getBoolean(String key, @Nullable String oldKey, boolean defaultValue, String... comment) { -+ ensureDefault(key, defaultValue, comment); -+ return config.getBoolean(key, defaultValue); -+ } -+ -+ private static int getInt(String key, int defaultValue, String... comment) { -+ return getInt(key, null, defaultValue, comment); -+ } -+ -+ private static int getInt(String key, @Nullable String oldKey, int defaultValue, String... comment) { -+ ensureDefault(key, defaultValue, comment); -+ return config.getInt(key, defaultValue); -+ } -+ -+ private static double getDouble(String key, double defaultValue, String... comment) { -+ return getDouble(key, null, defaultValue, comment); -+ } -+ -+ private static double getDouble(String key, @Nullable String oldKey, double defaultValue, String... comment) { -+ ensureDefault(key, defaultValue, comment); -+ return config.getDouble(key, defaultValue); -+ } -+ -+ private static String getString(String key, String defaultValue, String... comment) { -+ return getOldString(key, null, defaultValue, comment); -+ } -+ -+ private static String getOldString(String key, @Nullable String oldKey, String defaultValue, String... comment) { -+ ensureDefault(key, defaultValue, comment); -+ return config.getString(key, defaultValue); -+ } -+ -+ private static List getStringList(String key, List defaultValue, String... comment) { -+ return getStringList(key, null, defaultValue, comment); -+ } -+ -+ private static List getStringList(String key, @Nullable String oldKey, List defaultValue, String... comment) { -+ ensureDefault(key, defaultValue, comment); -+ return config.getStringList(key); -+ } -+ -+ public static String sentryDsn; -+ private static void sentry() { -+ String sentryEnvironment = System.getenv("SENTRY_DSN"); -+ String sentryConfig = getString("sentry-dsn", "", "Sentry DSN for improved error logging, leave blank to disable", "Obtain from https://sentry.io/"); -+ -+ sentryDsn = sentryEnvironment == null ? sentryConfig : sentryEnvironment; -+ if (sentryDsn != null && !sentryDsn.isBlank()) { -+ gg.pufferfish.pufferfish.sentry.SentryManager.init(); -+ } -+ } -+ -+ public static boolean enableBooks; -+ private static void books() { -+ enableBooks = getBoolean("enable-books", true, -+ "Whether or not books should be writeable.", -+ "Servers that anticipate being a target for duping may want to consider", -+ "disabling this option.", -+ "This can be overridden per-player with the permission pufferfish.usebooks"); -+ } -+ -+ public static boolean enableSuffocationOptimization; -+ private static void suffocationOptimization() { -+ enableSuffocationOptimization = getBoolean("enable-suffocation-optimization", true, -+ "Optimizes the suffocation check by selectively skipping", -+ "the check in a way that still appears vanilla. This should", -+ "be left enabled on most servers, but is provided as a", -+ "configuration option if the vanilla deviation is undesirable."); -+ } -+ -+ public static boolean enableAsyncMobSpawning; -+ public static boolean asyncMobSpawningInitialized; -+ private static void asyncMobSpawning() { -+ boolean temp = getBoolean("enable-async-mob-spawning", true, -+ "Whether or not asynchronous mob spawning should be enabled.", -+ "On servers with many entities, this can improve performance by up to 15%. You must have", -+ "paper's per-player-mob-spawns setting set to true for this to work.", -+ "One quick note - this does not actually spawn mobs async (that would be very unsafe).", -+ "This just offloads some expensive calculations that are required for mob spawning."); -+ -+ // This prevents us from changing the value during a reload. -+ if (!asyncMobSpawningInitialized) { -+ asyncMobSpawningInitialized = true; -+ enableAsyncMobSpawning = temp; -+ } -+ } -+ -+ public static int maxProjectileLoadsPerTick; -+ public static int maxProjectileLoadsPerProjectile; -+ private static void projectileLoading() { -+ maxProjectileLoadsPerTick = getInt("projectile.max-loads-per-tick", 10, "Controls how many chunks are allowed", "to be sync loaded by projectiles in a tick."); -+ maxProjectileLoadsPerProjectile = getInt("projectile.max-loads-per-projectile", 10, "Controls how many chunks a projectile", "can load in its lifetime before it gets", "automatically removed."); -+ -+ setComment("projectile", "Optimizes projectile settings"); -+ } -+ -+ -+ public static boolean dearEnabled; -+ public static int startDistance; -+ public static int startDistanceSquared; -+ public static int maximumActivationPrio; -+ public static int activationDistanceMod; -+ -+ private static void dynamicActivationOfBrains() throws IOException { -+ dearEnabled = getBoolean("dab.enabled", "activation-range.enabled", true); -+ startDistance = getInt("dab.start-distance", "activation-range.start-distance", 12, -+ "This value determines how far away an entity has to be", -+ "from the player to start being effected by DEAR."); -+ startDistanceSquared = startDistance * startDistance; -+ maximumActivationPrio = getInt("dab.max-tick-freq", "activation-range.max-tick-freq", 20, -+ "This value defines how often in ticks, the furthest entity", -+ "will get their pathfinders and behaviors ticked. 20 = 1s"); -+ activationDistanceMod = getInt("dab.activation-dist-mod", "activation-range.activation-dist-mod", 8, -+ "This value defines how much distance modifies an entity's", -+ "tick frequency. freq = (distanceToPlayer^2) / (2^value)", -+ "If you want further away entities to tick less often, use 7.", -+ "If you want further away entities to tick more often, try 9."); -+ -+ for (EntityType entityType : Registry.ENTITY_TYPE) { -+ entityType.dabEnabled = true; // reset all, before setting the ones to true -+ } -+ getStringList("dab.blacklisted-entities", "activation-range.blacklisted-entities", Collections.emptyList(), "A list of entities to ignore for activation") -+ .forEach(name -> EntityType.byString(name).ifPresentOrElse(entityType -> { -+ entityType.dabEnabled = false; -+ }, () -> MinecraftServer.LOGGER.warn("Unknown entity \"" + name + "\""))); -+ -+ setComment("dab", "Optimizes entity brains when", "they're far away from the player"); -+ } -+ -+ public static Map projectileTimeouts; -+ private static void projectileTimeouts() { -+ // Set some defaults -+ getInt("entity_timeouts.SNOWBALL", -1); -+ getInt("entity_timeouts.LLAMA_SPIT", -1); -+ setComment("entity_timeouts", -+ "These values define a entity's maximum lifespan. If an", -+ "entity is in this list and it has survived for longer than", -+ "that number of ticks, then it will be removed. Setting a value to", -+ "-1 disables this feature."); -+ -+ for (EntityType entityType : Registry.ENTITY_TYPE) { -+ String type = EntityType.getKey(entityType).getPath().toUpperCase(Locale.ROOT); -+ entityType.ttl = config.getInt("entity_timeouts." + type, -1); -+ } -+ } -+ -+ public static boolean throttleInactiveGoalSelectorTick; -+ private static void inactiveGoalSelectorThrottle() { -+ getBoolean("inactive-goal-selector-throttle", "inactive-goal-selector-disable", true, -+ "Throttles the AI goal selector in entity inactive ticks.", -+ "This can improve performance by a few percent, but has minor gameplay implications."); -+ } -+ -+ -+ public static boolean disableMethodProfiler; -+ public static boolean disableOutOfOrderChat; -+ private static void miscSettings() { -+ disableMethodProfiler = getBoolean("misc.disable-method-profiler", true); -+ disableOutOfOrderChat = getBoolean("misc.disable-out-of-order-chat", false); -+ setComment("misc", "Settings for things that don't belong elsewhere"); -+ } -+ -+} -diff --git a/src/main/java/gg/pufferfish/pufferfish/PufferfishLogger.java b/src/main/java/gg/pufferfish/pufferfish/PufferfishLogger.java -new file mode 100644 -index 0000000000000000000000000000000000000000..53f2df00c6809618a9ee3d2ea72e85e8052fbcf1 ---- /dev/null -+++ b/src/main/java/gg/pufferfish/pufferfish/PufferfishLogger.java -@@ -0,0 +1,16 @@ -+package gg.pufferfish.pufferfish; -+ -+import java.util.logging.Level; -+import java.util.logging.Logger; -+import org.bukkit.Bukkit; -+ -+public class PufferfishLogger extends Logger { -+ public static final PufferfishLogger LOGGER = new PufferfishLogger(); -+ -+ private PufferfishLogger() { -+ super("Pufferfish", null); -+ -+ setParent(Bukkit.getLogger()); -+ setLevel(Level.ALL); -+ } -+} -diff --git a/src/main/java/gg/pufferfish/pufferfish/PufferfishVersionFetcher.java b/src/main/java/gg/pufferfish/pufferfish/PufferfishVersionFetcher.java -new file mode 100644 -index 0000000000000000000000000000000000000000..e877921370f6009a4bd204d9b17d2d58834b8822 ---- /dev/null -+++ b/src/main/java/gg/pufferfish/pufferfish/PufferfishVersionFetcher.java -@@ -0,0 +1,136 @@ -+package gg.pufferfish.pufferfish; -+ -+import static net.kyori.adventure.text.Component.text; -+import static net.kyori.adventure.text.format.NamedTextColor.GREEN; -+import static net.kyori.adventure.text.format.NamedTextColor.RED; -+ -+import com.destroystokyo.paper.VersionHistoryManager; -+import com.destroystokyo.paper.util.VersionFetcher; -+import com.google.gson.Gson; -+import com.google.gson.JsonObject; -+import java.io.IOException; -+import java.net.URI; -+import java.net.http.HttpClient; -+import java.net.http.HttpRequest; -+import java.net.http.HttpResponse; -+import java.nio.charset.StandardCharsets; -+import java.util.concurrent.TimeUnit; -+import java.util.logging.Level; -+import java.util.logging.Logger; -+import net.kyori.adventure.text.Component; -+import net.kyori.adventure.text.JoinConfiguration; -+import net.kyori.adventure.text.format.NamedTextColor; -+import net.kyori.adventure.text.format.TextDecoration; -+import org.bukkit.craftbukkit.CraftServer; -+import org.jetbrains.annotations.NotNull; -+import org.jetbrains.annotations.Nullable; -+ -+public class PufferfishVersionFetcher implements VersionFetcher { -+ -+ private static final Logger LOGGER = Logger.getLogger("PufferfishVersionFetcher"); -+ private static final HttpClient client = HttpClient.newHttpClient(); -+ -+ private static final URI JENKINS_URI = URI.create("https://ci.pufferfish.host/job/Pufferfish-1.19/lastSuccessfulBuild/buildNumber"); -+ private static final String GITHUB_FORMAT = "https://api.github.com/repos/pufferfish-gg/Pufferfish/compare/ver/1.19...%s"; -+ -+ private static final HttpResponse.BodyHandler JSON_OBJECT_BODY_HANDLER = responseInfo -> HttpResponse.BodySubscribers -+ .mapping( -+ HttpResponse.BodySubscribers.ofString(StandardCharsets.UTF_8), -+ string -> new Gson().fromJson(string, JsonObject.class) -+ ); -+ -+ @Override -+ public long getCacheTime() { -+ return TimeUnit.MINUTES.toMillis(30); -+ } -+ -+ @Override -+ public @NotNull Component getVersionMessage(final @NotNull String serverVersion) { -+ final String[] parts = CraftServer.class.getPackage().getImplementationVersion().split("-"); -+ @NotNull Component component; -+ -+ if (parts.length != 3) { -+ component = text("Unknown server version.", RED); -+ } else { -+ final String versionString = parts[2]; -+ -+ try { -+ component = this.fetchJenkinsVersion(Integer.parseInt(versionString)); -+ } catch (NumberFormatException e) { -+ component = this.fetchGithubVersion(versionString.substring(1, versionString.length() - 1)); -+ } -+ } -+ -+ final @Nullable Component history = this.getHistory(); -+ return history != null ? Component -+ .join(JoinConfiguration.noSeparators(), component, Component.newline(), this.getHistory()) : component; -+ } -+ -+ private @NotNull Component fetchJenkinsVersion(final int versionNumber) { -+ final HttpRequest request = HttpRequest.newBuilder(JENKINS_URI).build(); -+ try { -+ final HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); -+ if (response.statusCode() != 200) { -+ return text("Received invalid status code (" + response.statusCode() + ") from server.", RED); -+ } -+ -+ int latestVersionNumber; -+ try { -+ latestVersionNumber = Integer.parseInt(response.body()); -+ } catch (NumberFormatException e) { -+ LOGGER.log(Level.WARNING, "Received invalid response from Jenkins \"" + response.body() + "\"."); -+ return text("Received invalid response from server.", RED); -+ } -+ -+ final int versionDiff = latestVersionNumber - versionNumber; -+ return this.getResponseMessage(versionDiff); -+ } catch (IOException | InterruptedException e) { -+ LOGGER.log(Level.WARNING, "Failed to look up version from Jenkins", e); -+ return text("Failed to retrieve version from server.", RED); -+ } -+ } -+ -+ // Based off code contributed by Techcable in Paper/GH-65 -+ private @NotNull Component fetchGithubVersion(final @NotNull String hash) { -+ final URI uri = URI.create(String.format(GITHUB_FORMAT, hash)); -+ final HttpRequest request = HttpRequest.newBuilder(uri).build(); -+ try { -+ final HttpResponse response = client.send(request, JSON_OBJECT_BODY_HANDLER); -+ if (response.statusCode() != 200) { -+ return text("Received invalid status code (" + response.statusCode() + ") from server.", RED); -+ } -+ -+ final JsonObject obj = response.body(); -+ final int versionDiff = obj.get("behind_by").getAsInt(); -+ -+ return this.getResponseMessage(versionDiff); -+ } catch (IOException | InterruptedException e) { -+ LOGGER.log(Level.WARNING, "Failed to look up version from GitHub", e); -+ return text("Failed to retrieve version from server.", RED); -+ } -+ } -+ -+ private @NotNull Component getResponseMessage(final int versionDiff) { -+ return switch (Math.max(-1, Math.min(1, versionDiff))) { -+ case -1 -> text("You are running an unsupported version of Pufferfish.", RED); -+ case 0 -> text("You are on the latest version!", GREEN); -+ default -> text("You are running " + versionDiff + " version" + (versionDiff == 1 ? "" : "s") + " beyond. " + -+ "Please update your server when possible to maintain stability, security, and receive the latest optimizations.", -+ RED); -+ }; -+ } -+ -+ private @Nullable Component getHistory() { -+ final VersionHistoryManager.VersionData data = VersionHistoryManager.INSTANCE.getVersionData(); -+ if (data == null) { -+ return null; -+ } -+ -+ final String oldVersion = data.getOldVersion(); -+ if (oldVersion == null) { -+ return null; -+ } -+ -+ return Component.text("Previous version: " + oldVersion, NamedTextColor.GRAY, TextDecoration.ITALIC); -+ } -+} -\ No newline at end of file -diff --git a/src/main/java/gg/pufferfish/pufferfish/sentry/PufferfishSentryAppender.java b/src/main/java/gg/pufferfish/pufferfish/sentry/PufferfishSentryAppender.java -new file mode 100644 -index 0000000000000000000000000000000000000000..731ef11c7a025ae95ed8a757b530d834733d0621 ---- /dev/null -+++ b/src/main/java/gg/pufferfish/pufferfish/sentry/PufferfishSentryAppender.java -@@ -0,0 +1,135 @@ -+package gg.pufferfish.pufferfish.sentry; -+ -+import com.google.common.reflect.TypeToken; -+import com.google.gson.Gson; -+import io.sentry.Breadcrumb; -+import io.sentry.Sentry; -+import io.sentry.SentryEvent; -+import io.sentry.SentryLevel; -+import io.sentry.protocol.Message; -+import io.sentry.protocol.User; -+import java.util.Map; -+import org.apache.logging.log4j.Level; -+import org.apache.logging.log4j.LogManager; -+import org.apache.logging.log4j.Marker; -+import org.apache.logging.log4j.core.LogEvent; -+import org.apache.logging.log4j.core.Logger; -+import org.apache.logging.log4j.core.appender.AbstractAppender; -+import org.apache.logging.log4j.core.filter.AbstractFilter; -+ -+public class PufferfishSentryAppender extends AbstractAppender { -+ -+ private static final org.apache.logging.log4j.Logger logger = LogManager.getLogger(PufferfishSentryAppender.class); -+ private static final Gson GSON = new Gson(); -+ -+ public PufferfishSentryAppender() { -+ super("PufferfishSentryAdapter", new SentryFilter(), null); -+ } -+ -+ @Override -+ public void append(LogEvent logEvent) { -+ if (logEvent.getThrown() != null && logEvent.getLevel().isMoreSpecificThan(Level.WARN)) { -+ try { -+ logException(logEvent); -+ } catch (Exception e) { -+ logger.warn("Failed to log event with sentry", e); -+ } -+ } else { -+ try { -+ logBreadcrumb(logEvent); -+ } catch (Exception e) { -+ logger.warn("Failed to log event with sentry", e); -+ } -+ } -+ } -+ -+ private void logException(LogEvent e) { -+ SentryEvent event = new SentryEvent(e.getThrown()); -+ -+ Message sentryMessage = new Message(); -+ sentryMessage.setMessage(e.getMessage().getFormattedMessage()); -+ -+ event.setThrowable(e.getThrown()); -+ event.setLevel(getLevel(e.getLevel())); -+ event.setLogger(e.getLoggerName()); -+ event.setTransaction(e.getLoggerName()); -+ event.setExtra("thread_name", e.getThreadName()); -+ -+ boolean hasContext = e.getContextData() != null; -+ -+ if (hasContext && e.getContextData().containsKey("pufferfishsentry_playerid")) { -+ User user = new User(); -+ user.setId(e.getContextData().getValue("pufferfishsentry_playerid")); -+ user.setUsername(e.getContextData().getValue("pufferfishsentry_playername")); -+ event.setUser(user); -+ } -+ -+ if (hasContext && e.getContextData().containsKey("pufferfishsentry_pluginname")) { -+ event.setExtra("plugin.name", e.getContextData().getValue("pufferfishsentry_pluginname")); -+ event.setExtra("plugin.version", e.getContextData().getValue("pufferfishsentry_pluginversion")); -+ event.setTransaction(e.getContextData().getValue("pufferfishsentry_pluginname")); -+ } -+ -+ if (hasContext && e.getContextData().containsKey("pufferfishsentry_eventdata")) { -+ Map eventFields = GSON.fromJson((String) e.getContextData().getValue("pufferfishsentry_eventdata"), new TypeToken>() {}.getType()); -+ if (eventFields != null) { -+ event.setExtra("event", eventFields); -+ } -+ } -+ -+ Sentry.captureEvent(event); -+ } -+ -+ private void logBreadcrumb(LogEvent e) { -+ Breadcrumb breadcrumb = new Breadcrumb(); -+ -+ breadcrumb.setLevel(getLevel(e.getLevel())); -+ breadcrumb.setCategory(e.getLoggerName()); -+ breadcrumb.setType(e.getLoggerName()); -+ breadcrumb.setMessage(e.getMessage().getFormattedMessage()); -+ -+ Sentry.addBreadcrumb(breadcrumb); -+ } -+ -+ private SentryLevel getLevel(Level level) { -+ switch (level.getStandardLevel()) { -+ case TRACE: -+ case DEBUG: -+ return SentryLevel.DEBUG; -+ case WARN: -+ return SentryLevel.WARNING; -+ case ERROR: -+ return SentryLevel.ERROR; -+ case FATAL: -+ return SentryLevel.FATAL; -+ case INFO: -+ default: -+ return SentryLevel.INFO; -+ } -+ } -+ -+ private static class SentryFilter extends AbstractFilter { -+ -+ @Override -+ public Result filter(Logger logger, org.apache.logging.log4j.Level level, Marker marker, String msg, -+ Object... params) { -+ return this.filter(logger.getName()); -+ } -+ -+ @Override -+ public Result filter(Logger logger, org.apache.logging.log4j.Level level, Marker marker, Object msg, Throwable t) { -+ return this.filter(logger.getName()); -+ } -+ -+ @Override -+ public Result filter(LogEvent event) { -+ return this.filter(event == null ? null : event.getLoggerName()); -+ } -+ -+ private Result filter(String loggerName) { -+ return loggerName != null && loggerName.startsWith("gg.castaway.pufferfish.sentry") ? Result.DENY -+ : Result.NEUTRAL; -+ } -+ -+ } -+} -diff --git a/src/main/java/gg/pufferfish/pufferfish/sentry/SentryManager.java b/src/main/java/gg/pufferfish/pufferfish/sentry/SentryManager.java -new file mode 100644 -index 0000000000000000000000000000000000000000..1b29210ad0bbb4ada150f23357f0c80d331c996d ---- /dev/null -+++ b/src/main/java/gg/pufferfish/pufferfish/sentry/SentryManager.java -@@ -0,0 +1,40 @@ -+package gg.pufferfish.pufferfish.sentry; -+ -+import gg.pufferfish.pufferfish.PufferfishConfig; -+import io.sentry.Sentry; -+import org.apache.logging.log4j.LogManager; -+import org.apache.logging.log4j.Logger; -+ -+public class SentryManager { -+ -+ private static final Logger logger = LogManager.getLogger(SentryManager.class); -+ -+ private SentryManager() { -+ -+ } -+ -+ private static boolean initialized = false; -+ -+ public static synchronized void init() { -+ if (initialized) { -+ return; -+ } -+ try { -+ initialized = true; -+ -+ Sentry.init(options -> { -+ options.setDsn(PufferfishConfig.sentryDsn); -+ options.setMaxBreadcrumbs(100); -+ }); -+ -+ PufferfishSentryAppender appender = new PufferfishSentryAppender(); -+ appender.start(); -+ ((org.apache.logging.log4j.core.Logger) LogManager.getRootLogger()).addAppender(appender); -+ logger.info("Sentry logging started!"); -+ } catch (Exception e) { -+ logger.warn("Failed to initialize sentry!", e); -+ initialized = false; -+ } -+ } -+ -+} -diff --git a/src/main/java/gg/pufferfish/pufferfish/util/AsyncExecutor.java b/src/main/java/gg/pufferfish/pufferfish/util/AsyncExecutor.java -new file mode 100644 -index 0000000000000000000000000000000000000000..8e5323d5d9af25c8a85c4b34a6be76cfc54384cf ---- /dev/null -+++ b/src/main/java/gg/pufferfish/pufferfish/util/AsyncExecutor.java -@@ -0,0 +1,73 @@ -+package gg.pufferfish.pufferfish.util; -+ -+import com.google.common.collect.Queues; -+import gg.pufferfish.pufferfish.PufferfishLogger; -+import java.util.Queue; -+import java.util.concurrent.locks.Condition; -+import java.util.concurrent.locks.Lock; -+import java.util.concurrent.locks.ReentrantLock; -+import java.util.logging.Level; -+ -+public class AsyncExecutor implements Runnable { -+ -+ private final Queue jobs = Queues.newArrayDeque(); -+ private final Lock mutex = new ReentrantLock(); -+ private final Condition cond = mutex.newCondition(); -+ private final Thread thread; -+ private volatile boolean killswitch = false; -+ -+ public AsyncExecutor(String threadName) { -+ this.thread = new Thread(this, threadName); -+ } -+ -+ public void start() { -+ thread.start(); -+ } -+ -+ public void kill() { -+ killswitch = true; -+ cond.signalAll(); -+ } -+ -+ public void submit(Runnable runnable) { -+ mutex.lock(); -+ try { -+ jobs.offer(runnable); -+ cond.signalAll(); -+ } finally { -+ mutex.unlock(); -+ } -+ } -+ -+ @Override -+ public void run() { -+ while (!killswitch) { -+ try { -+ Runnable runnable = takeRunnable(); -+ if (runnable != null) { -+ runnable.run(); -+ } -+ } catch (InterruptedException e) { -+ Thread.currentThread().interrupt(); -+ } catch (Exception e) { -+ PufferfishLogger.LOGGER.log(Level.SEVERE, e, () -> "Failed to execute async job for thread " + thread.getName()); -+ } -+ } -+ } -+ -+ private Runnable takeRunnable() throws InterruptedException { -+ mutex.lock(); -+ try { -+ while (jobs.isEmpty() && !killswitch) { -+ cond.await(); -+ } -+ -+ if (jobs.isEmpty()) return null; // We've set killswitch -+ -+ return jobs.remove(); -+ } finally { -+ mutex.unlock(); -+ } -+ } -+ -+} -diff --git a/src/main/java/gg/pufferfish/pufferfish/util/AsyncPlayerAreaMap.java b/src/main/java/gg/pufferfish/pufferfish/util/AsyncPlayerAreaMap.java -new file mode 100644 -index 0000000000000000000000000000000000000000..fdcb62d12164024a5f354d60cc863821a18d1b2a ---- /dev/null -+++ b/src/main/java/gg/pufferfish/pufferfish/util/AsyncPlayerAreaMap.java -@@ -0,0 +1,31 @@ -+package gg.pufferfish.pufferfish.util; -+ -+import com.destroystokyo.paper.util.misc.PlayerAreaMap; -+import com.destroystokyo.paper.util.misc.PooledLinkedHashSets; -+import java.util.concurrent.ConcurrentHashMap; -+import net.minecraft.server.level.ServerPlayer; -+ -+public final class AsyncPlayerAreaMap extends PlayerAreaMap { -+ -+ public AsyncPlayerAreaMap() { -+ super(); -+ this.areaMap = new Long2ObjectOpenHashMapWrapper<>(new ConcurrentHashMap<>(1024, 0.7f)); -+ } -+ -+ public AsyncPlayerAreaMap(final PooledLinkedHashSets pooledHashSets) { -+ super(pooledHashSets); -+ this.areaMap = new Long2ObjectOpenHashMapWrapper<>(new ConcurrentHashMap<>(1024, 0.7f)); -+ } -+ -+ public AsyncPlayerAreaMap(final PooledLinkedHashSets pooledHashSets, final ChangeCallback addCallback, -+ final ChangeCallback removeCallback) { -+ this(pooledHashSets, addCallback, removeCallback, null); -+ } -+ -+ public AsyncPlayerAreaMap(final PooledLinkedHashSets pooledHashSets, final ChangeCallback addCallback, -+ final ChangeCallback removeCallback, final ChangeSourceCallback changeSourceCallback) { -+ super(pooledHashSets, addCallback, removeCallback, changeSourceCallback); -+ this.areaMap = new Long2ObjectOpenHashMapWrapper<>(new ConcurrentHashMap<>(1024, 0.7f)); -+ } -+ -+} -diff --git a/src/main/java/gg/pufferfish/pufferfish/util/IterableWrapper.java b/src/main/java/gg/pufferfish/pufferfish/util/IterableWrapper.java -new file mode 100644 -index 0000000000000000000000000000000000000000..c1929840254a3e6d721816f4a20415bea1742580 ---- /dev/null -+++ b/src/main/java/gg/pufferfish/pufferfish/util/IterableWrapper.java -@@ -0,0 +1,20 @@ -+package gg.pufferfish.pufferfish.util; -+ -+import java.util.Iterator; -+import org.jetbrains.annotations.NotNull; -+ -+public class IterableWrapper implements Iterable { -+ -+ private final Iterator iterator; -+ -+ public IterableWrapper(Iterator iterator) { -+ this.iterator = iterator; -+ } -+ -+ @NotNull -+ @Override -+ public Iterator iterator() { -+ return iterator; -+ } -+ -+} -diff --git a/src/main/java/gg/pufferfish/pufferfish/util/Long2ObjectOpenHashMapWrapper.java b/src/main/java/gg/pufferfish/pufferfish/util/Long2ObjectOpenHashMapWrapper.java -new file mode 100644 -index 0000000000000000000000000000000000000000..facd55463d44cb7e3d2ca6892982f5497b8dded1 ---- /dev/null -+++ b/src/main/java/gg/pufferfish/pufferfish/util/Long2ObjectOpenHashMapWrapper.java -@@ -0,0 +1,40 @@ -+package gg.pufferfish.pufferfish.util; -+ -+import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; -+import java.util.Map; -+import org.jetbrains.annotations.Nullable; -+ -+public class Long2ObjectOpenHashMapWrapper extends Long2ObjectOpenHashMap { -+ -+ private final Map backingMap; -+ -+ public Long2ObjectOpenHashMapWrapper(Map map) { -+ backingMap = map; -+ } -+ -+ @Override -+ public V put(Long key, V value) { -+ return backingMap.put(key, value); -+ } -+ -+ @Override -+ public V get(Object key) { -+ return backingMap.get(key); -+ } -+ -+ @Override -+ public V remove(Object key) { -+ return backingMap.remove(key); -+ } -+ -+ @Nullable -+ @Override -+ public V putIfAbsent(Long key, V value) { -+ return backingMap.putIfAbsent(key, value); -+ } -+ -+ @Override -+ public int size() { -+ return backingMap.size(); -+ } -+} -diff --git a/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java b/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java -index 63ec2ebb71aa0e0dbb64bbce7cd3c9494e9ce2e7..d03551e81e3ef37935cb1d963aba3df316f48ef5 100644 ---- a/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java -+++ b/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java -@@ -7,6 +7,7 @@ import net.kyori.adventure.text.Component; - import net.kyori.adventure.text.format.NamedTextColor; - import net.minecraft.network.protocol.Packet; - import net.minecraft.network.protocol.game.ServerboundPlaceRecipePacket; -+import org.bukkit.Bukkit; // Pufferfish - import org.checkerframework.checker.nullness.qual.Nullable; - import org.spongepowered.configurate.objectmapping.ConfigSerializable; - import org.spongepowered.configurate.objectmapping.meta.Comment; -@@ -16,6 +17,7 @@ import org.spongepowered.configurate.objectmapping.meta.Setting; - import java.util.List; - import java.util.Map; - import java.util.Objects; -+import java.util.logging.Level; // Pufferfish - - @SuppressWarnings({"CanBeFinal", "FieldCanBeLocal", "FieldMayBeFinal", "NotNullFieldNotInitialized", "InnerClassMayBeStatic"}) - public class GlobalConfiguration extends ConfigurationPart { -@@ -51,6 +53,7 @@ public class GlobalConfiguration extends ConfigurationPart { - - public class Timings extends ConfigurationPart.Post { - public boolean enabled = true; -+ public boolean reallyEnabled = false; - public boolean verbose = true; - public String url = "https://timings.aikar.co/"; - public boolean serverNamePrivacy = false; -@@ -64,6 +67,14 @@ public class GlobalConfiguration extends ConfigurationPart { - - @Override - public void postProcess() { -+ // Pufferfish start -+ if (enabled && !reallyEnabled) { -+ Bukkit.getLogger().log(Level.WARNING, "[Pufferfish] To improve performance, timings have been disabled by default"); -+ Bukkit.getLogger().log(Level.WARNING, "[Pufferfish] You can still use timings by using /timings on, but they will not start on server startup unless you set timings.really-enabled to true in paper.yml"); -+ Bukkit.getLogger().log(Level.WARNING, "[Pufferfish] If you would like to disable this message, either set timings.really-enabled to true or timings.enabled to false."); -+ } -+ enabled = reallyEnabled; -+ // Pufferfish end - MinecraftTimings.processConfig(this); - } - } -diff --git a/src/main/java/io/papermc/paper/util/MCUtil.java b/src/main/java/io/papermc/paper/util/MCUtil.java -index dacb00c7cb2702ae8e9c6be61ca08e41bd6009e4..b5d4c53bf1046fa52da5398491258b94f1e0fcd0 100644 ---- a/src/main/java/io/papermc/paper/util/MCUtil.java -+++ b/src/main/java/io/papermc/paper/util/MCUtil.java -@@ -209,7 +209,7 @@ public final class MCUtil { - } - - public static long getCoordinateKey(final Entity entity) { -- return ((long)(MCUtil.fastFloor(entity.getZ()) >> 4) << 32) | ((MCUtil.fastFloor(entity.getX()) >> 4) & 0xFFFFFFFFL); -+ return ((long)(entity.blockPosition.getZ() >> 4) << 32) | ((entity.blockPosition.getX() >> 4) & 0xFFFFFFFFL); // Pufferfish - eliminate double->long cast in hotpath - } - - public static long getCoordinateKey(final ChunkPos pair) { -diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 6dc6c3bccb4ba34268a87b0754c87eb1e0df4135..3cadf20891888b56ac70798d581d6a044a98c0a3 100644 ---- a/src/main/java/net/minecraft/server/MinecraftServer.java -+++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -298,6 +298,8 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop S spin(Function serverFactory) { - AtomicReference atomicreference = new AtomicReference(); -@@ -1654,7 +1656,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop // Spigot - Spigot > // CraftBukkit - cb > vanilla! -+ return "Pufferfish"; // Pufferfish - Pufferfish > // Paper - Paper > // Spigot - Spigot > // CraftBukkit - cb > vanilla! - } - - public SystemReport fillSystemReport(SystemReport details) { -@@ -2233,6 +2235,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop passengers = parent.getPassengers(); -+ -+ for (int i = 0, size = passengers.size(); i < size; i++) { -+ Entity entity = passengers.get(i); -+ int range = entity.getType().clientTrackingRange() * 16; -+ range = org.spigotmc.TrackingRange.getEntityTrackingRange(entity, range); // Paper -+ -+ if (range > highest) { // Paper - we need the lowest range thanks to the fact that our tracker doesn't account for passenger logic // Tuinity - not anymore! -+ highest = range; -+ } -+ -+ highest = getHighestRange(entity, highest); -+ } -+ -+ return highest; -+ } -+ - private int getEffectiveRange() { - int i = this.range; -+ // Pufferfish start - remove iterators and streams -+ /* - Iterator iterator = this.entity.getIndirectPassengers().iterator(); - - while (iterator.hasNext()) { -@@ -1602,6 +1622,9 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider - i = j; - } - } -+ */ -+ i = getHighestRange(this.entity, i); -+ // Pufferfish end - - return this.scaledRange(i); - } -diff --git a/src/main/java/net/minecraft/server/level/ServerChunkCache.java b/src/main/java/net/minecraft/server/level/ServerChunkCache.java -index 4ff563d903633f181e1268daa77f250cfec204a0..014255019ce3f22e0c8cf8f0a775669f909d18f4 100644 ---- a/src/main/java/net/minecraft/server/level/ServerChunkCache.java -+++ b/src/main/java/net/minecraft/server/level/ServerChunkCache.java -@@ -75,6 +75,9 @@ public class ServerChunkCache extends ChunkSource { - final it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap loadedChunkMap = new it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap<>(8192, 0.5f); - - private final LevelChunk[] lastLoadedChunks = new LevelChunk[4 * 4]; -+ -+ public boolean firstRunSpawnCounts = true; // Pufferfish -+ public final java.util.concurrent.atomic.AtomicBoolean _pufferfish_spawnCountsReady = new java.util.concurrent.atomic.AtomicBoolean(false); // Pufferfish - optimize countmobs - - private static int getChunkCacheKey(int x, int z) { - return x & 3 | ((z & 3) << 2); -@@ -702,6 +705,7 @@ public class ServerChunkCache extends ChunkSource { - ProfilerFiller gameprofilerfiller = this.level.getProfiler(); - - gameprofilerfiller.push("pollingChunks"); -+ this.level.resetIceAndSnowTick(); // Pufferfish - reset ice & snow tick random - int k = this.level.getGameRules().getInt(GameRules.RULE_RANDOMTICKING); - boolean flag1 = level.ticksPerSpawnCategory.getLong(org.bukkit.entity.SpawnCategory.ANIMAL) != 0L && worlddata.getGameTime() % level.ticksPerSpawnCategory.getLong(org.bukkit.entity.SpawnCategory.ANIMAL) == 0L; // CraftBukkit - -@@ -711,18 +715,25 @@ public class ServerChunkCache extends ChunkSource { - // Paper start - per player mob spawning - NaturalSpawner.SpawnState spawnercreature_d; // moved down - if ((this.spawnFriendlies || this.spawnEnemies) && this.chunkMap.playerMobDistanceMap != null) { // don't count mobs when animals and monsters are disabled -- // re-set mob counts -- for (ServerPlayer player : this.level.players) { -- Arrays.fill(player.mobCounts, 0); -+ // Pufferfish start - moved down when async processing -+ if (!gg.pufferfish.pufferfish.PufferfishConfig.enableAsyncMobSpawning) { -+ // re-set mob counts -+ for (ServerPlayer player : this.level.players) { -+ Arrays.fill(player.mobCounts, 0); -+ } -+ lastSpawnState = NaturalSpawner.createState(l, this.level.getAllEntities(), this::getFullChunk, null, true); - } -- spawnercreature_d = NaturalSpawner.createState(l, this.level.getAllEntities(), this::getFullChunk, null, true); -+ // Pufferfish end - } else { -- spawnercreature_d = NaturalSpawner.createState(l, this.level.getAllEntities(), this::getFullChunk, this.chunkMap.playerMobDistanceMap == null ? new LocalMobCapCalculator(this.chunkMap) : null, false); -+ // Pufferfish start - this is only implemented for per-player mob spawning so this makes everything work if this setting is disabled. -+ lastSpawnState = NaturalSpawner.createState(l, this.level.getAllEntities(), this::getFullChunk, this.chunkMap.playerMobDistanceMap == null ? new LocalMobCapCalculator(this.chunkMap) : null, false); -+ _pufferfish_spawnCountsReady.set(true); -+ // Pufferfish end - } - // Paper end - this.level.timings.countNaturalMobs.stopTiming(); // Paper - timings - -- this.lastSpawnState = spawnercreature_d; -+ //this.lastSpawnState = spawnercreature_d; // Pufferfish - this is managed asynchronously - gameprofilerfiller.popPush("filteringLoadedChunks"); - // Paper - moved down - this.level.timings.chunkTicks.startTiming(); // Paper -@@ -760,8 +771,8 @@ public class ServerChunkCache extends ChunkSource { - - if ((true || this.level.isNaturalSpawningAllowed(chunkcoordintpair)) && this.chunkMap.anyPlayerCloseEnoughForSpawning(holder, chunkcoordintpair, false)) { // Paper - optimise anyPlayerCloseEnoughForSpawning // Paper - the chunk is known ticking - chunk1.incrementInhabitedTime(j); -- if (flag2 && (this.spawnEnemies || this.spawnFriendlies) && this.level.getWorldBorder().isWithinBounds(chunkcoordintpair) && this.chunkMap.anyPlayerCloseEnoughForSpawning(holder, chunkcoordintpair, true)) { // Spigot // Paper - optimise anyPlayerCloseEnoughForSpawning & optimise chunk tick iteration -- NaturalSpawner.spawnForChunk(this.level, chunk1, spawnercreature_d, this.spawnFriendlies, this.spawnEnemies, flag1); -+ if (flag2 && (!gg.pufferfish.pufferfish.PufferfishConfig.enableAsyncMobSpawning || _pufferfish_spawnCountsReady.get()) && (this.spawnEnemies || this.spawnFriendlies) && this.level.getWorldBorder().isWithinBounds(chunkcoordintpair) && this.chunkMap.anyPlayerCloseEnoughForSpawning(holder, chunkcoordintpair, true)) { // Spigot // Paper - optimise anyPlayerCloseEnoughForSpawning & optimise chunk tick iteration -+ NaturalSpawner.spawnForChunk(this.level, chunk1, lastSpawnState, this.spawnFriendlies, this.spawnEnemies, flag1); // Pufferfish - } - - if (true || this.level.shouldTickBlocksAt(chunkcoordintpair.toLong())) { // Paper - the chunk is known ticking -@@ -823,6 +834,30 @@ public class ServerChunkCache extends ChunkSource { - } - // Paper end - controlled flush for entity tracker packets - } -+ -+ // Pufferfish start - optimize mob spawning -+ if (gg.pufferfish.pufferfish.PufferfishConfig.enableAsyncMobSpawning) { -+ for (ServerPlayer player : this.level.players) { -+ Arrays.fill(player.mobCounts, 0); -+ } -+ if (firstRunSpawnCounts) { -+ firstRunSpawnCounts = false; -+ _pufferfish_spawnCountsReady.set(true); -+ } -+ if (chunkMap.playerMobDistanceMap != null && _pufferfish_spawnCountsReady.getAndSet(false)) { -+ net.minecraft.server.MinecraftServer.getServer().mobSpawnExecutor.submit(() -> { -+ int mapped = distanceManager.getNaturalSpawnChunkCount(); -+ io.papermc.paper.util.maplist.IteratorSafeOrderedReferenceSet.Iterator objectiterator = -+ level.entityTickList.entities.iterator(io.papermc.paper.util.maplist.IteratorSafeOrderedReferenceSet.ITERATOR_FLAG_SEE_ADDITIONS); -+ gg.pufferfish.pufferfish.util.IterableWrapper wrappedIterator = -+ new gg.pufferfish.pufferfish.util.IterableWrapper<>(objectiterator); -+ lastSpawnState = NaturalSpawner.createState(mapped, wrappedIterator, this::getFullChunk, null, true); -+ objectiterator.finishedIterating(); -+ _pufferfish_spawnCountsReady.set(true); -+ }); -+ } -+ } -+ // Pufferfish end - } - - private void getFullChunk(long pos, Consumer chunkConsumer) { -diff --git a/src/main/java/net/minecraft/server/level/ServerEntity.java b/src/main/java/net/minecraft/server/level/ServerEntity.java -index 2358bb1788cfb902bac9b3b7588954af2d2cd823..163f14b4e1ca99d75e5d8e14190f7b91cb58e8f3 100644 ---- a/src/main/java/net/minecraft/server/level/ServerEntity.java -+++ b/src/main/java/net/minecraft/server/level/ServerEntity.java -@@ -166,6 +166,7 @@ public class ServerEntity { - boolean flag4 = k < -32768L || k > 32767L || l < -32768L || l > 32767L || i1 < -32768L || i1 > 32767L; - - if (!flag4 && this.teleportDelay <= 400 && !this.wasRiding && this.wasOnGround == this.entity.isOnGround() && !(io.papermc.paper.configuration.GlobalConfiguration.get().collisions.sendFullPosForHardCollidingEntities && this.entity.hardCollides())) { // Paper - send full pos for hard colliding entities to prevent collision problems due to desync -+ if (flag2 || flag3 || this.entity instanceof AbstractArrow) { // Pufferfish - if ((!flag2 || !flag3) && !(this.entity instanceof AbstractArrow)) { - if (flag2) { - packet1 = new ClientboundMoveEntityPacket.Pos(this.entity.getId(), (short) ((int) k), (short) ((int) l), (short) ((int) i1), this.entity.isOnGround()); -@@ -175,6 +176,7 @@ public class ServerEntity { - } else { - packet1 = new ClientboundMoveEntityPacket.PosRot(this.entity.getId(), (short) ((int) k), (short) ((int) l), (short) ((int) i1), (byte) i, (byte) j, this.entity.isOnGround()); - } -+ } // Pufferfish - } else { - this.wasOnGround = this.entity.isOnGround(); - this.teleportDelay = 0; -diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index 79aa3374fd47cd57d2e0810bb5afebbdb38a1892..77d538ab79b31cf43620e560cdf2876a26b2bb7f 100644 ---- a/src/main/java/net/minecraft/server/level/ServerLevel.java -+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java -@@ -709,6 +709,7 @@ public class ServerLevel extends Level implements WorldGenLevel { - org.spigotmc.ActivationRange.activateEntities(this); // Spigot - timings.entityTick.startTiming(); // Spigot - this.entityTickList.forEach((entity) -> { -+ entity.activatedPriorityReset = false; // Pufferfish - DAB - if (!entity.isRemoved()) { - if (false && this.shouldDiscardEntity(entity)) { // CraftBukkit - We prevent spawning in general, so this butchering is not needed - entity.discard(); -@@ -728,7 +729,20 @@ public class ServerLevel extends Level implements WorldGenLevel { - } - - gameprofilerfiller.push("tick"); -- this.guardEntityTick(this::tickNonPassenger, entity); -+ // Pufferfish start - copied from this.guardEntityTick -+ try { -+ this.tickNonPassenger(entity); // Pufferfish - changed -+ MinecraftServer.getServer().executeMidTickTasks(); // Tuinity - execute chunk tasks mid tick -+ } catch (Throwable throwable) { -+ if (throwable instanceof ThreadDeath) throw throwable; // Paper -+ // Paper start - Prevent tile entity and entity crashes -+ final String msg = String.format("Entity threw exception at %s:%s,%s,%s", entity.level.getWorld().getName(), entity.getX(), entity.getY(), entity.getZ()); -+ MinecraftServer.LOGGER.error(msg, throwable); -+ getCraftServer().getPluginManager().callEvent(new com.destroystokyo.paper.event.server.ServerExceptionEvent(new com.destroystokyo.paper.exception.ServerInternalException(msg, throwable))); -+ entity.discard(); -+ // Paper end -+ } -+ // Pufferfish end - gameprofilerfiller.pop(); - } - } -@@ -795,9 +809,11 @@ public class ServerLevel extends Level implements WorldGenLevel { - } - // Paper start - optimise random block ticking - private final BlockPos.MutableBlockPos chunkTickMutablePosition = new BlockPos.MutableBlockPos(); -- private final io.papermc.paper.util.math.ThreadUnsafeRandom randomTickRandom = new io.papermc.paper.util.math.ThreadUnsafeRandom(this.random.nextLong()); -+ // private final io.papermc.paper.util.math.ThreadUnsafeRandom randomTickRandom = new io.papermc.paper.util.math.ThreadUnsafeRandom(); // Pufferfish - moved to super - // Paper end - -+ private int currentIceAndSnowTick = 0; protected void resetIceAndSnowTick() { this.currentIceAndSnowTick = this.randomTickRandom.nextInt(16); } // Pufferfish -+ - public void tickChunk(LevelChunk chunk, int randomTickSpeed) { - ChunkPos chunkcoordintpair = chunk.getPos(); - boolean flag = this.isRaining(); -@@ -808,7 +824,7 @@ public class ServerLevel extends Level implements WorldGenLevel { - gameprofilerfiller.push("thunder"); - final BlockPos.MutableBlockPos blockposition = this.chunkTickMutablePosition; // Paper - use mutable to reduce allocation rate, final to force compile fail on change - -- if (!this.paperConfig().environment.disableThunder && flag && this.isThundering() && this.spigotConfig.thunderChance > 0 && this.random.nextInt(this.spigotConfig.thunderChance) == 0) { // Spigot // Paper - disable thunder -+ if (!this.paperConfig().environment.disableThunder && flag && this.isThundering() && this.spigotConfig.thunderChance > 0 && /*this.random.nextInt(this.spigotConfig.thunderChance) == 0 &&*/ chunk.shouldDoLightning(this.random)) { // Spigot // Paper - disable thunder // Pufferfish - replace random with shouldDoLightning - blockposition.set(this.findLightningTargetAround(this.getBlockRandomPos(j, 0, k, 15))); // Paper - if (this.isRainingAt(blockposition)) { - DifficultyInstance difficultydamagescaler = this.getCurrentDifficultyAt(blockposition); -@@ -832,7 +848,7 @@ public class ServerLevel extends Level implements WorldGenLevel { - } - - gameprofilerfiller.popPush("iceandsnow"); -- if (!this.paperConfig().environment.disableIceAndSnow && this.random.nextInt(16) == 0) { // Paper - Disable ice and snow -+ if (!this.paperConfig().environment.disableIceAndSnow && (this.currentIceAndSnowTick++ & 15) == 0) { // Paper - Disable ice and snow // Paper - optimise random ticking // Pufferfish - optimize further random ticking - // Paper start - optimise chunk ticking - this.getRandomBlockPosition(j, 0, k, 15, blockposition); - int normalY = chunk.getHeight(Heightmap.Types.MOTION_BLOCKING, blockposition.getX() & 15, blockposition.getZ() & 15) + 1; -diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index d31a345edfffe39f127073fc3aec8b3489bae79c..187791ff8197be015856fdfa9159fb26558f95cf 100644 ---- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -1216,6 +1216,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic - - @Override - public void handleEditBook(ServerboundEditBookPacket packet) { -+ if (!gg.pufferfish.pufferfish.PufferfishConfig.enableBooks && !this.player.getBukkitEntity().hasPermission("pufferfish.usebooks")) return; // Pufferfish - // Paper start - if (!this.cserver.isPrimaryThread()) { - List pageList = packet.getPages(); -@@ -2364,6 +2365,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic - } - - private boolean updateChatOrder(Instant timestamp) { -+ if (gg.pufferfish.pufferfish.PufferfishConfig.disableOutOfOrderChat) return true; - Instant instant1; - - do { -diff --git a/src/main/java/net/minecraft/world/CompoundContainer.java b/src/main/java/net/minecraft/world/CompoundContainer.java -index 241fec02e6869c638d3a160819b32173a081467b..6a8f9e8f5bf108674c47018def28906e2d0a729c 100644 ---- a/src/main/java/net/minecraft/world/CompoundContainer.java -+++ b/src/main/java/net/minecraft/world/CompoundContainer.java -@@ -1,5 +1,6 @@ - package net.minecraft.world; - -+import net.minecraft.core.Direction; // Pufferfish - import net.minecraft.world.entity.player.Player; - import net.minecraft.world.item.ItemStack; - -@@ -64,6 +65,23 @@ public class CompoundContainer implements Container { - this.container2 = second; - } - -+ // Pufferfish start -+ @Override -+ public boolean hasEmptySlot(Direction enumdirection) { -+ return this.container1.hasEmptySlot(null) || this.container2.hasEmptySlot(null); -+ } -+ -+ @Override -+ public boolean isCompletelyFull(Direction enumdirection) { -+ return this.container1.isCompletelyFull(null) && this.container2.isCompletelyFull(null); -+ } -+ -+ @Override -+ public boolean isCompletelyEmpty(Direction enumdirection) { -+ return this.container1.isCompletelyEmpty(null) && this.container2.isCompletelyEmpty(null); -+ } -+ // Pufferfish end -+ - @Override - public int getContainerSize() { - return this.container1.getContainerSize() + this.container2.getContainerSize(); -diff --git a/src/main/java/net/minecraft/world/Container.java b/src/main/java/net/minecraft/world/Container.java -index 540bc9500c35c0db719b00aa26f6fb3a1b08ed9f..806cb760822a99316b08ad95ff8922df717050e2 100644 ---- a/src/main/java/net/minecraft/world/Container.java -+++ b/src/main/java/net/minecraft/world/Container.java -@@ -2,6 +2,8 @@ package net.minecraft.world; - - import java.util.Set; - import java.util.function.Predicate; -+ -+import net.minecraft.core.Direction; // Pufferfish - import net.minecraft.world.entity.player.Player; - import net.minecraft.world.item.Item; - import net.minecraft.world.item.ItemStack; -@@ -10,6 +12,63 @@ import org.bukkit.craftbukkit.entity.CraftHumanEntity; - // CraftBukkit end - - public interface Container extends Clearable { -+ // Pufferfish start - allow the inventory to override and optimize these frequent calls -+ default boolean hasEmptySlot(@org.jetbrains.annotations.Nullable Direction enumdirection) { // there is a slot with 0 items in it -+ if (this instanceof WorldlyContainer worldlyContainer) { -+ for (int i : worldlyContainer.getSlotsForFace(enumdirection)) { -+ if (this.getItem(i).isEmpty()) { -+ return true; -+ } -+ } -+ } else { -+ int size = this.getContainerSize(); -+ for (int i = 0; i < size; i++) { -+ if (this.getItem(i).isEmpty()) { -+ return true; -+ } -+ } -+ } -+ return false; -+ } -+ -+ default boolean isCompletelyFull(@org.jetbrains.annotations.Nullable Direction enumdirection) { // every stack is maxed -+ if (this instanceof WorldlyContainer worldlyContainer) { -+ for (int i : worldlyContainer.getSlotsForFace(enumdirection)) { -+ ItemStack itemStack = this.getItem(i); -+ if (itemStack.getCount() < itemStack.getMaxStackSize()) { -+ return false; -+ } -+ } -+ } else { -+ int size = this.getContainerSize(); -+ for (int i = 0; i < size; i++) { -+ ItemStack itemStack = this.getItem(i); -+ if (itemStack.getCount() < itemStack.getMaxStackSize()) { -+ return false; -+ } -+ } -+ } -+ return true; -+ } -+ -+ default boolean isCompletelyEmpty(@org.jetbrains.annotations.Nullable Direction enumdirection) { -+ if (this instanceof WorldlyContainer worldlyContainer) { -+ for (int i : worldlyContainer.getSlotsForFace(enumdirection)) { -+ if (!this.getItem(i).isEmpty()) { -+ return false; -+ } -+ } -+ } else { -+ int size = this.getContainerSize(); -+ for (int i = 0; i < size; i++) { -+ if (!this.getItem(i).isEmpty()) { -+ return false; -+ } -+ } -+ } -+ return true; -+ } -+ // Pufferfish end - - int LARGE_MAX_STACK_SIZE = 64; - -diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 22cd5f0e40d7e3cd04793a9dda29d113428fa093..608156f0d8f32d768c424a131c9f8b48fc7e5410 100644 ---- a/src/main/java/net/minecraft/world/entity/Entity.java -+++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -291,7 +291,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { - public double yo; - public double zo; - private Vec3 position; -- private BlockPos blockPosition; -+ public BlockPos blockPosition; // Pufferfish - private->public - private ChunkPos chunkPosition; - private Vec3 deltaMovement; - private float yRot; -@@ -413,6 +413,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { - return this.originWorld; - } - // Paper end -+ // Pufferfish start -+ public boolean activatedPriorityReset = false; // DAB -+ public int activatedPriority = gg.pufferfish.pufferfish.PufferfishConfig.maximumActivationPrio; // golf score -+ public final BlockPos.MutableBlockPos cachedBlockPos = new BlockPos.MutableBlockPos(); // used where needed -+ // Pufferfish end -+ - public float getBukkitYaw() { - return this.yRot; - } -@@ -487,17 +493,36 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { - this.isLegacyTrackingEntity = isLegacyTrackingEntity; - } - -+ private org.spigotmc.TrackingRange.TrackingRangeType getFurthestEntity(Entity entity, net.minecraft.server.level.ChunkMap chunkMap, org.spigotmc.TrackingRange.TrackingRangeType type, int range) { -+ List passengers = entity.getPassengers(); -+ for (int i = 0, size = passengers.size(); i < size; i++) { -+ Entity passenger = passengers.get(i); -+ org.spigotmc.TrackingRange.TrackingRangeType passengerType = passenger.trackingRangeType; -+ int passengerRange = chunkMap.getEntityTrackerRange(passengerType.ordinal()); -+ if (passengerRange > range) { -+ type = passengerType; -+ range = passengerRange; -+ } -+ -+ type = this.getFurthestEntity(passenger, chunkMap, type, range); -+ } -+ -+ return type; -+ } -+ - public final com.destroystokyo.paper.util.misc.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet getPlayersInTrackRange() { - // determine highest range of passengers - if (this.passengers.isEmpty()) { - return ((ServerLevel)this.level).getChunkSource().chunkMap.playerEntityTrackerTrackMaps[this.trackingRangeType.ordinal()] - .getObjectsInRange(MCUtil.getCoordinateKey(this)); - } -- Iterable passengers = this.getIndirectPassengers(); -+ //Iterable passengers = this.getIndirectPassengers(); // Pufferfish - net.minecraft.server.level.ChunkMap chunkMap = ((ServerLevel)this.level).getChunkSource().chunkMap; - org.spigotmc.TrackingRange.TrackingRangeType type = this.trackingRangeType; - int range = chunkMap.getEntityTrackerRange(type.ordinal()); - -+ // Pufferfish start - use getFurthestEntity to skip getIndirectPassengers -+ /* - for (Entity passenger : passengers) { - org.spigotmc.TrackingRange.TrackingRangeType passengerType = passenger.trackingRangeType; - int passengerRange = chunkMap.getEntityTrackerRange(passengerType.ordinal()); -@@ -506,6 +531,9 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { - range = passengerRange; - } - } -+ */ -+ type = this.getFurthestEntity(this, chunkMap, type, range); -+ // Pufferfish end - - return chunkMap.playerEntityTrackerTrackMaps[type.ordinal()].getObjectsInRange(MCUtil.getCoordinateKey(this)); - } -@@ -787,6 +815,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { - // CraftBukkit end - - public void baseTick() { -+ // Pufferfish start - entity TTL -+ if (type != EntityType.PLAYER && type.ttl >= 0 && this.tickCount >= type.ttl) { -+ remove(RemovalReason.DISCARDED); -+ return; -+ } -+ // Pufferfish end - entity TTL - this.level.getProfiler().push("entityBaseTick"); - if (firstTick && this instanceof net.minecraft.world.entity.NeutralMob neutralMob) neutralMob.tickInitialPersistentAnger(level); // Paper - Update last hurt when ticking - this.feetBlockState = null; -@@ -4031,16 +4065,18 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { - } - - public boolean updateFluidHeightAndDoFluidPushing(TagKey tag, double speed) { -- if (this.touchingUnloadedChunk()) { -+ if (false && this.touchingUnloadedChunk()) { // Pufferfish - cost of a lookup here is the same cost as below, so skip - return false; - } else { - AABB axisalignedbb = this.getBoundingBox().deflate(0.001D); -- int i = Mth.floor(axisalignedbb.minX); -- int j = Mth.ceil(axisalignedbb.maxX); -- int k = Mth.floor(axisalignedbb.minY); -- int l = Mth.ceil(axisalignedbb.maxY); -- int i1 = Mth.floor(axisalignedbb.minZ); -- int j1 = Mth.ceil(axisalignedbb.maxZ); -+ // Pufferfish start - rename -+ int minBlockX = Mth.floor(axisalignedbb.minX); -+ int maxBlockX = Mth.ceil(axisalignedbb.maxX); -+ int minBlockY = Mth.floor(axisalignedbb.minY); -+ int maxBlockY = Mth.ceil(axisalignedbb.maxY); -+ int minBlockZ = Mth.floor(axisalignedbb.minZ); -+ int maxBlockZ = Mth.ceil(axisalignedbb.maxZ); -+ // Pufferfish end - double d1 = 0.0D; - boolean flag = this.isPushedByFluid(); - boolean flag1 = false; -@@ -4048,14 +4084,61 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { - int k1 = 0; - BlockPos.MutableBlockPos blockposition_mutableblockposition = new BlockPos.MutableBlockPos(); - -- for (int l1 = i; l1 < j; ++l1) { -- for (int i2 = k; i2 < l; ++i2) { -- for (int j2 = i1; j2 < j1; ++j2) { -- blockposition_mutableblockposition.set(l1, i2, j2); -- FluidState fluid = this.level.getFluidState(blockposition_mutableblockposition); -+ // Pufferfish start - based off CollisionUtil.getCollisionsForBlocksOrWorldBorder -+ final int minSection = io.papermc.paper.util.WorldUtil.getMinSection(this.level); -+ final int maxSection = io.papermc.paper.util.WorldUtil.getMaxSection(this.level); -+ final int minBlock = minSection << 4; -+ final int maxBlock = (maxSection << 4) | 15; -+ -+ // special cases: -+ if (minBlockY > maxBlock || maxBlockY < minBlock) { -+ // no point in checking -+ return false; -+ } -+ -+ int minYIterate = Math.max(minBlock, minBlockY); -+ int maxYIterate = Math.min(maxBlock, maxBlockY); -+ -+ int minChunkX = minBlockX >> 4; -+ int maxChunkX = maxBlockX >> 4; -+ -+ int minChunkZ = minBlockZ >> 4; -+ int maxChunkZ = maxBlockZ >> 4; -+ -+ for (int currChunkZ = minChunkZ; currChunkZ <= maxChunkZ; ++currChunkZ) { -+ int minZ = currChunkZ == minChunkZ ? minBlockZ & 15 : 0; // coordinate in chunk -+ int maxZ = currChunkZ == maxChunkZ ? maxBlockZ & 15 : 16; // coordinate in chunk -+ -+ for (int currChunkX = minChunkX; currChunkX <= maxChunkX; ++currChunkX) { -+ int minX = currChunkX == minChunkX ? minBlockX & 15 : 0; // coordinate in chunk -+ int maxX = currChunkX == maxChunkX ? maxBlockX & 15 : 16; // coordinate in chunk -+ -+ net.minecraft.world.level.chunk.ChunkAccess chunk = this.level.getChunkIfLoadedImmediately(currChunkX, currChunkZ); -+ if (chunk == null) { -+ return false; // if we're touching an unloaded chunk then it's false -+ } -+ -+ net.minecraft.world.level.chunk.LevelChunkSection[] sections = chunk.getSections(); -+ -+ for (int currY = minYIterate; currY < maxYIterate; ++currY) { -+ net.minecraft.world.level.chunk.LevelChunkSection section = sections[(currY >> 4) - minSection]; -+ -+ if (section == null || section.hasOnlyAir() || section.fluidStateCount == 0) { // if no fluids, nothing in this section -+ // empty -+ // skip to next section -+ currY = (currY & ~(15)) + 15; // increment by 15: iterator loop increments by the extra one -+ continue; -+ } -+ -+ net.minecraft.world.level.chunk.PalettedContainer blocks = section.states; -+ -+ for (int currZ = minZ; currZ < maxZ; ++currZ) { -+ for (int currX = minX; currX < maxX; ++currX) { -+ FluidState fluid = blocks.get(currX & 15, currY & 15, currZ & 15).getFluidState(); - - if (fluid.is(tag)) { -- double d2 = (double) ((float) i2 + fluid.getHeight(this.level, blockposition_mutableblockposition)); -+ blockposition_mutableblockposition.set((currChunkX << 4) + currX, currY, (currChunkZ << 4) + currZ); -+ double d2 = (double) ((float) currY + fluid.getHeight(this.level, blockposition_mutableblockposition)); - - if (d2 >= axisalignedbb.minY) { - flag1 = true; -@@ -4077,9 +4160,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { - // CraftBukkit end - } - } -+ } -+ } - } - } - } -+ // Pufferfish end - - if (vec3d.length() > 0.0D) { - if (k1 > 0) { -diff --git a/src/main/java/net/minecraft/world/entity/EntityType.java b/src/main/java/net/minecraft/world/entity/EntityType.java -index 72516335570d7137a62ec8667a6e8f06f024692f..b44322c337bcded94c60e1761a3891013ae1dd1a 100644 ---- a/src/main/java/net/minecraft/world/entity/EntityType.java -+++ b/src/main/java/net/minecraft/world/entity/EntityType.java -@@ -305,6 +305,8 @@ public class EntityType implements EntityTypeTest { - return Registry.ENTITY_TYPE.getOptional(ResourceLocation.tryParse(id)); - } - -+ public boolean dabEnabled = false; // Pufferfish -+ public int ttl = -1; // Pufferfish - // Paper start - add id - public final String id; - -diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 11d7c42d65b91bf57b7bba7812aa17e60e018c67..77a96dd66e2c39495f23b4219dfdbb0820233434 100644 ---- a/src/main/java/net/minecraft/world/entity/LivingEntity.java -+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -142,7 +142,6 @@ import org.bukkit.event.entity.EntityTeleportEvent; - import org.bukkit.event.player.PlayerItemConsumeEvent; - // CraftBukkit end - --import co.aikar.timings.MinecraftTimings; // Paper - - public abstract class LivingEntity extends Entity { - -@@ -399,8 +398,7 @@ public abstract class LivingEntity extends Entity { - - if (this.isAlive()) { - boolean flag = this instanceof net.minecraft.world.entity.player.Player; -- -- if (this.isInWall()) { -+ if ((!gg.pufferfish.pufferfish.PufferfishConfig.enableSuffocationOptimization || (tickCount % 10 == 0 && couldPossiblyBeHurt(1.0F))) && this.isInWall()) { // Pufferfish - optimize suffocation - this.hurt(DamageSource.IN_WALL, 1.0F); - } else if (flag && !this.level.getWorldBorder().isWithinBounds(this.getBoundingBox())) { - double d0 = this.level.getWorldBorder().getDistanceToBorder(this) + this.level.getWorldBorder().getDamageSafeZone(); -@@ -1328,6 +1326,15 @@ public abstract class LivingEntity extends Entity { - return this.getHealth() <= 0.0F; - } - -+ // Pufferfish start - optimize suffocation -+ public boolean couldPossiblyBeHurt(float amount) { -+ if ((float) this.invulnerableTime > (float) this.invulnerableDuration / 2.0F && amount <= this.lastHurt) { -+ return false; -+ } -+ return true; -+ } -+ // Pufferfish end -+ - @Override - public boolean hurt(DamageSource source, float amount) { - if (this.isInvulnerableTo(source)) { -@@ -1921,6 +1928,20 @@ public abstract class LivingEntity extends Entity { - return this.lastClimbablePos; - } - -+ -+ // Pufferfish start -+ private boolean cachedOnClimable = false; -+ private BlockPos lastClimbingPosition = null; -+ -+ public boolean onClimableCached() { -+ if (!this.blockPosition().equals(this.lastClimbingPosition)) { -+ this.cachedOnClimable = this.onClimbable(); -+ this.lastClimbingPosition = this.blockPosition(); -+ } -+ return this.cachedOnClimable; -+ } -+ // Pufferfish end -+ - public boolean onClimbable() { - if (this.isSpectator()) { - return false; -@@ -3622,7 +3643,10 @@ public abstract class LivingEntity extends Entity { - Vec3 vec3d1 = new Vec3(entity.getX(), entity.getEyeY(), entity.getZ()); - - // Paper - diff on change - used in CraftLivingEntity#hasLineOfSight(Location) and CraftWorld#lineOfSightExists -- return vec3d1.distanceToSqr(vec3d) > 128D * 128D ? false : this.level.clip(new ClipContext(vec3d, vec3d1, ClipContext.Block.COLLIDER, ClipContext.Fluid.NONE, this)).getType() == HitResult.Type.MISS; // Paper - use distanceToSqr -+ // Pufferfish start -+ //return vec3d1.distanceToSqr(vec3d) > 128D * 128D ? false : this.level.clip(new ClipContext(vec3d, vec3d1, ClipContext.Block.COLLIDER, ClipContext.Fluid.NONE, this)).getType() == HitResult.Type.MISS; // Paper - use distanceToSqr -+ return vec3d1.distanceToSqr(vec3d) > 128D * 128D ? false : this.level.rayTraceDirect(vec3d, vec3d1, net.minecraft.world.phys.shapes.CollisionContext.of(this)) == net.minecraft.world.phys.BlockHitResult.Type.MISS; -+ // Pufferfish end - } - } - -diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java -index cf40ebd06c52a7a00e6f704a29ae9d2b5186d35a..26fabc96d3c3ac4ea35d094c686975b19c428d7f 100644 ---- a/src/main/java/net/minecraft/world/entity/Mob.java -+++ b/src/main/java/net/minecraft/world/entity/Mob.java -@@ -210,14 +210,16 @@ public abstract class Mob extends LivingEntity { - return this.lookControl; - } - -+ int _pufferfish_inactiveTickDisableCounter = 0; // Pufferfish - throttle inactive goal selector ticking - // Paper start - @Override - public void inactiveTick() { - super.inactiveTick(); -- if (this.goalSelector.inactiveTick()) { -+ boolean isThrottled = gg.pufferfish.pufferfish.PufferfishConfig.throttleInactiveGoalSelectorTick && _pufferfish_inactiveTickDisableCounter++ % 20 != 0; // Pufferfish - throttle inactive goal selector ticking -+ if (this.goalSelector.inactiveTick(this.activatedPriority, true) && !isThrottled) { // Pufferfish - pass activated priroity // Pufferfish - throttle inactive goal selector ticking - this.goalSelector.tick(); - } -- if (this.targetSelector.inactiveTick()) { -+ if (this.targetSelector.inactiveTick(this.activatedPriority, true)) { // Pufferfish - pass activated priority - this.targetSelector.tick(); - } - } -@@ -860,16 +862,20 @@ public abstract class Mob extends LivingEntity { - - if (i % 2 != 0 && this.tickCount > 1) { - this.level.getProfiler().push("targetSelector"); -+ if (this.targetSelector.inactiveTick(this.activatedPriority, false)) // Pufferfish - use this to alternate ticking - this.targetSelector.tickRunningGoals(false); - this.level.getProfiler().pop(); - this.level.getProfiler().push("goalSelector"); -+ if (this.goalSelector.inactiveTick(this.activatedPriority, false)) // Pufferfish - use this to alternate ticking - this.goalSelector.tickRunningGoals(false); - this.level.getProfiler().pop(); - } else { - this.level.getProfiler().push("targetSelector"); -+ if (this.targetSelector.inactiveTick(this.activatedPriority, false)) // Pufferfish - use this to alternate ticking - this.targetSelector.tick(); - this.level.getProfiler().pop(); - this.level.getProfiler().push("goalSelector"); -+ if (this.goalSelector.inactiveTick(this.activatedPriority, false)) // Pufferfish - use this to alternate ticking - this.goalSelector.tick(); - this.level.getProfiler().pop(); - } -diff --git a/src/main/java/net/minecraft/world/entity/ai/attributes/AttributeMap.java b/src/main/java/net/minecraft/world/entity/ai/attributes/AttributeMap.java -index 692524a69d43dcf52ae1b0f7f593fc53f3878137..59ca3a0a70c68263495ae9972215b76554d3fb83 100644 ---- a/src/main/java/net/minecraft/world/entity/ai/attributes/AttributeMap.java -+++ b/src/main/java/net/minecraft/world/entity/ai/attributes/AttributeMap.java -@@ -22,9 +22,11 @@ public class AttributeMap { - private final Map attributes = Maps.newHashMap(); - private final Set dirtyAttributes = Sets.newHashSet(); - private final AttributeSupplier supplier; -+ private final java.util.function.Function createInstance; // Pufferfish - - public AttributeMap(AttributeSupplier defaultAttributes) { - this.supplier = defaultAttributes; -+ this.createInstance = attribute -> this.supplier.createInstance(this::onAttributeModified, attribute); // Pufferfish - } - - private void onAttributeModified(AttributeInstance instance) { -@@ -44,11 +46,10 @@ public class AttributeMap { - }).collect(Collectors.toList()); - } - -+ - @Nullable - public AttributeInstance getInstance(Attribute attribute) { -- return this.attributes.computeIfAbsent(attribute, (attributex) -> { -- return this.supplier.createInstance(this::onAttributeModified, attributex); -- }); -+ return this.attributes.computeIfAbsent(attribute, this.createInstance); // Pufferfish - cache lambda, as for some reason java allocates it anyways - } - - public boolean hasAttribute(Attribute attribute) { -diff --git a/src/main/java/net/minecraft/world/entity/ai/behavior/AcquirePoi.java b/src/main/java/net/minecraft/world/entity/ai/behavior/AcquirePoi.java -index 43243537b765a2d270be6de3f053fea77ff67d18..bf3b8ccb3e031e0ad24cd51e28ea8cbd4f8a8030 100644 ---- a/src/main/java/net/minecraft/world/entity/ai/behavior/AcquirePoi.java -+++ b/src/main/java/net/minecraft/world/entity/ai/behavior/AcquirePoi.java -@@ -72,6 +72,7 @@ public class AcquirePoi extends Behavior { - @Override - protected void start(ServerLevel world, PathfinderMob entity, long time) { - this.nextScheduledStart = time + 20L + (long)world.getRandom().nextInt(20); -+ if (entity.getNavigation().isStuck()) this.nextScheduledStart += 200L; // Pufferfish - wait an additional 10s to check again if they're stuck - PoiManager poiManager = world.getPoiManager(); - this.batchCache.long2ObjectEntrySet().removeIf((entry) -> { - return !entry.getValue().isStillValid(time); -diff --git a/src/main/java/net/minecraft/world/entity/ai/behavior/VillagerPanicTrigger.java b/src/main/java/net/minecraft/world/entity/ai/behavior/VillagerPanicTrigger.java -index 42d466f7f162943886078eba3db18f2dfc2d7bee..6c0dda1ce018ec6bb2ebb97147045fffae0a89d5 100644 ---- a/src/main/java/net/minecraft/world/entity/ai/behavior/VillagerPanicTrigger.java -+++ b/src/main/java/net/minecraft/world/entity/ai/behavior/VillagerPanicTrigger.java -@@ -37,7 +37,11 @@ public class VillagerPanicTrigger extends Behavior { - - @Override - protected void tick(ServerLevel serverLevel, Villager villager, long l) { -- if (l % 100L == 0L) { -+ // Pufferfish start -+ if (villager.nextGolemPanic < 0) villager.nextGolemPanic = l + 100; -+ if (--villager.nextGolemPanic < l) { -+ villager.nextGolemPanic = -1; -+ // Pufferfish end - villager.spawnGolemIfNeeded(serverLevel, l, 3); - } - -diff --git a/src/main/java/net/minecraft/world/entity/ai/goal/GoalSelector.java b/src/main/java/net/minecraft/world/entity/ai/goal/GoalSelector.java -index 1805aacd982dae8d971cfad0ead23c161badb095..bc3defa2c2ca0971ce3d9642a38380973a82de46 100644 ---- a/src/main/java/net/minecraft/world/entity/ai/goal/GoalSelector.java -+++ b/src/main/java/net/minecraft/world/entity/ai/goal/GoalSelector.java -@@ -50,9 +50,12 @@ public class GoalSelector { - } - - // Paper start -- public boolean inactiveTick() { -+ public boolean inactiveTick(int tickRate, boolean inactive) { // Pufferfish start -+ if (inactive && !gg.pufferfish.pufferfish.PufferfishConfig.dearEnabled) tickRate = 4; // reset to Paper's -+ tickRate = Math.min(tickRate, this.newGoalRate); - this.curRate++; -- return this.curRate % this.newGoalRate == 0; -+ return this.curRate % tickRate == 0; -+ // Pufferfish end - } - public boolean hasTasks() { - for (WrappedGoal task : this.availableGoals) { -diff --git a/src/main/java/net/minecraft/world/entity/ai/goal/MoveToBlockGoal.java b/src/main/java/net/minecraft/world/entity/ai/goal/MoveToBlockGoal.java -index 26bf383caea68834c654b25653ced9017f1b1b22..615eb55e24d365d994fbfe9d45d2be387fd5d561 100644 ---- a/src/main/java/net/minecraft/world/entity/ai/goal/MoveToBlockGoal.java -+++ b/src/main/java/net/minecraft/world/entity/ai/goal/MoveToBlockGoal.java -@@ -119,6 +119,7 @@ public abstract class MoveToBlockGoal extends Goal { - for(int m = 0; m <= l; m = m > 0 ? -m : 1 - m) { - for(int n = m < l && m > -l ? l : 0; n <= l; n = n > 0 ? -n : 1 - n) { - mutableBlockPos.setWithOffset(blockPos, m, k - 1, n); -+ if (!this.mob.level.hasChunkAt(mutableBlockPos)) continue; // Pufferfish - if this block isn't loaded, continue - if (this.mob.isWithinRestriction(mutableBlockPos) && this.isValidTarget(this.mob.level, mutableBlockPos)) { - this.blockPos = mutableBlockPos; - setTargetPosition(mutableBlockPos.immutable()); // Paper -diff --git a/src/main/java/net/minecraft/world/entity/ai/targeting/TargetingConditions.java b/src/main/java/net/minecraft/world/entity/ai/targeting/TargetingConditions.java -index a7575b5ef56af6f53448d391abb4956e130148ca..e752c83df50fb9b670ecea2abc95426c2a009b6f 100644 ---- a/src/main/java/net/minecraft/world/entity/ai/targeting/TargetingConditions.java -+++ b/src/main/java/net/minecraft/world/entity/ai/targeting/TargetingConditions.java -@@ -75,9 +75,18 @@ public class TargetingConditions { - } - - if (this.range > 0.0D) { -- double d = this.testInvisible ? targetEntity.getVisibilityPercent(baseEntity) : 1.0D; -- double e = Math.max((this.useFollowRange ? this.getFollowRange(baseEntity) : this.range) * d, 2.0D); // Paper -+ // Pufferfish start - check range before getting visibility -+ // d = invisibility percent, e = follow range adjusted for invisibility, f = distance - double f = baseEntity.distanceToSqr(targetEntity.getX(), targetEntity.getY(), targetEntity.getZ()); -+ double followRangeRaw = this.useFollowRange ? this.getFollowRange(baseEntity) : this.range; -+ -+ if (f > followRangeRaw * followRangeRaw) { // the actual follow range will always be this value or smaller, so if the distance is larger then it never will return true after getting invis -+ return false; -+ } -+ -+ double d = this.testInvisible ? targetEntity.getVisibilityPercent(baseEntity) : 1.0D; -+ double e = Math.max((followRangeRaw) * d, 2.0D); // Paper -+ // Pufferfish end - if (f > e * e) { - return false; - } -diff --git a/src/main/java/net/minecraft/world/entity/ambient/Bat.java b/src/main/java/net/minecraft/world/entity/ambient/Bat.java -index def01d221f36d71640bf4ef982a984909aacc6da..bfea05018d9515fa7a9a8c04d4e2a63e0f3cd0d4 100644 ---- a/src/main/java/net/minecraft/world/entity/ambient/Bat.java -+++ b/src/main/java/net/minecraft/world/entity/ambient/Bat.java -@@ -253,13 +253,22 @@ public class Bat extends AmbientCreature { - } - } - -+ // Pufferfish start - only check for spooky season once an hour -+ private static boolean isSpookySeason = false; -+ private static final int ONE_HOUR = 20 * 60 * 60; -+ private static int lastSpookyCheck = -ONE_HOUR; - private static boolean isHalloween() { -+ if (net.minecraft.server.MinecraftServer.currentTick - lastSpookyCheck > ONE_HOUR) { - LocalDate localdate = LocalDate.now(); - int i = localdate.get(ChronoField.DAY_OF_MONTH); - int j = localdate.get(ChronoField.MONTH_OF_YEAR); - -- return j == 10 && i >= 20 || j == 11 && i <= 3; -+ isSpookySeason = j == 10 && i >= 20 || j == 11 && i <= 3; -+ lastSpookyCheck = net.minecraft.server.MinecraftServer.currentTick; -+ } -+ return isSpookySeason; - } -+ // Pufferfish end - - @Override - protected float getStandingEyeHeight(Pose pose, EntityDimensions dimensions) { -diff --git a/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java b/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java -index 1dcd0c494681b7665b6b86dbe20375afd8d2fad8..f889b352d5618c1955e21273da79604a33e30c06 100644 ---- a/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java -+++ b/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java -@@ -228,9 +228,11 @@ public class Allay extends PathfinderMob implements InventoryCarrier { - return 0.4F; - } - -+ private int behaviorTick = 0; // Pufferfish - @Override - protected void customServerAiStep() { - this.level.getProfiler().push("allayBrain"); -+ if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish - this.getBrain().tick((ServerLevel) this.level, this); - this.level.getProfiler().pop(); - this.level.getProfiler().push("allayActivityUpdate"); -diff --git a/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java b/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java -index e7467fec2cab37c1a9933d1096724e3732913590..1c93872f9fcc6f6a19dee8565726501d0e580d44 100644 ---- a/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java -+++ b/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java -@@ -283,9 +283,11 @@ public class Axolotl extends Animal implements LerpingModel, Bucketable { - return true; - } - -+ private int behaviorTick = 0; // Pufferfish - @Override - protected void customServerAiStep() { - this.level.getProfiler().push("axolotlBrain"); -+ if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish - this.getBrain().tick((ServerLevel) this.level, this); - this.level.getProfiler().pop(); - this.level.getProfiler().push("axolotlActivityUpdate"); -diff --git a/src/main/java/net/minecraft/world/entity/animal/frog/Frog.java b/src/main/java/net/minecraft/world/entity/animal/frog/Frog.java -index bb6063ae7f4438916306ce876057f7488537b444..74cb2741a5cd66bdac3a22de938ae82968705a56 100644 ---- a/src/main/java/net/minecraft/world/entity/animal/frog/Frog.java -+++ b/src/main/java/net/minecraft/world/entity/animal/frog/Frog.java -@@ -174,9 +174,11 @@ public class Frog extends Animal { - return this.getDeltaMovement().horizontalDistanceSqr() > 1.0E-6D && this.isInWaterOrBubble(); - } - -+ private int behaviorTick = 0; // Pufferfish - @Override - protected void customServerAiStep() { - this.level.getProfiler().push("frogBrain"); -+ if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish - this.getBrain().tick((ServerLevel)this.level, this); - this.level.getProfiler().pop(); - this.level.getProfiler().push("frogActivityUpdate"); -diff --git a/src/main/java/net/minecraft/world/entity/animal/frog/Tadpole.java b/src/main/java/net/minecraft/world/entity/animal/frog/Tadpole.java -index 3dd4e6d622a6daafa00ae971edd88a147e34beef..32cca29fd622d18030931e1f330791491e7f9fa0 100644 ---- a/src/main/java/net/minecraft/world/entity/animal/frog/Tadpole.java -+++ b/src/main/java/net/minecraft/world/entity/animal/frog/Tadpole.java -@@ -76,9 +76,11 @@ public class Tadpole extends AbstractFish { - return SoundEvents.TADPOLE_FLOP; - } - -+ private int behaviorTick = 0; // Pufferfish - @Override - protected void customServerAiStep() { - this.level.getProfiler().push("tadpoleBrain"); -+ if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish - this.getBrain().tick((ServerLevel) this.level, this); - this.level.getProfiler().pop(); - this.level.getProfiler().push("tadpoleActivityUpdate"); -diff --git a/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java b/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java -index a4690391df0aa26abea1ad92e6143eb19c5d1143..3c3453638e117609190787efbf5d87fc20dcf8fd 100644 ---- a/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java -+++ b/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java -@@ -163,9 +163,11 @@ public class Goat extends Animal { - return (Brain) super.getBrain(); // CraftBukkit - decompile error - } - -+ private int behaviorTick = 0; // Pufferfish - @Override - protected void customServerAiStep() { - this.level.getProfiler().push("goatBrain"); -+ if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish - this.getBrain().tick((ServerLevel) this.level, this); - this.level.getProfiler().pop(); - this.level.getProfiler().push("goatActivityUpdate"); -diff --git a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java -index c8d8fdef7b8abc0f59b7d19462825ae30c8d4f48..8a5efb6c81bbe85b67a6bb83c0c4afdf995121d0 100644 ---- a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java -+++ b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java -@@ -257,10 +257,16 @@ public class ItemEntity extends Entity { - if (entityitem.isMergable()) { - // Paper Start - Fix items merging through walls - if (this.level.paperConfig().fixes.fixItemsMergingThroughWalls) { -+ // Pufferfish start - skip the allocations -+ /* - net.minecraft.world.level.ClipContext rayTrace = new net.minecraft.world.level.ClipContext(this.position(), entityitem.position(), - net.minecraft.world.level.ClipContext.Block.COLLIDER, net.minecraft.world.level.ClipContext.Fluid.NONE, this); - net.minecraft.world.phys.BlockHitResult rayTraceResult = level.clip(rayTrace); - if (rayTraceResult.getType() == net.minecraft.world.phys.HitResult.Type.BLOCK) continue; -+ */ -+ if (level.rayTraceDirect(this.position(), entityitem.position(), net.minecraft.world.phys.shapes.CollisionContext.of(this)) == -+ net.minecraft.world.phys.HitResult.Type.BLOCK) continue; -+ // Pufferfish end - } - // Paper End - this.tryToMerge(entityitem); -diff --git a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -index f22e615dba31619c97bf58930da060476a52facf..f5bb64f9f683cf21e772035e9be100ed2ddf8bc6 100644 ---- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -+++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -@@ -317,11 +317,17 @@ public class EnderMan extends Monster implements NeutralMob { - private boolean teleport(double x, double y, double z) { - BlockPos.MutableBlockPos blockposition_mutableblockposition = new BlockPos.MutableBlockPos(x, y, z); - -- while (blockposition_mutableblockposition.getY() > this.level.getMinBuildHeight() && !this.level.getBlockState(blockposition_mutableblockposition).getMaterial().blocksMotion()) { -+ // Pufferfish start - single chunk lookup -+ net.minecraft.world.level.chunk.LevelChunk chunk = this.level.getChunkIfLoaded(blockposition_mutableblockposition); -+ if (chunk == null) { -+ return false; -+ } -+ // Pufferfish end -+ while (blockposition_mutableblockposition.getY() > this.level.getMinBuildHeight() && !chunk.getBlockState(blockposition_mutableblockposition).getMaterial().blocksMotion()) { // Pufferfish - blockposition_mutableblockposition.move(Direction.DOWN); - } - -- BlockState iblockdata = this.level.getBlockState(blockposition_mutableblockposition); -+ BlockState iblockdata = chunk.getBlockState(blockposition_mutableblockposition); // Pufferfish - boolean flag = iblockdata.getMaterial().blocksMotion(); - boolean flag1 = iblockdata.getFluidState().is(FluidTags.WATER); - -diff --git a/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java b/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java -index 45741410a13cffe3419e34b5607b048bbcf1c3ff..5d487f1613b1fc5807283c20e5cc23a432d08f42 100644 ---- a/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java -+++ b/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java -@@ -126,9 +126,11 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { - return (Brain) super.getBrain(); // Paper - decompile fix - } - -+ private int behaviorTick; // Pufferfish - @Override - protected void customServerAiStep() { - this.level.getProfiler().push("hoglinBrain"); -+ if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish - this.getBrain().tick((ServerLevel)this.level, this); - this.level.getProfiler().pop(); - HoglinAi.updateActivity(this); -diff --git a/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java b/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java -index abeb7285dc0d1e6687feaae8be2dbde1d61b7f11..23547da37a4178a32775285a1d697c369a7ffcd2 100644 ---- a/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java -+++ b/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java -@@ -289,9 +289,11 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento - return !this.cannotHunt; - } - -+ private int behaviorTick; // Pufferfish - @Override - protected void customServerAiStep() { - this.level.getProfiler().push("piglinBrain"); -+ if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish - this.getBrain().tick((ServerLevel) this.level, this); - this.level.getProfiler().pop(); - PiglinAi.updateActivity(this); -diff --git a/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java b/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java -index 27bd70dc30c8472e5a80f3273f9233a0392f831d..b3158b1a7772f1254dd081ff6d3278a92192e896 100644 ---- a/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java -+++ b/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java -@@ -270,11 +270,13 @@ public class Warden extends Monster implements VibrationListener.VibrationListen - - } - -+ private int behaviorTick = 0; // Pufferfish - @Override - protected void customServerAiStep() { - ServerLevel worldserver = (ServerLevel) this.level; - - worldserver.getProfiler().push("wardenBrain"); -+ if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish - this.getBrain().tick(worldserver, this); - this.level.getProfiler().pop(); - super.customServerAiStep(); -diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java -index 49f82c954155115b2caa87d7624521a9f7982be2..fa7cede4a0b59efde4949dba4a010aed5cd0a960 100644 ---- a/src/main/java/net/minecraft/world/entity/npc/Villager.java -+++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java -@@ -140,6 +140,8 @@ public class Villager extends AbstractVillager implements ReputationEventHandler - return holder.is(PoiTypes.MEETING); - }); - -+ public long nextGolemPanic = -1; // Pufferfish -+ - public Villager(EntityType entityType, Level world) { - this(entityType, world, VillagerType.PLAINS); - } -@@ -243,11 +245,17 @@ public class Villager extends AbstractVillager implements ReputationEventHandler - } - // Spigot End - -+ private int behaviorTick = 0; // Pufferfish - @Override - protected void customServerAiStep() { mobTick(false); } - protected void mobTick(boolean inactive) { - this.level.getProfiler().push("villagerBrain"); -- if (!inactive) this.getBrain().tick((ServerLevel) this.level, this); // Paper -+ // Pufferfish start -+ if (!inactive) { -+ if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish -+ this.getBrain().tick((ServerLevel) this.level, this); // Paper -+ } -+ // Pufferfish end - this.level.getProfiler().pop(); - if (this.assignProfessionWhenSpawned) { - this.assignProfessionWhenSpawned = false; -diff --git a/src/main/java/net/minecraft/world/entity/player/Inventory.java b/src/main/java/net/minecraft/world/entity/player/Inventory.java -index a1a625a8dacf4d2bbf75ddd90dce1b1be663c919..23e375c9a6955d03e0fc9be91ff0403251c8216c 100644 ---- a/src/main/java/net/minecraft/world/entity/player/Inventory.java -+++ b/src/main/java/net/minecraft/world/entity/player/Inventory.java -@@ -681,6 +681,8 @@ public class Inventory implements Container, Nameable { - } - - public boolean contains(ItemStack stack) { -+ // Pufferfish start - don't allocate iterators -+ /* - Iterator iterator = this.compartments.iterator(); - - while (iterator.hasNext()) { -@@ -695,6 +697,18 @@ public class Inventory implements Container, Nameable { - } - } - } -+ */ -+ for (int i = 0; i < this.compartments.size(); i++) { -+ List list = this.compartments.get(i); -+ for (int j = 0; j < list.size(); j++) { -+ ItemStack itemstack1 = list.get(j); -+ -+ if (!itemstack1.isEmpty() && itemstack1.sameItem(stack)) { -+ return true; -+ } -+ } -+ } -+ // Pufferfish end - - return false; - } -diff --git a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java -index 713c11d6547cb02ac4b6a02aec07a8ba68019f3f..bf828b9a36fc70bcf4c4d87d5db2d37aa384499c 100644 ---- a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java -+++ b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java -@@ -42,6 +42,36 @@ public abstract class Projectile extends Entity { - super(type, world); - } - -+ // Pufferfish start -+ private static int loadedThisTick = 0; -+ private static int loadedTick; -+ -+ private int loadedLifetime = 0; -+ @Override -+ public void setPos(double x, double y, double z) { -+ int currentTick = net.minecraft.server.MinecraftServer.currentTick; -+ if (loadedTick != currentTick) { -+ loadedTick = currentTick; -+ loadedThisTick = 0; -+ } -+ int previousX = Mth.floor(this.getX()) >> 4, previousZ = Mth.floor(this.getZ()) >> 4; -+ int newX = Mth.floor(x) >> 4, newZ = Mth.floor(z) >> 4; -+ if (previousX != newX || previousZ != newZ) { -+ boolean isLoaded = ((net.minecraft.server.level.ServerChunkCache) this.level.getChunkSource()).getChunkAtIfLoadedMainThread(newX, newZ) != null; -+ if (!isLoaded) { -+ if (Projectile.loadedThisTick > gg.pufferfish.pufferfish.PufferfishConfig.maxProjectileLoadsPerTick) { -+ if (++this.loadedLifetime > gg.pufferfish.pufferfish.PufferfishConfig.maxProjectileLoadsPerProjectile) { -+ this.discard(); -+ } -+ return; -+ } -+ Projectile.loadedThisTick++; -+ } -+ } -+ super.setPos(x, y, z); -+ } -+ // Pufferfish start -+ - public void setOwner(@Nullable Entity entity) { - if (entity != null) { - this.ownerUUID = entity.getUUID(); -diff --git a/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecartContainer.java b/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecartContainer.java -index b8fb7b5a347298ada16bc8b818edf1863e3f6040..43b4c4f9630bfa451d135139236ac6fce034ec15 100644 ---- a/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecartContainer.java -+++ b/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecartContainer.java -@@ -27,7 +27,10 @@ import org.bukkit.inventory.InventoryHolder; - - public abstract class AbstractMinecartContainer extends AbstractMinecart implements ContainerEntity { - -+ // Pufferfish start - private NonNullList itemStacks; -+ private gg.airplane.structs.ItemListWithBitset itemStacksOptimized; -+ // Pufferfish end - @Nullable - public ResourceLocation lootTable; - public long lootTableSeed; -@@ -89,12 +92,18 @@ public abstract class AbstractMinecartContainer extends AbstractMinecart impleme - - protected AbstractMinecartContainer(EntityType type, Level world) { - super(type, world); -- this.itemStacks = NonNullList.withSize(this.getContainerSize(), ItemStack.EMPTY); // CraftBukkit - SPIGOT-3513 -+ // Pufferfish start -+ this.itemStacksOptimized = new gg.airplane.structs.ItemListWithBitset(this.getContainerSize()); // CraftBukkit - SPIGOT-3513 -+ this.itemStacks = this.itemStacksOptimized.nonNullList; -+ // Pufferfish end - } - - protected AbstractMinecartContainer(EntityType type, double x, double y, double z, Level world) { - super(type, world, x, y, z); -- this.itemStacks = NonNullList.withSize(this.getContainerSize(), ItemStack.EMPTY); // CraftBukkit - SPIGOT-3513 -+ // Pufferfish start -+ this.itemStacksOptimized = new gg.airplane.structs.ItemListWithBitset(this.getContainerSize()); // CraftBukkit - SPIGOT-3513 -+ this.itemStacks = this.itemStacksOptimized.nonNullList; -+ // Pufferfish end - } - - @Override -@@ -156,6 +165,10 @@ public abstract class AbstractMinecartContainer extends AbstractMinecart impleme - protected void readAdditionalSaveData(CompoundTag nbt) { - super.readAdditionalSaveData(nbt); - this.lootableData.loadNbt(nbt); // Paper -+ // Pufferfish start -+ this.itemStacksOptimized = new gg.airplane.structs.ItemListWithBitset(this.getContainerSize()); -+ this.itemStacks = this.itemStacksOptimized.nonNullList; -+ // Pufferfish end - this.readChestVehicleSaveData(nbt); - } - -diff --git a/src/main/java/net/minecraft/world/item/crafting/ShapelessRecipe.java b/src/main/java/net/minecraft/world/item/crafting/ShapelessRecipe.java -index ffe5476d8ed15ee4384b679c341688787205ce59..9051559e78851257a56a998b4b882ebbcc394639 100644 ---- a/src/main/java/net/minecraft/world/item/crafting/ShapelessRecipe.java -+++ b/src/main/java/net/minecraft/world/item/crafting/ShapelessRecipe.java -@@ -25,8 +25,13 @@ public class ShapelessRecipe implements CraftingRecipe { - final String group; - final ItemStack result; - final NonNullList ingredients; -+ private final boolean isBukkit; // Pufferfish - -+ // Pufferfish start - public ShapelessRecipe(ResourceLocation id, String group, ItemStack output, NonNullList input) { -+ this(id, group, output, input, false); -+ } -+ public ShapelessRecipe(ResourceLocation id, String group, ItemStack output, NonNullList input, boolean isBukkit) { this.isBukkit = isBukkit; // Pufferfish end - this.id = id; - this.group = group; - this.result = output; -@@ -73,6 +78,28 @@ public class ShapelessRecipe implements CraftingRecipe { - } - - public boolean matches(CraftingContainer inventory, Level world) { -+ // Pufferfish start -+ if (!this.isBukkit) { -+ java.util.List ingredients = com.google.common.collect.Lists.newArrayList(this.ingredients.toArray(new Ingredient[0])); -+ -+ inventory: for (int index = 0; index < inventory.getContainerSize(); index++) { -+ ItemStack itemStack = inventory.getItem(index); -+ -+ if (!itemStack.isEmpty()) { -+ for (int i = 0; i < ingredients.size(); i++) { -+ if (ingredients.get(i).test(itemStack)) { -+ ingredients.remove(i); -+ continue inventory; -+ } -+ } -+ return false; -+ } -+ } -+ -+ return ingredients.isEmpty(); -+ } -+ // Pufferfish end -+ - StackedContents autorecipestackmanager = new StackedContents(); - int i = 0; - -diff --git a/src/main/java/net/minecraft/world/level/BlockGetter.java b/src/main/java/net/minecraft/world/level/BlockGetter.java -index d1eefa6ef3e9abfe7af4d8310aa64465fa2d5463..0f4aa330e5b179bb706a31917c671f165e22b9cd 100644 ---- a/src/main/java/net/minecraft/world/level/BlockGetter.java -+++ b/src/main/java/net/minecraft/world/level/BlockGetter.java -@@ -73,6 +73,16 @@ public interface BlockGetter extends LevelHeightAccessor { - }); - } - -+ // Pufferfish start - broken down variant of below rayTraceBlock, used by World#rayTraceDirect -+ default net.minecraft.world.phys.BlockHitResult.Type rayTraceBlockDirect(Vec3 vec3d, Vec3 vec3d1, BlockPos blockposition, BlockState iblockdata, net.minecraft.world.phys.shapes.CollisionContext voxelshapecoll) { -+ if (iblockdata.isAir()) return null; // Tuinity - optimise air cases -+ VoxelShape voxelshape = ClipContext.Block.COLLIDER.get(iblockdata, this, blockposition, voxelshapecoll); -+ net.minecraft.world.phys.BlockHitResult movingobjectpositionblock = this.clipWithInteractionOverride(vec3d, vec3d1, blockposition, voxelshape, iblockdata); -+ -+ return movingobjectpositionblock == null ? null : movingobjectpositionblock.getType(); -+ } -+ // Pufferfish end -+ - // CraftBukkit start - moved block handling into separate method for use by Block#rayTrace - default BlockHitResult clip(ClipContext raytrace1, BlockPos blockposition) { - // Paper start - Prevent raytrace from loading chunks -diff --git a/src/main/java/net/minecraft/world/level/GameRules.java b/src/main/java/net/minecraft/world/level/GameRules.java -index 2c500cfdd594e24b039d698bced1f9f9537722e3..9fa0758c0a8c74dec6cfe8a16585ace1cf45df96 100644 ---- a/src/main/java/net/minecraft/world/level/GameRules.java -+++ b/src/main/java/net/minecraft/world/level/GameRules.java -@@ -91,6 +91,7 @@ public class GameRules { - public static final GameRules.Key RULE_UNIVERSAL_ANGER = GameRules.register("universalAnger", GameRules.Category.MOBS, GameRules.BooleanValue.create(false)); - public static final GameRules.Key RULE_PLAYERS_SLEEPING_PERCENTAGE = GameRules.register("playersSleepingPercentage", GameRules.Category.PLAYER, GameRules.IntegerValue.create(100)); - private final Map, GameRules.Value> rules; -+ private final GameRules.Value[] gameruleArray; - - private static > GameRules.Key register(String name, GameRules.Category category, GameRules.Type type) { - GameRules.Key gamerules_gamerulekey = new GameRules.Key<>(name, category); -@@ -109,17 +110,33 @@ public class GameRules { - } - - public GameRules() { -- this.rules = (Map) GameRules.GAME_RULE_TYPES.entrySet().stream().collect(ImmutableMap.toImmutableMap(Entry::getKey, (entry) -> { -+ // Pufferfish start - use this to ensure gameruleArray is initialized -+ this((Map) GameRules.GAME_RULE_TYPES.entrySet().stream().collect(ImmutableMap.toImmutableMap(Entry::getKey, (entry) -> { - return ((GameRules.Type) entry.getValue()).createRule(); -- })); -+ }))); -+ // Pufferfish end - } - - private GameRules(Map, GameRules.Value> rules) { - this.rules = rules; -+ -+ // Pufferfish start -+ int arraySize = rules.keySet().stream().mapToInt(key -> key.gameRuleIndex).max().orElse(-1) + 1; -+ GameRules.Value[] values = new GameRules.Value[arraySize]; -+ -+ for (Entry, GameRules.Value> entry : rules.entrySet()) { -+ values[entry.getKey().gameRuleIndex] = entry.getValue(); -+ } -+ -+ this.gameruleArray = values; -+ // Pufferfish end - } - - public > T getRule(GameRules.Key key) { -- return (T) this.rules.get(key); // CraftBukkit - decompile error -+ // Pufferfish start -+ return key == null ? null : (T) this.gameruleArray[key.gameRuleIndex]; -+ //return (T) this.rules.get(key); // CraftBukkit - decompile error -+ // Pufferfish end - } - - public CompoundTag createTag() { -@@ -178,6 +195,10 @@ public class GameRules { - } - - public static final class Key> { -+ // Pufferfish start -+ private static int lastGameRuleIndex = 0; -+ public final int gameRuleIndex = lastGameRuleIndex++; -+ // Pufferfish end - - final String id; - private final GameRules.Category category; -diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index 596fb8ee21ba8450db13a11890d241ef3974d81d..791411866cabc2c237f40d54250d5a34653ceaa0 100644 ---- a/src/main/java/net/minecraft/world/level/Level.java -+++ b/src/main/java/net/minecraft/world/level/Level.java -@@ -271,6 +271,17 @@ public abstract class Level implements LevelAccessor, AutoCloseable { - - public abstract ResourceKey getTypeKey(); - -+ protected final io.papermc.paper.util.math.ThreadUnsafeRandom randomTickRandom = new io.papermc.paper.util.math.ThreadUnsafeRandom(java.util.concurrent.ThreadLocalRandom.current().nextLong()); public net.minecraft.util.RandomSource getThreadUnsafeRandom() { return this.randomTickRandom; } // Pufferfish - move thread unsafe random initialization // Pufferfish - getter -+ -+ // Pufferfish start - ensure these get inlined -+ private final int minBuildHeight, minSection, height, maxBuildHeight, maxSection; -+ @Override public final int getMaxBuildHeight() { return this.maxBuildHeight; } -+ @Override public final int getMinSection() { return this.minSection; } -+ @Override public final int getMaxSection() { return this.maxSection; } -+ @Override public final int getMinBuildHeight() { return this.minBuildHeight; } -+ @Override public final int getHeight() { return this.height; } -+ // Pufferfish end -+ - protected Level(WritableLevelData worlddatamutable, ResourceKey resourcekey, Holder holder, Supplier supplier, boolean flag, boolean flag1, long i, int j, org.bukkit.generator.ChunkGenerator gen, org.bukkit.generator.BiomeProvider biomeProvider, org.bukkit.World.Environment env, java.util.function.Function paperWorldConfigCreator, java.util.concurrent.Executor executor) { // Paper - Async-Anti-Xray - Pass executor - this.spigotConfig = new org.spigotmc.SpigotWorldConfig(((net.minecraft.world.level.storage.PrimaryLevelData) worlddatamutable).getLevelName()); // Spigot - this.paperConfig = paperWorldConfigCreator.apply(this.spigotConfig); // Paper -@@ -293,6 +304,13 @@ public abstract class Level implements LevelAccessor, AutoCloseable { - }); - final DimensionType dimensionmanager = (DimensionType) holder.value(); - -+ // Pufferfish start -+ this.minBuildHeight = dimensionmanager.minY(); -+ this.minSection = SectionPos.blockToSectionCoord(this.minBuildHeight); -+ this.height = dimensionmanager.height(); -+ this.maxBuildHeight = this.minBuildHeight + this.height; -+ this.maxSection = SectionPos.blockToSectionCoord(this.maxBuildHeight - 1) + 1; -+ // Pufferfish end - this.dimension = resourcekey; - this.isClientSide = flag; - if (dimensionmanager.coordinateScale() != 1.0D) { -@@ -408,6 +426,91 @@ public abstract class Level implements LevelAccessor, AutoCloseable { - return null; - } - -+ // Pufferfish start - broken down method of raytracing for EntityLiving#hasLineOfSight, replaces IBlockAccess#rayTrace(RayTrace) -+ public net.minecraft.world.phys.BlockHitResult.Type rayTraceDirect(net.minecraft.world.phys.Vec3 vec3d, net.minecraft.world.phys.Vec3 vec3d1, net.minecraft.world.phys.shapes.CollisionContext voxelshapecoll) { -+ // most of this code comes from IBlockAccess#a(RayTrace, BiFunction, Function), but removes the needless functions -+ if (vec3d.equals(vec3d1)) { -+ return net.minecraft.world.phys.BlockHitResult.Type.MISS; -+ } -+ -+ double endX = Mth.lerp(-1.0E-7D, vec3d1.x, vec3d.x); -+ double endY = Mth.lerp(-1.0E-7D, vec3d1.y, vec3d.y); -+ double endZ = Mth.lerp(-1.0E-7D, vec3d1.z, vec3d.z); -+ -+ double startX = Mth.lerp(-1.0E-7D, vec3d.x, vec3d1.x); -+ double startY = Mth.lerp(-1.0E-7D, vec3d.y, vec3d1.y); -+ double startZ = Mth.lerp(-1.0E-7D, vec3d.z, vec3d1.z); -+ -+ int currentX = Mth.floor(startX); -+ int currentY = Mth.floor(startY); -+ int currentZ = Mth.floor(startZ); -+ -+ BlockPos.MutableBlockPos currentBlock = new BlockPos.MutableBlockPos(currentX, currentY, currentZ); -+ -+ LevelChunk chunk = this.getChunkIfLoaded(currentBlock); -+ if (chunk == null) { -+ return net.minecraft.world.phys.BlockHitResult.Type.MISS; -+ } -+ -+ net.minecraft.world.phys.BlockHitResult.Type initialCheck = this.rayTraceBlockDirect(vec3d, vec3d1, currentBlock, chunk.getBlockState(currentBlock), voxelshapecoll); -+ -+ if (initialCheck != null) { -+ return initialCheck; -+ } -+ -+ double diffX = endX - startX; -+ double diffY = endY - startY; -+ double diffZ = endZ - startZ; -+ -+ int xDirection = Mth.sign(diffX); -+ int yDirection = Mth.sign(diffY); -+ int zDirection = Mth.sign(diffZ); -+ -+ double normalizedX = xDirection == 0 ? Double.MAX_VALUE : (double) xDirection / diffX; -+ double normalizedY = yDirection == 0 ? Double.MAX_VALUE : (double) yDirection / diffY; -+ double normalizedZ = zDirection == 0 ? Double.MAX_VALUE : (double) zDirection / diffZ; -+ -+ double normalizedXDirection = normalizedX * (xDirection > 0 ? 1.0D - Mth.frac(startX) : Mth.frac(startX)); -+ double normalizedYDirection = normalizedY * (yDirection > 0 ? 1.0D - Mth.frac(startY) : Mth.frac(startY)); -+ double normalizedZDirection = normalizedZ * (zDirection > 0 ? 1.0D - Mth.frac(startZ) : Mth.frac(startZ)); -+ -+ net.minecraft.world.phys.BlockHitResult.Type result; -+ -+ do { -+ if (normalizedXDirection > 1.0D && normalizedYDirection > 1.0D && normalizedZDirection > 1.0D) { -+ return net.minecraft.world.phys.BlockHitResult.Type.MISS; -+ } -+ -+ if (normalizedXDirection < normalizedYDirection) { -+ if (normalizedXDirection < normalizedZDirection) { -+ currentX += xDirection; -+ normalizedXDirection += normalizedX; -+ } else { -+ currentZ += zDirection; -+ normalizedZDirection += normalizedZ; -+ } -+ } else if (normalizedYDirection < normalizedZDirection) { -+ currentY += yDirection; -+ normalizedYDirection += normalizedY; -+ } else { -+ currentZ += zDirection; -+ normalizedZDirection += normalizedZ; -+ } -+ -+ currentBlock.set(currentX, currentY, currentZ); -+ if (chunk.getPos().x != currentBlock.getX() >> 4 || chunk.getPos().z != currentBlock.getZ() >> 4) { -+ chunk = this.getChunkIfLoaded(currentBlock); -+ if (chunk == null) { -+ return net.minecraft.world.phys.BlockHitResult.Type.MISS; -+ } -+ } -+ result = this.rayTraceBlockDirect(vec3d, vec3d1, currentBlock, chunk.getBlockState(currentBlock), voxelshapecoll); -+ } while (result == null); -+ -+ return result; -+ } -+ // Pufferfish end -+ - public boolean isInWorldBounds(BlockPos pos) { - return pos.isInsideBuildHeightAndWorldBoundsHorizontal(this); // Paper - use better/optimized check - } -@@ -896,13 +999,13 @@ public abstract class Level implements LevelAccessor, AutoCloseable { - try { - tickConsumer.accept(entity); - MinecraftServer.getServer().executeMidTickTasks(); // Paper - execute chunk tasks mid tick -- } catch (Throwable throwable) { -+ } catch (Throwable throwable) { // Pufferfish - diff on change ServerLevel.tick - if (throwable instanceof ThreadDeath) throw throwable; // Paper - // Paper start - Prevent tile entity and entity crashes - final String msg = String.format("Entity threw exception at %s:%s,%s,%s", entity.level.getWorld().getName(), entity.getX(), entity.getY(), entity.getZ()); - MinecraftServer.LOGGER.error(msg, throwable); - getCraftServer().getPluginManager().callEvent(new ServerExceptionEvent(new ServerInternalException(msg, throwable))); -- entity.discard(); -+ entity.discard(); // Pufferfish - diff on change ServerLevel.tick - // Paper end - } - } -@@ -1388,6 +1491,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { - } - - public ProfilerFiller getProfiler() { -+ if (gg.pufferfish.pufferfish.PufferfishConfig.disableMethodProfiler) return net.minecraft.util.profiling.InactiveProfiler.INSTANCE; // Pufferfish - return (ProfilerFiller) this.profiler.get(); - } - -diff --git a/src/main/java/net/minecraft/world/level/NaturalSpawner.java b/src/main/java/net/minecraft/world/level/NaturalSpawner.java -index 7c7408b9686c8ff945c30892d45914c60f6c5e4a..a182b3c804cf56855e15290f826fdebdc289a552 100644 ---- a/src/main/java/net/minecraft/world/level/NaturalSpawner.java -+++ b/src/main/java/net/minecraft/world/level/NaturalSpawner.java -@@ -415,12 +415,12 @@ public final class NaturalSpawner { - } - } - -- private static BlockPos getRandomPosWithin(Level world, LevelChunk chunk) { -+ private static BlockPos getRandomPosWithin(ServerLevel world, LevelChunk chunk) { // Pufferfish - accept serverlevel - ChunkPos chunkcoordintpair = chunk.getPos(); -- int i = chunkcoordintpair.getMinBlockX() + world.random.nextInt(16); -- int j = chunkcoordintpair.getMinBlockZ() + world.random.nextInt(16); -+ int i = chunkcoordintpair.getMinBlockX() + world.getThreadUnsafeRandom().nextInt(16); // Pufferfish - use thread unsafe random -+ int j = chunkcoordintpair.getMinBlockZ() + world.getThreadUnsafeRandom().nextInt(16); // Pufferfish - int k = chunk.getHeight(Heightmap.Types.WORLD_SURFACE, i, j) + 1; -- int l = Mth.randomBetweenInclusive(world.random, world.getMinBuildHeight(), k); -+ int l = Mth.randomBetweenInclusive(world.getThreadUnsafeRandom(), world.getMinBuildHeight(), k); // Pufferfish - - return new BlockPos(i, l, j); - } -diff --git a/src/main/java/net/minecraft/world/level/biome/Biome.java b/src/main/java/net/minecraft/world/level/biome/Biome.java -index ca259e278ad10347567c021376abca0287610432..021f7c44285b13a0904c09ea7210f2a5d10c7c61 100644 ---- a/src/main/java/net/minecraft/world/level/biome/Biome.java -+++ b/src/main/java/net/minecraft/world/level/biome/Biome.java -@@ -66,14 +66,20 @@ public final class Biome { - private final BiomeGenerationSettings generationSettings; - private final MobSpawnSettings mobSettings; - private final BiomeSpecialEffects specialEffects; -- private final ThreadLocal temperatureCache = ThreadLocal.withInitial(() -> { -+ // Pufferfish start - use our cache -+ private final ThreadLocal temperatureCache = ThreadLocal.withInitial(() -> { - return Util.make(() -> { -+ /* - Long2FloatLinkedOpenHashMap long2FloatLinkedOpenHashMap = new Long2FloatLinkedOpenHashMap(1024, 0.25F) { - protected void rehash(int i) { - } - }; - long2FloatLinkedOpenHashMap.defaultReturnValue(Float.NaN); - return long2FloatLinkedOpenHashMap; -+ -+ */ -+ return new gg.airplane.structs.Long2FloatAgingCache(TEMPERATURE_CACHE_SIZE); -+ // Pufferfish end - }); - }); - -@@ -114,17 +120,15 @@ public final class Biome { - @Deprecated - public float getTemperature(BlockPos blockPos) { - long l = blockPos.asLong(); -- Long2FloatLinkedOpenHashMap long2FloatLinkedOpenHashMap = this.temperatureCache.get(); -- float f = long2FloatLinkedOpenHashMap.get(l); -+ // Pufferfish start -+ gg.airplane.structs.Long2FloatAgingCache cache = this.temperatureCache.get(); -+ float f = cache.getValue(l); - if (!Float.isNaN(f)) { - return f; - } else { - float g = this.getHeightAdjustedTemperature(blockPos); -- if (long2FloatLinkedOpenHashMap.size() == 1024) { -- long2FloatLinkedOpenHashMap.removeFirstFloat(); -- } -- -- long2FloatLinkedOpenHashMap.put(l, g); -+ cache.putValue(l, g); -+ // Pufferfish end - return g; - } - } -diff --git a/src/main/java/net/minecraft/world/level/block/entity/ChestBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/ChestBlockEntity.java -index a71414397bd45ee7bcacfeef0041d80dfa25f114..d66806565770cb03a21794f99e5c4b0f3040b26a 100644 ---- a/src/main/java/net/minecraft/world/level/block/entity/ChestBlockEntity.java -+++ b/src/main/java/net/minecraft/world/level/block/entity/ChestBlockEntity.java -@@ -31,7 +31,10 @@ import org.bukkit.entity.HumanEntity; - public class ChestBlockEntity extends RandomizableContainerBlockEntity implements LidBlockEntity { - - private static final int EVENT_SET_OPEN_COUNT = 1; -+ // Pufferfish start - private NonNullList items; -+ private gg.airplane.structs.ItemListWithBitset optimizedItems; -+ // Pufferfish end - public final ContainerOpenersCounter openersCounter; - private final ChestLidController chestLidController; - -@@ -65,9 +68,13 @@ public class ChestBlockEntity extends RandomizableContainerBlockEntity implement - } - // CraftBukkit end - -+ private final boolean isNative = getClass().equals(ChestBlockEntity.class); // Pufferfish - protected ChestBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { - super(type, pos, state); -- this.items = NonNullList.withSize(27, ItemStack.EMPTY); -+ // Pufferfish start -+ this.optimizedItems = new gg.airplane.structs.ItemListWithBitset(27); -+ this.items = this.optimizedItems.nonNullList; -+ // Pufferfish end - this.openersCounter = new ContainerOpenersCounter() { - @Override - protected void onOpen(Level world, BlockPos pos, BlockState state) { -@@ -98,6 +105,23 @@ public class ChestBlockEntity extends RandomizableContainerBlockEntity implement - this.chestLidController = new ChestLidController(); - } - -+ // Pufferfish start -+ @Override -+ public boolean hasEmptySlot(Direction enumdirection) { -+ return isNative ? !this.optimizedItems.hasFullStacks() : super.hasEmptySlot(enumdirection); -+ } -+ -+ @Override -+ public boolean isCompletelyFull(Direction enumdirection) { -+ return isNative ? this.optimizedItems.hasFullStacks() && super.isCompletelyFull(enumdirection) : super.isCompletelyFull(enumdirection); -+ } -+ -+ @Override -+ public boolean isCompletelyEmpty(Direction enumdirection) { -+ return isNative && this.optimizedItems.isCompletelyEmpty() || super.isCompletelyEmpty(enumdirection); -+ } -+ // Pufferfish end -+ - public ChestBlockEntity(BlockPos pos, BlockState state) { - this(BlockEntityType.CHEST, pos, state); - } -@@ -115,7 +139,10 @@ public class ChestBlockEntity extends RandomizableContainerBlockEntity implement - @Override - public void load(CompoundTag nbt) { - super.load(nbt); -- this.items = NonNullList.withSize(this.getContainerSize(), ItemStack.EMPTY); -+ // Pufferfish start -+ this.optimizedItems = new gg.airplane.structs.ItemListWithBitset(this.getContainerSize()); -+ this.items = this.optimizedItems.nonNullList; -+ // Pufferfish end - if (!this.tryLoadLootTable(nbt)) { - ContainerHelper.loadAllItems(nbt, this.items); - } -@@ -187,7 +214,10 @@ public class ChestBlockEntity extends RandomizableContainerBlockEntity implement - - @Override - protected void setItems(NonNullList list) { -- this.items = list; -+ // Pufferfish start -+ this.optimizedItems = gg.airplane.structs.ItemListWithBitset.fromList(list); -+ this.items = this.optimizedItems.nonNullList; -+ // Pufferfish end - } - - @Override -diff --git a/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java -index ccad692aba2ed77259f6814d88f01b91ed9d229b..698a0ac71cf9fb409d609a81cc2958121260a46d 100644 ---- a/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java -+++ b/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java -@@ -43,7 +43,10 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen - - public static final int MOVE_ITEM_SPEED = 8; - public static final int HOPPER_CONTAINER_SIZE = 5; -+ // Pufferfish start - private NonNullList items; -+ private gg.airplane.structs.ItemListWithBitset optimizedItems; // Pufferfish -+ // Pufferfish end - private int cooldownTime; - private long tickedGameTime; - -@@ -79,14 +82,37 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen - - public HopperBlockEntity(BlockPos pos, BlockState state) { - super(BlockEntityType.HOPPER, pos, state); -- this.items = NonNullList.withSize(5, ItemStack.EMPTY); -+ // Pufferfish start -+ this.optimizedItems = new gg.airplane.structs.ItemListWithBitset(5); -+ this.items = this.optimizedItems.nonNullList; -+ // Pufferfish end - this.cooldownTime = -1; - } - -+ // Pufferfish start -+ @Override -+ public boolean hasEmptySlot(Direction enumdirection) { -+ return !this.optimizedItems.hasFullStacks(); -+ } -+ -+ @Override -+ public boolean isCompletelyFull(Direction enumdirection) { -+ return this.optimizedItems.hasFullStacks() && super.isCompletelyFull(enumdirection); -+ } -+ -+ @Override -+ public boolean isCompletelyEmpty(Direction enumdirection) { -+ return this.optimizedItems.isCompletelyEmpty() || super.isCompletelyEmpty(enumdirection); -+ } -+ // Pufferfish end -+ - @Override - public void load(CompoundTag nbt) { - super.load(nbt); -- this.items = NonNullList.withSize(this.getContainerSize(), ItemStack.EMPTY); -+ // Pufferfish start -+ this.optimizedItems = new gg.airplane.structs.ItemListWithBitset(this.getContainerSize()); -+ this.items = this.optimizedItems.nonNullList; -+ // Pufferfish end - if (!this.tryLoadLootTable(nbt)) { - ContainerHelper.loadAllItems(nbt, this.items); - } -@@ -158,7 +184,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen - flag = HopperBlockEntity.ejectItems(world, pos, state, (Container) blockEntity, blockEntity); // CraftBukkit - } - -- if (!blockEntity.inventoryFull()) { -+ if (!blockEntity.optimizedItems.hasFullStacks() || !blockEntity.inventoryFull()) { // Pufferfish - use bitset first - flag |= booleansupplier.getAsBoolean(); - } - -@@ -197,7 +223,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen - skipPushModeEventFire = skipHopperEvents; - boolean foundItem = false; - for (int i = 0; i < hopper.getContainerSize(); ++i) { -- ItemStack item = hopper.getItem(i); -+ ItemStack item = hopper.getItem(i); // Pufferfish - if (!item.isEmpty()) { - foundItem = true; - ItemStack origItemStack = item; -@@ -400,12 +426,18 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen - } - - private static boolean isFullContainer(Container inventory, Direction direction) { -- return allMatch(inventory, direction, STACK_SIZE_TEST); // Paper - no streams -+ // Pufferfish start - use bitsets -+ //return allMatch(inventory, direction, STACK_SIZE_TEST); // Paper - no streams -+ return inventory.isCompletelyFull(direction); -+ // Pufferfish end - } - - private static boolean isEmptyContainer(Container inv, Direction facing) { - // Paper start -- return allMatch(inv, facing, IS_EMPTY_TEST); -+ // Pufferfish start - use bitsets -+ //return allMatch(inv, facing, IS_EMPTY_TEST); -+ return inv.isCompletelyEmpty(facing); -+ // Pufferfish end - } - private static boolean allMatch(Container iinventory, Direction enumdirection, java.util.function.BiPredicate test) { - if (iinventory instanceof WorldlyContainer) { -@@ -582,7 +614,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen - - if (HopperBlockEntity.canPlaceItemInContainer(to, stack, slot, side)) { - boolean flag = false; -- boolean flag1 = to.isEmpty(); -+ boolean flag1 = to.isCompletelyEmpty(side); // Pufferfish - - if (itemstack1.isEmpty()) { - // Spigot start - SPIGOT-6693, InventorySubcontainer#setItem -@@ -730,7 +762,10 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen - - @Override - protected void setItems(NonNullList list) { -- this.items = list; -+ // Pufferfish start -+ this.optimizedItems = gg.airplane.structs.ItemListWithBitset.fromList(list); -+ this.items = this.optimizedItems.nonNullList; -+ // Pufferfish end - } - - public static void entityInside(Level world, BlockPos pos, BlockState state, Entity entity, HopperBlockEntity blockEntity) { -diff --git a/src/main/java/net/minecraft/world/level/block/entity/RandomizableContainerBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/RandomizableContainerBlockEntity.java -index d559f93a9a09bac414dd5d58afccad42c127f09b..13e749a3c40f0b2cc002f13675a9a56eedbefdac 100644 ---- a/src/main/java/net/minecraft/world/level/block/entity/RandomizableContainerBlockEntity.java -+++ b/src/main/java/net/minecraft/world/level/block/entity/RandomizableContainerBlockEntity.java -@@ -96,13 +96,8 @@ public abstract class RandomizableContainerBlockEntity extends BaseContainerBloc - public boolean isEmpty() { - this.unpackLootTable((Player)null); - // Paper start -- for (ItemStack itemStack : this.getItems()) { -- if (!itemStack.isEmpty()) { -- return false; -- } -- } -+ return this.isCompletelyEmpty(null); // Pufferfish - use super - // Paper end -- return true; - } - - @Override -diff --git a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java -index 5e54cf312160e537d2fe6e6fedc618160359330e..39684720c5ee2bb36b8d12cc10e05b7ab8d06172 100644 ---- a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java -+++ b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java -@@ -88,6 +88,18 @@ public class LevelChunk extends ChunkAccess { - private final LevelChunkTicks blockTicks; - private final LevelChunkTicks fluidTicks; - -+ // Pufferfish start - instead of using a random every time the chunk is ticked, define when lightning strikes preemptively -+ private int lightningTick; -+ // shouldDoLightning compiles down to 29 bytes, which with the default of 35 byte inlining should guarantee an inline -+ public final boolean shouldDoLightning(net.minecraft.util.RandomSource random) { -+ if (this.lightningTick-- <= 0) { -+ this.lightningTick = random.nextInt(this.level.spigotConfig.thunderChance) << 1; -+ return true; -+ } -+ return false; -+ } -+ // Pufferfish end -+ - public LevelChunk(Level world, ChunkPos pos) { - this(world, pos, UpgradeData.EMPTY, new LevelChunkTicks<>(), new LevelChunkTicks<>(), 0L, (LevelChunkSection[]) null, (LevelChunk.PostLoadProcessor) null, (BlendingData) null); - } -@@ -118,6 +130,7 @@ public class LevelChunk extends ChunkAccess { - this.fluidTicks = fluidTickScheduler; - // CraftBukkit start - this.bukkitChunk = new org.bukkit.craftbukkit.CraftChunk(this); -+ this.lightningTick = this.level.getThreadUnsafeRandom().nextInt(100000) << 1; // Pufferfish - initialize lightning tick - } - - public org.bukkit.Chunk bukkitChunk; -diff --git a/src/main/java/net/minecraft/world/level/chunk/LevelChunkSection.java b/src/main/java/net/minecraft/world/level/chunk/LevelChunkSection.java -index b0c9fce9d4e06cac139e341d218d0b6aac1f1943..f25467ad1c5bac7eaef4b63b2845ad04d7c76e4e 100644 ---- a/src/main/java/net/minecraft/world/level/chunk/LevelChunkSection.java -+++ b/src/main/java/net/minecraft/world/level/chunk/LevelChunkSection.java -@@ -27,6 +27,7 @@ public class LevelChunkSection { - public final PalettedContainer states; - // CraftBukkit start - read/write - private PalettedContainer> biomes; -+ public short fluidStateCount; // Pufferfish - public final com.destroystokyo.paper.util.maplist.IBlockDataList tickingList = new com.destroystokyo.paper.util.maplist.IBlockDataList(); // Paper - - public LevelChunkSection(int i, PalettedContainer datapaletteblock, PalettedContainer> palettedcontainerro) { -@@ -198,6 +199,7 @@ public class LevelChunkSection { - - if (!fluid.isEmpty()) { - --this.tickingFluidCount; -+ --this.fluidStateCount; // Pufferfish - } - - if (!state.isAir()) { -@@ -212,6 +214,7 @@ public class LevelChunkSection { - - if (!fluid1.isEmpty()) { - ++this.tickingFluidCount; -+ ++this.fluidStateCount; // Pufferfish - } - - this.updateKnownBlockInfo(x | (z << 4) | (y << 8), iblockdata1, state); // Paper -@@ -260,6 +263,7 @@ public class LevelChunkSection { - if (fluid.isRandomlyTicking()) { - this.tickingFluidCount = (short) (this.tickingFluidCount + 1); - } -+ this.fluidStateCount++; // Pufferfish - } - - }); -diff --git a/src/main/java/net/minecraft/world/level/entity/EntityTickList.java b/src/main/java/net/minecraft/world/level/entity/EntityTickList.java -index 4cdfc433df67afcd455422e9baf56f167dd712ae..57fcf3910f45ce371ac2e237b277b1034caaac4e 100644 ---- a/src/main/java/net/minecraft/world/level/entity/EntityTickList.java -+++ b/src/main/java/net/minecraft/world/level/entity/EntityTickList.java -@@ -8,7 +8,7 @@ import javax.annotation.Nullable; - import net.minecraft.world.entity.Entity; - - public class EntityTickList { -- private final io.papermc.paper.util.maplist.IteratorSafeOrderedReferenceSet entities = new io.papermc.paper.util.maplist.IteratorSafeOrderedReferenceSet<>(true); // Paper - rewrite this, always keep this updated - why would we EVER tick an entity that's not ticking? -+ public final io.papermc.paper.util.maplist.IteratorSafeOrderedReferenceSet entities = new io.papermc.paper.util.maplist.IteratorSafeOrderedReferenceSet<>(true); // Paper - rewrite this, always keep this updated - why would we EVER tick an entity that's not ticking? // Pufferfish - private->public - - private void ensureActiveIsNotIterated() { - // Paper - replace with better logic, do not delay removals -diff --git a/src/main/java/net/minecraft/world/level/material/FlowingFluid.java b/src/main/java/net/minecraft/world/level/material/FlowingFluid.java -index ff40fe323964f173561a6838fb443e79abf9df38..c2c3ed6ba79f9f41497e042571f699a0fc6e9335 100644 ---- a/src/main/java/net/minecraft/world/level/material/FlowingFluid.java -+++ b/src/main/java/net/minecraft/world/level/material/FlowingFluid.java -@@ -43,6 +43,8 @@ public abstract class FlowingFluid extends Fluid { - public static final BooleanProperty FALLING = BlockStateProperties.FALLING; - public static final IntegerProperty LEVEL = BlockStateProperties.LEVEL_FLOWING; - private static final int CACHE_SIZE = 200; -+ // Pufferfish start - use our own cache -+ /* - private static final ThreadLocal> OCCLUSION_CACHE = ThreadLocal.withInitial(() -> { - Object2ByteLinkedOpenHashMap object2bytelinkedopenhashmap = new Object2ByteLinkedOpenHashMap(200) { - protected void rehash(int i) {} -@@ -51,6 +53,14 @@ public abstract class FlowingFluid extends Fluid { - object2bytelinkedopenhashmap.defaultReturnValue((byte) 127); - return object2bytelinkedopenhashmap; - }); -+ */ -+ -+ private static final ThreadLocal> localFluidDirectionCache = ThreadLocal.withInitial(() -> { -+ // Pufferfish todo - mess with this number for performance -+ // with 2048 it seems very infrequent on a small world that it has to remove old entries -+ return new gg.airplane.structs.FluidDirectionCache<>(2048); -+ }); -+ // Pufferfish end - private final Map shapes = Maps.newIdentityHashMap(); - - public FlowingFluid() {} -@@ -239,6 +249,8 @@ public abstract class FlowingFluid extends Fluid { - } - - private boolean canPassThroughWall(Direction face, BlockGetter world, BlockPos pos, BlockState state, BlockPos fromPos, BlockState fromState) { -+ // Pufferfish start - modify to use our cache -+ /* - Object2ByteLinkedOpenHashMap object2bytelinkedopenhashmap; - - if (!state.getBlock().hasDynamicShape() && !fromState.getBlock().hasDynamicShape()) { -@@ -246,9 +258,16 @@ public abstract class FlowingFluid extends Fluid { - } else { - object2bytelinkedopenhashmap = null; - } -+ */ -+ gg.airplane.structs.FluidDirectionCache cache = null; -+ -+ if (!state.getBlock().hasDynamicShape() && !fromState.getBlock().hasDynamicShape()) { -+ cache = localFluidDirectionCache.get(); -+ } - - Block.BlockStatePairKey block_a; - -+ /* - if (object2bytelinkedopenhashmap != null) { - block_a = new Block.BlockStatePairKey(state, fromState, face); - byte b0 = object2bytelinkedopenhashmap.getAndMoveToFirst(block_a); -@@ -259,11 +278,22 @@ public abstract class FlowingFluid extends Fluid { - } else { - block_a = null; - } -+ */ -+ if (cache != null) { -+ block_a = new Block.BlockStatePairKey(state, fromState, face); -+ Boolean flag = cache.getValue(block_a); -+ if (flag != null) { -+ return flag; -+ } -+ } else { -+ block_a = null; -+ } - - VoxelShape voxelshape = state.getCollisionShape(world, pos); - VoxelShape voxelshape1 = fromState.getCollisionShape(world, fromPos); - boolean flag = !Shapes.mergedFaceOccludes(voxelshape, voxelshape1, face); - -+ /* - if (object2bytelinkedopenhashmap != null) { - if (object2bytelinkedopenhashmap.size() == 200) { - object2bytelinkedopenhashmap.removeLastByte(); -@@ -271,6 +301,11 @@ public abstract class FlowingFluid extends Fluid { - - object2bytelinkedopenhashmap.putAndMoveToFirst(block_a, (byte) (flag ? 1 : 0)); - } -+ */ -+ if (cache != null) { -+ cache.putValue(block_a, flag); -+ } -+ // Pufferfish end - - return flag; - } -diff --git a/src/main/java/net/minecraft/world/level/storage/loot/LootContext.java b/src/main/java/net/minecraft/world/level/storage/loot/LootContext.java -index 35f9b11a3a61976c952a2c1c64bb2a932538f54f..9e9ac64764cf0a84e25e75d8d6f516cde6047284 100644 ---- a/src/main/java/net/minecraft/world/level/storage/loot/LootContext.java -+++ b/src/main/java/net/minecraft/world/level/storage/loot/LootContext.java -@@ -41,8 +41,10 @@ public class LootContext { - this.level = world; - this.lootTables = tableGetter; - this.conditions = conditionGetter; -- this.params = ImmutableMap.copyOf(parameters); -- this.dynamicDrops = ImmutableMap.copyOf(drops); -+ // Pufferfish start - use unmodifiable maps instead of immutable ones to skip the copy -+ this.params = java.util.Collections.unmodifiableMap(parameters); -+ this.dynamicDrops = java.util.Collections.unmodifiableMap(drops); -+ // Pufferfish end - } - - public boolean hasParam(LootContextParam parameter) { -diff --git a/src/main/java/net/minecraft/world/phys/shapes/EntityCollisionContext.java b/src/main/java/net/minecraft/world/phys/shapes/EntityCollisionContext.java -index ebe65474a4a05ff1637d7f37ebcfe690af59def5..42142c512b12e5b269c19f1e821c50e7496a5f25 100644 ---- a/src/main/java/net/minecraft/world/phys/shapes/EntityCollisionContext.java -+++ b/src/main/java/net/minecraft/world/phys/shapes/EntityCollisionContext.java -@@ -19,47 +19,66 @@ public class EntityCollisionContext implements CollisionContext { - return defaultValue; - } - }; -- private final boolean descending; -- private final double entityBottom; -- private final ItemStack heldItem; -- private final Predicate canStandOnFluid; -+ // Pufferfish start - remove these and pray no plugin uses them -+ // private final boolean descending; -+ // private final double entityBottom; -+ // private final ItemStack heldItem; -+ // private final Predicate canStandOnFluid; -+ // Pufferfish end - @Nullable - private final Entity entity; - - protected EntityCollisionContext(boolean descending, double minY, ItemStack heldItem, Predicate walkOnFluidPredicate, @Nullable Entity entity) { -- this.descending = descending; -- this.entityBottom = minY; -- this.heldItem = heldItem; -- this.canStandOnFluid = walkOnFluidPredicate; -+ // Pufferfish start - remove these -+ // this.descending = descending; -+ // this.entityBottom = minY; -+ // this.heldItem = heldItem; -+ // this.canStandOnFluid = walkOnFluidPredicate; -+ // Pufferfish end - this.entity = entity; - } - - /** @deprecated */ - @Deprecated - protected EntityCollisionContext(Entity entity) { -- this(entity.isDescending(), entity.getY(), entity instanceof LivingEntity ? ((LivingEntity)entity).getMainHandItem() : ItemStack.EMPTY, entity instanceof LivingEntity ? ((LivingEntity)entity)::canStandOnFluid : (fluidState) -> { -- return false; -- }, entity); -+ // Pufferfish start - remove this -+ // this(entity.isDescending(), entity.getY(), entity instanceof LivingEntity ? ((LivingEntity)entity).getMainHandItem() : ItemStack.EMPTY, entity instanceof LivingEntity ? ((LivingEntity)entity)::canStandOnFluid : (fluidState) -> { -+ // return false; -+ // }, entity); -+ // Pufferfish end -+ this.entity = entity; - } - - @Override - public boolean isHoldingItem(Item item) { -- return this.heldItem.is(item); -+ // Pufferfish start -+ Entity entity = this.entity; -+ if (entity instanceof LivingEntity livingEntity) { -+ return livingEntity.getMainHandItem().is(item); -+ } -+ return ItemStack.EMPTY.is(item); -+ // Pufferfish end - } - - @Override - public boolean canStandOnFluid(FluidState stateAbove, FluidState state) { -- return this.canStandOnFluid.test(state) && !stateAbove.getType().isSame(state.getType()); -+ // Pufferfish start -+ Entity entity = this.entity; -+ if (entity instanceof LivingEntity livingEntity) { -+ return livingEntity.canStandOnFluid(state) && !stateAbove.getType().isSame(state.getType()); -+ } -+ return false; -+ // Pufferfish end - } - - @Override - public boolean isDescending() { -- return this.descending; -+ return this.entity != null && this.entity.isDescending(); // Pufferfish - } - - @Override - public boolean isAbove(VoxelShape shape, BlockPos pos, boolean defaultValue) { -- return this.entityBottom > (double)pos.getY() + shape.max(Direction.Axis.Y) - (double)1.0E-5F; -+ return (this.entity == null ? -Double.MAX_VALUE : entity.getY()) > (double)pos.getY() + shape.max(Direction.Axis.Y) - (double)1.0E-5F; // Pufferfish - } - - @Nullable -diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 07eac5439164a7345476c55277538a152359630a..a4848a507f620cff686992c2e95039ca60af6d0e 100644 ---- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java -+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -248,7 +248,7 @@ import javax.annotation.Nullable; // Paper - import javax.annotation.Nonnull; // Paper - - public final class CraftServer implements Server { -- private final String serverName = "Paper"; // Paper -+ private final String serverName = "Pufferfish"; // Paper // Pufferfish - private final String serverVersion; - private final String bukkitVersion = Versioning.getBukkitVersion(); - private final Logger logger = Logger.getLogger("Minecraft"); -@@ -1052,6 +1052,11 @@ public final class CraftServer implements Server { - plugin.getDescription().getName(), - "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." - )); -+ getLogger().log(Level.SEVERE, String.format("%s Stacktrace", worker.getThread().getName())); -+ StackTraceElement[] stackTrace = worker.getThread().getStackTrace(); -+ for (StackTraceElement element : stackTrace) { -+ getLogger().log(Level.SEVERE, " " + element.toString()); -+ } - } - } - // Paper end -diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftShapelessRecipe.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftShapelessRecipe.java -index 0b3b46348ac9195bff1492ffc11fcbff7d3f5c6f..4010052c53f3a2831b4d5aa1c041d85897856acb 100644 ---- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftShapelessRecipe.java -+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftShapelessRecipe.java -@@ -43,6 +43,6 @@ public class CraftShapelessRecipe extends ShapelessRecipe implements CraftRecipe - data.set(i, toNMS(ingred.get(i), true)); - } - -- MinecraftServer.getServer().getRecipeManager().addRecipe(new net.minecraft.world.item.crafting.ShapelessRecipe(CraftNamespacedKey.toMinecraft(this.getKey()), this.getGroup(), CraftItemStack.asNMSCopy(this.getResult()), data)); -+ MinecraftServer.getServer().getRecipeManager().addRecipe(new net.minecraft.world.item.crafting.ShapelessRecipe(CraftNamespacedKey.toMinecraft(this.getKey()), this.getGroup(), CraftItemStack.asNMSCopy(this.getResult()), data, true)); - } - } -diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java -index 103ab25119bfcdd21eac7e1deeac025108e3c138..47ff8c22bd9c7220df98268f6db224d1cd66a0ab 100644 ---- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java -+++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java -@@ -435,7 +435,7 @@ public final class CraftMagicNumbers implements UnsafeValues { - - @Override - public com.destroystokyo.paper.util.VersionFetcher getVersionFetcher() { -- return new com.destroystokyo.paper.PaperVersionFetcher(); -+ return new gg.pufferfish.pufferfish.PufferfishVersionFetcher(); // Pufferfish - } - - @Override -diff --git a/src/main/java/org/bukkit/craftbukkit/util/Versioning.java b/src/main/java/org/bukkit/craftbukkit/util/Versioning.java -index 774556a62eb240da42e84db4502e2ed43495be17..80553face9c70c2a3d897681e7761df85b22d464 100644 ---- a/src/main/java/org/bukkit/craftbukkit/util/Versioning.java -+++ b/src/main/java/org/bukkit/craftbukkit/util/Versioning.java -@@ -11,7 +11,7 @@ public final class Versioning { - public static String getBukkitVersion() { - String result = "Unknown-Version"; - -- InputStream stream = Bukkit.class.getClassLoader().getResourceAsStream("META-INF/maven/io.papermc.paper/paper-api/pom.properties"); -+ InputStream stream = Bukkit.class.getClassLoader().getResourceAsStream("META-INF/maven/gg.pufferfish.pufferfish/pufferfish-api/pom.properties"); // Pufferfish - Properties properties = new Properties(); - - if (stream != null) { -diff --git a/src/main/java/org/spigotmc/ActivationRange.java b/src/main/java/org/spigotmc/ActivationRange.java -index 1b42c98956342832c37f0aa266f85271daa4ba5b..b87756d9a7b04ea2613208984b2583eca3f32af6 100644 ---- a/src/main/java/org/spigotmc/ActivationRange.java -+++ b/src/main/java/org/spigotmc/ActivationRange.java -@@ -38,6 +38,10 @@ import co.aikar.timings.MinecraftTimings; - import net.minecraft.world.entity.schedule.Activity; - import net.minecraft.world.level.Level; - import net.minecraft.world.phys.AABB; -+// Pufferfish start -+import net.minecraft.world.phys.Vec3; -+import java.util.List; -+// Pufferfish end - - public class ActivationRange - { -@@ -216,6 +220,25 @@ public class ActivationRange - for (int i = 0; i < entities.size(); i++) { - Entity entity = entities.get(i); - ActivationRange.activateEntity(entity); -+ -+ // Pufferfish start -+ if (gg.pufferfish.pufferfish.PufferfishConfig.dearEnabled && entity.getType().dabEnabled) { -+ if (!entity.activatedPriorityReset) { -+ entity.activatedPriorityReset = true; -+ entity.activatedPriority = gg.pufferfish.pufferfish.PufferfishConfig.maximumActivationPrio; -+ } -+ Vec3 playerVec = player.position(); -+ Vec3 entityVec = entity.position(); -+ double diffX = playerVec.x - entityVec.x, diffY = playerVec.y - entityVec.y, diffZ = playerVec.z - entityVec.z; -+ int squaredDistance = (int) (diffX * diffX + diffY * diffY + diffZ * diffZ); -+ entity.activatedPriority = squaredDistance > gg.pufferfish.pufferfish.PufferfishConfig.startDistanceSquared ? -+ Math.max(1, Math.min(squaredDistance >> gg.pufferfish.pufferfish.PufferfishConfig.activationDistanceMod, entity.activatedPriority)) : -+ 1; -+ } else { -+ entity.activatedPriority = 1; -+ } -+ // Pufferfish end -+ - } - // Paper end - } -@@ -232,12 +255,12 @@ public class ActivationRange - if ( MinecraftServer.currentTick > entity.activatedTick ) - { - if ( entity.defaultActivationState ) -- { -+ { // Pufferfish - diff on change - entity.activatedTick = MinecraftServer.currentTick; - return; - } - if ( entity.activationType.boundingBox.intersects( entity.getBoundingBox() ) ) -- { -+ { // Pufferfish - diff on change - entity.activatedTick = MinecraftServer.currentTick; - } - } -@@ -291,7 +314,7 @@ public class ActivationRange - if ( entity instanceof LivingEntity ) - { - LivingEntity living = (LivingEntity) entity; -- if ( living.onClimbable() || living.jumping || living.hurtTime > 0 || living.activeEffects.size() > 0 ) // Paper -+ if ( living.onClimableCached() || living.jumping || living.hurtTime > 0 || living.activeEffects.size() > 0 ) // Paper // Pufferfish - use cached - { - return 1; // Paper - } diff --git a/patches/server/0001-Rebrand.patch b/patches/server/0001-Rebrand.patch new file mode 100644 index 000000000..ea185009d --- /dev/null +++ b/patches/server/0001-Rebrand.patch @@ -0,0 +1,361 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: William Blake Galbreath +Date: Sat, 4 May 2019 01:02:11 -0500 +Subject: [PATCH] Rebrand + + +diff --git a/build.gradle.kts b/build.gradle.kts +index d5d49bb2b47c889e12d17dc87b8c439a60b3fe67..7de4b51cb4afdcbdfb8d1dc32f56252d997e23a8 100644 +--- a/build.gradle.kts ++++ b/build.gradle.kts +@@ -7,8 +7,10 @@ plugins { + } + + dependencies { +- implementation(project(":paper-api")) +- implementation(project(":paper-mojangapi")) ++ implementation(project(":purpur-api")) // Purpur ++ implementation("io.papermc.paper:paper-mojangapi:1.19.3-R0.1-SNAPSHOT") { ++ exclude("io.papermc.paper", "paper-api") ++ } + // Paper start + implementation("org.jline:jline-terminal-jansi:3.21.0") + implementation("net.minecrell:terminalconsoleappender:1.3.0") +@@ -37,6 +39,9 @@ dependencies { + runtimeOnly("mysql:mysql-connector-java:8.0.29") + runtimeOnly("com.lmax:disruptor:3.4.4") // Paper + ++ implementation("cat.inspiracio:rhino-js-engine:1.7.7.1") // Purpur ++ implementation("dev.omega24:upnp4j:1.0") // Purpur ++ + runtimeOnly("org.apache.maven:maven-resolver-provider:3.8.5") + runtimeOnly("org.apache.maven.resolver:maven-resolver-connector-basic:1.7.3") + runtimeOnly("org.apache.maven.resolver:maven-resolver-transport-http:1.7.3") +@@ -61,7 +66,7 @@ tasks.jar { + attributes( + "Main-Class" to "org.bukkit.craftbukkit.Main", + "Implementation-Title" to "CraftBukkit", +- "Implementation-Version" to "git-Paper-$implementationVersion", ++ "Implementation-Version" to "git-Purpur-$implementationVersion", // Purpur + "Implementation-Vendor" to date, // Paper + "Specification-Title" to "Bukkit", + "Specification-Version" to project.version, +@@ -133,7 +138,7 @@ fun TaskContainer.registerRunTask( + name: String, + block: JavaExec.() -> Unit + ): TaskProvider = register(name) { +- group = "paper" ++ group = "paperweight" // Purpur + mainClass.set("org.bukkit.craftbukkit.Main") + standardInput = System.`in` + workingDir = rootProject.layout.projectDirectory +diff --git a/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java b/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java +index bf42969859545a8a520923ef1836ffa4a5cc24a0..fba5dbdb7bcbb55400ef18342c9b54612972a718 100644 +--- a/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java ++++ b/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java +@@ -19,8 +19,10 @@ import java.util.stream.StreamSupport; + + public class PaperVersionFetcher implements VersionFetcher { + private static final java.util.regex.Pattern VER_PATTERN = java.util.regex.Pattern.compile("^([0-9\\.]*)\\-.*R"); // R is an anchor, will always give '-R' at end +- private static final String GITHUB_BRANCH_NAME = "master"; +- private static final String DOWNLOAD_PAGE = "https://papermc.io/downloads"; ++ // Purpur start ++ private static final String DOWNLOAD_PAGE = "https://purpurmc.org/downloads"; ++ private static int distance = -2; public int distance() { return distance; } ++ // Purpur end + private static @Nullable String mcVer; + + @Override +@@ -31,11 +33,11 @@ public class PaperVersionFetcher implements VersionFetcher { + @Nonnull + @Override + public Component getVersionMessage(@Nonnull String serverVersion) { +- String[] parts = serverVersion.substring("git-Paper-".length()).split("[-\\s]"); +- final Component updateMessage = getUpdateStatusMessage("PaperMC/Paper", GITHUB_BRANCH_NAME, parts[0]); ++ String[] parts = serverVersion.substring("git-Purpur-".length()).split("[-\\s]"); // Purpur ++ final Component updateMessage = getUpdateStatusMessage("PurpurMC/Purpur", "ver/" + getMinecraftVersion(), parts[0]); // Purpur + final Component history = getHistory(); + +- return history != null ? TextComponent.ofChildren(updateMessage, Component.newline(), history) : updateMessage; ++ return history != null ? Component.join(net.kyori.adventure.text.JoinConfiguration.separator(Component.newline()), history, updateMessage) : updateMessage; // Purpur + } + + private static @Nullable String getMinecraftVersion() { +@@ -45,7 +47,7 @@ public class PaperVersionFetcher implements VersionFetcher { + String result = matcher.group(); + mcVer = result.substring(0, result.length() - 2); // strip 'R' anchor and trailing '-' + } else { +- org.bukkit.Bukkit.getLogger().warning("Unable to match version to pattern! Report to PaperMC!"); ++ org.bukkit.Bukkit.getLogger().warning("Unable to match version to pattern! Report to Purpur!"); // Purpur + org.bukkit.Bukkit.getLogger().warning("Pattern: " + VER_PATTERN.toString()); + org.bukkit.Bukkit.getLogger().warning("Version: " + org.bukkit.Bukkit.getBukkitVersion()); + } +@@ -55,7 +57,7 @@ public class PaperVersionFetcher implements VersionFetcher { + } + + private static Component getUpdateStatusMessage(@Nonnull String repo, @Nonnull String branch, @Nonnull String versionInfo) { +- int distance; ++ //int distance; // Purpur - use field + try { + int jenkinsBuild = Integer.parseInt(versionInfo); + distance = fetchDistanceFromSiteApi(jenkinsBuild, getMinecraftVersion()); +@@ -66,13 +68,13 @@ public class PaperVersionFetcher implements VersionFetcher { + + switch (distance) { + case -1: +- return Component.text("Error obtaining version information", NamedTextColor.YELLOW); ++ return Component.text("* Error obtaining version information", NamedTextColor.RED); // Purpur + case 0: +- return Component.text("You are running the latest version", NamedTextColor.GREEN); ++ return Component.text("* You are running the latest version", NamedTextColor.GREEN); // Purpur + case -2: +- return Component.text("Unknown version", NamedTextColor.YELLOW); ++ return Component.text("* Unknown version", NamedTextColor.RED); // Purpur + default: +- return Component.text("You are " + distance + " version(s) behind", NamedTextColor.YELLOW) ++ return Component.text("* You are " + distance + " version(s) behind", NamedTextColor.YELLOW) // Purpur + .append(Component.newline()) + .append(Component.text("Download the new version at: ") + .append(Component.text(DOWNLOAD_PAGE, NamedTextColor.GOLD) +@@ -85,15 +87,11 @@ public class PaperVersionFetcher implements VersionFetcher { + if (siteApiVersion == null) { return -1; } + try { + try (BufferedReader reader = Resources.asCharSource( +- new URL("https://api.papermc.io/v2/projects/paper/versions/" + siteApiVersion), ++ new URL("https://api.purpurmc.org/v2/purpur/" + siteApiVersion), // Purpur + Charsets.UTF_8 + ).openBufferedStream()) { + JsonObject json = new Gson().fromJson(reader, JsonObject.class); +- JsonArray builds = json.getAsJsonArray("builds"); +- int latest = StreamSupport.stream(builds.spliterator(), false) +- .mapToInt(e -> e.getAsInt()) +- .max() +- .getAsInt(); ++ int latest = json.getAsJsonObject("builds").getAsJsonPrimitive("latest").getAsInt(); // Purpur + return latest - jenkinsBuild; + } catch (JsonSyntaxException ex) { + ex.printStackTrace(); +@@ -144,6 +142,6 @@ public class PaperVersionFetcher implements VersionFetcher { + return null; + } + +- return Component.text("Previous version: " + oldVersion, NamedTextColor.GRAY, TextDecoration.ITALIC); ++ return org.bukkit.ChatColor.parseMM("Previous: %s", oldVersion); // Purpur + } + } +diff --git a/src/main/java/com/destroystokyo/paper/console/PaperConsole.java b/src/main/java/com/destroystokyo/paper/console/PaperConsole.java +index c5d5648f4ca603ef2b1df723b58f9caf4dd3c722..3cb56595822799926a8141e60a42f5d1edfc6de5 100644 +--- a/src/main/java/com/destroystokyo/paper/console/PaperConsole.java ++++ b/src/main/java/com/destroystokyo/paper/console/PaperConsole.java +@@ -17,7 +17,7 @@ public final class PaperConsole extends SimpleTerminalConsole { + @Override + protected LineReader buildReader(LineReaderBuilder builder) { + builder +- .appName("Paper") ++ .appName("Purpur") // Purpur + .variable(LineReader.HISTORY_FILE, java.nio.file.Paths.get(".console_history")) + .completer(new ConsoleCommandCompleter(this.server)) + .option(LineReader.Option.COMPLETE_IN_WORD, true); +diff --git a/src/main/java/net/minecraft/CrashReport.java b/src/main/java/net/minecraft/CrashReport.java +index abe37c7c3c6f5ab73afd738ec78f06d7e4d2ed96..b5b6657e52e4f7a630229bd3ba433438af293e22 100644 +--- a/src/main/java/net/minecraft/CrashReport.java ++++ b/src/main/java/net/minecraft/CrashReport.java +@@ -123,6 +123,10 @@ public class CrashReport { + StringBuilder stringbuilder = new StringBuilder(); + + stringbuilder.append("---- Minecraft Crash Report ----\n"); ++ // Purpur start ++ stringbuilder.append("// "); ++ stringbuilder.append("// DO NOT REPORT THIS TO PAPER! REPORT TO PURPUR INSTEAD!"); ++ // Purpur end + stringbuilder.append("// "); + stringbuilder.append(CrashReport.getErrorComment()); + stringbuilder.append("\n\n"); +diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java +index 710ca7d3a5659953f64bc6dccdd93b43300961cc..b5368fc08cbe587f03a5f04a9e25850ca818cf2c 100644 +--- a/src/main/java/net/minecraft/server/MinecraftServer.java ++++ b/src/main/java/net/minecraft/server/MinecraftServer.java +@@ -922,7 +922,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop // Spigot - Spigot > // CraftBukkit - cb > vanilla! ++ return "Purpur"; // Purpur - Purpur > // Paper - Paper > // Spigot - Spigot > // CraftBukkit - cb > vanilla! + } + + public SystemReport fillSystemReport(SystemReport details) { +diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java +index 51b3db0b6c2cede95b584268e035c0fb36d38094..b29406fa5bd62fdd393915160fdb920cf7e28bc4 100644 +--- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java ++++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java +@@ -278,11 +278,12 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface + DedicatedServer.LOGGER.warn("**** SERVER IS RUNNING IN OFFLINE/INSECURE MODE!"); + DedicatedServer.LOGGER.warn("The server will make no attempt to authenticate usernames. Beware."); + // Spigot start +- if (org.spigotmc.SpigotConfig.bungee) { +- DedicatedServer.LOGGER.warn("Whilst this makes it possible to use BungeeCord, unless access to your server is properly restricted, it also opens up the ability for hackers to connect with any username they choose."); ++ if (io.papermc.paper.configuration.GlobalConfiguration.get().proxies.isProxyOnlineMode()) { // Purpur ++ DedicatedServer.LOGGER.warn("Whilst this makes it possible to use BungeeCord or Velocity, unless access to your server is properly restricted, it also opens up the ability for hackers to connect with any username they choose."); // Purpur + DedicatedServer.LOGGER.warn("Please see http://www.spigotmc.org/wiki/firewall-guide/ for further information."); + } else { + DedicatedServer.LOGGER.warn("While this makes the game possible to play without internet access, it also opens up the ability for hackers to connect with any username they choose."); ++ DedicatedServer.LOGGER.warn("You will not be offered any support as long as the server allows offline-mode players to join."); // Purpur + } + // Spigot end + DedicatedServer.LOGGER.warn("To change this, set \"online-mode\" to \"true\" in the server.properties file."); +diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java +index 47df6f4268a63118da8187f4102c876bd37d1680..0ca1d7a9950d5797bae7266961190ec1776e524f 100644 +--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java ++++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java +@@ -261,7 +261,7 @@ import javax.annotation.Nullable; // Paper + import javax.annotation.Nonnull; // Paper + + public final class CraftServer implements Server { +- private final String serverName = "Paper"; // Paper ++ private final String serverName = "Purpur"; // Paper // Purpur + private final String serverVersion; + private final String bukkitVersion = Versioning.getBukkitVersion(); + private final Logger logger = Logger.getLogger("Minecraft"); +diff --git a/src/main/java/org/bukkit/craftbukkit/command/CraftConsoleCommandSender.java b/src/main/java/org/bukkit/craftbukkit/command/CraftConsoleCommandSender.java +index 4e56018b64d11f76c8da43fd8f85c6de72204e36..aa8212432825db65cf485cd93f734ccd9eefcb5a 100644 +--- a/src/main/java/org/bukkit/craftbukkit/command/CraftConsoleCommandSender.java ++++ b/src/main/java/org/bukkit/craftbukkit/command/CraftConsoleCommandSender.java +@@ -21,7 +21,12 @@ public class CraftConsoleCommandSender extends ServerCommandSender implements Co + + @Override + public void sendMessage(String message) { +- this.sendRawMessage(message); ++ // Purpur start ++ String[] parts = message.split("\n"); ++ for (String part : parts) { ++ this.sendRawMessage(part); ++ } ++ // Purpur end + } + + @Override +@@ -91,7 +96,7 @@ public class CraftConsoleCommandSender extends ServerCommandSender implements Co + // Paper start + @Override + public void sendMessage(final net.kyori.adventure.identity.Identity identity, final net.kyori.adventure.text.Component message, final net.kyori.adventure.audience.MessageType type) { +- this.sendRawMessage(net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().serialize(message)); ++ this.sendMessage(net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().serialize(message)); // Purpur + } + + @Override +diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java +index 316120a57802c45fb9b02a4daee207a0845c63be..e3c1a7f7e643b8a2f42e76c92087219f984ea8aa 100644 +--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java ++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java +@@ -866,7 +866,7 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { + return EntityCategory.WATER; + } + +- throw new UnsupportedOperationException("Unsupported monster type: " + type + ". This is a bug, report this to Spigot."); ++ throw new UnsupportedOperationException("Unsupported monster type: " + type + ". This is a bug, report this to Purpur."); // Purpur + } + + @Override +diff --git a/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java b/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java +index cdefb2025eedea7e204d70d568adaf1c1ec4c03c..d1526ed7197b883e1d1f07baf285bf5eef4d20d5 100644 +--- a/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java ++++ b/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java +@@ -504,7 +504,7 @@ public class CraftScheduler implements BukkitScheduler { + this.parsePending(); + } else { + //this.debugTail = this.debugTail.setNext(new CraftAsyncDebugger(currentTick + CraftScheduler.RECENT_TICKS, task.getOwner(), task.getTaskClass())); // Paper +- task.getOwner().getLogger().log(Level.SEVERE, "Unexpected Async Task in the Sync Scheduler. Report this to Paper"); // Paper ++ task.getOwner().getLogger().log(Level.SEVERE, "Unexpected Async Task in the Sync Scheduler. Report this to Purpur"); // Paper // Purpur + // We don't need to parse pending + // (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 17336102d37a5ab05c3b3c93fcf46961d0ffa7e2..a308993500fbb6cd871b44ec3d2ff66e28ac680b 100644 +--- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java ++++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java +@@ -433,7 +433,7 @@ public final class CraftMagicNumbers implements UnsafeValues { + + @Override + public com.destroystokyo.paper.util.VersionFetcher getVersionFetcher() { +- return new com.destroystokyo.paper.PaperVersionFetcher(); ++ return new com.destroystokyo.paper.PaperVersionFetcher(); // Purpur - diff on change + } + + @Override +diff --git a/src/main/java/org/bukkit/craftbukkit/util/Versioning.java b/src/main/java/org/bukkit/craftbukkit/util/Versioning.java +index 774556a62eb240da42e84db4502e2ed43495be17..fb87620c742ff7912f5e8ccd2a7930dd605576d9 100644 +--- a/src/main/java/org/bukkit/craftbukkit/util/Versioning.java ++++ b/src/main/java/org/bukkit/craftbukkit/util/Versioning.java +@@ -11,7 +11,7 @@ public final class Versioning { + public static String getBukkitVersion() { + String result = "Unknown-Version"; + +- InputStream stream = Bukkit.class.getClassLoader().getResourceAsStream("META-INF/maven/io.papermc.paper/paper-api/pom.properties"); ++ InputStream stream = Bukkit.class.getClassLoader().getResourceAsStream("META-INF/maven/org.purpurmc.purpur/purpur-api/pom.properties"); // Purpur + Properties properties = new Properties(); + + if (stream != null) { +diff --git a/src/main/java/org/spigotmc/WatchdogThread.java b/src/main/java/org/spigotmc/WatchdogThread.java +index e9fa7faaa4451e36b3908cbcbbe0baf213abde96..a810bfd3b8d6bd4d8f2ef8797e4281ae4fe8a67f 100644 +--- a/src/main/java/org/spigotmc/WatchdogThread.java ++++ b/src/main/java/org/spigotmc/WatchdogThread.java +@@ -96,7 +96,7 @@ public final class WatchdogThread extends io.papermc.paper.util.TickThread // Pa + + private WatchdogThread(long timeoutTime, boolean restart) + { +- super( "Paper Watchdog Thread" ); ++ super( "Watchdog Thread" ); // Purpur - use a generic name + this.timeoutTime = timeoutTime; + this.restart = restart; + earlyWarningEvery = Math.min(io.papermc.paper.configuration.GlobalConfiguration.get().watchdog.earlyWarningEvery, timeoutTime); // Paper +@@ -155,14 +155,14 @@ public final class WatchdogThread extends io.papermc.paper.util.TickThread // Pa + if (isLongTimeout) { + // Paper end + log.log( Level.SEVERE, "------------------------------" ); +- log.log( Level.SEVERE, "The server has stopped responding! This is (probably) not a Paper bug." ); // Paper ++ log.log( Level.SEVERE, "The server has stopped responding! This is (probably) not a Purpur bug." ); // Paper // Purpur + log.log( Level.SEVERE, "If you see a plugin in the Server thread dump below, then please report it to that author" ); + log.log( Level.SEVERE, "\t *Especially* if it looks like HTTP or MySQL operations are occurring" ); + log.log( Level.SEVERE, "If you see a world save or edit, then it means you did far more than your server can handle at once" ); + log.log( Level.SEVERE, "\t If this is the case, consider increasing timeout-time in spigot.yml but note that this will replace the crash with LARGE lag spikes" ); +- log.log( Level.SEVERE, "If you are unsure or still think this is a Paper bug, please report this to https://github.com/PaperMC/Paper/issues" ); ++ log.log( Level.SEVERE, "If you are unsure or still think this is a Purpur bug, please report this to https://github.com/PurpurMC/Purpur/issues" ); // Purpur + log.log( Level.SEVERE, "Be sure to include ALL relevant console errors and Minecraft crash reports" ); +- log.log( Level.SEVERE, "Paper version: " + Bukkit.getServer().getVersion() ); ++ log.log( Level.SEVERE, "Purpur version: " + Bukkit.getServer().getVersion() ); // Purpur + // + if ( net.minecraft.world.level.Level.lastPhysicsProblem != null ) + { +@@ -185,12 +185,12 @@ public final class WatchdogThread extends io.papermc.paper.util.TickThread // Pa + // Paper end + } else + { +- log.log(Level.SEVERE, "--- DO NOT REPORT THIS TO PAPER - THIS IS NOT A BUG OR A CRASH - " + Bukkit.getServer().getVersion() + " ---"); ++ log.log(Level.SEVERE, "--- DO NOT REPORT THIS TO PURPUR - THIS IS NOT A BUG OR A CRASH - " + Bukkit.getServer().getVersion() + " ---"); // Purpur + log.log(Level.SEVERE, "The server has not responded for " + (currentTime - lastTick) / 1000 + " seconds! Creating thread dump"); + } + // Paper end - Different message for short timeout + log.log( Level.SEVERE, "------------------------------" ); +- log.log( Level.SEVERE, "Server thread dump (Look for plugins here before reporting to Paper!):" ); // Paper ++ log.log( Level.SEVERE, "Server thread dump (Look for plugins here before reporting to Purpur!):" ); // Paper // Purpur + io.papermc.paper.chunk.system.scheduling.ChunkTaskScheduler.dumpAllChunkLoadInfo(isLongTimeout); // Paper // Paper - rewrite chunk system + this.dumpTickingInfo(); // Paper - log detailed tick information + WatchdogThread.dumpThread( ManagementFactory.getThreadMXBean().getThreadInfo( MinecraftServer.getServer().serverThread.getId(), Integer.MAX_VALUE ), log ); +@@ -206,7 +206,7 @@ public final class WatchdogThread extends io.papermc.paper.util.TickThread // Pa + WatchdogThread.dumpThread( thread, log ); + } + } else { +- log.log(Level.SEVERE, "--- DO NOT REPORT THIS TO PAPER - THIS IS NOT A BUG OR A CRASH ---"); ++ log.log(Level.SEVERE, "--- DO NOT REPORT THIS TO PURPUR - THIS IS NOT A BUG OR A CRASH ---"); // Purpur + } + + log.log( Level.SEVERE, "------------------------------" ); diff --git a/patches/server/0002-Fix-pufferfish-issues.patch b/patches/server/0002-Fix-pufferfish-issues.patch deleted file mode 100644 index da48b3cda..000000000 --- a/patches/server/0002-Fix-pufferfish-issues.patch +++ /dev/null @@ -1,67 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: BillyGalbreath -Date: Sun, 12 Jun 2022 09:18:57 -0500 -Subject: [PATCH] Fix pufferfish issues - - -diff --git a/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java b/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java -index ed9c8e882739c02d0d04129d251e4c726b422c07..5426e57ed67b0d144818a7e3b917c90d45f548ce 100644 ---- a/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java -+++ b/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java -@@ -222,7 +222,7 @@ public class PufferfishConfig { - public static int activationDistanceMod; - - private static void dynamicActivationOfBrains() throws IOException { -- dearEnabled = getBoolean("dab.enabled", "activation-range.enabled", true); -+ dearEnabled = getBoolean("dab.enabled", "activation-range.enabled", false); // Purpur - startDistance = getInt("dab.start-distance", "activation-range.start-distance", 12, - "This value determines how far away an entity has to be", - "from the player to start being effected by DEAR."); -@@ -266,7 +266,7 @@ public class PufferfishConfig { - - public static boolean throttleInactiveGoalSelectorTick; - private static void inactiveGoalSelectorThrottle() { -- getBoolean("inactive-goal-selector-throttle", "inactive-goal-selector-disable", true, -+ getBoolean("inactive-goal-selector-throttle", "inactive-goal-selector-disable", false, // Purpur - "Throttles the AI goal selector in entity inactive ticks.", - "This can improve performance by a few percent, but has minor gameplay implications."); - } -diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index 77d538ab79b31cf43620e560cdf2876a26b2bb7f..bdc5dc90dc036a5480dfd776d5e6bf5520d1cc73 100644 ---- a/src/main/java/net/minecraft/server/level/ServerLevel.java -+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java -@@ -809,7 +809,7 @@ public class ServerLevel extends Level implements WorldGenLevel { - } - // Paper start - optimise random block ticking - private final BlockPos.MutableBlockPos chunkTickMutablePosition = new BlockPos.MutableBlockPos(); -- // private final io.papermc.paper.util.math.ThreadUnsafeRandom randomTickRandom = new io.papermc.paper.util.math.ThreadUnsafeRandom(); // Pufferfish - moved to super -+ private final io.papermc.paper.util.math.ThreadUnsafeRandom randomTickRandom = new io.papermc.paper.util.math.ThreadUnsafeRandom(this.random.nextLong()); public net.minecraft.util.RandomSource getThreadUnsafeRandom() { return this.randomTickRandom; } // Pufferfish - moved to super // Purpur - dont break ABI - // Paper end - - private int currentIceAndSnowTick = 0; protected void resetIceAndSnowTick() { this.currentIceAndSnowTick = this.randomTickRandom.nextInt(16); } // Pufferfish -diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index 791411866cabc2c237f40d54250d5a34653ceaa0..baf48dc10723cc7c7ececfeb8a05b57aff6ed1bf 100644 ---- a/src/main/java/net/minecraft/world/level/Level.java -+++ b/src/main/java/net/minecraft/world/level/Level.java -@@ -271,7 +271,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { - - public abstract ResourceKey getTypeKey(); - -- protected final io.papermc.paper.util.math.ThreadUnsafeRandom randomTickRandom = new io.papermc.paper.util.math.ThreadUnsafeRandom(java.util.concurrent.ThreadLocalRandom.current().nextLong()); public net.minecraft.util.RandomSource getThreadUnsafeRandom() { return this.randomTickRandom; } // Pufferfish - move thread unsafe random initialization // Pufferfish - getter -+ //protected final io.papermc.paper.util.math.ThreadUnsafeRandom randomTickRandom = new io.papermc.paper.util.math.ThreadUnsafeRandom(java.util.concurrent.ThreadLocalRandom.current().nextLong()); public net.minecraft.util.RandomSource getThreadUnsafeRandom() { return this.randomTickRandom; } // Pufferfish - move thread unsafe random initialization // Pufferfish - getter // Purpur - dont break ABI - - // Pufferfish start - ensure these get inlined - private final int minBuildHeight, minSection, height, maxBuildHeight, maxSection; -diff --git a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java -index 39684720c5ee2bb36b8d12cc10e05b7ab8d06172..e0e4a924e926b086699998095a1abddd01d8c002 100644 ---- a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java -+++ b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java -@@ -130,7 +130,7 @@ public class LevelChunk extends ChunkAccess { - this.fluidTicks = fluidTickScheduler; - // CraftBukkit start - this.bukkitChunk = new org.bukkit.craftbukkit.CraftChunk(this); -- this.lightningTick = this.level.getThreadUnsafeRandom().nextInt(100000) << 1; // Pufferfish - initialize lightning tick -+ this.lightningTick = java.util.concurrent.ThreadLocalRandom.current().nextInt(100000) << 1; // Pufferfish - initialize lightning tick // Purpur - any random will do - } - - public org.bukkit.Chunk bukkitChunk; diff --git a/patches/server/0004-Purpur-config-files.patch b/patches/server/0002-Purpur-config-files.patch similarity index 93% rename from patches/server/0004-Purpur-config-files.patch rename to patches/server/0002-Purpur-config-files.patch index 673996d89..163966f27 100644 --- a/patches/server/0004-Purpur-config-files.patch +++ b/patches/server/0002-Purpur-config-files.patch @@ -5,14 +5,14 @@ Subject: [PATCH] Purpur config files diff --git a/src/main/java/com/destroystokyo/paper/Metrics.java b/src/main/java/com/destroystokyo/paper/Metrics.java -index 061716934ba0a1f01e4d85d664034f72b3c7a765..acd95cf1dc7f009b63e44e4404e1736283fd458e 100644 +index 7b1843e16745ca8db2244e17490d291401f22679..acd95cf1dc7f009b63e44e4404e1736283fd458e 100644 --- a/src/main/java/com/destroystokyo/paper/Metrics.java +++ b/src/main/java/com/destroystokyo/paper/Metrics.java @@ -593,7 +593,7 @@ public class Metrics { boolean logFailedRequests = config.getBoolean("logFailedRequests", false); // Only start Metrics, if it's enabled in the config if (config.getBoolean("enabled", true)) { -- Metrics metrics = new Metrics("Pufferfish", serverUUID, logFailedRequests, Bukkit.getLogger()); // Pufferfish +- Metrics metrics = new Metrics("Paper", serverUUID, logFailedRequests, Bukkit.getLogger()); + Metrics metrics = new Metrics("Purpur", serverUUID, logFailedRequests, Bukkit.getLogger()); // Purpur metrics.addCustomChart(new Metrics.SimplePie("minecraft_version", () -> { @@ -22,17 +22,17 @@ index 061716934ba0a1f01e4d85d664034f72b3c7a765..acd95cf1dc7f009b63e44e4404e17362 metrics.addCustomChart(new Metrics.SingleLineChart("players", () -> Bukkit.getOnlinePlayers().size())); - metrics.addCustomChart(new Metrics.SimplePie("online_mode", () -> Bukkit.getOnlineMode() ? "online" : "offline")); -- metrics.addCustomChart(new Metrics.SimplePie("pufferfish_version", () -> (Metrics.class.getPackage().getImplementationVersion() != null) ? Metrics.class.getPackage().getImplementationVersion() : "unknown")); +- metrics.addCustomChart(new Metrics.SimplePie("paper_version", () -> (Metrics.class.getPackage().getImplementationVersion() != null) ? Metrics.class.getPackage().getImplementationVersion() : "unknown")); + metrics.addCustomChart(new Metrics.SimplePie("online_mode", () -> Bukkit.getOnlineMode() ? "online" : (io.papermc.paper.configuration.GlobalConfiguration.get().proxies.isProxyOnlineMode() ? "bungee" : "offline"))); // Purpur + metrics.addCustomChart(new Metrics.SimplePie("purpur_version", () -> (Metrics.class.getPackage().getImplementationVersion() != null) ? Metrics.class.getPackage().getImplementationVersion() : "unknown")); // Purpur metrics.addCustomChart(new Metrics.DrilldownPie("java_version", () -> { Map> map = new HashMap<>(); diff --git a/src/main/java/net/minecraft/commands/CommandSourceStack.java b/src/main/java/net/minecraft/commands/CommandSourceStack.java -index 81f4e3c869623b6dd2d80886652fa41791fe7032..901edaae2230c48fa0584991ed82498d568d5fc0 100644 +index ae5dd08de75a7ed231295f306fd0974da3988249..b8d49f7607c646216d42f4e047997d47b49f228f 100644 --- a/src/main/java/net/minecraft/commands/CommandSourceStack.java +++ b/src/main/java/net/minecraft/commands/CommandSourceStack.java -@@ -319,6 +319,30 @@ public class CommandSourceStack implements SharedSuggestionProvider, com.destroy +@@ -317,6 +317,30 @@ public class CommandSourceStack implements SharedSuggestionProvider, com.destroy } } @@ -64,10 +64,10 @@ index 81f4e3c869623b6dd2d80886652fa41791fe7032..901edaae2230c48fa0584991ed82498d if (this.source.acceptsSuccess() && !this.silent) { this.source.sendSystemMessage(message); diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java -index b60c3d4f5ab695e0e449678a8f0ae1eea2f83aab..24b7ae3253b0710954d4a522114fc0617c0ef3b3 100644 +index b29406fa5bd62fdd393915160fdb920cf7e28bc4..fa2f2d509445831360e78d4e61bd40e4f2ebe84f 100644 --- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java +++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java -@@ -223,6 +223,15 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface +@@ -218,6 +218,15 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface thread.start(); // Paper - start console thread after MinecraftServer.console & PaperConfig are initialized io.papermc.paper.command.PaperCommands.registerCommands(this); com.destroystokyo.paper.Metrics.PaperMetrics.startMetrics(); @@ -84,10 +84,10 @@ index b60c3d4f5ab695e0e449678a8f0ae1eea2f83aab..24b7ae3253b0710954d4a522114fc061 io.papermc.paper.brigadier.PaperBrigadierProviderImpl.INSTANCE.getClass(); // init PaperBrigadierProvider // Paper end diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index baf48dc10723cc7c7ececfeb8a05b57aff6ed1bf..eeab93f6a3eea19a58fe1b78e0727f8c109640d0 100644 +index 3cbf801b2e5420c0e870f73788deb550e49ad54d..e38d20975f63e2a9847b17e60647624c1eeab6f5 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java -@@ -174,6 +174,8 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -173,6 +173,8 @@ public abstract class Level implements LevelAccessor, AutoCloseable { // Paper end public final com.destroystokyo.paper.antixray.ChunkPacketBlockController chunkPacketBlockController; // Paper - Anti-Xray @@ -96,7 +96,7 @@ index baf48dc10723cc7c7ececfeb8a05b57aff6ed1bf..eeab93f6a3eea19a58fe1b78e0727f8c public final co.aikar.timings.WorldTimingsHandler timings; // Paper public static BlockPos lastPhysicsProblem; // Spigot private org.spigotmc.TickLimiter entityLimiter; -@@ -285,6 +287,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -273,6 +275,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { protected Level(WritableLevelData worlddatamutable, ResourceKey resourcekey, Holder holder, Supplier supplier, boolean flag, boolean flag1, long i, int j, org.bukkit.generator.ChunkGenerator gen, org.bukkit.generator.BiomeProvider biomeProvider, org.bukkit.World.Environment env, java.util.function.Function paperWorldConfigCreator, java.util.concurrent.Executor executor) { // Paper - Async-Anti-Xray - Pass executor this.spigotConfig = new org.spigotmc.SpigotWorldConfig(((net.minecraft.world.level.storage.PrimaryLevelData) worlddatamutable).getLevelName()); // Spigot this.paperConfig = paperWorldConfigCreator.apply(this.spigotConfig); // Paper @@ -105,10 +105,10 @@ index baf48dc10723cc7c7ececfeb8a05b57aff6ed1bf..eeab93f6a3eea19a58fe1b78e0727f8c this.world = new CraftWorld((ServerLevel) this, gen, biomeProvider, env); diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index c42e913376fc76d588070fe130470196429fa3b2..285510a7b25c5979feb5e38391d802570f01e4e3 100644 +index 0ca1d7a9950d5797bae7266961190ec1776e524f..78372d9b900e7506bfbcf53e8fa70043cc140fdb 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -966,6 +966,7 @@ public final class CraftServer implements Server { +@@ -979,6 +979,7 @@ public final class CraftServer implements Server { org.spigotmc.SpigotConfig.init((File) console.options.valueOf("spigot-settings")); // Spigot this.console.paperConfigurations.reloadConfigs(this.console); @@ -116,7 +116,7 @@ index c42e913376fc76d588070fe130470196429fa3b2..285510a7b25c5979feb5e38391d80257 for (ServerLevel world : this.console.getAllLevels()) { // world.serverLevelData.setDifficulty(config.difficulty); // Paper - per level difficulty world.setSpawnSettings(world.serverLevelData.getDifficulty() != Difficulty.PEACEFUL && config.spawnMonsters, config.spawnAnimals); // Paper - per level difficulty (from MinecraftServer#setDifficulty(ServerLevel, Difficulty, boolean)) -@@ -981,6 +982,7 @@ public final class CraftServer implements Server { +@@ -994,6 +995,7 @@ public final class CraftServer implements Server { } } world.spigotConfig.init(); // Spigot @@ -124,7 +124,7 @@ index c42e913376fc76d588070fe130470196429fa3b2..285510a7b25c5979feb5e38391d80257 } Plugin[] pluginClone = pluginManager.getPlugins().clone(); // Paper -@@ -996,6 +998,7 @@ public final class CraftServer implements Server { +@@ -1009,6 +1011,7 @@ public final class CraftServer implements Server { this.reloadData(); org.spigotmc.SpigotConfig.registerCommands(); // Spigot io.papermc.paper.command.PaperCommands.registerCommands(this.console); // Paper @@ -132,7 +132,7 @@ index c42e913376fc76d588070fe130470196429fa3b2..285510a7b25c5979feb5e38391d80257 this.overrideAllCommandBlockCommands = this.commandsConfiguration.getStringList("command-block-overrides").contains("*"); this.ignoreVanillaPermissions = this.commandsConfiguration.getBoolean("ignore-vanilla-permissions"); -@@ -2741,6 +2744,18 @@ public final class CraftServer implements Server { +@@ -2760,6 +2763,18 @@ public final class CraftServer implements Server { return CraftServer.this.console.paperConfigurations.createLegacyObject(CraftServer.this.console); } @@ -152,7 +152,7 @@ index c42e913376fc76d588070fe130470196429fa3b2..285510a7b25c5979feb5e38391d80257 public void restart() { org.spigotmc.RestartCommand.restart(); diff --git a/src/main/java/org/bukkit/craftbukkit/Main.java b/src/main/java/org/bukkit/craftbukkit/Main.java -index f30621be24c6c3a4f173436fce1ad1c13507c84f..e859f1078a42de196a69818a34a8b2c24958c717 100644 +index e072a5475a64d110f25ebcc871aa7703c2fc1e70..1913792032ef81a6f331cfdfc97052cfe53e767e 100644 --- a/src/main/java/org/bukkit/craftbukkit/Main.java +++ b/src/main/java/org/bukkit/craftbukkit/Main.java @@ -166,6 +166,14 @@ public class Main { @@ -172,7 +172,7 @@ index f30621be24c6c3a4f173436fce1ad1c13507c84f..e859f1078a42de196a69818a34a8b2c2 .withRequiredArg() diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java new file mode 100644 -index 0000000000000000000000000000000000000000..f05a9d7542c9c1b6c67c5328215c0926a50bf806 +index 0000000000000000000000000000000000000000..3fc92f92138d8223e18461758f5fe372b6552480 --- /dev/null +++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java @@ -0,0 +1,175 @@ @@ -183,7 +183,7 @@ index 0000000000000000000000000000000000000000..f05a9d7542c9c1b6c67c5328215c0926 +import com.google.common.collect.ImmutableMap; +import com.mojang.datafixers.util.Pair; +import net.kyori.adventure.bossbar.BossBar; -+import net.minecraft.core.Registry; ++import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.MinecraftServer; +import net.minecraft.world.effect.MobEffect; @@ -353,14 +353,14 @@ index 0000000000000000000000000000000000000000..f05a9d7542c9c1b6c67c5328215c0926 +} diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java new file mode 100644 -index 0000000000000000000000000000000000000000..b1628149a2f3effebbf86fd5615f1c8c1d0fbe73 +index 0000000000000000000000000000000000000000..efbbe97d29561fa456b40292328eed89650f4322 --- /dev/null +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -0,0 +1,95 @@ +package org.purpurmc.purpur; + -+import gg.pufferfish.pufferfish.PufferfishConfig; -+import net.minecraft.core.Registry; ++//import gg.pufferfish.pufferfish.PufferfishConfig; ++import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.Entity; diff --git a/patches/server/0005-Purpur-client-support.patch b/patches/server/0003-Purpur-client-support.patch similarity index 71% rename from patches/server/0005-Purpur-client-support.patch rename to patches/server/0003-Purpur-client-support.patch index e6b32bc6b..7dad4480b 100644 --- a/patches/server/0005-Purpur-client-support.patch +++ b/patches/server/0003-Purpur-client-support.patch @@ -5,22 +5,22 @@ Subject: [PATCH] Purpur client support diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index 3b122f521c166253f20d233c0fcebdede6660be5..f927090ed59b483124076c6d4eed4b55ac5c61d6 100644 +index c0b0a7fdb75266a7064d54bda6441953184ecc64..0e21e7faf2036f12b64b9237a89ef8e75ebf548d 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java -@@ -261,6 +261,7 @@ public class ServerPlayer extends Player { - public Integer clientViewDistance; - // CraftBukkit end +@@ -270,6 +270,7 @@ public class ServerPlayer extends Player { + public final com.destroystokyo.paper.util.misc.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet cachedSingleHashSet; // Paper public PlayerNaturallySpawnCreaturesEvent playerNaturallySpawnedEvent; // Paper + public org.bukkit.event.player.PlayerQuitEvent.QuitReason quitReason = null; // Paper - there are a lot of changes to do if we change all methods leading to the event + public boolean purpurClient = false; // Purpur - public boolean isRealPlayer; // Paper - public double lastEntitySpawnRadiusSquared; // Paper - optimise isOutsideRange, this field is in blocks + public ServerPlayer(MinecraftServer server, ServerLevel world, GameProfile profile) { + super(world, world.getSharedSpawnPos(), world.getSharedSpawnAngle(), profile); diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 187791ff8197be015856fdfa9159fb26558f95cf..15075c8705929de83adaf0f7afe7a7cfd40150ae 100644 +index 0c2255b6e2fb7752f85b0f83d4f84732758bd14d..d99baac236d7d4be09f351943971a9f60914be31 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -3648,6 +3648,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -3505,6 +3505,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic private static final ResourceLocation CUSTOM_UNREGISTER = new ResourceLocation("unregister"); private static final ResourceLocation MINECRAFT_BRAND = new ResourceLocation("brand"); // Paper - Brand support @@ -28,7 +28,7 @@ index 187791ff8197be015856fdfa9159fb26558f95cf..15075c8705929de83adaf0f7afe7a7cf @Override public void handleCustomPayload(ServerboundCustomPayloadPacket packet) { -@@ -3672,6 +3673,13 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -3529,6 +3530,13 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic ServerGamePacketListenerImpl.LOGGER.error("Couldn\'t unregister custom payload", ex); this.disconnect("Invalid payload UNREGISTER!", org.bukkit.event.player.PlayerKickEvent.Cause.INVALID_PAYLOAD); // Paper - kick event cause } @@ -43,10 +43,10 @@ index 187791ff8197be015856fdfa9159fb26558f95cf..15075c8705929de83adaf0f7afe7a7cf try { byte[] data = new byte[packet.data.readableBytes()]; diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index a5220a4e514865c70700527bcd2f941d852564c0..26a05a8835934093054e76057572f3f69410134d 100644 +index 52071101c16ae84f69f1a00857b4895f328f6edd..72501f09d42f73a108e96f519be4382ee4e3b230 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -2983,4 +2983,11 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -2998,4 +2998,11 @@ public class CraftPlayer extends CraftHumanEntity implements Player { return this.spigot; } // Spigot end diff --git a/patches/server/0003-Rebrand.patch b/patches/server/0003-Rebrand.patch deleted file mode 100644 index f9b3710f5..000000000 --- a/patches/server/0003-Rebrand.patch +++ /dev/null @@ -1,994 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: William Blake Galbreath -Date: Sat, 4 May 2019 01:02:11 -0500 -Subject: [PATCH] Rebrand - - -diff --git a/build.gradle.kts b/build.gradle.kts -index 9d4fc7b32e4b3f232748b7f6808c33f989649f5c..8ffc0d92ea29b95e5406ed81088ecf00e7679a97 100644 ---- a/build.gradle.kts -+++ b/build.gradle.kts -@@ -7,7 +7,7 @@ plugins { - } - - dependencies { -- implementation(project(":pufferfish-api")) // Pufferfish // Paper -+ implementation(project(":purpur-api")) // Purpur - // Pufferfish start - implementation("io.papermc.paper:paper-mojangapi:1.19.2-R0.1-SNAPSHOT") { - exclude("io.papermc.paper", "paper-api") -@@ -42,6 +42,9 @@ dependencies { - runtimeOnly("mysql:mysql-connector-java:8.0.29") - runtimeOnly("com.lmax:disruptor:3.4.4") // Paper - -+ implementation("cat.inspiracio:rhino-js-engine:1.7.7.1") // Purpur -+ implementation("dev.omega24:upnp4j:1.0") // Purpur -+ - runtimeOnly("org.apache.maven:maven-resolver-provider:3.8.5") - runtimeOnly("org.apache.maven.resolver:maven-resolver-connector-basic:1.7.3") - runtimeOnly("org.apache.maven.resolver:maven-resolver-transport-http:1.7.3") -@@ -81,7 +84,7 @@ tasks.jar { - attributes( - "Main-Class" to "org.bukkit.craftbukkit.Main", - "Implementation-Title" to "CraftBukkit", -- "Implementation-Version" to "git-Pufferfish-$implementationVersion", // Pufferfish -+ "Implementation-Version" to "git-Purpur-$implementationVersion",// Purpur - "Implementation-Vendor" to date, // Paper - "Specification-Title" to "Bukkit", - "Specification-Version" to project.version, -@@ -153,7 +156,7 @@ fun TaskContainer.registerRunTask( - name: String, - block: JavaExec.() -> Unit - ): TaskProvider = register(name) { -- group = "paper" -+ group = "paperweight" // Purpur - mainClass.set("org.bukkit.craftbukkit.Main") - standardInput = System.`in` - workingDir = rootProject.layout.projectDirectory -diff --git a/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java b/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java -index bf42969859545a8a520923ef1836ffa4a5cc24a0..fba5dbdb7bcbb55400ef18342c9b54612972a718 100644 ---- a/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java -+++ b/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java -@@ -19,8 +19,10 @@ import java.util.stream.StreamSupport; - - public class PaperVersionFetcher implements VersionFetcher { - private static final java.util.regex.Pattern VER_PATTERN = java.util.regex.Pattern.compile("^([0-9\\.]*)\\-.*R"); // R is an anchor, will always give '-R' at end -- private static final String GITHUB_BRANCH_NAME = "master"; -- private static final String DOWNLOAD_PAGE = "https://papermc.io/downloads"; -+ // Purpur start -+ private static final String DOWNLOAD_PAGE = "https://purpurmc.org/downloads"; -+ private static int distance = -2; public int distance() { return distance; } -+ // Purpur end - private static @Nullable String mcVer; - - @Override -@@ -31,11 +33,11 @@ public class PaperVersionFetcher implements VersionFetcher { - @Nonnull - @Override - public Component getVersionMessage(@Nonnull String serverVersion) { -- String[] parts = serverVersion.substring("git-Paper-".length()).split("[-\\s]"); -- final Component updateMessage = getUpdateStatusMessage("PaperMC/Paper", GITHUB_BRANCH_NAME, parts[0]); -+ String[] parts = serverVersion.substring("git-Purpur-".length()).split("[-\\s]"); // Purpur -+ final Component updateMessage = getUpdateStatusMessage("PurpurMC/Purpur", "ver/" + getMinecraftVersion(), parts[0]); // Purpur - final Component history = getHistory(); - -- return history != null ? TextComponent.ofChildren(updateMessage, Component.newline(), history) : updateMessage; -+ return history != null ? Component.join(net.kyori.adventure.text.JoinConfiguration.separator(Component.newline()), history, updateMessage) : updateMessage; // Purpur - } - - private static @Nullable String getMinecraftVersion() { -@@ -45,7 +47,7 @@ public class PaperVersionFetcher implements VersionFetcher { - String result = matcher.group(); - mcVer = result.substring(0, result.length() - 2); // strip 'R' anchor and trailing '-' - } else { -- org.bukkit.Bukkit.getLogger().warning("Unable to match version to pattern! Report to PaperMC!"); -+ org.bukkit.Bukkit.getLogger().warning("Unable to match version to pattern! Report to Purpur!"); // Purpur - org.bukkit.Bukkit.getLogger().warning("Pattern: " + VER_PATTERN.toString()); - org.bukkit.Bukkit.getLogger().warning("Version: " + org.bukkit.Bukkit.getBukkitVersion()); - } -@@ -55,7 +57,7 @@ public class PaperVersionFetcher implements VersionFetcher { - } - - private static Component getUpdateStatusMessage(@Nonnull String repo, @Nonnull String branch, @Nonnull String versionInfo) { -- int distance; -+ //int distance; // Purpur - use field - try { - int jenkinsBuild = Integer.parseInt(versionInfo); - distance = fetchDistanceFromSiteApi(jenkinsBuild, getMinecraftVersion()); -@@ -66,13 +68,13 @@ public class PaperVersionFetcher implements VersionFetcher { - - switch (distance) { - case -1: -- return Component.text("Error obtaining version information", NamedTextColor.YELLOW); -+ return Component.text("* Error obtaining version information", NamedTextColor.RED); // Purpur - case 0: -- return Component.text("You are running the latest version", NamedTextColor.GREEN); -+ return Component.text("* You are running the latest version", NamedTextColor.GREEN); // Purpur - case -2: -- return Component.text("Unknown version", NamedTextColor.YELLOW); -+ return Component.text("* Unknown version", NamedTextColor.RED); // Purpur - default: -- return Component.text("You are " + distance + " version(s) behind", NamedTextColor.YELLOW) -+ return Component.text("* You are " + distance + " version(s) behind", NamedTextColor.YELLOW) // Purpur - .append(Component.newline()) - .append(Component.text("Download the new version at: ") - .append(Component.text(DOWNLOAD_PAGE, NamedTextColor.GOLD) -@@ -85,15 +87,11 @@ public class PaperVersionFetcher implements VersionFetcher { - if (siteApiVersion == null) { return -1; } - try { - try (BufferedReader reader = Resources.asCharSource( -- new URL("https://api.papermc.io/v2/projects/paper/versions/" + siteApiVersion), -+ new URL("https://api.purpurmc.org/v2/purpur/" + siteApiVersion), // Purpur - Charsets.UTF_8 - ).openBufferedStream()) { - JsonObject json = new Gson().fromJson(reader, JsonObject.class); -- JsonArray builds = json.getAsJsonArray("builds"); -- int latest = StreamSupport.stream(builds.spliterator(), false) -- .mapToInt(e -> e.getAsInt()) -- .max() -- .getAsInt(); -+ int latest = json.getAsJsonObject("builds").getAsJsonPrimitive("latest").getAsInt(); // Purpur - return latest - jenkinsBuild; - } catch (JsonSyntaxException ex) { - ex.printStackTrace(); -@@ -144,6 +142,6 @@ public class PaperVersionFetcher implements VersionFetcher { - return null; - } - -- return Component.text("Previous version: " + oldVersion, NamedTextColor.GRAY, TextDecoration.ITALIC); -+ return org.bukkit.ChatColor.parseMM("Previous: %s", oldVersion); // Purpur - } - } -diff --git a/src/main/java/com/destroystokyo/paper/console/PaperConsole.java b/src/main/java/com/destroystokyo/paper/console/PaperConsole.java -index c5d5648f4ca603ef2b1df723b58f9caf4dd3c722..3cb56595822799926a8141e60a42f5d1edfc6de5 100644 ---- a/src/main/java/com/destroystokyo/paper/console/PaperConsole.java -+++ b/src/main/java/com/destroystokyo/paper/console/PaperConsole.java -@@ -17,7 +17,7 @@ public final class PaperConsole extends SimpleTerminalConsole { - @Override - protected LineReader buildReader(LineReaderBuilder builder) { - builder -- .appName("Paper") -+ .appName("Purpur") // Purpur - .variable(LineReader.HISTORY_FILE, java.nio.file.Paths.get(".console_history")) - .completer(new ConsoleCommandCompleter(this.server)) - .option(LineReader.Option.COMPLETE_IN_WORD, true); -diff --git a/src/main/java/net/minecraft/CrashReport.java b/src/main/java/net/minecraft/CrashReport.java -index abe37c7c3c6f5ab73afd738ec78f06d7e4d2ed96..b5b6657e52e4f7a630229bd3ba433438af293e22 100644 ---- a/src/main/java/net/minecraft/CrashReport.java -+++ b/src/main/java/net/minecraft/CrashReport.java -@@ -123,6 +123,10 @@ public class CrashReport { - StringBuilder stringbuilder = new StringBuilder(); - - stringbuilder.append("---- Minecraft Crash Report ----\n"); -+ // Purpur start -+ stringbuilder.append("// "); -+ stringbuilder.append("// DO NOT REPORT THIS TO PAPER! REPORT TO PURPUR INSTEAD!"); -+ // Purpur end - stringbuilder.append("// "); - stringbuilder.append(CrashReport.getErrorComment()); - stringbuilder.append("\n\n"); -diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 3cadf20891888b56ac70798d581d6a044a98c0a3..10869c6c0697917c412f80dfdc9b211fec0b5b06 100644 ---- a/src/main/java/net/minecraft/server/MinecraftServer.java -+++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -298,7 +298,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop S spin(Function serverFactory) { -@@ -923,7 +923,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop // Paper - Paper > // Spigot - Spigot > // CraftBukkit - cb > vanilla! -+ return "Purpur"; // Purpur - Purpur > // Paper - Paper > // Spigot - Spigot > // CraftBukkit - cb > vanilla! - } - - public SystemReport fillSystemReport(SystemReport details) { -diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java -index 5c54a5da7fb50cd97799c5fa280a24d5c6117244..b60c3d4f5ab695e0e449678a8f0ae1eea2f83aab 100644 ---- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java -+++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java -@@ -285,11 +285,12 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface - DedicatedServer.LOGGER.warn("**** SERVER IS RUNNING IN OFFLINE/INSECURE MODE!"); - DedicatedServer.LOGGER.warn("The server will make no attempt to authenticate usernames. Beware."); - // Spigot start -- if (org.spigotmc.SpigotConfig.bungee) { -- DedicatedServer.LOGGER.warn("Whilst this makes it possible to use BungeeCord, unless access to your server is properly restricted, it also opens up the ability for hackers to connect with any username they choose."); -+ if (io.papermc.paper.configuration.GlobalConfiguration.get().proxies.isProxyOnlineMode()) { // Purpur -+ DedicatedServer.LOGGER.warn("Whilst this makes it possible to use BungeeCord or Velocity, unless access to your server is properly restricted, it also opens up the ability for hackers to connect with any username they choose."); // Purpur - DedicatedServer.LOGGER.warn("Please see http://www.spigotmc.org/wiki/firewall-guide/ for further information."); - } else { - DedicatedServer.LOGGER.warn("While this makes the game possible to play without internet access, it also opens up the ability for hackers to connect with any username they choose."); -+ DedicatedServer.LOGGER.warn("You will not be offered any support as long as the server allows offline-mode players to join."); // Purpur - } - // Spigot end - DedicatedServer.LOGGER.warn("To change this, set \"online-mode\" to \"true\" in the server.properties file."); -diff --git a/src/main/java/net/minecraft/world/level/chunk/storage/RegionFileStorage.java b/src/main/java/net/minecraft/world/level/chunk/storage/RegionFileStorage.java -index 8db3bcc63aeb23e5b50864ebea675acc75d184ff..3aa9a667d988fe2b6118ce4b3a4551e7e17b7884 100644 ---- a/src/main/java/net/minecraft/world/level/chunk/storage/RegionFileStorage.java -+++ b/src/main/java/net/minecraft/world/level/chunk/storage/RegionFileStorage.java -@@ -113,7 +113,7 @@ public class RegionFileStorage implements AutoCloseable { - - // Paper start - private static void printOversizedLog(String msg, Path file, int x, int z) { -- org.apache.logging.log4j.LogManager.getLogger().fatal(msg + " (" + file.toString().replaceAll(".+[\\\\/]", "") + " - " + x + "," + z + ") Go clean it up to remove this message. /minecraft:tp " + (x<<4)+" 128 "+(z<<4) + " - DO NOT REPORT THIS TO PAPER - You may ask for help on Discord, but do not file an issue. These error messages can not be removed."); -+ org.apache.logging.log4j.LogManager.getLogger().fatal(msg + " (" + file.toString().replaceAll(".+[\\\\/]", "") + " - " + x + "," + z + ") Go clean it up to remove this message. /minecraft:tp " + (x<<4)+" 128 "+(z<<4) + " - DO NOT REPORT THIS TO PURPUR - You may ask for help on Discord, but do not file an issue. These error messages can not be removed."); // Purpur - } - - private static final int DEFAULT_SIZE_THRESHOLD = 1024 * 8; -diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index a4848a507f620cff686992c2e95039ca60af6d0e..c42e913376fc76d588070fe130470196429fa3b2 100644 ---- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java -+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -248,7 +248,7 @@ import javax.annotation.Nullable; // Paper - import javax.annotation.Nonnull; // Paper - - public final class CraftServer implements Server { -- private final String serverName = "Pufferfish"; // Paper // Pufferfish -+ private final String serverName = "Purpur"; // Paper // Purpur - private final String serverVersion; - private final String bukkitVersion = Versioning.getBukkitVersion(); - private final Logger logger = Logger.getLogger("Minecraft"); -diff --git a/src/main/java/org/bukkit/craftbukkit/command/CraftConsoleCommandSender.java b/src/main/java/org/bukkit/craftbukkit/command/CraftConsoleCommandSender.java -index 4e56018b64d11f76c8da43fd8f85c6de72204e36..aa8212432825db65cf485cd93f734ccd9eefcb5a 100644 ---- a/src/main/java/org/bukkit/craftbukkit/command/CraftConsoleCommandSender.java -+++ b/src/main/java/org/bukkit/craftbukkit/command/CraftConsoleCommandSender.java -@@ -21,7 +21,12 @@ public class CraftConsoleCommandSender extends ServerCommandSender implements Co - - @Override - public void sendMessage(String message) { -- this.sendRawMessage(message); -+ // Purpur start -+ String[] parts = message.split("\n"); -+ for (String part : parts) { -+ this.sendRawMessage(part); -+ } -+ // Purpur end - } - - @Override -@@ -91,7 +96,7 @@ public class CraftConsoleCommandSender extends ServerCommandSender implements Co - // Paper start - @Override - public void sendMessage(final net.kyori.adventure.identity.Identity identity, final net.kyori.adventure.text.Component message, final net.kyori.adventure.audience.MessageType type) { -- this.sendRawMessage(net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().serialize(message)); -+ this.sendMessage(net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().serialize(message)); // Purpur - } - - @Override -diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java -index 316120a57802c45fb9b02a4daee207a0845c63be..e3c1a7f7e643b8a2f42e76c92087219f984ea8aa 100644 ---- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java -+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java -@@ -866,7 +866,7 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { - return EntityCategory.WATER; - } - -- throw new UnsupportedOperationException("Unsupported monster type: " + type + ". This is a bug, report this to Spigot."); -+ throw new UnsupportedOperationException("Unsupported monster type: " + type + ". This is a bug, report this to Purpur."); // Purpur - } - - @Override -diff --git a/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java b/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java -index cdefb2025eedea7e204d70d568adaf1c1ec4c03c..d1526ed7197b883e1d1f07baf285bf5eef4d20d5 100644 ---- a/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java -+++ b/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java -@@ -504,7 +504,7 @@ public class CraftScheduler implements BukkitScheduler { - this.parsePending(); - } else { - //this.debugTail = this.debugTail.setNext(new CraftAsyncDebugger(currentTick + CraftScheduler.RECENT_TICKS, task.getOwner(), task.getTaskClass())); // Paper -- task.getOwner().getLogger().log(Level.SEVERE, "Unexpected Async Task in the Sync Scheduler. Report this to Paper"); // Paper -+ task.getOwner().getLogger().log(Level.SEVERE, "Unexpected Async Task in the Sync Scheduler. Report this to Purpur"); // Paper // Purpur - // We don't need to parse pending - // (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 47ff8c22bd9c7220df98268f6db224d1cd66a0ab..b1e11bb17212174e546892cbaa04740e632cd075 100644 ---- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java -+++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java -@@ -435,7 +435,7 @@ public final class CraftMagicNumbers implements UnsafeValues { - - @Override - public com.destroystokyo.paper.util.VersionFetcher getVersionFetcher() { -- return new gg.pufferfish.pufferfish.PufferfishVersionFetcher(); // Pufferfish -+ return new com.destroystokyo.paper.PaperVersionFetcher(); // Purpur - } - - @Override -diff --git a/src/main/java/org/bukkit/craftbukkit/util/Versioning.java b/src/main/java/org/bukkit/craftbukkit/util/Versioning.java -index 80553face9c70c2a3d897681e7761df85b22d464..fb87620c742ff7912f5e8ccd2a7930dd605576d9 100644 ---- a/src/main/java/org/bukkit/craftbukkit/util/Versioning.java -+++ b/src/main/java/org/bukkit/craftbukkit/util/Versioning.java -@@ -11,7 +11,7 @@ public final class Versioning { - public static String getBukkitVersion() { - String result = "Unknown-Version"; - -- InputStream stream = Bukkit.class.getClassLoader().getResourceAsStream("META-INF/maven/gg.pufferfish.pufferfish/pufferfish-api/pom.properties"); // Pufferfish -+ InputStream stream = Bukkit.class.getClassLoader().getResourceAsStream("META-INF/maven/org.purpurmc.purpur/purpur-api/pom.properties"); // Purpur - Properties properties = new Properties(); - - if (stream != null) { -diff --git a/src/main/java/org/spigotmc/WatchdogThread.java b/src/main/java/org/spigotmc/WatchdogThread.java -index e9fa7faaa4451e36b3908cbcbbe0baf213abde96..a810bfd3b8d6bd4d8f2ef8797e4281ae4fe8a67f 100644 ---- a/src/main/java/org/spigotmc/WatchdogThread.java -+++ b/src/main/java/org/spigotmc/WatchdogThread.java -@@ -96,7 +96,7 @@ public final class WatchdogThread extends io.papermc.paper.util.TickThread // Pa - - private WatchdogThread(long timeoutTime, boolean restart) - { -- super( "Paper Watchdog Thread" ); -+ super( "Watchdog Thread" ); // Purpur - use a generic name - this.timeoutTime = timeoutTime; - this.restart = restart; - earlyWarningEvery = Math.min(io.papermc.paper.configuration.GlobalConfiguration.get().watchdog.earlyWarningEvery, timeoutTime); // Paper -@@ -155,14 +155,14 @@ public final class WatchdogThread extends io.papermc.paper.util.TickThread // Pa - if (isLongTimeout) { - // Paper end - log.log( Level.SEVERE, "------------------------------" ); -- log.log( Level.SEVERE, "The server has stopped responding! This is (probably) not a Paper bug." ); // Paper -+ log.log( Level.SEVERE, "The server has stopped responding! This is (probably) not a Purpur bug." ); // Paper // Purpur - log.log( Level.SEVERE, "If you see a plugin in the Server thread dump below, then please report it to that author" ); - log.log( Level.SEVERE, "\t *Especially* if it looks like HTTP or MySQL operations are occurring" ); - log.log( Level.SEVERE, "If you see a world save or edit, then it means you did far more than your server can handle at once" ); - log.log( Level.SEVERE, "\t If this is the case, consider increasing timeout-time in spigot.yml but note that this will replace the crash with LARGE lag spikes" ); -- log.log( Level.SEVERE, "If you are unsure or still think this is a Paper bug, please report this to https://github.com/PaperMC/Paper/issues" ); -+ log.log( Level.SEVERE, "If you are unsure or still think this is a Purpur bug, please report this to https://github.com/PurpurMC/Purpur/issues" ); // Purpur - log.log( Level.SEVERE, "Be sure to include ALL relevant console errors and Minecraft crash reports" ); -- log.log( Level.SEVERE, "Paper version: " + Bukkit.getServer().getVersion() ); -+ log.log( Level.SEVERE, "Purpur version: " + Bukkit.getServer().getVersion() ); // Purpur - // - if ( net.minecraft.world.level.Level.lastPhysicsProblem != null ) - { -@@ -185,12 +185,12 @@ public final class WatchdogThread extends io.papermc.paper.util.TickThread // Pa - // Paper end - } else - { -- log.log(Level.SEVERE, "--- DO NOT REPORT THIS TO PAPER - THIS IS NOT A BUG OR A CRASH - " + Bukkit.getServer().getVersion() + " ---"); -+ log.log(Level.SEVERE, "--- DO NOT REPORT THIS TO PURPUR - THIS IS NOT A BUG OR A CRASH - " + Bukkit.getServer().getVersion() + " ---"); // Purpur - log.log(Level.SEVERE, "The server has not responded for " + (currentTime - lastTick) / 1000 + " seconds! Creating thread dump"); - } - // Paper end - Different message for short timeout - log.log( Level.SEVERE, "------------------------------" ); -- log.log( Level.SEVERE, "Server thread dump (Look for plugins here before reporting to Paper!):" ); // Paper -+ log.log( Level.SEVERE, "Server thread dump (Look for plugins here before reporting to Purpur!):" ); // Paper // Purpur - io.papermc.paper.chunk.system.scheduling.ChunkTaskScheduler.dumpAllChunkLoadInfo(isLongTimeout); // Paper // Paper - rewrite chunk system - this.dumpTickingInfo(); // Paper - log detailed tick information - WatchdogThread.dumpThread( ManagementFactory.getThreadMXBean().getThreadInfo( MinecraftServer.getServer().serverThread.getId(), Integer.MAX_VALUE ), log ); -@@ -206,7 +206,7 @@ public final class WatchdogThread extends io.papermc.paper.util.TickThread // Pa - WatchdogThread.dumpThread( thread, log ); - } - } else { -- log.log(Level.SEVERE, "--- DO NOT REPORT THIS TO PAPER - THIS IS NOT A BUG OR A CRASH ---"); -+ log.log(Level.SEVERE, "--- DO NOT REPORT THIS TO PURPUR - THIS IS NOT A BUG OR A CRASH ---"); // Purpur - } - - log.log( Level.SEVERE, "------------------------------" ); -diff --git a/src/main/resources/logo.png b/src/main/resources/logo.png -index a7d785f60c884ee4ee487cc364402d66c3dc2ecc..35ae7a94cebd4a9a16fc9112ccc248fa3cac5f32 100644 -GIT binary patch -literal 17292 -zcmZr%Q+Op^)18@QV%ye9GO?|RZQHi36Wiv*wrwX9TNB&<&--2f7v25zRqxunYE`XO -z)#388V(>6HFyFp?gO?B&Q3O3l|GS_dK=&&3>KxGHyOW}r(6{Poyc5t1xS61g;J0se -zv9Rw3KSA%%_Tm~&-@YLX{C9mHu`4zH_Dz^rLPSv6UH3uIKHN$(9lRBV*i2#hI- -z_~Y$^N~A|I!$ek*IvIctFG)?DTtpI0Ha@GZC`npujzS(T5(-7(X4 -zbQ|h))t2-2q5jDCR@pVPHt=-bHPc~+FHRHyj`IKBcEm$x4SqQIGwUWNa2>4tx*iJ5 -zFQ`h+5Qq~;B15?Lt087ATEwRQJAaPK@$cklh);?pfGCbg+`rX5E34(u{dkW8GGL!f -z?;bha7X~Uk6!9Co4ryW!H=?6Il>bNs6jx;{Hs6{G*ryq4Fq3{-@U6u*xPoD{NYDsY -z$xK~}lC2}lD-LxxgTy%re!m7icdAaM-W%q#`!Kiz!U-9Y4;d5+>ATyX$tl2h3Cmer -zu%3R^XH@nBN_EX$bN=EXy?2Xd(kZhtomkO#7CQg -zB+1Sw*O(!vrQitB3t?DT?PGJd!seWZKW})+(SIKCo^_pWMbSnzAc>` -z1wdPjL)gIDoGKv*Ok0tnye0ON2*wE&{6q!Yf6N=qo3=b=_e*jQcMj||k#k=Oaoj_k -zb=ZKr30IUP+7?GD^5-~`Xmc@xFC7Pqg)}@B9Mzo{OR8-Q96^tjI%$qSSX@V$s178W -zQ~&9o!Acbf7VY~gm?!vT)AEexJn%Mpw!{v!pb!+F_2sk*miJSY*qH^n3ZeOD`%``K -zomU)-XS-y$)jbZqlZoQ9-p#~$V6xIkq!MivcxN2ZDDmt&d?Z!`64v#%iZ|F!#xFjH -zHbt($S+CB-W9mt;(k7U3{^y95!Xy-XB0(fX=QI+`i%JN55297@zP@{%EV`20NQH}{ -z=LXaR&eK1KAzmnNsO%{4hC8pH_3!N22JDDfiyU0tomMwEJi-tYYLCi6y2|XCWLU-5 -zs|wHs3@GsVbLUgnC49~s$GB8)Dn^=b#W-}x0U@JqMx&O5q}jmmFQz4nCss_Km?k*HOfJFo!Hf%kJ3{2 -zhGi29gjW=PS7ZR!Sb$S*T!$+jBzhX22!>_a0p6(A{Q6gJ*$A%ffeHF@E(&ATyS%aC -zhHqvPDgoeg5U_;aXXr|rlENktPOC{JA`}PS -z?)&j~B=hi%S@X@AE`FzdqsAo~K|&o{n!~tKmDTTxjH}H>=!0t!vID5qU+dOVCPXG*M3HN=-Y~pJbRw6 -zU_{I4!p&XdT+dg>8hcitE&eqiJOOaJCTxMofb&tSRFs6Ea7&nK$p+tcBIw2#>r#rf -zF2I``X7?S@lvNN*1AhVhVBBEH7FF`q^`zw-)ZIT%t>ghuR+|v}*ta6uU{bc7F8#*Z -z>g$av&I#2f$8-L{VmC;Xp01bBj<{-kLS8#h2MKn$A}(84LrC@Z -zHHVU8!pl4ZxeO_lq|jwNGzD(}G|CkW1j_O6*sKTfnpEL885C+DrT__P+8H;Ugig>U -zf9H0nQIG(%&03UCPDzE5EgcGKP~b03;S$Rh9jNcM&+YQ_6g`jW3E##cS|C7=%p!YY -zun{~ZNV_*4ix4{Ln1`BaeXC*K8`8HU`PqkTVE*;JeoGCrKX+Vxb9UpHUvJOOC{wm@ -zv8gfZnK|oa!)TAD_&}({f(sEQV4w2+8zmp3Ol5;&A@K7FSX~p0!dTe|Z5r#Ld#@-- -z2iFG1zFfL*E4PsehkN7MXSyqFaQfnSaEWv6?*ZR@vvhJJm(@DI9|tOJR&Bp>Rv%TH)$IOD?5O}I`7>?PQ|>k+DJRLn)ku? -z$_jyyw#BqKBun<1i3)&u5Ij=w#N7ydGvqfsx#X8lnGE)`&7qG`l5_|wbt2-vn_ -zYOg^K$BK1Hd0@}_VYTt9oGNDYoER?_PBr|H%qyN@X|?lwxgGwHqWVr`3ZJOwj6?6I -zzKxav7?>0tM(}Ngb2*uuUU-P -z!QEL0pbmWjiiP}j?U`(LZga8mJ>n3%7qF7tCvU_k2V<~od3;SqDSm{oWNyA&+Ov5O -zS4UYqciXaX%|?se=+Q;QijtPhAfdFgR~fepk)xDGHlrcOgxExuRfM7WgrAAZLeJEAmUrLf;bbl(xu@tT -z)j2=ZB^dqgw7=g3W}-DKKbRLb7ar{NPhbs|dC>Qa%GbW{@AV;J2+$E{)1^R=j&$aH -z9Z}|UcX{mQYbjv2awgDZ%%ZRha&GkV_Trw}KAy|sKu~dPgdjXNz-+IKK-@T7rr*^N -zC&Z#-r-_d+k|0Hufy4Mn1Q&igxvdpU72lLiI+}mCCKfWhJ&B+O%e^qG;S=rHa!m$b -z+O3B@)E%)u(>5O0bt#w&P3^^5cZ2At%iHW(PUn^PILqf5XJ!jCT{-CTHZ4Sff)9_d -z;X0q8xWc8-IJ1r5Ll1HKQGjmaQo`ekpR(WF7W@bMWI61952=jydr^gwOXoXV+DAXu -zl~^S&C049@G*2>HUvRiw#I9QGT+jxGnBtY0x$6_p4Qlf4aBoL64{h4kffLn&U)j?w -zJ;9Btl7@km@QTS&!2ZWp#K%h5$xpju%Aq}5|0ngrJ?9?-i(*)e8`sV_(SmnF@~4+A -zLxS@T`{ND-2adcD#qML$D=&XJuJ~2Aqz8Lv>4ahF(6E(ppJX3GiWmZ|=9QZ)yCFrZ&rhUEuw$E; -zUSo@3>mY(E9~J9!t?k*hD4ZY`%Z*>h59X{oSOakyt?O6S`~DvJTu~P8${+#K2=Pw2>BWmi9oW@xr&XC)61tBlUk>Zg)Ohdy{NW}!^tjj{GQdG71^h_&b2*h1z%1$^?E -zGw~W4#Sf9O)sy4z$zh&Vf4Y48ESI|5^HoQ78v7`@CqAgG>-T~Y -zC%6sN@g7uhTlSGwnl+!bjzl6Vn7TRg?ttoh5HRj|?OtQQZ(-klZYbI#4oO{xR3B9# -z-Te(G>1_#h{@S@-v8i>E=((0L29G^GV0jI@RDSSahHK+1_oZ4uyeW#{iJ?Nle!XN8 -zKZb3OmA?NBybQ}{!d=FB+)h`QybACk)k7IEZz4r-TA!HAQj~>6p`Hvnr{QyL9#VTK -zdTzAX{ZF2Ho@h3$oT#U^_HMS -z?;9NHfNojV2tCa6n1p3v!D-O3CrB(WE>hNs{2H4>m(${BFJ3UC#J#BT(`@^;`dQh; -zad$djlps6yb_Y&pcf6QH2Y~-w{jY%Prtgo^n|^jg0#Y4*7(!gT<|lJMt^k80`u!*( -zTVZItC&wYDVcPWU#0WS3C@0fB1P`HH1=H<{BZT@PouJ+e?@hiQ% -zEiQT6Ev?l7bU8L-envX)&{}-zW2-VRD9)Xk -zkc?ZFluil~O%2(QzZcU{7&~_=I7py)hYurI-{9Kc|6=^(h7+6JdD+^3!;Q}pZSjDO -z@iI2oP#ii1DWQ+=BEt^p+q*hxe+3eZo$p)20j6)WqPkAkw-jgVw8~ -z3)n|z6Pn;{s@!f;(8}&1i-DRy$eu-sB;0RKqckDtI`p^Dwt%7efT#Cn5z&_7qDWdW -zhimJnCLC8&!{{pT_4oZ_yH)}oi%T1%NUHbrIb`cc0ufqdMTec?jUWNWuO#-;AEsqY -zhf$;r=YWm&=OQ5Y(nEnoNs=y#fXE@HKS1ou!Y84=W4DXgX(&VzATVh|iD{A=5TlK$ -z75Bc05rX;>-5_iu;qeUNGIzA}tnS#!!~4OZK78n+iDL%73)8N1GYfp4>iDI$6BQD7 -z`}dAynae2uNyl+FS7uk6E;4Tq%a@=pUaJxLgk1%_xxal3waZV@wtY__TOu4wRSWSd -zDuV=rAbIqv8h#c+N>Q&(~*>cE3pm=osYPM -z?c)b-9a_0hB(-#7?7aOC>yv}G49W$|r$t&0G_<}xt;Ygfa}bxze{8B?m(!c;@#(jB -zH=l)p2(@?+FA1na!I7 -z!eX|}+_>xr;3G74!Q)4jDBP9Guy&1!6-3xL=?_ZH`*2Qkn7hoAYAz=0J|iKY96p!J -zziU$M;GM>`REMB}x6xjg#%=m)tjES`s%m&olsQsmuFO#-MqG$0-6xpxx8ax~82F-K -zELOqr6iMmGVT^T&v@P|lMI8?(?x(~&F=#)HyvEd?)PgS`zxA_p+k#SQV*8j0)K* -z47@+RW*n0E^4mu1+Kklx7WCCE_LVF@ -z&nW-G@Jd7zI#8?w%qgsx-Y_7&5d7U<}R*`=`x?J!T{h+|kxt>tG -z!KTjmEaQ+-d^i|f(KLnCa;N{kBEwL2ML8Yqpm05meY+YpKAXGu&xPt-ke|cZz*nq9 -z=kK=2!MLA*;#rT1qzG*p>CC1Y7>47PQ_2vsU`7{m`vT^m+@+tHhcg|4*9CifRBG;d -z^$)X5Pqg{-27Q4!oWdvd^lYX6=OA2iLv;##Ha>1qDlu4FZEhU)zWZpG`tKoQUXuvV -zuXAI2J(7S>{gOFTe5%Sf*rG?x(~qjVk!r`oxfh5j>en657oiI4MY?uvm_>RAoix9g -zoI0I$fCfYU9SY;dJQqvKVlw7=8N!tUpU{XqiMSIHk0 -z21a9py|eO*_o#D%>L;9>CIX^d4u$Bffv~mU;%{UEd=b3{WzsEAD62t=X -z{aIi-Ooys=H-tW9S!_n3Lx0n!A3-djmbx3Pw+vueC|A7L9~!<9Wk`&;4ASw8Dq#1E8U -zhh332D?9R1eRh;T3Te%lY(3l@?+@Aw7LDzBF+E;NpViwJjQiCgBic)qP&Gp+)@nS} -zJPQcB5tLBU-O``&3dpjxHj9rGhXPx*>05dW8Lnj;i7GfT20oU!hF*>s=RKEG17EfG -zhp-3V)4|E7T!|$%5j#43sbiWNh0=fx5NB&2{*EUlAyyM6E(a!W<$Y)6v^;!o9R*Jk -z@v!=hS%jK~zv%a_%GY|xc=^v3@1;0Q_96|*vkl=oG*iAV;8tWDmiBo-5TA(3-l2{5 -zBg92bDAi$M=u9;N^<$W0Y|xFnvFs);cF?jI4d~vQ%bq`R9{Rc5Lz>glnC0H?MTHn} -zrfEx~y|gcN^Cuan|9z=mOq4vW3PP?PVZpL!F-jBv -zcA8Ej#LlaGtC(Z84Rx6ATc=XJ%8&N=NHWZs&`pi^xInUDcA)caGS?#(%Pc+X7 -zVb@Y{yk9%|lR?%fFwc9v>Nu3Kx=RINZ3QZ4rykl{%xl}o$al=R5lmPqcb|ImITJ>L -zY&qBMDY=V{)n83LwR&VZ`XGXG>t+qReu)2}DUujeEVjc(?XY;-TCLi-!Mh8dbgWI& -z1_jF-FyFUbdoeC>)nEHcaoX#dq@9nJ9M+Re<4|;0(0E-{fHSZDY2L={vfhp=L^N_N -zPIYY(HD3;8 -z41Fd(l(J)Nlj-NUQx_Cok3)s8F(a4->kdk=xXY+{fehTj4Pe1lrf;Rx~po3rk -zHHcb4FU6z!jNrV%fog)<+im;lXS3i}FlC2+C0-#P)1{7Au4A_`n4|3iEc&?w7-1*2 -zw%e}jX20mL0OHiL@sYfH+t%m6!#(`@8{7%239C4wnF_1Dn{@s`WWh=LVc(0J1!R6k -zn5$cwcHrgh-{;OUKO_6+rW#Ly&xoV)nN~IBSqX#<4x!5_TEtVDN^J^sMMHjL8GKY< -zHCo%W`Cs>1zZyP4R9D7t|M<@K`NiYHMAcSeUn^EK!I9{wex~3}=jG7F_-j%!KenRz -zg)s)I-w(S)^t0W}8M?pqlda8MOXn;b?gzWHBi+GN+rxEcH*~gfc+LBl*oq_}TzG(EOL-=%bgYtGP-Iggi -z2a&ihB*9rKCTokD6$H99yHeS{)=fsNntEhgFUtaVWq`*HwYK8wD^)P27=g~9{r*to -zL0=~tl|i%7m{0AWqmhFAV&oWc1a#^TguQe4I;&~)rURKbnm#3K;j`Sxt<;EX-(FiR -z7$dmX$L%xW5YJsv-k87jg%muFewf%dUDiuV*%h%TsAi`J3Sk~qCchy$8yni4P{>!Q3N>t?w)+`;bGy%WlKag8$nj8HDB+B5fG(<)2#9ayNL@5dx`L -z^lwUq)Q-FV?%Lmq@Ej|&tt{~I-7lE{3l)6`w(N@-X}T`>WO~=a#x=~gj?TXgoj+x@ -z^JIsy#!wQh*T)D5ci!L%$ONJ?>3k0nCgezY*(J$({3obwl__2V>h1UZy^8S`R0!-W -zFywgL+LC5SIa@zzIbb`No@|Jx^(0!NMj7sqIGr7ddfWKZ&x!2Sm7hHaN|y3N5pY~f -z6gDL5=dQlD0e#t+PP8@TC;_wE92wp=yhoI~Ol;Y3XSM_y?Sypm+x#uoXTm@1&B8G+&_Jc$n^Cpum_vRAfLH{24#dTw0Lj<&@sfgemtZ;WJWJolU?Ri1-}4m#=gv?%)moaX&5jo~*bNFoST<^F@C -ztXN>J;gLR+Gva>;yE46fy^ -z4&z|0Co{~S1=S|U_=ZnY2 -zV2$c -zDSyz60v5|`u(3&GZ196ixJjs>5WMlG_@P_CKK-uqG|x;>4q3yGtlw|ZBivFWiS(}+ -zkbYZHE)uFuft~BXp{shUrPbR{3lTWvTh3xzWA!JiEwq9o!?~sTMuEY!@P<$gF>?19 -zp+(oUW$;{5XdH9lgi|$|OW1c(D2Xfw(ByCf#er`Hd5jk@fG3q;uSw7NS-Hi{hGCj)~fnGVvpB%nPEzI4n|goB!KPFCz1>2p0vub&q+ -z7i7QaMpK!ZsI^+YT<`Zq|v+4uG{i`Im2E~fFj>EU-Mg{ -znSHL{AcGCD#8{vXi3MLui~01G1I;7`=yiPJ%(;j|=t;x)8~tihIWBTacwO`O^XX -zJ79HtePcpNAPu?IyBnfy58Er+Dg7VjvDs;d)iGx9J)D3eK1yNFjVA5xBEl{FLzP2R -zgAG^ic}T-Bxzvz=6f<5k9Srh#@V<6$Z+jVb@YxaMJ7pLj0*a;oyuYBtmC^bHsKuJODBizz0%UT@Xp!6AAce>9_DpPJ#Q1<=s_Y! -z`xn{~+u(n?SN76khQ`Hx#kM}4cAd+RKsTkLdlzvVtH7DIa8&Txf2!*ZGJL&yfyWHy -zR9cM!2po7c9MgxWh_dKqo!dJ#Q`8cHOpV*_%|Xu3Fa)f>p-_G+Fa2I!`IZvZ(R@8o -zZAPE6zBnO+)nX&i=c9@-g`-A`%CDJ$aeTo~0zAb;snWB7Pr8b32vr=1oa~G@MPhdd -z{Fa_Snm>ey_C=oJkCt4jfX02Y?uRG?vz_*}3B~ugW*6lx8m3vX!;(lwb`Sy7_Oomn -zFqE~@0BYYHBn6KD(m4VtVuQ~1tT3?}Ph!W|h2|pa{nm3&lL6St-DZ40?muY319?fDyP2dXPvoHBE!?Y@ -zd=A+P3@BU042GGX2>XmRdXLXyNGME`TySVH2rg4ZJfjh7{=!>mS6i`f(SK<60rO%lmDZMQ+0|wHpv6WhF}ApOY1*`J|fX%VFdmljdE^^Fp{P`c>T%Mhz@9 -z)Hh@kmXX_9NTQlun(hS+-8ogLpsaD7H-deplL^4>oARi~_aGyV;0$S@6&*=v>+T&C -z7;iZhBKTPIPNz%?&nw`fK}@`*hfHL1amjQ(>B41aozipH_n%PPt^`SF+wz>_fHrZv -zA05O=0h+FWVPy@HV{OT4$jx6c`L5DI{p*J|UyA1}JFqgUypc}ib6VPWN+?(BS$VJ! -z+;DGB?AnVWC%!#`4LcTX+pb!p@qy*wEB1CeREBdC;&D4*oh0G{RS~zZszzzy9#^#S -zH-X2uFWr)}v5&Z#Q^PVf(1H!a$%K)* -zToM6z)JU9ohx#8etI!SAj$OxS@Yk%Qzv{v`1gD647UQ;2I7j)M9>u4ErzP{luA_+# -zUK=I}#9MGt7pOW73zB$8#-yca*z|FeT2D)@7mf@=448vU+X=?Y*aUaa7EH5plmX<3 -zo%Zn?(g(F?{eeg3OUJjx$2JzCnEzZBX$=DxbeN@RYs(4fSfvDLngfdaM2TaziMJ@T -z3;NjukxVzqspHP%8kj8@4pRK*?=N~fY7&kt7fbsW^9|(co@G&`?mvaj@tKsu6tQa) -zYHGO9gkR5Ei_t;&JSr7{^M?Ss3rA{8l(uTczvg1m)|)N`0+~_#dCd~ZNZpcNnZl8Z -zJa>mi5bF*I!-yDCqN96R$^8@K(UaqKg05S5!R2Ne=miq0pEID-@r5JL@Qa0i~76jZ+a*?2^f(*r|AKv8RSCA%YVqGJ- -zNLLFj9EuG@>k6Dn-G~yL#%a#)z0-(k%M#;vpThZXvRL4=!`k&B5IO4v%}UvbSk^#H -zJMKFT#QyFk6Z7n!Mt~$#M^}Rz4S!Df0fM?YL^&9#5 -zaKVg6%wH1yLuf@5&hy&`)`TZv9}*x)C?Xt@coBmKI4$T8y^i0qXKRx^iy~Ej3!#|_ -zUgV{8r_a~z77oL9(-cvNmU)p+aS5*cEd0=LEjx^$!`v+`tWOjngoJy@39tXnC1c1v -z0Ac)%h+ElfK41c5Vd6bD&Edn-Xf9xE@ECi~`yn6auLIK0!(p$Y&YGJ0ces^ZftQPV5}qLv -zXuSTlRELiAFkD>ZaSVh_*95e=rQCQd4{`(MSj=wS!iWFRApzFPN-{k1cG=ozJW~Eq -zUW5=6y&HKDZ{wcW7sg{Y5swyLriOs@(CBEQ)(z#jqV81qy>!GR&bkKP2XgDz;lhzR -zA>BB=vM;`vJ1S^Hp&N;T>(N4})@D4D&gC~vyg72~@-WOqeq0KYB#?;aFlChov}qy- -zdB*HvSY+NZ(}@}1eS0;!ChhLslj{JXjr0pNWPr$>0D+0XBZfa!zyD3cI@Zg-%=uS9kWF7{{o=P0Ok<*| -zN*Z>M+b~7fGNKgjnldT_aGtyVY={jqj9}{|_V2eqDOlA!6YR%iR{r;OZ%P*2>*?i? -zqS(L6uaFdVbF{j$h0rbCq>nrwc}Rz@{q&bSEm3ifgZdAQufqM4!oX8M_zvMprvMWA -zpY>(JD(fdKq4n`XXAJTyJ{3d3T&A3GOR5Qn;aE&REmt2FJTl+I*_C58jC_8tem-eh -zrT~OTTnPqmzMupTYGabJm)vw2E}I)_K}#v`CnJyw6r+sH2N9djLhdUZssk2JZ8gq` -zc{qdfg@O~~0SA_&F#t56WiwQ&sk%PC7#o2Zkxl&>u7KP;4&EEHD26rPdayYPl6$J7 -zew~2J^anl+e-7E!{I -z@gd+BFyy@MJ?M!TZ^Q7iSi6>+HPcS(hM*Eti0^TJhvsH8U$%SeG!psK -znw$5Wah=>ejjccjA(CpUg4eH_28hbYV7a+LB_u{A6OTn{hhpF-t*fQ;*$|qdRCF~- -zx>#AK(pi8;>VL0NdiVBS&nzwwt}~M#rDM#(`Nc1LYaZmiJr8W@Cio!?`ti^D{e?ng -zN1E;4yq0P4LB)73LGP*ec!zB%>YYUjM?XTlf`uI1z}K-bT@%c?Hy_=LzvT70Za8x8 -z95UH;D8b`}0d3c~(>Se^71gqe9$4}@sO+!~d;Bk6QVI7qa~8jUchhAN#wnB+0%*St -z%Obl-m&_&Qicknrb4L3XRls>28Jv?556k@ZxK2x@W2;;iVz3ojl#!a1ca;~1r1Ls=!t&h~kR$=7izcKXe1Tvejt+@Ye8WTXJOD)mL5gO( -zHbosAArfjEN+`QBil)fGwq%Z0>$HDzoi|Gqbu@e(%ke-IvM8Vc0vF~;j3Y(ed8?UK -zp9&Ws@}H@M?5+i+%}%K4BDsi(JS$!>DEq;FL(3_yP(6!tgT1Zuiw2Ge?=C1Pg^#)p -zD<#Rg3>PW)h*X0j;^1T$spnfxX!?lg(-yXm=PsDdP0aC&71lM -zy0RX>gKVKLzl1=04F*y~-Zn3oQ{ygB`R36oQ#yGvNl -zfg}!W&A`x?wA8_1$--GKI1KAZV79yPn%t2hQ~oBvstb~nQ-#Q}G_f5nB9-IY;^~_p -z96WWHjq^H)3rZqUPtp%a*Djck`1jxIY4u)$Vi22CCafbD-tJvoDuYOWZLfLc{5&t; -zR@Rtic=IucQ6VCV7l>*BMv_FzuruD6K6i_M7>$Z5F27fWB~7yx{gkY%OsJ9v$J_+ -z6&)@$NZ|1oSq=!vqTZqCELVL%H{E{y=?5)T5L+06yNxOQAZFSBzC15xnbRuNU8usl -zI~w#wp#wO~TDryY;rheC{ddzge%>hjN;bvO&tt`EO@jnXRNbsgP!_#js=ucBqa8s6 -zE`yb}ib_x~QegQ3>=Q)JH|6uAnyy9Y0aY+(=CzQ@Iix?h<>zB=koo>!+ewn{I_D{J5ymn3+)V2?Iu+25AM0bED1NykRs*Rx1W|P2e6l5hHIo -zPzp5$g4YrFuO_d> -z#(Z~cnW2`6Bc7YFgTI`JIiwD%92(+A4)zw_Yj -zm2IowJL@Dpf7^yKL@3Y8Ki`>sP(odcqA8hc-3Ce8vp`D_SrgMXS<#DXYJ3k^HFf@l -zI)~#vA(wDrzSL`8uG5X6^+_Spz%Q~g5WU!Ru-}|Z&Cb!|f<~pB8UJh^YX`n78j~41 -z|F{#-5VIzV;)wHcUhJ4E$v%7GKx^RVr2&(QgBOaEIae^BG{H -zkk){EmyZt{p-}tH*b!-p{x3T!89*JqbhT&MWY_7Z9u{VYK&<9n+*E9OlZIJRq2MVC -z4m5}0jD7Gy{YiJb>_jVNsESOw$|jMUrDhwYqzj*4G|ul#Kg`>#yeodM?{@a~ZOf~@ -z=;a8ZQ09U;K||kWiBA~qGpR2k@W+)M(Ac-O66X}y5)H#cD}hk3jGURxQS -zAC24WuoDJorF6uErY(A498NtMWk5C1>P5uJe2WlxD3>X*?yL5|DQU!uapD*AfBH}P -zKqGIMec*BJIo-z?ovc{?3}6BHoLmokzqn%LI>4?iHqCsb4LEXx@&miImv=Ko(TRcP -zo=VOktSqCOn5&FWg)>p+O#5R!%z+GM7R|sv+OrgQ^xJW$@O;*RUAimJU_H;~fAF(( -zP9`Yql0i%{dA~&%X;$sE`5exZJHj>D3;%LvHlA9gO|0E1@?LWEV=~Co@}*GN6U@<9 -z48U&wUijx+T>qB(~@xF`YKR05ryW))W~n~CsI -z^w>>0D)ZPSro5RUu%v9Rd$7-GA}#`!q+g(-G5mMn(PV(zlorWJ2D<~%wSTb)9P{`< -zGBf>kj!Zi}TERN-^@=h{4EA68=fBk#EmsN0pdymf+3(E@XIYpjZ1EnTkO{Jp+(e8F -z$4f~;Jx~rXgD;N#J|uMxWX7*{ch-32u~?TsdDWiP#~mf;*#U8*-gtwbUHiYmTuU_e -z$iifwaNO^ImSp$|Nh~S2^gFM`&0HSv9(T~86rAeKY9bPN#dU4UN}?2_eV5EN)q&f* -z7-oyZgV|<_TR>+F*7dXUfsqq4WcgBZu2mFzesO;R>)2CxU%t>tw%a>529rfFHtnPuQOVazOy7XGlmP}jVBN5q -z^%bsIGw%?k?RqzQP?(B0uJf6X1asp8Nm*iiu;rh8v -zO&o@&xj39rUVk3@u&CuT)oP7mNq@_RGA4(9c5=4!MHgHG4rT+nI7OccLX->MSt=9l -z-dgT$%hFnq%;LOVx7qs6tkA=L$*QbDm+lsml*^VP+*lqh#fLhgeOspMO02H;N9ZFg~-a6e6nZ@Y87CMM3Hk?*?VXM5AdEdO{0f12d}us -zhM&YiIc)Ma>7c(~yxP6r{}p`t>|5%QEaDGqu+_rC-@og$4eRh(u4fsV9IVEp%gK@N1QPxAkcz>2@N~#Qy1Hmnhzwm!>&-J+NSEH>&2uJw -zRiYL2xz;HIumltjytilD3C$u@tfm=!)^#;HTFyPO-9f$7=^Zkul+^Z_B7}t?u{f-LwTKfaYa3M#kkiIDc9n#F2a0g_cR;M5NBe|!)B>DGPYhrI1ZAVjCQX-QJ0+uR%m$+`j&S4ba -z=#l79(lmZ*gnbo&+JXsS6Y*G_ELUY409d(qT6e5~AXjFs= -zPqi+*SIbMFitv_b@&YziZc}MTX!$=v(F;FxEAI!;1J!&c+0poaA6&w~Ml*?==^&1; -ztB{JB^wVDt=|E=pSkoP6 -zFtQ2I;_z6=uaoT+qE?^kXRWz -zEL?T=!_+TaOs|s6m%_d=iRz@gL@iiOuza)P725d3JPyH -z|04Cl!JV^mBn6ak1;q&4*ICSGS)~3&!U%jfK6;V#uG-B@eQ8RMb80~DB}ohQ5S5@# -zWX+kbVf?X^VE$CBP|`LuzBR5w?MUom$**h9C`IvxVF0d(*qO1l!MXu7L5O}!i3=9% -z?53e#M0=m>fz^!*I-_?MtF%Z6QIw#Q$l@;jY4Oj^UjUIYYIqgOhZIL!Tn*uhSD5aY -ztuSt!X+9tdS;prtjMP=I3({31P;);(tI=R3=nE)dVTuKh#E4Kt6|<5pu^dUkh^0Ud -zwcmUq6wDbteD8PK|IeHw+Etr!UWpdeJDX)YD?=Nq>V?3knL7#!-qcO`H7&zMqIr>? -zPSWsDX)skv9T->3zBZ^o7)%7`h@<0#52pklQ9yuP@O;6N!7bgC_l6kqnla})nMqii -z{hsQE+MEpv^f-JT0mjSPq#29b=O1Ll=;>vax%oM>WoL@uH44;fVTvBR+k8eogfYCr56Ug64>W^1$I6i5roZE#TIN-D?wrFB~)m -zn>#M(X+b|SP9C;9m4@#wo7_gHp$0SBHzS?1tR+Rk%z`M6Rg+NP`+jl<*`20fkd3kf -zJvU=fJ2-svZ$$Mga#iGuNdZGD$Ll7fa-Um$qWA&HaNZxJP(gU2h-tWvg#+1wvKufU -z3nv8onDC<~4k4HJAZ9Vn9EzLAz)O^L_P&dDgwWSPg*2ju#|t0qw3oZ)A%%+%QUQjP -zlF-n8P(tm$dI%-0|73R8uZ>$c#?CIjTYWRoPYH;wTFWv>jGO)mX9CoP@w^Z`|BlL# -z26RA&ckR3h%4 -zi8I=k)Jro12yvw3q2nj9>_&N}-7A1A#2mJs!%?4TZP539zldqIbl{z&Fqq8L*q%>C -zE-GbO&@fNlv6HA8G^YccQ)^f-7Y2pJSu#}2hIE=ooOKMBC|=z6-o^#^%Hc>_%Lo0FOQVmk -zBsK^M@E`N&LMYK_auX_lG -zwn0kApy0k44Vicf=hq#Gub%1SVb*WZ!}D~P4TkD)RqmV8QPX}-BKZgJ14=({P9V`vdNT_#&s -zz@~ll185WLVoq9pPKMjaixo;=N9DZQR#TKzM&3xb972X@iOi||itJAs3iA8CVc9~N -zmlBNk`%uuD{up6$o*r{xGR#7pwecg6w(y>E=$@0!HRo0B_WWbD-iRE`(-;th;UYGW -z(QMX~4QUgNFvD{IHvl=p_}8)C;OTeKTUBnWs)>*}^td4}CzLvUS?g-nS+E -zeP71OqiAfz(e2Zeh6ceM4Ko^9n`b25_PqV^kZQNsP?VhSJ -z%;qcZ#joOG)6c`t#~w6^&8`Ny$GRx7Z4bUwWxY6*^bD~fTB^o?NF6Cu;iBfv5_V6d -z*+V`&1*Ds29)mR$u7)uwgahMV)MLMo?g{~TIP#;y>|UUuRGfG%VOfFq8q=-bzR`EQ -z_ZUiBic%wG&t9p@`}ygTz!h5qaKJRjE0j`+qM%(#8Qqt5&QK+k9P>O^3*+#D3lskHFxP*v5DNE>l!bVe?|&TbQ+0Uuo?j8< -zGY|@+H;av%yOwJcR{ns7my@Q^6&{Q*W;n{B`^`TRku0$7BXNj4^%K0;#U&4S86vL9 -zAOjaHYS4b|SkD1X;j?gQuZUkY(NGx2O~dC^$LCFou4ac0mbA}(2ZlL9#!MG0laZMs -zVSd^*iSzlOBcR~0gc>IYrtq`GISQknWU{;9gpmE+eeGJl(g-Rf(@N*I8 -z3kTxuf_||6q4_~QXhHQ)pqN+E(_{4WM8q#e$MR*+L`#D0?+*FRp`;~PcWhYxn0{*P -zD6wG@x4O44!5$?FI49gFJ>8{T3YMEDtGQYZ(INc<%s-nUc#3a8gzJZhuqZSQTQ%%M -zvV1uF%m=C#!f=PY=TGzvL^7xZM3xQOwb`R7bNM+Py^nb0pYe_5{}+Vl6w*kr-JeAYGM%$6Qu2}E929MIY6AI0f*^%Not{V6GcE0l0 -z$P}VXme^xyCQuY42;wtN+$==t47kKSaOp4Oe^m)1iaMtAZbTwSdYU{}5d-5~K9iA% -zQSN|fOi2m&g9JgMfEwxI?c=wo*(B`e9Di4qa&twwoRWB8^LZ1TP9fvpW2DSUf`#h9 -z$agFfgUF%M6Yv!YfZBEi!sS#Ua$ -zLuE)HDo8YLjIh0|OwK9=IXvhIJkWVIsJ1&a*teIn2tf$bM;x1xAVw^Zm_cHMD*Hrk -z&3}bR$${r+WV^{hp@}eZXdz-G$Pqgv8ag0ssUXQ6gEi7MNvfuY20ksT%o(HNz62?P -zKw<_72-SCsBouppVv>Vk&m6fhB0-J>5=bC{1QJLffdmprAb|uDNZ=?3!2biBdNN#> -SDfV^%00008wLo!q*HRn`6f5rV?*HD)IX5{c -zxpy-=`|Zxo_svGBD$Agwkf4A-AaprdNp;|J21vifLD%hMrT$lZeEex|7Xe0mqFAZArC{!qp)zJmbab@utqA`6 -z61Z~|e!k$IbXNT?PvGuuzT7G514$8e!}lsR>%nURMm+~pde``@(!O=ISt0%B93;Ez -za-qRi4n0Q>zQ2#2^_y08QOl3jT*!Ir5@<8VrFx(6f9sP|H8ttjftN;wrX>jP4BcG1;MfU5x^L`zc09u!bDBt#+ll=7@ -zB;}A$BKgu}V?#qfHvm`~pt%wG2y{MOc%B!8I`p|pc -zO#?sq!Zd&j8UPmvY4RQnfo>!6{a}GFV!}g@qu<3Wu$07X(O`vikNW$~q!ngF23Ls2 -z53p8js<-B_Qd?xX6rtq43Mdz(jOg2QXx#Wng_9^1^^~KqFNq{Kvb@Ap9}bf&xFA-C -z5+#cQ`#v$A=kd0O=agATcleBaxXf_(dnqbQz|cL9R&&Ni1omTs+6~YApmk)MCghxj -z1}mq&IU>1nEiF=q=PI`%jQbyRd=hVI83Sm{E-4uTc#w;NNwEW)C(C`xvWzY_%`_MmO -zD&g-sEaE)}6(&g)y-N&rNy;5@+{M`}!{60Y8wMgF5;HmO#B~hG`W$;7xLG*yF((rq -zxP6I#r#o`B3FppK{v(q1!C+YLFSfySDcHyoW!}EfzuCB1B|C5+oP}dtocnwkcNy1EZ6#5JX4=ePl&cu~0tMnt&79+I4%PaK>VqFx;r!QdNmnxlEqdU-QR%Nmu{aWP -zJxwXvt5fFTCOVgB)Zq -z%H0U=9q7Y0lu&1kc4zYT3*lHA@XJfoK>3WFM&WWf2u6^+wCm8##D$x@Gkw+t^HoO( -z4pxDRqg;$5S=t^k22H5^V3V0Qfy%Ogl8I%LD$52=7)J>Ki9Ej1HyEi_ujELlz8$-+?cdD1Zxi02kW0 -zaY=caFq4~s^R?zxcc3Z0X|az}Aww<{P$>6rk+5Di5J7$kWor0{Q&>+DWSBH^Gf`SP -zT{4}IOFh-hB7xwBdewq%de)q6QvxorV(()2>@j8i!kj)=^hN -zl_N{$9xTHHA;V&Zx#tX&1pOO;v^NiOP#_UK@J;;lp+OOhOOO2mlMdxM;Qv-mWG+^vzox|8t`w| -z=gPlM3)y6G*hfV1WwuMe>bO-vP9g`h5BqgO9x{ROBD;aPl>XDmvt(3PUxt|4RFRpK -z5OEtRz{(Oa_W_!Z4XHf#h;Z-~71XM7wlF*L!-#h_Uy2tGuy-rAZ)4{qE~feNkp}qf -zgvBtLkFPI~I7%C=OHZfPZz$j>L9)rb;l -z@J^dxncy52;wmHg=wC3|Xn6jPYCR7xc}~D0wNjoYxmoRh_zh=6@8coM1UQIa_z*1)cZPw4v40qoZQp-uy#DLv=oP -zX9b3vzFA2r8}|_AO8W1(OMG__0{1AUD&Z%&7-(>s+Z-X6Sv}G5QguIbZ3mYa--?09 -z;wNw?n=yAag4%m#w$$-YZ{(ZJUcwHfzu&!gykNjG)e}!=q8xy2_KS=ULsQwv45NK! -zVqqD8#S{vRjg4(Q6HM_F&tihNIQns<%DVjE$cv33ET>Dvc^#{z&#u&&9RgXO?ZLuebczKv#;! -zCS|2lIa37Bp#3RWj0$V3=I2>o40{(J^LD|EUH?!2;Z&HS*>7*V%{v1)wHaUP85mcX -z%q!K}Ntr*IzJD%++btJ;VQO*OjJL1t{GvR3cy@OC-~pe^bV?N`z0QKCr?Tom)4u%A -z3mi2k&eIgh0^rGI#Di+&3lrsy-r+}zwBkDQtswtPbkj!Y^l`{f!# -zLseC0M;DiifDa!({-G4{W$Wxsgv*(NX%HMyXhArVwY105dUHg?+=@6Sy8n@slS76x -zU7%PI8ToKm#qahfR;7kn#|t@9y(0EkooWBDqA1(mpO)>BBz))giBi8xVHlj#dR9U8 -zRo%`iBdlj8%_tRn^qa%T>{nsLLwTNld&WHLyfbPzv2W62m6q=Nsdxnk -z#{P==5!Lidx3bcr_qlUl%BX!xjywA?jv>FU^mJDa0zQT9Kw8RRHq>7B -zb~DXw0(oqBrOQunsm2ghWV2i1VmN{F?)U;0%*j{FEUxazAJ3)KSWomuhklkDi?5h*MTLDS5ma_Nk1sNZYzZ#$maGRyiXBzjG@(G__fuyBl(^A>s&{jF+J%5| -zv#7nD1XK806#_U_4#N2ANAxznk%;U$Y$z#{K*O07mADqx6LjACqwP<`HFV#C6Q*wx -z8JVP_qGF}V7B?^8)f*2F5AON7v$L~Kr?2}oPai_kG!_6MI(U`LS~+Mo*CSyrw>pPE -zllqxy -z^&rnDn4XA@AUY7~`1lwTCrm8KlVRqX&!kZFH&;i9@=R}UDxNSh*)Iq2U+#9}@ag1t -z%KUOEw0DXT)>hQoLTprY^z=BC=8NAyi3pZWT7A`?;rI<3%65Nqb93%pJ=!+dNtB>W -z7f3O-e-S7ZBgBntcyt~wOG_p$AU2zlGH8=%TEm+z8kLYReEMTkIo#2YiA=iKWrH); -zS%uT3xAyyY=!U)0Evpgx{{38MPR2nN<3913M<0O#YCO=TSt^4IzV3^D%2zC>t_OO} -z_h~AVOk+IIi$Ov;-g93a4j@WaekCC#HFm2_Vu9s)8-GbYtr{LgrxnSIN^PW9)!jYX -z?%-yssA~&R3F)C)wj5i|@!atCx?Qy%P1QEGSZm;iUNai`-F(8a%y+_a>CMzx$XEKx -z>sW|JbN36s+Y{4SZsrspH%UH=+Q6J`c&_-JLGL&5|$XUA1vFOC+rgoc&xT{dFT&pMaEBKwyD;plX0>2nla;jTlQ{!fn2M=Ak*=K*g% -zBm0-$ly1~}CT-5gv){jex9)7&b8u!a+vYHXU>=NF2>g3+_rN{(LUMGwRWKk49sS$v -zazyX8zZ1hwZ|U*5{fK@i@hRl*U%Q2cg+!iIfb)6W%S5F{91qinEZE%~4Gl>rBw9S< -zMP5$exl1jESyt}d~jo?hf`z^32b!}UGtJH+w9(0UrI#~Ei*ii&6z(AVE?(}k_A -zE9Z@mj7HF-ch46I0ipe3gapRj{=zk_J1E^b_JwdrhKi4ytBuwP)m>e$@9v`A{1N{h -zwUN6H=_W+h(a?rGaQ%%LP5C4)XiZ*`1uUwgqWvk`LyDD!Ps#Q5oI($KDJ%8n5kBi- -zghsLx`~mf<>WT)6-cJBbp|htk1NfkZ@e#B4@l?UH7!MDMpO?1NETGk_Eg{z!N3!D< -zWg8gtgS%b(0Bg7dw9u35xq)1vNdnM8iu7Eje*u?#sZ~%^q*HDaZC?5z4ZzhSA%ndS -z4&$M&7(|(9nWY%QShCnuN0 -z`n9&UeypypUgx;R+x;XM#8uDM{p`9~j<49)^dotHJVO*A@HL&g7F={FP#trj@{dzm -zeQUiqRWJ&pkKkA1O-|vOf8O1UQ$$0lIExffio|}F@ROV#MXcPH$ -z?$$kxAF@B#KT}u;R@SVyIO>1sw1!i?C(_013w9@?8$bKaLQi34zC$g*^}F&(%NEO6 -zQzD-^6}HQMnGJ{h$J*)HjSxjblWegsW&rLC8Ov_r_20jLjUS$Ptnm|p9fK%r0j+4; -z57^mjL&lISh8>DC;eB$B69$h4XxE3qU4T&zUpDeV@4g>or%D-x@qhie>6mqD959ck74(h?S0BA0}YQ18d?hr6}%}y{%ZNJ^-(?=Op~; -z#2-UNh)jH9>RXmvPJ(Y!8(uhyW|sFpyvv)AaNeljHj^Fx+RC -z!`@c->W1C^FUKHmG2w_atkdsMnzY+l!CV8havQ8-Gu)<8t{#V*2Pwp4h?ayXsi5Z> -zo!guta>TA~iv#iJpQkN>#)QF%As@2WgU&V_Y^qm#E*O}M_ijJfFWq}ts)-l4>D)kCqJJ@MG2$69ph0jzwI8ry1u8D@CyinC$oT?7S*Z}Eg -zYs}PWLqr4u@)w}#!{cMx;KxO6W2H6~3k$laJjAt+C{0mmCRnfs=OJYbh}HMh&e`#> -zj;jrpjqKCh41OK{FOS`@_sPP$iCm46G^EMNk8(l-1f>!gEV+4vMVRZ#8infUenP+k -zL^tBOHF^=)k&U-Tw{gfijqQ&^ -z-RHHII5yp}2|o8pTsf6x7$teW9Em!~iy2DN?D@|U)g%I6VG%JBO$|~;c~1Q^3|x`1 -z6HRbq1#~Ke)wWpALcc&@P;m+*sGavR0{aOx3=IwUE3YPWAwV45pzD$~02inxi7(6X -z$zk683M=_r#M*+6fQ)&FK0y|lm7JLwS)K=t&ZJk!U_-y%_o@fhr{s37MUEQOF*M)3 -zB$;4>Zx;Xk*(hwFjb>1iJ1f*D#nyWL{=>{2|9*^vCNN!%bF8Oe<`xz#s;jFz?;I}4M3lL;!fy_;J-E96Of+;sG%K=fZdR)99pJ}fM( -zq%(s8UrsEL{NrdF`!#RY+VjFyPpE_vtqPMM!MQ+QnE)+_g9Z^{4^;k&Sa^=w*yuxB_*Z!U%!3{_9Qr)Jfz4IeS#io4oj_Kqhq`HCUub|Ke!v$1-$v=kc+O#rlCej?%dhY -zxxKUTsFPG1nfoFp3%7@gh9S?vM0N27#*fpJyaX;Vy{!pt*}!9_mX9uC#J5RyjknW2Dm3dCvZYU -zSW?0kvI9!o2un}*%`AYhr^CQT1aZF=-Nt^atn@Kt%b2!hT(pK!|MclbBv3-<+6{>_ -z8toMfWc9rpOk(8|KW>Z-k>Fr(xc_+q9ocf`8!_n}XYUrW?Ax|*_|=5m*4F0V+46wJ -z1IGS^Z5t=0Zj86J2MfJc -zUq#WKCfhoB<;P2&&`*_G4^_0uqDR20m!>T8ay_rxSzA&9_v5##g6tzXTkx+KRfz32 -z9vvpp?+YxHTxDthCBu7)&Q052y4s9*$M4_2w-OdPyK?F-EBoUuSsIk@@(!gA*A_!0 -z2eu1y;-Q$Ut(M>8FCOtw?vZR-%*ly^x)<95vK@P0tJoZws@+M*NGhg_NU`!}DZnWBHQz%*@6))$BWN;EM0xAF+B4Mph#S??J?K+&viwPmes*n^HGDL9iBf -zCk|mDu46wwughN!isu&G((DO>Ws`(VLY?^#w=RONxUgFGby--Y=5NJ|(>qXOS`;lZhmXyMEyBdVM@jJh71E-})~`?t4w8^Kwy) -z<+KACjs!F^TS-;FT24_iWF+=l(nR}j7U#;Vd -z)IT3=b&}A}1PUKFa6DKfgHkJci!~7u?a%k9h7Rri^{y`|;;xNDoQbV}+oJ=LdApL}|77o@C= -z;~aed)XpbrMtt1x3gHPWxbliQH4nKBCew{9 -z*-_PTyn~`1VrwKcc4ZrhI^!MsZ{D0O0%O2!SHHi^Dfyr9*x*DGFKwc()b;q6nM*M7 -zvA$x_?$BMJJHN5HIn9Ps{_7-sn79~BZegaa5V;s(BA<5BnU?^AeJHXtd)cIj_UCjA -zW|N@MjV~vrJz{sE0Dzv}tXxUDQAXm)1(kX7C_ZVFX%!TlZ850i(P1A0BxaJu)#LcH -zoxMFRzxoxw$bM=B6gpuMD#vcsa^00?%=D+T9-dQqV*=zD|)W!3BLun2&^n)~$ -z2_^{i9~sGXOAsF_S=k&4mWJ@`mD+G%MiPTlhuomboeFNwHb(< -zVpVR!mwf;JmpO3JL|B%L-!;@7TG}+`HZA;-{VIlQGY|T=f|!9!S=!c?sq5|KeEQ*~ -zm!1xeZcJPbSsfjU9e>K|=Ni<+YgrIG!|5@|Z>4bjx+`1j^O-{QK8XARf -zUG$nLRiTEtt;)9F30rvw>nj)@vCF{$d7>o2n>}~Y2^^C79l@s`uXRZOcuy>^%2@t- -zRGv={pKlDXFUgvG_^DWGR==il1rIzn{$p4r(FVOQxZi!_*Ksfl2hR{Aj>01RbFAM= -zpr0wzMwlOwlkt4|JLK)$>VL+{4nv>^`yMa)T;(9f*B(9;{T+)_=M4dN>M&&hS-#(G -z)-sW(WxVkHR)`x#g)25Lu7qnN;~Q-bvKDZ=;^fyLy@okDpvt&ZU{!U)WVtmnp -zAN-CzM{jPFWep9NAKDDq@=kynkGi_GQ@Z2y_Wn)xc_q3-&+9`qdGy_{PF-2c^$)%x -zd0sonEJhtG*2|P*Q-f_3`Akk96HzBz2 -z!5tnJaCcA2hGQrSw*{F)epvfYX?7toP=O0dN -zizY2w`>O@4Vqff!dBhQ^><#TjMP}loM9ProiD-Og@$V=*zQ|Avg0D!+96lr^u(1fl -z3J52PHoJYDdvdiIW?q?JIC*r?88VruLx#bp0lys39v$(c6uC*j}2IFFh -zViOX|K+DH18cd9%Rgjs$*sXuoW<>p^Fv-7CV|zpgTUnj812pyyX-nhA4TZ^UyYY9; -z?}BOarTT1q;0xSTjV_DPWE11?Y2+wSA*ybzebDoy8JwhznKa6SvYxE$WswX7Z6pG$ -zsA2GgHFFL3^zA@XTYK{a+6$Q8di%@1-|q9U15y+~R-L7Kwx8*xr(FP{g*JDPa`e((jSl#~?Rx=3ne(nLfeP9k0grubJK -zU4euzZqt~$Cl%k^{-!e6YQZi|D3#+MUS}VsYZ)0S>y@)kyqRI?A_esvAu-{`1Uq@! -zC+b`wnMK&<_mitl+k@e*$*{&S>vayX*>D>Q5sw2FZ?l(8ff%(8lo<^mBMrwQXOXe+ -z*7sZdWzBTIwZO$y^F)qZL1XbOMY<@M_a56y{({Vg@YN<_y}toq41V%~w=+4ZQvg)X -zVw~l$z-sId^nKU%dlk7W(mG}eS&KV2BdYqNJnX-p=YrG&&`_m0fzA_|iKD${5?oL* -zdS$heR@%Q+(3!!T&k;tIN|v2j=UI))rgkvyC7MTTrKP3g>Fma@_R0`GE5(tL%sS$7 -zG41ag%(Y(xZ5cjlk=R~(3XC+$25r*Fo=G5OhGgR}i!nDoG?^sult?Eo*x$x6CH-3L@LtZ0dfq!Bbbw-S}RwlN%lpH8c=4l2qH -z1wRszHSPh~=esnWvXD8B{D4<}?}6cA+@Ob1760Is6`g!zl@WL(L&={LA}SxAt0>Tw -z%b7i^&yNKM;(vGcNwuxAK{g|S3Y1&pH_6U1G -z3M4zx5FU=O;=l_?VzQ-~bx~xN1axPgYI0am3d25BjYmfSTX7Q}==Vcryl6@Se0(Jv -zxKW_o%H`jdnC7QXlkFbCsACHN1Dx=0gf<~@PW-&<=`1Hd)@#ypH7%OpalDj-P=ts+3^~yWs~TV}BD20HjkW6zc1L -z0#HzMkn3JV%7N-18_@tgE82*YnmEzxirriDSx#_|<|q1vL{k}7>^mRzO(ueTSN2~H -zG}kxp)Qn!&)><3|e>62+GXSpQKcemfqU!&BHZ5Ca;DT<63bBM&uV1BDS?MM$M;x8w>gShAPMxJM^BbMZn}Unm{OC9^4x3%% -zlmX8!km-u$N4fQXQ>jRe`7)3+RFGjhz -z18zf(Fo2<>YV^7LJO^UTZ2Ivd#mpN}o?7pBV&q=f%ID>haV7M8R3jsF*@a%iwIy>| -zsZ!-y{!%&j7`B?W8TcF4NH-RHH1xZ{;7BsA<#APu!;cND)te)FhoXz$BIU}2&^7WP -zT}TX>ZO58$VNPuh6JV7~s(W$vAj`^%AtUamex3YdVl3~4+pqk?G)qUibNMrj0*M25 -zY>5Ac|Dnv6xBQmV#$3JA?&HTN(lYl~J}@$l{*TY^kORrCB)3dDO}^^v!dcLf^CHty -zanjllIQeSLmpuG+h&ae`r*v!C*0A&W^a&q>93?BAXzG7n -z2*3TGPIcN`-_hY9&oaiv#fiv~>}7`T`4=pInEqWX*3e8+yPm^9h-tr&ts55$l+388 -zW)~F}2JH!}VLbQ>?6~H@&k`MnSsTeVj0TRVP4jGbP*!!CwM6`Z11c)yI2w$+R0zxo -zT|obYS1&&`{>>Z9(jnVU&=yI*%PGe*f78ie*_9oap?sd7fx7{r^WT>=XHF -zl`f{=UJEn2?tRw`Fem?eRE6#*nOes(ebRcmaK3~a3{a3EyE1zXSF0p7I_iDJ&%;3V -zU;AS}e?*mH#Yh2P9E3QBigIqu2iXf=@t)2+I~f*_E^JtEP1@IR{CBfTj%T}E3e#n% -zUa{@vU?D$l4DEANwkkK@ruP4ta)E*e^KLGg%$PizyPmHvKNMWtuJQ6sPXY=(1m#>W -z7V?9E!Vj}>a|KfQx5ESpH+q6$@gAp-P#~lbz`aj1_?xinN>3o8b2-Z3w>UZ3QZ}W0 -zWg-!>p>AADDcU^4;0*L4UFgB0QLlXd^y1E&4>txV!T|!`RwjZGl`;-4ZgFf>luHIy -zZ8d8Rh{I3r!g-ht6mAZxMB6VxRqnA0UY`h|mJZy2 -z17BazT$jMKFL3J6Ue_HL1^)4s%$Jj~Qx~1HG#tS@kwL(KP_ZI3dWz0SH(sqj#-*TNGsIWqPj>cj?!GyWvfdEiNOu4$>MIqL=F&Cc0{g*~L5 -zA1wt)=_zMFUkCT5$l!G{1-Y9QtGQ#qm5E(3fYPms_EP*sSVI)bfXN|uNO`BqVuCvd -zv)z8IGRgtM1<_trndVhQ^xA)wn~*W~#d*X@E=W)jcQWI8+?kdzHe;DZ`%+JE%gE}m -z6H=FO8rJxM{N90S=Gi!Mel)TyanxPa;E}C?hJl@e9UWad->;S|v;axgFjrY$z3(rV{MiJ}3M)t;Q?P5wZy0e3G{dcDO7n}3slDXLMrB$;#*W@Qv)D$=?Xs$F(8eTcyGIQ~IWgD%Gn&E>F9y#o>cR-7spE;Rur<_E~Pu)e0I -z#&y1|@8D~8c55<|KMf;&x;hg!A%VOZ38_+uk`jH4#=b9M&xcpxV-7cMN{jXVRnKSe -zlKJJ%=VBV{$DNeI1QkiA;DfdVT?$;O#22z6v6bTK9)fjrfIh!Hq__l~KzuNqT{&kA -zKs@YV6^1ZLGjTgR%(=NHS-DvWnnP)NM#qbHINqmQdCE5??co$3nuikqgm=s7*#Kd*+j_weKrZjMeLeHEoiJm>zuDRU` -zh~ggr^knneWU!Nn}AQt=0Id6Hk; -z4bJqse|V$H`stT?NS0yreYvaZ9YF!fw+N}{3#yXRU!C7?exl35BDC%+!jDMGT^DN# -zN9FGd#5t#;$h}5UgQ?q-Gr15>C6=nLUszle9<+_!!oi_m@_L^-R>_Qty7_g|C%m|5 -z-7^5X5V_ARi?h9_LW%2vByD3X_IvUktqBv{%SYXO1&;e&O#Ll_cfC`Wv1u+l_#RI< -zQ5Kly0;P`%TXaQN(heOg~>V&L{d+ZDA%eq-UKo#1)$rkjSm=nzAE2r -z5--RyKhxfXoGVU3^ab{5XGlyL1+26foG)4HZvN -zG@&I3h0fnK5lIjcrg*XxPy1(gK3_TN`&VYnxP;C|j$~0rT$0f|*#=OzM^NbE-1T5D -z%Csnt)n!sx3N#b(8G&+G3W~Q_B#StA6jZZ=p#wuu`DrAMXm{T@#S;ku4Dme@{Njmk -zCtrh3z6O>o)~o{&Htx+6kn*)$NNBH-biu^aYtWUq -z(G>4rCEKr#tO>!x8A@%W@6g)Xs%2Hq!y#Mbb@9R2@GDWi&!{jhZvzQ1D9nMuPoOS+ -z+cj{9nx5X{jJOIavbFf)Kz5Jnbe5Bu#(XE-z$j&iaP%c9W59OoT0~|N#D*(N2kz={ -zs(|)nH!_+_g1)#ZH2xk>ZTG#6WN#qa3BxZM{NWxq`*#$H255k6Ky?hw*hSA6`c_fl -zT@Ua%E5Ez3;~`kQFmrC#$Nlvc_Uy3#yzhd-6UYuuIwgIBZZC-`dwOBJbfurL(FfhH -z{YkjE+9OrOveY`{t{sGw&51YO1@{iO4)Ki=!Z5#q=m_Hi)_j0`>?;t2j);vv%BUif -z;wpTZdLQLsGvZ()DCdxYudn^Pt;BZ}Rin$4F8h{R`HxT2z`uc&aMXIQOvwgA5%{&) -zFW52MiN!$!EXgx}Px~e1!EMp;#&kY65oDho95j~!qD%YJr`+aK4jCJ4UJ^;q>w@Lf -zvDfg|M`S^@DGxu+7aR3Cx#;%?advj&1~L-m -zJqCP9&TW3migV*`Z$#)Qa>3>Jf)g9D6Ki28P@iX(uso)hic8Dp1F< -zeF;(n8Po8A*~^T{De(J)Z2nqLl@Vv3yoSlGwq0aeOg4ymI(KIkTeur-=J-yp9z?qe)it6gq-wl@I -z0D-_I{|T<5kwD9uH3yf1GWXp5*8eOgJf*q0IRoK|+r{}Fug&0WpNDKMTC@(Xc)9K8 -zy`lByMn!1fnY)1KYP(0Je1)c~WilUuh<&Q8^OE?L9Q^xK*Y@M$`6D6TDCZ^@l8{|} -zxmmNw)mng$hYBii+&ZqedxWT0dnV#LG4zC%+kzcK+-??vEHT>Q-T8zu|s_1IbA#OV)^+1pg1OmmZn` - diff --git a/patches/server/0004-Fix-decompile-errors.patch b/patches/server/0004-Fix-decompile-errors.patch new file mode 100644 index 000000000..8f2cc1682 --- /dev/null +++ b/patches/server/0004-Fix-decompile-errors.patch @@ -0,0 +1,58 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: BillyGalbreath +Date: Sun, 12 Jun 2022 06:20:21 -0500 +Subject: [PATCH] Fix decompile errors + + +diff --git a/src/main/java/net/minecraft/world/entity/decoration/Painting.java b/src/main/java/net/minecraft/world/entity/decoration/Painting.java +index 0c5caad2a5bfc14450cf8d37f988ee176e8d1450..05a0a890a719a957d9aea736d6c0e85bae9e4eec 100644 +--- a/src/main/java/net/minecraft/world/entity/decoration/Painting.java ++++ b/src/main/java/net/minecraft/world/entity/decoration/Painting.java +@@ -124,7 +124,7 @@ public class Painting extends HangingEntity implements VariantHolder { + return entry; +- }).orElseGet(Painting::getDefaultVariant); ++ }).orElseGet(() -> (Holder.Reference) getDefaultVariant()); // Purpur - decompile error + this.setVariant(holder); + this.direction = Direction.from2DDataValue(nbt.getByte("facing")); + super.readAdditionalSaveData(nbt); +diff --git a/src/main/java/net/minecraft/world/entity/monster/Zoglin.java b/src/main/java/net/minecraft/world/entity/monster/Zoglin.java +index 5956a7759964f5e4939f062e93714fba64f53141..0ca82175ec91ca8b3418c0931682c972666c47f8 100644 +--- a/src/main/java/net/minecraft/world/entity/monster/Zoglin.java ++++ b/src/main/java/net/minecraft/world/entity/monster/Zoglin.java +@@ -182,7 +182,7 @@ public class Zoglin extends Monster implements Enemy, HoglinBase { + + @Override + public Brain getBrain() { +- return super.getBrain(); ++ return (Brain) super.getBrain(); // Purpur - decompile error + } + + protected void updateActivity() { +diff --git a/src/main/java/net/minecraft/world/entity/monster/piglin/PiglinBrute.java b/src/main/java/net/minecraft/world/entity/monster/piglin/PiglinBrute.java +index ac75c54e897565e340b66823caeed92ba1d1641a..769e4fbaac01a4fe3a45bd9cab5c63b61fc69f53 100644 +--- a/src/main/java/net/minecraft/world/entity/monster/piglin/PiglinBrute.java ++++ b/src/main/java/net/minecraft/world/entity/monster/piglin/PiglinBrute.java +@@ -70,7 +70,7 @@ public class PiglinBrute extends AbstractPiglin { + + @Override + public Brain getBrain() { +- return super.getBrain(); ++ return (Brain) super.getBrain(); // Purpur - decompile error + } + + @Override +diff --git a/src/main/java/net/minecraft/world/level/block/Blocks.java b/src/main/java/net/minecraft/world/level/block/Blocks.java +index 42f46d338886e2892ee4219d19be4dc97f61616f..fdd3aa81644087bff33a47c5f98e14ca0452f3ef 100644 +--- a/src/main/java/net/minecraft/world/level/block/Blocks.java ++++ b/src/main/java/net/minecraft/world/level/block/Blocks.java +@@ -1127,7 +1127,7 @@ public class Blocks { + } + + private static Boolean ocelotOrParrot(BlockState state, BlockGetter world, BlockPos pos, EntityType type) { +- return (boolean)type == EntityType.OCELOT || type == EntityType.PARROT; ++ return type == EntityType.OCELOT || type == EntityType.PARROT; // Purpur - decompile error + } + + private static BedBlock bed(DyeColor color) { diff --git a/patches/server/0007-Component-related-conveniences.patch b/patches/server/0005-Component-related-conveniences.patch similarity index 88% rename from patches/server/0007-Component-related-conveniences.patch rename to patches/server/0005-Component-related-conveniences.patch index d65eb2d62..33236834c 100644 --- a/patches/server/0007-Component-related-conveniences.patch +++ b/patches/server/0005-Component-related-conveniences.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Component related conveniences diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index 23ef875e9030480ec195572a56248b71d8d4f5cc..74bb1b8f1f7d838bdacdcd127a7ecf8738c02b0f 100644 +index 0e21e7faf2036f12b64b9237a89ef8e75ebf548d..740eff44b2895f83099beb4bc0e705f4252edc12 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java -@@ -1718,6 +1718,26 @@ public class ServerPlayer extends Player { +@@ -1741,6 +1741,26 @@ public class ServerPlayer extends Player { this.lastSentExp = -1; // CraftBukkit - Added to reset } @@ -36,10 +36,10 @@ index 23ef875e9030480ec195572a56248b71d8d4f5cc..74bb1b8f1f7d838bdacdcd127a7ecf87 public void displayClientMessage(Component message, boolean overlay) { this.sendSystemMessage(message, overlay); diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index 3be9352ae9b0b84acf07064b45562ceffd30391b..550e53665ac3a8d1723e432f0cf0b4adbd03270f 100644 +index b348d33726b2b14ea2d12ce3430df2c0b94295f4..5f6789783659b3adbdda15705c89a032686f33d5 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java -@@ -1074,6 +1074,20 @@ public abstract class PlayerList { +@@ -1084,6 +1084,20 @@ public abstract class PlayerList { } // CraftBukkit end @@ -61,10 +61,10 @@ index 3be9352ae9b0b84acf07064b45562ceffd30391b..550e53665ac3a8d1723e432f0cf0b4ad Iterator iterator = this.players.iterator(); diff --git a/src/main/java/net/minecraft/world/damagesource/DamageSource.java b/src/main/java/net/minecraft/world/damagesource/DamageSource.java -index 67bce77093dcc126098731047447da2031e3388d..c4088446d30c3b25cf196f51fd394cd056be0495 100644 +index 8795c94e6b6474addddbb0b337a962e8fac46b2b..f2ef4d93e070167d70f597e8893bf29b53433a28 100644 --- a/src/main/java/net/minecraft/world/damagesource/DamageSource.java +++ b/src/main/java/net/minecraft/world/damagesource/DamageSource.java -@@ -247,6 +247,15 @@ public class DamageSource { +@@ -256,6 +256,15 @@ public class DamageSource { return entityliving1 != null ? Component.translatable(s1, entity.getDisplayName(), entityliving1.getDisplayName()) : Component.translatable(s, entity.getDisplayName()); } @@ -81,10 +81,10 @@ index 67bce77093dcc126098731047447da2031e3388d..c4088446d30c3b25cf196f51fd394cd0 return this.isFireSource; } diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 608156f0d8f32d768c424a131c9f8b48fc7e5410..395d1109ac367c23b490f7d52b4bdab7cac7f92e 100644 +index 7f94da8059147760cbdc2476d0e8beda4a105f40..efce81deda7403d056628ab1a83f909af548b424 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -3802,6 +3802,20 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -3812,6 +3812,20 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { return SlotAccess.NULL; } diff --git a/patches/server/0006-Fix-decompile-errors.patch b/patches/server/0006-Fix-decompile-errors.patch deleted file mode 100644 index 63ce5c0f0..000000000 --- a/patches/server/0006-Fix-decompile-errors.patch +++ /dev/null @@ -1,59 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: BillyGalbreath -Date: Sun, 12 Jun 2022 06:20:21 -0500 -Subject: [PATCH] Fix decompile errors - - -diff --git a/src/main/java/net/minecraft/world/entity/monster/Zoglin.java b/src/main/java/net/minecraft/world/entity/monster/Zoglin.java -index 056e4c2f7f632dadc0015710c032a0b718d46ff9..1fb11985dcfd07ded1f7cadf3fdba7d23ca4f87b 100644 ---- a/src/main/java/net/minecraft/world/entity/monster/Zoglin.java -+++ b/src/main/java/net/minecraft/world/entity/monster/Zoglin.java -@@ -90,11 +90,11 @@ public class Zoglin extends Monster implements Enemy, HoglinBase { - } - - private static void initIdleActivity(Brain brain) { -- brain.addActivity(Activity.IDLE, 10, ImmutableList.of(new StartAttacking<>(Zoglin::findNearestValidAttackTarget), new RunSometimes(new SetEntityLookTarget(8.0F), UniformInt.of(30, 60)), new RunOne(ImmutableList.of(Pair.of(new RandomStroll(0.4F), 2), Pair.of(new SetWalkTargetFromLookTarget(0.4F, 3), 2), Pair.of(new DoNothing(30, 60), 1))))); -+ brain.addActivity(Activity.IDLE, 10, ImmutableList.of(new StartAttacking<>(Zoglin::findNearestValidAttackTarget), new RunSometimes<>(new SetEntityLookTarget(8.0F), UniformInt.of(30, 60)), new RunOne<>(ImmutableList.of(Pair.of(new RandomStroll(0.4F), 2), Pair.of(new SetWalkTargetFromLookTarget(0.4F, 3), 2), Pair.of(new DoNothing(30, 60), 1))))); // Purpur - decompile error - } - - private static void initFightActivity(Brain brain) { -- brain.addActivityAndRemoveMemoryWhenStopped(Activity.FIGHT, 10, ImmutableList.of(new SetWalkTargetFromAttackTargetIfTargetOutOfReach(1.0F), new RunIf<>(Zoglin::isAdult, new MeleeAttack(40)), new RunIf<>(Zoglin::isBaby, new MeleeAttack(15)), new StopAttackingIfTargetInvalid()), MemoryModuleType.ATTACK_TARGET); -+ brain.addActivityAndRemoveMemoryWhenStopped(Activity.FIGHT, 10, ImmutableList.of(new SetWalkTargetFromAttackTargetIfTargetOutOfReach(1.0F), new RunIf<>(Zoglin::isAdult, new MeleeAttack(40)), new RunIf<>(Zoglin::isBaby, new MeleeAttack(15)), new StopAttackingIfTargetInvalid<>()), MemoryModuleType.ATTACK_TARGET); // Purpur - decompile error - } - - private Optional findNearestValidAttackTarget() { -@@ -183,7 +183,7 @@ public class Zoglin extends Monster implements Enemy, HoglinBase { - - @Override - public Brain getBrain() { -- return super.getBrain(); -+ return (Brain) super.getBrain(); // Purpur - decompile error - } - - protected void updateActivity() { -diff --git a/src/main/java/net/minecraft/world/entity/monster/piglin/PiglinBrute.java b/src/main/java/net/minecraft/world/entity/monster/piglin/PiglinBrute.java -index ac75c54e897565e340b66823caeed92ba1d1641a..769e4fbaac01a4fe3a45bd9cab5c63b61fc69f53 100644 ---- a/src/main/java/net/minecraft/world/entity/monster/piglin/PiglinBrute.java -+++ b/src/main/java/net/minecraft/world/entity/monster/piglin/PiglinBrute.java -@@ -70,7 +70,7 @@ public class PiglinBrute extends AbstractPiglin { - - @Override - public Brain getBrain() { -- return super.getBrain(); -+ return (Brain) super.getBrain(); // Purpur - decompile error - } - - @Override -diff --git a/src/main/java/net/minecraft/world/level/block/Blocks.java b/src/main/java/net/minecraft/world/level/block/Blocks.java -index 5dc3605fed7fb2ff8cc6c965d1bf99c462e0b14a..bcc1ce196c1dbf60cf6ae73d95766dc41ed22012 100644 ---- a/src/main/java/net/minecraft/world/level/block/Blocks.java -+++ b/src/main/java/net/minecraft/world/level/block/Blocks.java -@@ -1091,7 +1091,7 @@ public class Blocks { - } - - private static Boolean ocelotOrParrot(BlockState state, BlockGetter world, BlockPos pos, EntityType type) { -- return (boolean)type == EntityType.OCELOT || type == EntityType.PARROT; -+ return type == EntityType.OCELOT || type == EntityType.PARROT; // Purpur - decompile error - } - - private static BedBlock bed(DyeColor color) { diff --git a/patches/server/0008-Ridables.patch b/patches/server/0006-Ridables.patch similarity index 92% rename from patches/server/0008-Ridables.patch rename to patches/server/0006-Ridables.patch index e38aabe44..daac5f7c6 100644 --- a/patches/server/0008-Ridables.patch +++ b/patches/server/0006-Ridables.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Ridables diff --git a/src/main/java/net/minecraft/core/BlockPos.java b/src/main/java/net/minecraft/core/BlockPos.java -index 153451ecd5b3c8e8ecb2d5ec91ccd582d4300899..56536c39bccfe097f8227c74a0d1679943826610 100644 +index b1d12c78edf21cc29a9f9ca54e7957ddc8875ffb..a3e398d3bcc88f9c0feaa6ca8dc646f3c522c0a9 100644 --- a/src/main/java/net/minecraft/core/BlockPos.java +++ b/src/main/java/net/minecraft/core/BlockPos.java @@ -41,6 +41,12 @@ public class BlockPos extends Vec3i { @@ -22,10 +22,10 @@ index 153451ecd5b3c8e8ecb2d5ec91ccd582d4300899..56536c39bccfe097f8227c74a0d16799 super(x, y, z); } diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 10869c6c0697917c412f80dfdc9b211fec0b5b06..f2d589f1ad9b507fca816320472caa455a4c6f89 100644 +index b5368fc08cbe587f03a5f04a9e25850ca818cf2c..cb2d56bc77132883876e367d332fef081bb32c72 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1517,6 +1517,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0; // Paper worldserver.hasEntityMoveEvent = io.papermc.paper.event.entity.EntityMoveEvent.getHandlerList().getRegisteredListeners().length > 0; // Paper @@ -34,10 +34,10 @@ index 10869c6c0697917c412f80dfdc9b211fec0b5b06..f2d589f1ad9b507fca816320472caa45 this.profiler.push(() -> { diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index bdc5dc90dc036a5480dfd776d5e6bf5520d1cc73..503bf34f3c9256ed6f0f31f5396d0baeb9ffea59 100644 +index f3a19d00f78e19aa98c57461efb90d79f656a992..bc1a8e2bb56e25e49bdbf5a80c5d14ed87605f2c 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java -@@ -220,6 +220,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -223,6 +223,7 @@ public class ServerLevel extends Level implements WorldGenLevel { public boolean hasPhysicsEvent = true; // Paper public boolean hasEntityMoveEvent = false; // Paper private final alternate.current.wire.WireHandler wireHandler = new alternate.current.wire.WireHandler(this); // Paper - optimize redstone (Alternate Current) @@ -46,10 +46,10 @@ index bdc5dc90dc036a5480dfd776d5e6bf5520d1cc73..503bf34f3c9256ed6f0f31f5396d0bae final Throwable thr = new Throwable(entity + " Added to world at " + new java.util.Date()); io.papermc.paper.util.StacktraceDeobfuscator.INSTANCE.deobfuscateThrowable(thr); diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index 74bb1b8f1f7d838bdacdcd127a7ecf8738c02b0f..61b9dcda16ee454b102d8a76f3ea6986de7325c0 100644 +index 740eff44b2895f83099beb4bc0e705f4252edc12..9918cc39247037c0a8379071167c5560dce9bc8d 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java -@@ -681,6 +681,15 @@ public class ServerPlayer extends Player { +@@ -703,6 +703,15 @@ public class ServerPlayer extends Player { this.trackStartFallingPosition(); this.trackEnteredOrExitedLavaOnVehicle(); this.advancements.flushDirty(this); @@ -66,20 +66,28 @@ index 74bb1b8f1f7d838bdacdcd127a7ecf8738c02b0f..61b9dcda16ee454b102d8a76f3ea6986 public void doTick() { diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 15075c8705929de83adaf0f7afe7a7cfd40150ae..6ec78e1efff939755b163ab88405e17ba646e706 100644 +index d99baac236d7d4be09f351943971a9f60914be31..503323974eb4ee076636ef495d7c475d1ade00cd 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -2915,6 +2915,8 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -720,7 +720,6 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic + to.setY(packet.getY()); + to.setZ(packet.getZ()); - ServerGamePacketListenerImpl.this.cserver.getPluginManager().callEvent(event); +- + // If the packet contains look information then we update the To location with the correct Yaw & Pitch. + to.setYaw(packet.getYRot()); + to.setPitch(packet.getXRot()); +@@ -2772,6 +2771,8 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic -+ player.processClick(enumhand); // Purpur + ServerGamePacketListenerImpl.this.cserver.getPluginManager().callEvent(event); + ++ player.processClick(enumhand); // Purpur + - // Entity in bucket - SPIGOT-4048 and SPIGOT-6859 - if ((entity instanceof Bucketable && entity instanceof LivingEntity && origItem != null && origItem.asItem() == Items.WATER_BUCKET) && (event.isCancelled() || ServerGamePacketListenerImpl.this.player.getInventory().getSelected() == null || ServerGamePacketListenerImpl.this.player.getInventory().getSelected().getItem() != origItem)) { - // Paper start + // Entity in bucket - SPIGOT-4048 and SPIGOT-6859a + if ((entity instanceof Bucketable && entity instanceof LivingEntity && origItem != null && origItem.asItem() == Items.WATER_BUCKET) && (event.isCancelled() || ServerGamePacketListenerImpl.this.player.getInventory().getSelected() == null || ServerGamePacketListenerImpl.this.player.getInventory().getSelected().getItem() != origItem)) { + entity.getEntityData().resendPossiblyDesyncedEntity(player); // Paper - The entire mob gets deleted, so resend it. diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 395d1109ac367c23b490f7d52b4bdab7cac7f92e..317b8272cede5ba52c04d8960a4440c09d238134 100644 +index efce81deda7403d056628ab1a83f909af548b424..3f2813e32a1ea011f760d2df454b8875f32a42f3 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -361,7 +361,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { @@ -91,7 +99,7 @@ index 395d1109ac367c23b490f7d52b4bdab7cac7f92e..317b8272cede5ba52c04d8960a4440c0 private float eyeHeight; public boolean isInPowderSnow; public boolean wasInPowderSnow; -@@ -2782,6 +2782,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -2767,6 +2767,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { this.passengers = ImmutableList.copyOf(list); } @@ -104,7 +112,7 @@ index 395d1109ac367c23b490f7d52b4bdab7cac7f92e..317b8272cede5ba52c04d8960a4440c0 } return true; // CraftBukkit } -@@ -2822,6 +2828,14 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -2807,6 +2813,14 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { return false; } // Spigot end @@ -119,7 +127,7 @@ index 395d1109ac367c23b490f7d52b4bdab7cac7f92e..317b8272cede5ba52c04d8960a4440c0 if (this.passengers.size() == 1 && this.passengers.get(0) == entity) { this.passengers = ImmutableList.of(); } else { -@@ -4584,4 +4598,45 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -4548,4 +4562,45 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { return ((net.minecraft.server.level.ServerChunkCache) level.getChunkSource()).isPositionTicking(this); } // Paper end @@ -165,6 +173,26 @@ index 395d1109ac367c23b490f7d52b4bdab7cac7f92e..317b8272cede5ba52c04d8960a4440c0 + } + // Purpur end } +diff --git a/src/main/java/net/minecraft/world/entity/EntityType.java b/src/main/java/net/minecraft/world/entity/EntityType.java +index a8e8cb8686a34ddd13c71261ffc40204ce6fefe3..e368ebc593653b10f79a06811f28f8cbcb953c18 100644 +--- a/src/main/java/net/minecraft/world/entity/EntityType.java ++++ b/src/main/java/net/minecraft/world/entity/EntityType.java +@@ -301,6 +301,7 @@ public class EntityType implements FeatureElement, EntityTypeT + private ResourceLocation lootTable; + private final EntityDimensions dimensions; + private final FeatureFlagSet requiredFeatures; ++ public final String id; // Purpur + + private static EntityType register(String id, EntityType.Builder type) { // CraftBukkit - decompile error + return (EntityType) Registry.register(BuiltInRegistries.ENTITY_TYPE, id, (EntityType) type.build(id)); // CraftBukkit - decompile error +@@ -336,6 +337,7 @@ public class EntityType implements FeatureElement, EntityTypeT + this.clientTrackingRange = maxTrackDistance; + this.updateInterval = trackTickInterval; + this.requiredFeatures = requiredFeatures; ++ this.id = id; // Purpur + } + + @Nullable diff --git a/src/main/java/net/minecraft/world/entity/GlowSquid.java b/src/main/java/net/minecraft/world/entity/GlowSquid.java index c1e9b40a4a0f9cdc650caa88b5ea132e06ee2496..882ab40c8cdea8c214cb8344b3ccecddb2967c1c 100644 --- a/src/main/java/net/minecraft/world/entity/GlowSquid.java @@ -194,10 +222,10 @@ index c1e9b40a4a0f9cdc650caa88b5ea132e06ee2496..882ab40c8cdea8c214cb8344b3ccecdd protected ParticleOptions getInkParticle() { return ParticleTypes.GLOW_SQUID_INK; diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 77a96dd66e2c39495f23b4219dfdbb0820233434..6e626aab5c90100de969125c28c12d8d02e68ea0 100644 +index 9e075de3542bda8ae086c9ca68bcd00b16d565d0..1e75f62ff6bd83f6007090dde5ce521fb6bd5247 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -220,9 +220,9 @@ public abstract class LivingEntity extends Entity { +@@ -222,9 +222,9 @@ public abstract class LivingEntity extends Entity { protected int deathScore; public float lastHurt; public boolean jumping; @@ -210,7 +238,7 @@ index 77a96dd66e2c39495f23b4219dfdbb0820233434..6e626aab5c90100de969125c28c12d8d protected int lerpSteps; protected double lerpX; protected double lerpY; -@@ -288,7 +288,7 @@ public abstract class LivingEntity extends Entity { +@@ -290,7 +290,7 @@ public abstract class LivingEntity extends Entity { this.effectsDirty = true; this.useItem = ItemStack.EMPTY; this.lastClimbablePos = Optional.empty(); @@ -219,7 +247,7 @@ index 77a96dd66e2c39495f23b4219dfdbb0820233434..6e626aab5c90100de969125c28c12d8d this.craftAttributes = new CraftAttributeMap(this.attributes); // CraftBukkit // CraftBukkit - setHealth(getMaxHealth()) inlined and simplified to skip the instanceof check for EntityPlayer, as getBukkitEntity() is not initialized in constructor this.entityData.set(LivingEntity.DATA_HEALTH_ID, (float) this.getAttribute(Attributes.MAX_HEALTH).getValue()); -@@ -339,6 +339,7 @@ public abstract class LivingEntity extends Entity { +@@ -341,6 +341,7 @@ public abstract class LivingEntity extends Entity { public static AttributeSupplier.Builder createLivingAttributes() { return AttributeSupplier.builder().add(Attributes.MAX_HEALTH).add(Attributes.KNOCKBACK_RESISTANCE).add(Attributes.MOVEMENT_SPEED).add(Attributes.ARMOR).add(Attributes.ARMOR_TOUGHNESS); } @@ -272,7 +300,7 @@ index 77a96dd66e2c39495f23b4219dfdbb0820233434..6e626aab5c90100de969125c28c12d8d // Paper end if (!this.level.isClientSide && this.isSensitiveToWater() && this.isInWaterRainOrBubble()) { diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java -index 26fabc96d3c3ac4ea35d094c686975b19c428d7f..088a44dfc798e4fad4e20f0dea344abae606242c 100644 +index 49b983064ea810382b6112f5dc7f93ba4e5710bd..35e02891f21c661808fea7d59c6c312f2193a6d3 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java @@ -146,8 +146,8 @@ public abstract class Mob extends LivingEntity { @@ -286,7 +314,7 @@ index 26fabc96d3c3ac4ea35d094c686975b19c428d7f..088a44dfc798e4fad4e20f0dea344aba this.jumpControl = new JumpControl(this); this.bodyRotationControl = this.createBodyControl(); this.navigation = this.createNavigation(world); -@@ -1329,7 +1329,7 @@ public abstract class Mob extends LivingEntity { +@@ -1341,7 +1341,7 @@ public abstract class Mob extends LivingEntity { protected void onOffspringSpawnedFromEgg(Player player, Mob child) {} protected InteractionResult mobInteract(Player player, InteractionHand hand) { @@ -295,9 +323,9 @@ index 26fabc96d3c3ac4ea35d094c686975b19c428d7f..088a44dfc798e4fad4e20f0dea344aba } public boolean isWithinRestriction() { -@@ -1700,4 +1700,52 @@ public abstract class Mob extends LivingEntity { - public Iterable iteratePathfindingStartNodeCandidatePositions() { - return ImmutableSet.of(new BlockPos(this.getBoundingBox().minX, (double) this.getBlockY(), this.getBoundingBox().minZ), new BlockPos(this.getBoundingBox().minX, (double) this.getBlockY(), this.getBoundingBox().maxZ), new BlockPos(this.getBoundingBox().maxX, (double) this.getBlockY(), this.getBoundingBox().minZ), new BlockPos(this.getBoundingBox().maxX, (double) this.getBlockY(), this.getBoundingBox().maxZ)); +@@ -1722,4 +1722,52 @@ public abstract class Mob extends LivingEntity { + + return itemmonsteregg == null ? null : new ItemStack(itemmonsteregg); } + + // Purpur start @@ -349,15 +377,14 @@ index 26fabc96d3c3ac4ea35d094c686975b19c428d7f..088a44dfc798e4fad4e20f0dea344aba + // Purpur end } diff --git a/src/main/java/net/minecraft/world/entity/ai/attributes/AttributeMap.java b/src/main/java/net/minecraft/world/entity/ai/attributes/AttributeMap.java -index 59ca3a0a70c68263495ae9972215b76554d3fb83..2c915c765ceef3ec28f5a58fa9a587282c1a906a 100644 +index dd1102d5291ef6f18e82400a6d8a0a376cc071e9..9932a801be1bde1c57697396c097fb47a6b26ede 100644 --- a/src/main/java/net/minecraft/world/entity/ai/attributes/AttributeMap.java +++ b/src/main/java/net/minecraft/world/entity/ai/attributes/AttributeMap.java -@@ -22,15 +22,22 @@ public class AttributeMap { +@@ -23,13 +23,20 @@ public class AttributeMap { private final Map attributes = Maps.newHashMap(); private final Set dirtyAttributes = Sets.newHashSet(); private final AttributeSupplier supplier; + private final net.minecraft.world.entity.LivingEntity entity; // Purpur - private final java.util.function.Function createInstance; // Pufferfish public AttributeMap(AttributeSupplier defaultAttributes) { + // Purpur start @@ -367,7 +394,6 @@ index 59ca3a0a70c68263495ae9972215b76554d3fb83..2c915c765ceef3ec28f5a58fa9a58728 + this.entity = entity; + // Purpur end this.supplier = defaultAttributes; - this.createInstance = attribute -> this.supplier.createInstance(this::onAttributeModified, attribute); // Pufferfish } private void onAttributeModified(AttributeInstance instance) { @@ -376,7 +402,7 @@ index 59ca3a0a70c68263495ae9972215b76554d3fb83..2c915c765ceef3ec28f5a58fa9a58728 this.dirtyAttributes.add(instance); } -@@ -42,11 +49,10 @@ public class AttributeMap { +@@ -41,7 +48,7 @@ public class AttributeMap { public Collection getSyncableAttributes() { return this.attributes.values().stream().filter((attribute) -> { @@ -385,12 +411,8 @@ index 59ca3a0a70c68263495ae9972215b76554d3fb83..2c915c765ceef3ec28f5a58fa9a58728 }).collect(Collectors.toList()); } -- - @Nullable - public AttributeInstance getInstance(Attribute attribute) { - return this.attributes.computeIfAbsent(attribute, this.createInstance); // Pufferfish - cache lambda, as for some reason java allocates it anyways diff --git a/src/main/java/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java b/src/main/java/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java -index d5d2b58f103d6bb50a4657299876ac02b77f258a..449b13ab3aeaebdf1e315700446b62b20e275e9b 100644 +index 3f7c6349a99c1cd4e0b2d7fc7a43bedcf5a9d980..3ce566840032e0b7728c6bcc4dd6e12cbd114268 100644 --- a/src/main/java/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java +++ b/src/main/java/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java @@ -2,7 +2,9 @@ package net.minecraft.world.entity.ai.attributes; @@ -401,14 +423,13 @@ index d5d2b58f103d6bb50a4657299876ac02b77f258a..449b13ab3aeaebdf1e315700446b62b2 import java.util.Map; + import net.minecraft.Util; - import net.minecraft.core.Registry; + import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.world.entity.EntityType; -@@ -78,7 +80,88 @@ import org.slf4j.Logger; +@@ -79,7 +81,87 @@ import org.slf4j.Logger; public class DefaultAttributes { private static final Logger LOGGER = LogUtils.getLogger(); -- private static final Map, AttributeSupplier> SUPPLIERS = ImmutableMap., AttributeSupplier>builder().put(EntityType.ALLAY, Allay.createAttributes().build()).put(EntityType.ARMOR_STAND, LivingEntity.createLivingAttributes().build()).put(EntityType.AXOLOTL, Axolotl.createAttributes().build()).put(EntityType.BAT, Bat.createAttributes().build()).put(EntityType.BEE, Bee.createAttributes().build()).put(EntityType.BLAZE, Blaze.createAttributes().build()).put(EntityType.CAT, Cat.createAttributes().build()).put(EntityType.CAVE_SPIDER, CaveSpider.createCaveSpider().build()).put(EntityType.CHICKEN, Chicken.createAttributes().build()).put(EntityType.COD, AbstractFish.createAttributes().build()).put(EntityType.COW, Cow.createAttributes().build()).put(EntityType.CREEPER, Creeper.createAttributes().build()).put(EntityType.DOLPHIN, Dolphin.createAttributes().build()).put(EntityType.DONKEY, AbstractChestedHorse.createBaseChestedHorseAttributes().build()).put(EntityType.DROWNED, Zombie.createAttributes().build()).put(EntityType.ELDER_GUARDIAN, ElderGuardian.createAttributes().build()).put(EntityType.ENDERMAN, EnderMan.createAttributes().build()).put(EntityType.ENDERMITE, Endermite.createAttributes().build()).put(EntityType.ENDER_DRAGON, EnderDragon.createAttributes().build()).put(EntityType.EVOKER, Evoker.createAttributes().build()).put(EntityType.FOX, Fox.createAttributes().build()).put(EntityType.FROG, Frog.createAttributes().build()).put(EntityType.GHAST, Ghast.createAttributes().build()).put(EntityType.GIANT, Giant.createAttributes().build()).put(EntityType.GLOW_SQUID, GlowSquid.createAttributes().build()).put(EntityType.GOAT, Goat.createAttributes().build()).put(EntityType.GUARDIAN, Guardian.createAttributes().build()).put(EntityType.HOGLIN, Hoglin.createAttributes().build()).put(EntityType.HORSE, AbstractHorse.createBaseHorseAttributes().build()).put(EntityType.HUSK, Zombie.createAttributes().build()).put(EntityType.ILLUSIONER, Illusioner.createAttributes().build()).put(EntityType.IRON_GOLEM, IronGolem.createAttributes().build()).put(EntityType.LLAMA, Llama.createAttributes().build()).put(EntityType.MAGMA_CUBE, MagmaCube.createAttributes().build()).put(EntityType.MOOSHROOM, Cow.createAttributes().build()).put(EntityType.MULE, AbstractChestedHorse.createBaseChestedHorseAttributes().build()).put(EntityType.OCELOT, Ocelot.createAttributes().build()).put(EntityType.PANDA, Panda.createAttributes().build()).put(EntityType.PARROT, Parrot.createAttributes().build()).put(EntityType.PHANTOM, Monster.createMonsterAttributes().build()).put(EntityType.PIG, Pig.createAttributes().build()).put(EntityType.PIGLIN, Piglin.createAttributes().build()).put(EntityType.PIGLIN_BRUTE, PiglinBrute.createAttributes().build()).put(EntityType.PILLAGER, Pillager.createAttributes().build()).put(EntityType.PLAYER, Player.createAttributes().build()).put(EntityType.POLAR_BEAR, PolarBear.createAttributes().build()).put(EntityType.PUFFERFISH, AbstractFish.createAttributes().build()).put(EntityType.RABBIT, Rabbit.createAttributes().build()).put(EntityType.RAVAGER, Ravager.createAttributes().build()).put(EntityType.SALMON, AbstractFish.createAttributes().build()).put(EntityType.SHEEP, Sheep.createAttributes().build()).put(EntityType.SHULKER, Shulker.createAttributes().build()).put(EntityType.SILVERFISH, Silverfish.createAttributes().build()).put(EntityType.SKELETON, AbstractSkeleton.createAttributes().build()).put(EntityType.SKELETON_HORSE, SkeletonHorse.createAttributes().build()).put(EntityType.SLIME, Monster.createMonsterAttributes().build()).put(EntityType.SNOW_GOLEM, SnowGolem.createAttributes().build()).put(EntityType.SPIDER, Spider.createAttributes().build()).put(EntityType.SQUID, Squid.createAttributes().build()).put(EntityType.STRAY, AbstractSkeleton.createAttributes().build()).put(EntityType.STRIDER, Strider.createAttributes().build()).put(EntityType.TADPOLE, Tadpole.createAttributes().build()).put(EntityType.TRADER_LLAMA, Llama.createAttributes().build()).put(EntityType.TROPICAL_FISH, AbstractFish.createAttributes().build()).put(EntityType.TURTLE, Turtle.createAttributes().build()).put(EntityType.VEX, Vex.createAttributes().build()).put(EntityType.VILLAGER, Villager.createAttributes().build()).put(EntityType.VINDICATOR, Vindicator.createAttributes().build()).put(EntityType.WARDEN, Warden.createAttributes().build()).put(EntityType.WANDERING_TRADER, Mob.createMobAttributes().build()).put(EntityType.WITCH, Witch.createAttributes().build()).put(EntityType.WITHER, WitherBoss.createAttributes().build()).put(EntityType.WITHER_SKELETON, AbstractSkeleton.createAttributes().build()).put(EntityType.WOLF, Wolf.createAttributes().build()).put(EntityType.ZOGLIN, Zoglin.createAttributes().build()).put(EntityType.ZOMBIE, Zombie.createAttributes().build()).put(EntityType.ZOMBIE_HORSE, ZombieHorse.createAttributes().build()).put(EntityType.ZOMBIE_VILLAGER, Zombie.createAttributes().build()).put(EntityType.ZOMBIFIED_PIGLIN, ZombifiedPiglin.createAttributes().build()).build(); -+ // Purpur start +- private static final Map, AttributeSupplier> SUPPLIERS = ImmutableMap., AttributeSupplier>builder().put(EntityType.ALLAY, Allay.createAttributes().build()).put(EntityType.ARMOR_STAND, LivingEntity.createLivingAttributes().build()).put(EntityType.AXOLOTL, Axolotl.createAttributes().build()).put(EntityType.BAT, Bat.createAttributes().build()).put(EntityType.BEE, Bee.createAttributes().build()).put(EntityType.BLAZE, Blaze.createAttributes().build()).put(EntityType.CAT, Cat.createAttributes().build()).put(EntityType.CAMEL, Camel.createAttributes().build()).put(EntityType.CAVE_SPIDER, CaveSpider.createCaveSpider().build()).put(EntityType.CHICKEN, Chicken.createAttributes().build()).put(EntityType.COD, AbstractFish.createAttributes().build()).put(EntityType.COW, Cow.createAttributes().build()).put(EntityType.CREEPER, Creeper.createAttributes().build()).put(EntityType.DOLPHIN, Dolphin.createAttributes().build()).put(EntityType.DONKEY, AbstractChestedHorse.createBaseChestedHorseAttributes().build()).put(EntityType.DROWNED, Zombie.createAttributes().build()).put(EntityType.ELDER_GUARDIAN, ElderGuardian.createAttributes().build()).put(EntityType.ENDERMAN, EnderMan.createAttributes().build()).put(EntityType.ENDERMITE, Endermite.createAttributes().build()).put(EntityType.ENDER_DRAGON, EnderDragon.createAttributes().build()).put(EntityType.EVOKER, Evoker.createAttributes().build()).put(EntityType.FOX, Fox.createAttributes().build()).put(EntityType.FROG, Frog.createAttributes().build()).put(EntityType.GHAST, Ghast.createAttributes().build()).put(EntityType.GIANT, Giant.createAttributes().build()).put(EntityType.GLOW_SQUID, GlowSquid.createAttributes().build()).put(EntityType.GOAT, Goat.createAttributes().build()).put(EntityType.GUARDIAN, Guardian.createAttributes().build()).put(EntityType.HOGLIN, Hoglin.createAttributes().build()).put(EntityType.HORSE, AbstractHorse.createBaseHorseAttributes().build()).put(EntityType.HUSK, Zombie.createAttributes().build()).put(EntityType.ILLUSIONER, Illusioner.createAttributes().build()).put(EntityType.IRON_GOLEM, IronGolem.createAttributes().build()).put(EntityType.LLAMA, Llama.createAttributes().build()).put(EntityType.MAGMA_CUBE, MagmaCube.createAttributes().build()).put(EntityType.MOOSHROOM, Cow.createAttributes().build()).put(EntityType.MULE, AbstractChestedHorse.createBaseChestedHorseAttributes().build()).put(EntityType.OCELOT, Ocelot.createAttributes().build()).put(EntityType.PANDA, Panda.createAttributes().build()).put(EntityType.PARROT, Parrot.createAttributes().build()).put(EntityType.PHANTOM, Monster.createMonsterAttributes().build()).put(EntityType.PIG, Pig.createAttributes().build()).put(EntityType.PIGLIN, Piglin.createAttributes().build()).put(EntityType.PIGLIN_BRUTE, PiglinBrute.createAttributes().build()).put(EntityType.PILLAGER, Pillager.createAttributes().build()).put(EntityType.PLAYER, Player.createAttributes().build()).put(EntityType.POLAR_BEAR, PolarBear.createAttributes().build()).put(EntityType.PUFFERFISH, AbstractFish.createAttributes().build()).put(EntityType.RABBIT, Rabbit.createAttributes().build()).put(EntityType.RAVAGER, Ravager.createAttributes().build()).put(EntityType.SALMON, AbstractFish.createAttributes().build()).put(EntityType.SHEEP, Sheep.createAttributes().build()).put(EntityType.SHULKER, Shulker.createAttributes().build()).put(EntityType.SILVERFISH, Silverfish.createAttributes().build()).put(EntityType.SKELETON, AbstractSkeleton.createAttributes().build()).put(EntityType.SKELETON_HORSE, SkeletonHorse.createAttributes().build()).put(EntityType.SLIME, Monster.createMonsterAttributes().build()).put(EntityType.SNOW_GOLEM, SnowGolem.createAttributes().build()).put(EntityType.SPIDER, Spider.createAttributes().build()).put(EntityType.SQUID, Squid.createAttributes().build()).put(EntityType.STRAY, AbstractSkeleton.createAttributes().build()).put(EntityType.STRIDER, Strider.createAttributes().build()).put(EntityType.TADPOLE, Tadpole.createAttributes().build()).put(EntityType.TRADER_LLAMA, Llama.createAttributes().build()).put(EntityType.TROPICAL_FISH, AbstractFish.createAttributes().build()).put(EntityType.TURTLE, Turtle.createAttributes().build()).put(EntityType.VEX, Vex.createAttributes().build()).put(EntityType.VILLAGER, Villager.createAttributes().build()).put(EntityType.VINDICATOR, Vindicator.createAttributes().build()).put(EntityType.WARDEN, Warden.createAttributes().build()).put(EntityType.WANDERING_TRADER, Mob.createMobAttributes().build()).put(EntityType.WITCH, Witch.createAttributes().build()).put(EntityType.WITHER, WitherBoss.createAttributes().build()).put(EntityType.WITHER_SKELETON, AbstractSkeleton.createAttributes().build()).put(EntityType.WOLF, Wolf.createAttributes().build()).put(EntityType.ZOGLIN, Zoglin.createAttributes().build()).put(EntityType.ZOMBIE, Zombie.createAttributes().build()).put(EntityType.ZOMBIE_HORSE, ZombieHorse.createAttributes().build()).put(EntityType.ZOMBIE_VILLAGER, Zombie.createAttributes().build()).put(EntityType.ZOMBIFIED_PIGLIN, ZombifiedPiglin.createAttributes().build()).build(); + private static final Map, AttributeSupplier> SUPPLIERS = ImmutableMap., AttributeSupplier>builder() + .put(EntityType.ALLAY, Allay.createAttributes().build()) + .put(EntityType.ARMOR_STAND, LivingEntity.createLivingAttributes().build()) @@ -417,6 +438,7 @@ index d5d2b58f103d6bb50a4657299876ac02b77f258a..449b13ab3aeaebdf1e315700446b62b2 + .put(EntityType.BEE, Bee.createAttributes().build()) + .put(EntityType.BLAZE, Blaze.createAttributes().build()) + .put(EntityType.CAT, Cat.createAttributes().build()) ++ .put(EntityType.CAMEL, Camel.createAttributes().build()) + .put(EntityType.CAVE_SPIDER, CaveSpider.createCaveSpider().build()) + .put(EntityType.CHICKEN, Chicken.createAttributes().build()) + .put(EntityType.COD, AbstractFish.createAttributes().build()) @@ -489,7 +511,6 @@ index d5d2b58f103d6bb50a4657299876ac02b77f258a..449b13ab3aeaebdf1e315700446b62b2 + .put(EntityType.ZOMBIE_HORSE, ZombieHorse.createAttributes().build()) + .put(EntityType.ZOMBIE_VILLAGER, Zombie.createAttributes().build()) + .put(EntityType.ZOMBIFIED_PIGLIN, ZombifiedPiglin.createAttributes().build()).build(); -+ // Purpur end public static AttributeSupplier getSupplier(EntityType type) { return SUPPLIERS.get(type); @@ -553,7 +574,7 @@ index 7df56705a4a0de2dc4ff7ab133fc26612c219162..60d21d6171b9af20a4c6fcc0d564a31a } diff --git a/src/main/java/net/minecraft/world/entity/ambient/Bat.java b/src/main/java/net/minecraft/world/entity/ambient/Bat.java -index bfea05018d9515fa7a9a8c04d4e2a63e0f3cd0d4..794bd646fda0d7f2c71b10b8a74880fcdf813d22 100644 +index 320c558bbe80d4bbc641e895ec43cfa2b45e8d70..b2b490961ee47d4cfbac0d438dba91eec658ead5 100644 --- a/src/main/java/net/minecraft/world/entity/ambient/Bat.java +++ b/src/main/java/net/minecraft/world/entity/ambient/Bat.java @@ -18,6 +18,7 @@ import net.minecraft.world.entity.EntityDimensions; @@ -564,12 +585,15 @@ index bfea05018d9515fa7a9a8c04d4e2a63e0f3cd0d4..794bd646fda0d7f2c71b10b8a74880fc import net.minecraft.world.entity.Pose; import net.minecraft.world.entity.ai.attributes.AttributeSupplier; import net.minecraft.world.entity.ai.attributes.Attributes; -@@ -41,9 +42,56 @@ public class Bat extends AmbientCreature { +@@ -41,12 +42,59 @@ public class Bat extends AmbientCreature { public Bat(EntityType type, Level world) { super(type, world); + this.moveControl = new org.purpurmc.purpur.controller.FlyingWithSpacebarMoveControllerWASD(this, 0.075F); // Purpur - this.setResting(true); + if (!world.isClientSide) { + this.setResting(true); + } + } + // Purpur start @@ -621,7 +645,7 @@ index bfea05018d9515fa7a9a8c04d4e2a63e0f3cd0d4..794bd646fda0d7f2c71b10b8a74880fc @Override public boolean isFlapping() { return !this.isResting() && this.tickCount % Bat.TICKS_PER_FLAP == 0; -@@ -93,7 +141,7 @@ public class Bat extends AmbientCreature { +@@ -96,7 +144,7 @@ public class Bat extends AmbientCreature { protected void pushEntities() {} public static AttributeSupplier.Builder createAttributes() { @@ -630,7 +654,7 @@ index bfea05018d9515fa7a9a8c04d4e2a63e0f3cd0d4..794bd646fda0d7f2c71b10b8a74880fc } public boolean isResting() { -@@ -125,6 +173,14 @@ public class Bat extends AmbientCreature { +@@ -128,6 +176,14 @@ public class Bat extends AmbientCreature { @Override protected void customServerAiStep() { @@ -702,7 +726,7 @@ index 1f85f34c1e50f34fb270d2fac7d307c82a550bfa..324f52edd95b5f9a498e46def8c14435 double d = this.wantedX - this.fish.getX(); double e = this.wantedY - this.fish.getY(); diff --git a/src/main/java/net/minecraft/world/entity/animal/Bee.java b/src/main/java/net/minecraft/world/entity/animal/Bee.java -index 2e05c953182c27e3571b2c33eceeb379e60b54be..0e3e9c9652da69a66d372173d256e3ca2f1e75f7 100644 +index 337a88a7cd6445004d005ef8d56af1b1cdf800d9..16d6b0881746ade2113e2dc7977e7468abde352f 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Bee.java +++ b/src/main/java/net/minecraft/world/entity/animal/Bee.java @@ -43,6 +43,7 @@ import net.minecraft.world.entity.EntityType; @@ -803,7 +827,7 @@ index 2e05c953182c27e3571b2c33eceeb379e60b54be..0e3e9c9652da69a66d372173d256e3ca this.targetSelector.addGoal(1, (new Bee.BeeHurtByOtherGoal(this)).setAlertOthers(new Class[0])); this.targetSelector.addGoal(2, new Bee.BeeBecomeAngryTargetGoal(this)); this.targetSelector.addGoal(3, new ResetUniversalAngerTargetGoal<>(this, true)); -@@ -880,16 +931,16 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -883,16 +934,16 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { } } @@ -824,10 +848,10 @@ index 2e05c953182c27e3571b2c33eceeb379e60b54be..0e3e9c9652da69a66d372173d256e3ca } diff --git a/src/main/java/net/minecraft/world/entity/animal/Cat.java b/src/main/java/net/minecraft/world/entity/animal/Cat.java -index 745883a7b9c2590ae8e28db79e1bd0341a7e54bd..e163851c02e38c294d95dbabafd4903b8846b551 100644 +index 0114c1cf3b6b0500149a77ebc190cb7fa2832184..a13de1a2f2b5a4e6e9a6d8de1de220578f2c623f 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cat.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cat.java -@@ -95,6 +95,31 @@ public class Cat extends TamableAnimal { +@@ -96,6 +96,31 @@ public class Cat extends TamableAnimal implements VariantHolder { super(type, world); } @@ -857,9 +881,9 @@ index 745883a7b9c2590ae8e28db79e1bd0341a7e54bd..e163851c02e38c294d95dbabafd4903b + // Purpur end + public ResourceLocation getResourceLocation() { - return this.getCatVariant().texture(); + return this.getVariant().texture(); } -@@ -103,6 +128,7 @@ public class Cat extends TamableAnimal { +@@ -104,6 +129,7 @@ public class Cat extends TamableAnimal implements VariantHolder { protected void registerGoals() { this.temptGoal = new Cat.CatTemptGoal(this, 0.6D, Cat.TEMPT_INGREDIENT, true); this.goalSelector.addGoal(1, new FloatGoal(this)); @@ -867,7 +891,7 @@ index 745883a7b9c2590ae8e28db79e1bd0341a7e54bd..e163851c02e38c294d95dbabafd4903b this.goalSelector.addGoal(1, new SitWhenOrderedToGoal(this)); this.goalSelector.addGoal(2, new Cat.CatRelaxOnOwnerGoal(this)); this.goalSelector.addGoal(3, this.temptGoal); -@@ -114,6 +140,7 @@ public class Cat extends TamableAnimal { +@@ -115,6 +141,7 @@ public class Cat extends TamableAnimal implements VariantHolder { this.goalSelector.addGoal(10, new BreedGoal(this, 0.8D)); this.goalSelector.addGoal(11, new WaterAvoidingRandomStrollGoal(this, 0.8D, 1.0000001E-5F)); this.goalSelector.addGoal(12, new LookAtPlayerGoal(this, Player.class, 10.0F)); @@ -875,7 +899,7 @@ index 745883a7b9c2590ae8e28db79e1bd0341a7e54bd..e163851c02e38c294d95dbabafd4903b this.targetSelector.addGoal(1, new NonTameRandomTargetGoal<>(this, Rabbit.class, false, (Predicate) null)); this.targetSelector.addGoal(1, new NonTameRandomTargetGoal<>(this, Turtle.class, false, Turtle.BABY_ON_LAND_SELECTOR)); } -@@ -371,6 +398,7 @@ public class Cat extends TamableAnimal { +@@ -376,6 +403,7 @@ public class Cat extends TamableAnimal implements VariantHolder { @Override public InteractionResult mobInteract(Player player, InteractionHand hand) { @@ -884,10 +908,10 @@ index 745883a7b9c2590ae8e28db79e1bd0341a7e54bd..e163851c02e38c294d95dbabafd4903b Item item = itemstack.getItem(); diff --git a/src/main/java/net/minecraft/world/entity/animal/Chicken.java b/src/main/java/net/minecraft/world/entity/animal/Chicken.java -index ab5f7c69f35acbddd9a4fec7dbbb1df296880d25..58c1102b483ccdddb74023959b9234bcd2af6548 100644 +index 72edd4d0698dd18cf2d91c39d68d3b3302d86d62..9494383f1e370964f3e32cf8d6afc03e045320d4 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Chicken.java +++ b/src/main/java/net/minecraft/world/entity/animal/Chicken.java -@@ -53,9 +53,27 @@ public class Chicken extends Animal { +@@ -54,9 +54,27 @@ public class Chicken extends Animal { this.setPathfindingMalus(BlockPathTypes.WATER, 0.0F); } @@ -944,10 +968,10 @@ index 824e5e4fe7619ae46061c3c978c9a044db8c84ab..545ef4ab037b3173cc7377ad8147a44a public ItemStack getBucketItemStack() { return new ItemStack(Items.COD_BUCKET); diff --git a/src/main/java/net/minecraft/world/entity/animal/Cow.java b/src/main/java/net/minecraft/world/entity/animal/Cow.java -index 76b7baf879a4bf9e2e884bbd497eb8f9cad4c4ce..eccb4af0aba930b04763303e38620700fc991184 100644 +index abae850f5babfd75c7547e88fb7637e9775991d3..04356c2a3f64842582e7a637afb3f77a7920bd63 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cow.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cow.java -@@ -40,9 +40,27 @@ public class Cow extends Animal { +@@ -41,9 +41,27 @@ public class Cow extends Animal { super(type, world); } @@ -975,7 +999,7 @@ index 76b7baf879a4bf9e2e884bbd497eb8f9cad4c4ce..eccb4af0aba930b04763303e38620700 this.goalSelector.addGoal(1, new PanicGoal(this, 2.0D)); this.goalSelector.addGoal(2, new BreedGoal(this, 1.0D)); this.goalSelector.addGoal(3, new TemptGoal(this, 1.25D, Ingredient.of(Items.WHEAT), false)); -@@ -83,6 +101,7 @@ public class Cow extends Animal { +@@ -84,6 +102,7 @@ public class Cow extends Animal { @Override public InteractionResult mobInteract(Player player, InteractionHand hand) { @@ -983,7 +1007,7 @@ index 76b7baf879a4bf9e2e884bbd497eb8f9cad4c4ce..eccb4af0aba930b04763303e38620700 ItemStack itemstack = player.getItemInHand(hand); if (itemstack.is(Items.BUCKET) && !this.isBaby()) { -@@ -90,7 +109,7 @@ public class Cow extends Animal { +@@ -91,7 +110,7 @@ public class Cow extends Animal { org.bukkit.event.player.PlayerBucketFillEvent event = CraftEventFactory.callPlayerBucketFillEvent((ServerLevel) player.level, player, this.blockPosition(), this.blockPosition(), null, itemstack, Items.MILK_BUCKET, hand); if (event.isCancelled()) { @@ -1123,10 +1147,10 @@ index 3f100d847fbce6db5b625e99c4f3694576237372..7343f6fa6c29d4029cc35e173e5d701e this.setAirSupply(this.getMaxAirSupply()); } else { diff --git a/src/main/java/net/minecraft/world/entity/animal/Fox.java b/src/main/java/net/minecraft/world/entity/animal/Fox.java -index 06b11bdbccd76f166561bcaff444066cc46b4663..6b3413593fd68d5e4f97bd7fe9454496ace94287 100644 +index bc2b98c9f34ad2b289f5da91d704bd836edec8c1..9c3a62540a7c78615081d25af9590060dc9d5e12 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Fox.java +++ b/src/main/java/net/minecraft/world/entity/animal/Fox.java -@@ -140,6 +140,44 @@ public class Fox extends Animal { +@@ -140,6 +140,44 @@ public class Fox extends Animal implements VariantHolder { this.setCanPickUpLoot(true); } @@ -1171,7 +1195,7 @@ index 06b11bdbccd76f166561bcaff444066cc46b4663..6b3413593fd68d5e4f97bd7fe9454496 @Override protected void defineSynchedData() { super.defineSynchedData(); -@@ -159,6 +197,7 @@ public class Fox extends Animal { +@@ -159,6 +197,7 @@ public class Fox extends Animal implements VariantHolder { return entityliving instanceof AbstractSchoolingFish; }); this.goalSelector.addGoal(0, new Fox.FoxFloatGoal()); @@ -1179,7 +1203,7 @@ index 06b11bdbccd76f166561bcaff444066cc46b4663..6b3413593fd68d5e4f97bd7fe9454496 this.goalSelector.addGoal(0, new ClimbOnTopOfPowderSnowGoal(this, this.level)); this.goalSelector.addGoal(1, new Fox.FaceplantGoal()); this.goalSelector.addGoal(2, new Fox.FoxPanicGoal(2.2D)); -@@ -185,6 +224,7 @@ public class Fox extends Animal { +@@ -185,6 +224,7 @@ public class Fox extends Animal implements VariantHolder { this.goalSelector.addGoal(11, new Fox.FoxSearchForItemsGoal()); this.goalSelector.addGoal(12, new Fox.FoxLookAtPlayerGoal(this, Player.class, 24.0F)); this.goalSelector.addGoal(13, new Fox.PerchAndSearchGoal()); @@ -1187,7 +1211,7 @@ index 06b11bdbccd76f166561bcaff444066cc46b4663..6b3413593fd68d5e4f97bd7fe9454496 this.targetSelector.addGoal(3, new Fox.DefendTrustedTargetGoal(LivingEntity.class, false, false, (entityliving) -> { return Fox.TRUSTED_TARGET_SELECTOR.test(entityliving) && !this.trusts(entityliving.getUUID()); })); -@@ -752,16 +792,16 @@ public class Fox extends Animal { +@@ -757,16 +797,16 @@ public class Fox extends Animal implements VariantHolder { return new Vec3(0.0D, (double) (0.55F * this.getEyeHeight()), (double) (this.getBbWidth() * 0.4F)); } @@ -1207,7 +1231,7 @@ index 06b11bdbccd76f166561bcaff444066cc46b4663..6b3413593fd68d5e4f97bd7fe9454496 } } -@@ -772,16 +812,16 @@ public class Fox extends Animal { +@@ -777,16 +817,16 @@ public class Fox extends Animal implements VariantHolder { } } @@ -1284,10 +1308,10 @@ index e73acfa2f5a4066fa1beee1758082a2fe97a43b3..bdd7d46781598fd54e65d9df1efe7905 float f1 = 1.0F + (this.random.nextFloat() - this.random.nextFloat()) * 0.2F; diff --git a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java -index c4441ef250b95663198cfc9607d714dbe346512c..2bc451088a69fb56ff6a6274d4f91cc1ceed2f9c 100644 +index 68a5ee85e64802e4509ba0d184fc0ceb3cbe2d11..38908fd222816efd8c9ae94b6947599b6c301422 100644 --- a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java +++ b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java -@@ -64,6 +64,23 @@ public class MushroomCow extends Cow implements Shearable { +@@ -63,6 +63,23 @@ public class MushroomCow extends Cow implements Shearable, VariantHolder> optional = this.getEffectFromItemStack(itemstack); if (!optional.isPresent()) { @@ -1330,7 +1354,7 @@ index c4441ef250b95663198cfc9607d714dbe346512c..2bc451088a69fb56ff6a6274d4f91cc1 Pair pair = (Pair) optional.get(); diff --git a/src/main/java/net/minecraft/world/entity/animal/Ocelot.java b/src/main/java/net/minecraft/world/entity/animal/Ocelot.java -index 6a459435493295ee5bb44fe2ba79cba6acea2e35..041c2d330a245826fc2fa4c1327aeadd24a44254 100644 +index 5ad029e3c1eaeae33784b55d04181cdd119ef8c0..dc5a44730eb8a48a831830295af7c069404c9bf7 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Ocelot.java +++ b/src/main/java/net/minecraft/world/entity/animal/Ocelot.java @@ -68,6 +68,23 @@ public class Ocelot extends Animal { @@ -1373,10 +1397,10 @@ index 6a459435493295ee5bb44fe2ba79cba6acea2e35..041c2d330a245826fc2fa4c1327aeadd this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Turtle.class, 10, false, false, Turtle.BABY_ON_LAND_SELECTOR)); } diff --git a/src/main/java/net/minecraft/world/entity/animal/Panda.java b/src/main/java/net/minecraft/world/entity/animal/Panda.java -index 87c9f1cba8eac70d54576d6ffb6f85fc5dcb8e8a..8f1b1fbfa76b8003126da7b5a8b5ce1a9cf647df 100644 +index 9c1e02c3a990cd0f8bba1c84c170b438278c02a7..8125c804e51899d3cc7378354536e35dab762c87 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Panda.java +++ b/src/main/java/net/minecraft/world/entity/animal/Panda.java -@@ -107,6 +107,32 @@ public class Panda extends Animal { +@@ -108,6 +108,32 @@ public class Panda extends Animal { } @@ -1409,7 +1433,7 @@ index 87c9f1cba8eac70d54576d6ffb6f85fc5dcb8e8a..8f1b1fbfa76b8003126da7b5a8b5ce1a @Override public boolean canTakeItem(ItemStack stack) { EquipmentSlot enumitemslot = Mob.getEquipmentSlotForItem(stack); -@@ -263,6 +289,7 @@ public class Panda extends Animal { +@@ -269,6 +295,7 @@ public class Panda extends Animal { @Override protected void registerGoals() { this.goalSelector.addGoal(0, new FloatGoal(this)); @@ -1417,7 +1441,7 @@ index 87c9f1cba8eac70d54576d6ffb6f85fc5dcb8e8a..8f1b1fbfa76b8003126da7b5a8b5ce1a this.goalSelector.addGoal(2, new Panda.PandaPanicGoal(this, 2.0D)); this.goalSelector.addGoal(2, new Panda.PandaBreedGoal(this, 1.0D)); this.goalSelector.addGoal(3, new Panda.PandaAttackGoal(this, 1.2000000476837158D, true)); -@@ -278,6 +305,7 @@ public class Panda extends Animal { +@@ -284,6 +311,7 @@ public class Panda extends Animal { this.goalSelector.addGoal(12, new Panda.PandaRollGoal(this)); this.goalSelector.addGoal(13, new FollowParentGoal(this, 1.25D)); this.goalSelector.addGoal(14, new WaterAvoidingRandomStrollGoal(this, 1.0D)); @@ -1425,7 +1449,7 @@ index 87c9f1cba8eac70d54576d6ffb6f85fc5dcb8e8a..8f1b1fbfa76b8003126da7b5a8b5ce1a this.targetSelector.addGoal(1, (new Panda.PandaHurtByTargetGoal(this, new Class[0])).setAlertOthers(new Class[0])); } -@@ -624,7 +652,7 @@ public class Panda extends Animal { +@@ -630,7 +658,7 @@ public class Panda extends Animal { ItemStack itemstack = player.getItemInHand(hand); if (this.isScared()) { @@ -1434,7 +1458,7 @@ index 87c9f1cba8eac70d54576d6ffb6f85fc5dcb8e8a..8f1b1fbfa76b8003126da7b5a8b5ce1a } else if (this.isOnBack()) { this.setOnBack(false); return InteractionResult.sidedSuccess(this.level.isClientSide); -@@ -641,7 +669,7 @@ public class Panda extends Animal { +@@ -647,7 +675,7 @@ public class Panda extends Animal { this.setInLove(player); } else { if (this.level.isClientSide || this.isSitting() || this.isInWater()) { @@ -1443,7 +1467,7 @@ index 87c9f1cba8eac70d54576d6ffb6f85fc5dcb8e8a..8f1b1fbfa76b8003126da7b5a8b5ce1a } this.tryToSit(); -@@ -660,7 +688,7 @@ public class Panda extends Animal { +@@ -666,7 +694,7 @@ public class Panda extends Animal { return InteractionResult.SUCCESS; } else { @@ -1452,7 +1476,7 @@ index 87c9f1cba8eac70d54576d6ffb6f85fc5dcb8e8a..8f1b1fbfa76b8003126da7b5a8b5ce1a } } -@@ -700,7 +728,7 @@ public class Panda extends Animal { +@@ -706,7 +734,7 @@ public class Panda extends Animal { return !this.isOnBack() && !this.isScared() && !this.isEating() && !this.isRolling() && !this.isSitting(); } @@ -1461,7 +1485,7 @@ index 87c9f1cba8eac70d54576d6ffb6f85fc5dcb8e8a..8f1b1fbfa76b8003126da7b5a8b5ce1a private final Panda panda; -@@ -710,9 +738,9 @@ public class Panda extends Animal { +@@ -716,9 +744,9 @@ public class Panda extends Animal { } @Override @@ -1474,10 +1498,10 @@ index 87c9f1cba8eac70d54576d6ffb6f85fc5dcb8e8a..8f1b1fbfa76b8003126da7b5a8b5ce1a } } diff --git a/src/main/java/net/minecraft/world/entity/animal/Parrot.java b/src/main/java/net/minecraft/world/entity/animal/Parrot.java -index a2977596c672a5a435f56bb20fbfb7b59882dda6..9a433b96fa468aab604c6874e1814e09dc9d621d 100644 +index 2d9aa961df034eab21ecfdb6e6d0ce7cf013505d..1ed1fd11824cbc5322dfd1f2f24a2eb5b2ae6942 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Parrot.java +++ b/src/main/java/net/minecraft/world/entity/animal/Parrot.java -@@ -125,12 +125,68 @@ public class Parrot extends ShoulderRidingEntity implements FlyingAnimal { +@@ -129,12 +129,68 @@ public class Parrot extends ShoulderRidingEntity implements VariantHolder type, Level world) { super(type, world); @@ -1547,7 +1571,7 @@ index a2977596c672a5a435f56bb20fbfb7b59882dda6..9a433b96fa468aab604c6874e1814e09 @Nullable @Override public SpawnGroupData finalizeSpawn(ServerLevelAccessor world, DifficultyInstance difficulty, MobSpawnType spawnReason, @Nullable SpawnGroupData entityData, @Nullable CompoundTag entityNbt) { -@@ -149,8 +205,10 @@ public class Parrot extends ShoulderRidingEntity implements FlyingAnimal { +@@ -153,8 +209,10 @@ public class Parrot extends ShoulderRidingEntity implements VariantHolder(this, Player.class, 10, true, false, this::isAngryAt)); -@@ -201,6 +232,11 @@ public class PolarBear extends Animal implements NeutralMob { +@@ -202,6 +233,11 @@ public class PolarBear extends Animal implements NeutralMob { this.updatePersistentAnger((ServerLevel)this.level, true); } @@ -1663,7 +1687,7 @@ index b1e05acfb0f0d6517682c12e1ba06a685f0280db..8d123d6ce4c1fb5176d93a651363ba8b } @Override -@@ -230,6 +266,7 @@ public class PolarBear extends Animal implements NeutralMob { +@@ -231,6 +267,7 @@ public class PolarBear extends Animal implements NeutralMob { public void setStanding(boolean warning) { this.entityData.set(DATA_STANDING_ID, warning); @@ -1700,10 +1724,10 @@ index ce02552c1b3c62cf9f48425838a129a3ec40a049..71929e5fe8851ad5620f25b6ed505865 protected void defineSynchedData() { super.defineSynchedData(); diff --git a/src/main/java/net/minecraft/world/entity/animal/Rabbit.java b/src/main/java/net/minecraft/world/entity/animal/Rabbit.java -index 6152ffec28c9cf93d45ea8c2d9d66ba15110a9aa..895e93e114e12a402812c19fab9581f47ed5020e 100644 +index e1cb50c31d18265c56f49461d79436f5fbe67f67..2579351192a47567a3b9a0e7653f02dcf61babb1 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Rabbit.java +++ b/src/main/java/net/minecraft/world/entity/animal/Rabbit.java -@@ -85,6 +85,7 @@ public class Rabbit extends Animal { +@@ -83,6 +83,7 @@ public class Rabbit extends Animal implements VariantHolder { private boolean wasOnGround; private int jumpDelayTicks; int moreCarrotTicks; @@ -1711,7 +1735,7 @@ index 6152ffec28c9cf93d45ea8c2d9d66ba15110a9aa..895e93e114e12a402812c19fab9581f4 public Rabbit(EntityType type, Level world) { super(type, world); -@@ -93,6 +94,51 @@ public class Rabbit extends Animal { +@@ -91,6 +92,51 @@ public class Rabbit extends Animal implements VariantHolder { this.initializePathFinderGoals(); // CraftBukkit - moved code } @@ -1763,7 +1787,7 @@ index 6152ffec28c9cf93d45ea8c2d9d66ba15110a9aa..895e93e114e12a402812c19fab9581f4 // CraftBukkit start - code from constructor public void initializePathFinderGoals(){ this.setSpeedModifier(0.0D); -@@ -102,6 +148,7 @@ public class Rabbit extends Animal { +@@ -100,6 +146,7 @@ public class Rabbit extends Animal implements VariantHolder { @Override public void registerGoals() { this.goalSelector.addGoal(1, new FloatGoal(this)); @@ -1771,7 +1795,7 @@ index 6152ffec28c9cf93d45ea8c2d9d66ba15110a9aa..895e93e114e12a402812c19fab9581f4 this.goalSelector.addGoal(1, new ClimbOnTopOfPowderSnowGoal(this, this.level)); this.goalSelector.addGoal(1, new Rabbit.RabbitPanicGoal(this, 2.2D)); this.goalSelector.addGoal(2, new BreedGoal(this, 0.8D)); -@@ -116,6 +163,13 @@ public class Rabbit extends Animal { +@@ -114,6 +161,13 @@ public class Rabbit extends Animal implements VariantHolder { @Override protected float getJumpPower() { @@ -1785,7 +1809,7 @@ index 6152ffec28c9cf93d45ea8c2d9d66ba15110a9aa..895e93e114e12a402812c19fab9581f4 if (!this.horizontalCollision && (!this.moveControl.hasWanted() || this.moveControl.getWantedY() <= this.getY() + 0.5D)) { Path pathentity = this.navigation.getPath(); -@@ -134,7 +188,7 @@ public class Rabbit extends Animal { +@@ -132,7 +186,7 @@ public class Rabbit extends Animal implements VariantHolder { } @Override @@ -1794,7 +1818,7 @@ index 6152ffec28c9cf93d45ea8c2d9d66ba15110a9aa..895e93e114e12a402812c19fab9581f4 super.jumpFromGround(); double d0 = this.moveControl.getSpeedModifier(); -@@ -184,6 +238,13 @@ public class Rabbit extends Animal { +@@ -182,6 +236,13 @@ public class Rabbit extends Animal implements VariantHolder { @Override public void customServerAiStep() { @@ -1808,7 +1832,7 @@ index 6152ffec28c9cf93d45ea8c2d9d66ba15110a9aa..895e93e114e12a402812c19fab9581f4 if (this.jumpDelayTicks > 0) { --this.jumpDelayTicks; } -@@ -454,7 +515,7 @@ public class Rabbit extends Animal { +@@ -466,7 +527,7 @@ public class Rabbit extends Animal implements VariantHolder { } } @@ -1817,7 +1841,7 @@ index 6152ffec28c9cf93d45ea8c2d9d66ba15110a9aa..895e93e114e12a402812c19fab9581f4 private final Rabbit rabbit; private double nextJumpSpeed; -@@ -465,14 +526,14 @@ public class Rabbit extends Animal { +@@ -477,14 +538,14 @@ public class Rabbit extends Animal implements VariantHolder { } @Override @@ -1863,7 +1887,7 @@ index 0af79daa357f53a8871e293b57e16c099e5d3f64..59cb21bc3166f4cc77b962c253ed786f public int getMaxSchoolSize() { return 5; diff --git a/src/main/java/net/minecraft/world/entity/animal/Sheep.java b/src/main/java/net/minecraft/world/entity/animal/Sheep.java -index ed289bdc0455e737c79e8630e1cdfdeb957e2c03..15b2677018abc5047ddedaaf2b640de8dd1966ae 100644 +index efac4395fdb79a78fbb18a0f828b1a3c90b102fe..0be5aaa76997063d2c8df5547e01260e11c08f7a 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Sheep.java +++ b/src/main/java/net/minecraft/world/entity/animal/Sheep.java @@ -116,10 +116,28 @@ public class Sheep extends Animal implements Shearable { @@ -2039,10 +2063,10 @@ index a51424d29ac353cf1bec4d1484db0acb63bebba5..30687391baacd693fa3bb9e3efbd492d if (i > 100) { diff --git a/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java b/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java -index 559a4995d3530c0d402ab6306f9ac4c46b934c2b..cac2845978b9beebb4e1ed6fed3eb33a698bc545 100644 +index b05b560b7570e97bc234b75f26233909fcf575b3..7df3ee0f4b1a467d95f3eade65c0846b8a2e6337 100644 --- a/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java +++ b/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java -@@ -49,6 +49,23 @@ public class TropicalFish extends AbstractSchoolingFish { +@@ -42,6 +42,23 @@ public class TropicalFish extends AbstractSchoolingFish implements VariantHolder super(type, world); } @@ -2067,7 +2091,7 @@ index 559a4995d3530c0d402ab6306f9ac4c46b934c2b..cac2845978b9beebb4e1ed6fed3eb33a return "entity.minecraft.tropical_fish.predefined." + variant; } diff --git a/src/main/java/net/minecraft/world/entity/animal/Turtle.java b/src/main/java/net/minecraft/world/entity/animal/Turtle.java -index 4764b975386f1c5629a59f762f7ba1c1ae2598c5..ec095421e4928489a4bebfbb212f1795b57341fc 100644 +index 25503678e7d049a8b3172cfad8a5606958c32302..1d188320b10a640e4667b775e996b4fcdd5a1e73 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Turtle.java +++ b/src/main/java/net/minecraft/world/entity/animal/Turtle.java @@ -82,6 +82,23 @@ public class Turtle extends Animal { @@ -2149,7 +2173,7 @@ index 4764b975386f1c5629a59f762f7ba1c1ae2598c5..ec095421e4928489a4bebfbb212f1795 this.turtle.setSpeed(Mth.lerp(0.125F, this.turtle.getSpeed(), f1)); this.turtle.setDeltaMovement(this.turtle.getDeltaMovement().add(0.0D, (double) this.turtle.getSpeed() * d1 * 0.1D, 0.0D)); diff --git a/src/main/java/net/minecraft/world/entity/animal/Wolf.java b/src/main/java/net/minecraft/world/entity/animal/Wolf.java -index 45c3cec839a7c23903dedf6e3e004305da2adceb..248531727dcafb71d7d2d2767205e09a8c0f1876 100644 +index a6a50eb4f4ac85751071571876ac804d44ee1ee6..b9c692a2f42976eb459ed6a4078dca28eddeb459 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Wolf.java +++ b/src/main/java/net/minecraft/world/entity/animal/Wolf.java @@ -102,9 +102,32 @@ public class Wolf extends TamableAnimal implements NeutralMob { @@ -2194,7 +2218,7 @@ index 45c3cec839a7c23903dedf6e3e004305da2adceb..248531727dcafb71d7d2d2767205e09a this.targetSelector.addGoal(2, new OwnerHurtTargetGoal(this)); this.targetSelector.addGoal(3, (new HurtByTargetGoal(this, new Class[0])).setAlertOthers()); diff --git a/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java b/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java -index f889b352d5618c1955e21273da79604a33e30c06..28633838cb314ba59b4ff3bbdb99343d98ee66ae 100644 +index c0084b1f146a4697194c421519537e612ff737c0..3c60ad2c26c46f900e537ea39d74a97068f44561 100644 --- a/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java +++ b/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java @@ -101,10 +101,23 @@ public class Allay extends PathfinderMob implements InventoryCarrier { @@ -2252,10 +2276,10 @@ index f889b352d5618c1955e21273da79604a33e30c06..28633838cb314ba59b4ff3bbdb99343d protected Brain.Provider brainProvider() { return Brain.provider(Allay.MEMORY_TYPES, Allay.SENSOR_TYPES); diff --git a/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java b/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java -index 1c93872f9fcc6f6a19dee8565726501d0e580d44..3b576e8944bcef78f5769ccd90591f2db4dfd697 100644 +index 0d7f951e3837de7553d93f3d4525276048feb405..682c69ea9cdcc1ab9fd19e28eef410ecf27bf9f3 100644 --- a/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java +++ b/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java -@@ -97,6 +97,28 @@ public class Axolotl extends Animal implements LerpingModel, Bucketable { +@@ -98,6 +98,28 @@ public class Axolotl extends Animal implements LerpingModel, VariantHolder getModelRotationValues() { return this.modelRotationValues; -@@ -525,14 +547,22 @@ public class Axolotl extends Animal implements LerpingModel, Bucketable { +@@ -518,14 +540,22 @@ public class Axolotl extends Animal implements LerpingModel, VariantHolder { public final AnimationState walkAnimationState = new AnimationState(); public final AnimationState swimAnimationState = new AnimationState(); public final AnimationState swimIdleAnimationState = new AnimationState(); @@ -2390,7 +2414,7 @@ index 74cb2741a5cd66bdac3a22de938ae82968705a56..6a6613f70f9c4cc950882191b00048d4 @Override protected Brain.Provider brainProvider() { return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); -@@ -380,7 +429,7 @@ public class Frog extends Animal { +@@ -381,7 +430,7 @@ public class Frog extends Animal implements VariantHolder { return world.getBlockState(pos.below()).is(BlockTags.FROGS_SPAWNABLE_ON) && isBrightEnoughToSpawn(world, pos); } @@ -2400,7 +2424,7 @@ index 74cb2741a5cd66bdac3a22de938ae82968705a56..6a6613f70f9c4cc950882191b00048d4 super(entity); } diff --git a/src/main/java/net/minecraft/world/entity/animal/frog/Tadpole.java b/src/main/java/net/minecraft/world/entity/animal/frog/Tadpole.java -index 32cca29fd622d18030931e1f330791491e7f9fa0..8561d1994cb8c42e69ef77fad16d037c205dad33 100644 +index e8574bd4b412c1db82aaec9dced47b63de9dbf28..b33b3714f18f5bcd1f7d9d4974a8c1e254d83f5b 100644 --- a/src/main/java/net/minecraft/world/entity/animal/frog/Tadpole.java +++ b/src/main/java/net/minecraft/world/entity/animal/frog/Tadpole.java @@ -44,13 +44,50 @@ public class Tadpole extends AbstractFish { @@ -2456,7 +2480,7 @@ index 32cca29fd622d18030931e1f330791491e7f9fa0..8561d1994cb8c42e69ef77fad16d037c protected PathNavigation createNavigation(Level world) { return new WaterBoundPathNavigation(this, world); diff --git a/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java b/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java -index 3c3453638e117609190787efbf5d87fc20dcf8fd..e3a5d18779746e35f63f5103b9d4480b1bf31ee0 100644 +index e9f7c08ae3ea9c578971b1ede88788572c20e277..9b0a0736aa46e60f21c85cc88b67af342c34d5db 100644 --- a/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java +++ b/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java @@ -89,6 +89,23 @@ public class Goat extends Animal { @@ -2483,20 +2507,19 @@ index 3c3453638e117609190787efbf5d87fc20dcf8fd..e3a5d18779746e35f63f5103b9d4480b @Override protected Brain.Provider brainProvider() { return Brain.provider(Goat.MEMORY_TYPES, Goat.SENSOR_TYPES); -@@ -167,7 +184,7 @@ public class Goat extends Animal { +@@ -191,6 +208,7 @@ public class Goat extends Animal { @Override protected void customServerAiStep() { this.level.getProfiler().push("goatBrain"); -- if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish -+ if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider ++ if (getRider() == null || !this.isControllable()) // Purpur - only use brain if no rider this.getBrain().tick((ServerLevel) this.level, this); this.level.getProfiler().pop(); this.level.getProfiler().push("goatActivityUpdate"); diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/AbstractHorse.java b/src/main/java/net/minecraft/world/entity/animal/horse/AbstractHorse.java -index a8da601b8342aa6e4902b452eb588c76c98a7adf..f4190b1e1f9b4d2af04c15c472001f7f943a3cd3 100644 +index 821b88d0c32f946af9af1c2e211b38446fab4ecb..a1f2648005f37101b641302e173eb6d6183c2773 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/AbstractHorse.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/AbstractHorse.java -@@ -116,12 +116,22 @@ public abstract class AbstractHorse extends Animal implements ContainerListener, +@@ -118,12 +118,22 @@ public abstract class AbstractHorse extends Animal implements ContainerListener, protected AbstractHorse(EntityType type, Level world) { super(type, world); @@ -2519,16 +2542,16 @@ index a8da601b8342aa6e4902b452eb588c76c98a7adf..f4190b1e1f9b4d2af04c15c472001f7f this.goalSelector.addGoal(1, new PanicGoal(this, 1.2D)); this.goalSelector.addGoal(1, new RunAroundLikeCrazyGoal(this, 1.2D)); this.goalSelector.addGoal(2, new BreedGoal(this, 1.0D, AbstractHorse.class)); -@@ -129,6 +139,7 @@ public abstract class AbstractHorse extends Animal implements ContainerListener, - this.goalSelector.addGoal(6, new WaterAvoidingRandomStrollGoal(this, 0.7D)); - this.goalSelector.addGoal(7, new LookAtPlayerGoal(this, Player.class, 6.0F)); - this.goalSelector.addGoal(8, new RandomLookAroundGoal(this)); +@@ -134,6 +144,7 @@ public abstract class AbstractHorse extends Animal implements ContainerListener, + if (this.canPerformRearing()) { + this.goalSelector.addGoal(9, new RandomStandGoal(this)); + } + this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HorseHasRider(this)); // Purpur + this.addBehaviourGoals(); } - diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Donkey.java b/src/main/java/net/minecraft/world/entity/animal/horse/Donkey.java -index 4e68ba557e86250b61ce0b20eacb3bcd36a23806..db4d5d5e38a44f85c343b632c914f2252c30a3c3 100644 +index e0dfee0e0ce091d5ae0ec740e939c2c50915c104..13e03f23b1d5b120b403dda0f5002480ccc2421a 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/Donkey.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/Donkey.java @@ -15,6 +15,13 @@ public class Donkey extends AbstractChestedHorse { @@ -2544,12 +2567,12 @@ index 4e68ba557e86250b61ce0b20eacb3bcd36a23806..db4d5d5e38a44f85c343b632c914f225 + @Override protected SoundEvent getAmbientSound() { - super.getAmbientSound(); + return SoundEvents.DONKEY_AMBIENT; diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Horse.java b/src/main/java/net/minecraft/world/entity/animal/horse/Horse.java -index 34299274e7dd57076a1043d735a41b9c34f0a349..f711ea32db68fb7aece5081e741c4e161123467f 100644 +index 97a92b5576da2f8572a71cab42c40d1368ecb300..b1f34ab6e747465df2299b5dd0036d5197397af2 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/Horse.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/Horse.java -@@ -40,6 +40,13 @@ public class Horse extends AbstractHorse { +@@ -40,6 +40,13 @@ public class Horse extends AbstractHorse implements VariantHolder { super(type, world); } @@ -2564,10 +2587,10 @@ index 34299274e7dd57076a1043d735a41b9c34f0a349..f711ea32db68fb7aece5081e741c4e16 protected void randomizeAttributes(RandomSource random) { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue((double)this.generateRandomMaxHealth(random)); diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java -index 149be8bf166282e651a375a27ca209010f25d688..5db0ed6cc982a276284be50d87e2125921b5d5d6 100644 +index 7ae0e4b3aa8e861500ddc7b38aa671258b532fcd..419c458f15fb421c5cd6df98b8e74391915d647d 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java -@@ -71,7 +71,51 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { +@@ -76,7 +76,51 @@ public class Llama extends AbstractChestedHorse implements VariantHolder type, Level world) { super(type, world); @@ -2619,7 +2642,7 @@ index 149be8bf166282e651a375a27ca209010f25d688..5db0ed6cc982a276284be50d87e21259 public boolean isTraderLlama() { return false; -@@ -123,6 +167,7 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { +@@ -128,6 +172,7 @@ public class Llama extends AbstractChestedHorse implements VariantHolder(this, LivingEntity.class, 0, false, false, WitherBoss.LIVING_ENTITY_SELECTOR)); } -@@ -256,6 +376,16 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob +@@ -255,6 +375,16 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob @Override protected void customServerAiStep() { @@ -3091,7 +3114,7 @@ index b9d42e59a9f9e9ee4e6a06e2245a00dcc34f9002..b0fb4db03a2392c324caf5b8b1b07453 int i; if (this.getInvulnerableTicks() > 0) { -@@ -582,11 +712,11 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob +@@ -580,11 +710,11 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob } public int getAlternativeTarget(int headIndex) { @@ -3237,10 +3260,10 @@ index d980b906d9206560741576fa4153c57212f307a0..790d4abbc8e0b288e20e72e63f8190e9 public boolean doHurtTarget(Entity target) { if (super.doHurtTarget(target)) { diff --git a/src/main/java/net/minecraft/world/entity/monster/Creeper.java b/src/main/java/net/minecraft/world/entity/monster/Creeper.java -index e0f71dc12cfc28710cacfbc372026f556dcab165..17cc847fd6e5a128c9ae7427dc0aef51918bc30a 100644 +index 805e267090285d625dbeb75b06f8c5ad141a75a4..411baa912b61ce319faef73e187ebf7ac1bacde5 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Creeper.java +++ b/src/main/java/net/minecraft/world/entity/monster/Creeper.java -@@ -60,21 +60,98 @@ public class Creeper extends Monster implements PowerableMob { +@@ -59,21 +59,98 @@ public class Creeper extends Monster implements PowerableMob { public int maxSwell = 30; public int explosionRadius = 3; private int droppedSkulls; @@ -3441,10 +3464,10 @@ index d02286d553c600fe7e75f48e278e380d21c5b868..82b03488178962eb74fe252d561ba8ce return Guardian.createAttributes().add(Attributes.MOVEMENT_SPEED, 0.30000001192092896D).add(Attributes.ATTACK_DAMAGE, 8.0D).add(Attributes.MAX_HEALTH, 80.0D); } diff --git a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -index f5bb64f9f683cf21e772035e9be100ed2ddf8bc6..a27394f0188f643a602e126c484d0de440d19409 100644 +index f4002ac7cba7d5e41b4f11b98212c625f6a92a65..daac8d2ee377d960cac361e6977bcea4656b8d79 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -@@ -87,9 +87,27 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -92,9 +92,27 @@ public class EnderMan extends Monster implements NeutralMob { this.setPathfindingMalus(BlockPathTypes.WATER, -1.0F); } @@ -3472,7 +3495,7 @@ index f5bb64f9f683cf21e772035e9be100ed2ddf8bc6..a27394f0188f643a602e126c484d0de4 this.goalSelector.addGoal(1, new EnderMan.EndermanFreezeWhenLookedAt(this)); this.goalSelector.addGoal(2, new MeleeAttackGoal(this, 1.0D, false)); this.goalSelector.addGoal(7, new WaterAvoidingRandomStrollGoal(this, 1.0D, 0.0F)); -@@ -97,6 +115,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -102,6 +120,7 @@ public class EnderMan extends Monster implements NeutralMob { this.goalSelector.addGoal(8, new RandomLookAroundGoal(this)); this.goalSelector.addGoal(10, new EnderMan.EndermanLeaveBlockGoal(this)); this.goalSelector.addGoal(11, new EnderMan.EndermanTakeBlockGoal(this)); @@ -3480,7 +3503,7 @@ index f5bb64f9f683cf21e772035e9be100ed2ddf8bc6..a27394f0188f643a602e126c484d0de4 this.targetSelector.addGoal(1, new EnderMan.EndermanLookForPlayerGoal(this, this::isAngryAt)); this.targetSelector.addGoal(2, new HurtByTargetGoal(this, new Class[0])); this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, Endermite.class, true, false)); -@@ -278,7 +297,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -283,7 +302,7 @@ public class EnderMan extends Monster implements NeutralMob { @Override protected void customServerAiStep() { @@ -3489,7 +3512,7 @@ index f5bb64f9f683cf21e772035e9be100ed2ddf8bc6..a27394f0188f643a602e126c484d0de4 float f = this.getLightLevelDependentMagicValue(); if (f > 0.5F && this.level.canSeeSky(this.blockPosition()) && this.random.nextFloat() * 30.0F < (f - 0.4F) * 2.0F && this.tryEscape(com.destroystokyo.paper.event.entity.EndermanEscapeEvent.Reason.RUNAWAY)) { // Paper -@@ -388,6 +407,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -398,6 +417,7 @@ public class EnderMan extends Monster implements NeutralMob { public boolean hurt(DamageSource source, float amount) { if (this.isInvulnerableTo(source)) { return false; @@ -3536,7 +3559,7 @@ index e8c3972b889fd6b348a5b0d18444d28faa813879..9af512ac1147c7be9afeb2e1b767f345 this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); } diff --git a/src/main/java/net/minecraft/world/entity/monster/Evoker.java b/src/main/java/net/minecraft/world/entity/monster/Evoker.java -index 7f695625134ba55f85c54efddd049e167e0d1d8b..169a19b605a4b7edda0d1d04e83d9bb5ea554b99 100644 +index d16988e854c327e3c33b4c7c0d3546468526cfd0..13b81f03db31b9e5befe6f4618a0bb611bd69220 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Evoker.java +++ b/src/main/java/net/minecraft/world/entity/monster/Evoker.java @@ -48,10 +48,28 @@ public class Evoker extends SpellcasterIllager { @@ -4046,10 +4069,10 @@ index aa8734856ec7b90036afad13bfda46c02e548812..3ee0905bc4d054fef76e1f02e618f06f private class PhantomBodyRotationControl extends BodyRotationControl { diff --git a/src/main/java/net/minecraft/world/entity/monster/Pillager.java b/src/main/java/net/minecraft/world/entity/monster/Pillager.java -index 682beb556bbe2b74c0a08e780fa25dcb301c281c..e3e1743e4a8d6ddccdbd08351b3524e6e2bed38c 100644 +index cec545c3baa6599d47b9cf1a4b97de8771062a22..a12352cb50edd8bd7a8f514e714e352bb341c2f7 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Pillager.java +++ b/src/main/java/net/minecraft/world/entity/monster/Pillager.java -@@ -63,15 +63,34 @@ public class Pillager extends AbstractIllager implements CrossbowAttackMob, Inve +@@ -62,15 +62,34 @@ public class Pillager extends AbstractIllager implements CrossbowAttackMob, Inve super(type, world); } @@ -4138,10 +4161,10 @@ index 23cd2e1faf0d7b59885e194fc0f0adc558e4921b..c08c95198fb472ac2eb1e0cbf266f2e4 this.getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(0.0D); } else { diff --git a/src/main/java/net/minecraft/world/entity/monster/Shulker.java b/src/main/java/net/minecraft/world/entity/monster/Shulker.java -index 524eed4042c7a83eb8b4a0769a66330dd141261d..7db7e4ae2ad164dd622ab9b803a5e395dff08ea5 100644 +index 9dedb3599d5388c1bcc34558e8e5cb4a8668646f..2d31b78a9d27b3354b01eb957996a0477f457bec 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Shulker.java +++ b/src/main/java/net/minecraft/world/entity/monster/Shulker.java -@@ -92,12 +92,31 @@ public class Shulker extends AbstractGolem implements Enemy { +@@ -94,12 +94,31 @@ public class Shulker extends AbstractGolem implements VariantHolder(this, Player.class, true)); } diff --git a/src/main/java/net/minecraft/world/entity/monster/Skeleton.java b/src/main/java/net/minecraft/world/entity/monster/Skeleton.java -index 3a3f3358c4bbd16bdcadc56c6a865ecfb942ad54..e73644f453bed8523bfad47764018362a416b5ea 100644 +index badde621357a567965f0ef203e402e21bed09059..84d03d11d24e6c36a91be7a8e310e91a002370fe 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Skeleton.java +++ b/src/main/java/net/minecraft/world/entity/monster/Skeleton.java -@@ -25,6 +25,23 @@ public class Skeleton extends AbstractSkeleton { +@@ -26,6 +26,23 @@ public class Skeleton extends AbstractSkeleton { super(type, world); } @@ -4249,10 +4272,10 @@ index 3a3f3358c4bbd16bdcadc56c6a865ecfb942ad54..e73644f453bed8523bfad47764018362 protected void defineSynchedData() { super.defineSynchedData(); diff --git a/src/main/java/net/minecraft/world/entity/monster/Slime.java b/src/main/java/net/minecraft/world/entity/monster/Slime.java -index 7e85ad7ba31bbb32ea1e1dff5d1c83e7ce68b4b3..3ccf5083333751ee1eede1d3e1a28b6f7bf7f23c 100644 +index 87c2e50c6f817d1a77e0cfd64366765b265f9ba0..3de34f745609cfcb8039c72b0432966262918510 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Slime.java +++ b/src/main/java/net/minecraft/world/entity/monster/Slime.java -@@ -64,18 +64,55 @@ public class Slime extends Mob implements Enemy { +@@ -64,6 +64,7 @@ public class Slime extends Mob implements Enemy { public float squish; public float oSquish; private boolean wasOnGround; @@ -4260,6 +4283,7 @@ index 7e85ad7ba31bbb32ea1e1dff5d1c83e7ce68b4b3..3ccf5083333751ee1eede1d3e1a28b6f public Slime(EntityType type, Level world) { super(type, world); +@@ -71,12 +72,48 @@ public class Slime extends Mob implements Enemy { this.moveControl = new Slime.SlimeMoveControl(this); } @@ -4308,7 +4332,7 @@ index 7e85ad7ba31bbb32ea1e1dff5d1c83e7ce68b4b3..3ccf5083333751ee1eede1d3e1a28b6f this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Player.class, 10, true, false, (entityliving) -> { return Math.abs(entityliving.getY() - this.getY()) <= 4.0D; })); -@@ -366,11 +403,12 @@ public class Slime extends Mob implements Enemy { +@@ -368,11 +405,12 @@ public class Slime extends Mob implements Enemy { } @Override @@ -4322,7 +4346,7 @@ index 7e85ad7ba31bbb32ea1e1dff5d1c83e7ce68b4b3..3ccf5083333751ee1eede1d3e1a28b6f } @Nullable -@@ -404,7 +442,7 @@ public class Slime extends Mob implements Enemy { +@@ -406,7 +444,7 @@ public class Slime extends Mob implements Enemy { return super.getDimensions(pose).scale(0.255F * (float) this.getSize()); } @@ -4331,7 +4355,7 @@ index 7e85ad7ba31bbb32ea1e1dff5d1c83e7ce68b4b3..3ccf5083333751ee1eede1d3e1a28b6f private float yRot; private int jumpDelay; -@@ -423,21 +461,33 @@ public class Slime extends Mob implements Enemy { +@@ -425,21 +463,33 @@ public class Slime extends Mob implements Enemy { } public void setWantedMovement(double speed) { @@ -4368,7 +4392,7 @@ index 7e85ad7ba31bbb32ea1e1dff5d1c83e7ce68b4b3..3ccf5083333751ee1eede1d3e1a28b6f if (this.jumpDelay-- <= 0) { this.jumpDelay = this.slime.getJumpDelay(); if (this.isAggressive) { -@@ -454,7 +504,7 @@ public class Slime extends Mob implements Enemy { +@@ -456,7 +506,7 @@ public class Slime extends Mob implements Enemy { this.mob.setSpeed(0.0F); } } else { @@ -4378,7 +4402,7 @@ index 7e85ad7ba31bbb32ea1e1dff5d1c83e7ce68b4b3..3ccf5083333751ee1eede1d3e1a28b6f } diff --git a/src/main/java/net/minecraft/world/entity/monster/Spider.java b/src/main/java/net/minecraft/world/entity/monster/Spider.java -index c3085ad5410b41d9c7703b28ca835dbee3f49ee7..7e0e7d3247010c0008df355a5b44db9f55287fe6 100644 +index 001f6cf2ea3d664864f444a92dd71d069b9a38f5..74d70a2d63f527511fbf369f85abde864524c3c0 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Spider.java +++ b/src/main/java/net/minecraft/world/entity/monster/Spider.java @@ -51,14 +51,33 @@ public class Spider extends Monster { @@ -4444,7 +4468,7 @@ index 118b636a44e4b062e812e433f603b039276337da..5737b1b2c2882e67082e2c0243b192ac BlockPos blockPos = pos; diff --git a/src/main/java/net/minecraft/world/entity/monster/Strider.java b/src/main/java/net/minecraft/world/entity/monster/Strider.java -index 8ff4aa933b80eee45fbc1fdf6ce19110bef31b49..7bdb28de468681884f1cffdda207932ba0412a06 100644 +index 6a511394bb01e025d5e3cf3963618920eee74445..db8510eeb8ba3218b732d80bb69779a46a439462 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Strider.java +++ b/src/main/java/net/minecraft/world/entity/monster/Strider.java @@ -96,6 +96,23 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { @@ -4479,7 +4503,7 @@ index 8ff4aa933b80eee45fbc1fdf6ce19110bef31b49..7bdb28de468681884f1cffdda207932b this.goalSelector.addGoal(1, this.panicGoal); this.goalSelector.addGoal(2, new BreedGoal(this, 1.0D)); this.temptGoal = new TemptGoal(this, 1.4D, Strider.TEMPT_ITEMS, false); -@@ -439,7 +457,7 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { +@@ -440,7 +458,7 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { if (!enuminteractionresult.consumesAction()) { ItemStack itemstack = player.getItemInHand(hand); @@ -4489,10 +4513,10 @@ index 8ff4aa933b80eee45fbc1fdf6ce19110bef31b49..7bdb28de468681884f1cffdda207932b if (flag && !this.isSilent()) { this.level.playSound((Player) null, this.getX(), this.getY(), this.getZ(), SoundEvents.STRIDER_EAT, this.getSoundSource(), 1.0F, 1.0F + (this.random.nextFloat() - this.random.nextFloat()) * 0.2F); diff --git a/src/main/java/net/minecraft/world/entity/monster/Vex.java b/src/main/java/net/minecraft/world/entity/monster/Vex.java -index 78b1fb5e163cbe6b95ab39aa3b1b33da95c62cee..9bc60081a1d3f63f3b452ee5a8c8ae327f64b16e 100644 +index 8804771d73c2521d6dff284de3464fa5788e5ffc..cdfa94f8deeca5ab529e5027b0fdb3c072452582 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Vex.java +++ b/src/main/java/net/minecraft/world/entity/monster/Vex.java -@@ -59,6 +59,50 @@ public class Vex extends Monster { +@@ -62,6 +62,50 @@ public class Vex extends Monster { this.xpReward = 3; } @@ -4541,9 +4565,9 @@ index 78b1fb5e163cbe6b95ab39aa3b1b33da95c62cee..9bc60081a1d3f63f3b452ee5a8c8ae32 + // Purpur end + @Override - public boolean isFlapping() { - return this.tickCount % Vex.TICKS_PER_FLAP == 0; -@@ -72,7 +116,7 @@ public class Vex extends Monster { + protected float getStandingEyeHeight(Pose pose, EntityDimensions dimensions) { + return dimensions.height - 0.28125F; +@@ -80,7 +124,7 @@ public class Vex extends Monster { @Override public void tick() { @@ -4552,7 +4576,7 @@ index 78b1fb5e163cbe6b95ab39aa3b1b33da95c62cee..9bc60081a1d3f63f3b452ee5a8c8ae32 super.tick(); this.noPhysics = false; this.setNoGravity(true); -@@ -87,17 +131,19 @@ public class Vex extends Monster { +@@ -95,17 +139,19 @@ public class Vex extends Monster { protected void registerGoals() { super.registerGoals(); this.goalSelector.addGoal(0, new FloatGoal(this)); @@ -4573,8 +4597,8 @@ index 78b1fb5e163cbe6b95ab39aa3b1b33da95c62cee..9bc60081a1d3f63f3b452ee5a8c8ae32 } @Override -@@ -220,14 +266,14 @@ public class Vex extends Monster { - this.setDropChance(EquipmentSlot.MAINHAND, 0.0F); +@@ -233,14 +279,14 @@ public class Vex extends Monster { + return 0.4D; } - private class VexMoveControl extends MoveControl { @@ -4590,7 +4614,7 @@ index 78b1fb5e163cbe6b95ab39aa3b1b33da95c62cee..9bc60081a1d3f63f3b452ee5a8c8ae32 if (this.operation == MoveControl.Operation.MOVE_TO) { Vec3 vec3d = new Vec3(this.wantedX - Vex.this.getX(), this.wantedY - Vex.this.getY(), this.wantedZ - Vex.this.getZ()); double d0 = vec3d.length(); -@@ -236,7 +282,7 @@ public class Vex extends Monster { +@@ -249,7 +295,7 @@ public class Vex extends Monster { this.operation = MoveControl.Operation.WAIT; Vex.this.setDeltaMovement(Vex.this.getDeltaMovement().scale(0.5D)); } else { @@ -4707,10 +4731,10 @@ index 6449213d717271bcc516e393a78dfe1e5c762d68..3b272b5653c6e7672f16eb35314c6899 protected void registerGoals() { this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractPiglin.class, true)); diff --git a/src/main/java/net/minecraft/world/entity/monster/Zoglin.java b/src/main/java/net/minecraft/world/entity/monster/Zoglin.java -index 1fb11985dcfd07ded1f7cadf3fdba7d23ca4f87b..9970c2c09b294e601b7cda4f1e8cbf2aed13b0dc 100644 +index 0ca82175ec91ca8b3418c0931682c972666c47f8..9314af7daf2522c05358a98103780ab1716d2418 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zoglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zoglin.java -@@ -68,6 +68,23 @@ public class Zoglin extends Monster implements Enemy, HoglinBase { +@@ -67,6 +67,23 @@ public class Zoglin extends Monster implements Enemy, HoglinBase { this.xpReward = 5; } @@ -4734,7 +4758,7 @@ index 1fb11985dcfd07ded1f7cadf3fdba7d23ca4f87b..9970c2c09b294e601b7cda4f1e8cbf2a @Override protected Brain.Provider brainProvider() { return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); -@@ -200,6 +217,7 @@ public class Zoglin extends Monster implements Enemy, HoglinBase { +@@ -199,6 +216,7 @@ public class Zoglin extends Monster implements Enemy, HoglinBase { @Override protected void customServerAiStep() { this.level.getProfiler().push("zoglinBrain"); @@ -4743,10 +4767,10 @@ index 1fb11985dcfd07ded1f7cadf3fdba7d23ca4f87b..9970c2c09b294e601b7cda4f1e8cbf2a this.level.getProfiler().pop(); this.updateActivity(); diff --git a/src/main/java/net/minecraft/world/entity/monster/Zombie.java b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -index e0e16d3b4ba0afc3cfc66b93ecf5f889599f48dd..2040da30822f6f24f6de96bd47f2f8cb4cd2a266 100644 +index 9976205537cfe228735687f1e9c52c74ac025690..c7aa68cc7d8403a7dedf445fda30e6ee709f463d 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zombie.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -@@ -105,11 +105,30 @@ public class Zombie extends Monster { +@@ -106,11 +106,30 @@ public class Zombie extends Monster { this(EntityType.ZOMBIE, world); } @@ -4778,10 +4802,10 @@ index e0e16d3b4ba0afc3cfc66b93ecf5f889599f48dd..2040da30822f6f24f6de96bd47f2f8cb } diff --git a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java -index d1f7d912ad274cf90a912e44d63b39f9387a694b..179fe7f6f4f2305f8e07106f0d7151cd8d69a959 100644 +index 71a36cf9b976443cca9ab63cd0eb23253f638562..09fa0b71bd9b207eba3f0e7ac104ccef9dac1cc8 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java -@@ -78,6 +78,23 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { +@@ -79,6 +79,23 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { }); } @@ -4806,10 +4830,10 @@ index d1f7d912ad274cf90a912e44d63b39f9387a694b..179fe7f6f4f2305f8e07106f0d7151cd protected void defineSynchedData() { super.defineSynchedData(); diff --git a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java -index d0567234d1261227d29bb254f959604dc91b3c72..cf9f43d1205453af88ffdc2e96fe4376ecd45fbf 100644 +index b75945807b425609394c343da56c316a769f0a29..838420f5d61eaf5e4abb52751b010d57def21d6f 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java -@@ -59,6 +59,23 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { +@@ -63,6 +63,23 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { this.setPathfindingMalus(BlockPathTypes.LAVA, 8.0F); } @@ -4834,7 +4858,7 @@ index d0567234d1261227d29bb254f959604dc91b3c72..cf9f43d1205453af88ffdc2e96fe4376 public void setPersistentAngerTarget(@Nullable UUID angryAt) { this.persistentAngerTarget = angryAt; diff --git a/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java b/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java -index 5d487f1613b1fc5807283c20e5cc23a432d08f42..f2afd5f8ad916f0cf4674c6b4f973715999c6641 100644 +index 45741410a13cffe3419e34b5607b048bbcf1c3ff..0a63ee3a292111143104f764e01cabbc4c2100ba 100644 --- a/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java @@ -67,6 +67,23 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { @@ -4861,20 +4885,19 @@ index 5d487f1613b1fc5807283c20e5cc23a432d08f42..f2afd5f8ad916f0cf4674c6b4f973715 @Override public boolean canBeLeashed(Player player) { return !this.isLeashed(); -@@ -130,7 +147,7 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { +@@ -129,6 +146,7 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { @Override protected void customServerAiStep() { this.level.getProfiler().push("hoglinBrain"); -- if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish -+ if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider ++ if (getRider() == null || !this.isControllable()) // Purpur - only use brain if no rider this.getBrain().tick((ServerLevel)this.level, this); this.level.getProfiler().pop(); HoglinAi.updateActivity(this); diff --git a/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java b/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java -index 23547da37a4178a32775285a1d697c369a7ffcd2..e7b3be1e2f36e962239095e81f865792a61aedc9 100644 +index afa7ecfa8453da510ec5ccecb1ceeb1d9893d259..0b6f4460f29e4b04c715eceba0d7fbda0b08c037 100644 --- a/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java -@@ -95,6 +95,23 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento +@@ -97,6 +97,23 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento this.xpReward = 5; } @@ -4898,12 +4921,11 @@ index 23547da37a4178a32775285a1d697c369a7ffcd2..e7b3be1e2f36e962239095e81f865792 @Override public void addAdditionalSaveData(CompoundTag nbt) { super.addAdditionalSaveData(nbt); -@@ -293,7 +310,7 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento +@@ -311,6 +328,7 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento @Override protected void customServerAiStep() { this.level.getProfiler().push("piglinBrain"); -- if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish -+ if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider ++ if (getRider() == null || !this.isControllable()) // Purpur - only use brain if no rider this.getBrain().tick((ServerLevel) this.level, this); this.level.getProfiler().pop(); PiglinAi.updateActivity(this); @@ -4944,7 +4966,7 @@ index 769e4fbaac01a4fe3a45bd9cab5c63b61fc69f53..ff149234a8f3e1c94961e41d5bc81174 this.level.getProfiler().pop(); PiglinBruteAi.updateActivity(this); diff --git a/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java b/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java -index b3158b1a7772f1254dd081ff6d3278a92192e896..df55f9a9f684b474a3bff0977069471727b242f4 100644 +index 1ae7408048f951cb94d7cfbea60efc5567b1af84..98176fde2760ab1d85d0b5afc1fd776487eef5e0 100644 --- a/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java +++ b/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java @@ -120,8 +120,32 @@ public class Warden extends Monster implements VibrationListener.VibrationListen @@ -4978,9 +5000,9 @@ index b3158b1a7772f1254dd081ff6d3278a92192e896..df55f9a9f684b474a3bff09770694717 + // Purpur end + @Override - public Packet getAddEntityPacket() { + public Packet getAddEntityPacket() { return new ClientboundAddEntityPacket(this, this.hasPose(Pose.EMERGING) ? 1 : 0); -@@ -405,19 +429,16 @@ public class Warden extends Monster implements VibrationListener.VibrationListen +@@ -403,19 +427,16 @@ public class Warden extends Monster implements VibrationListener.VibrationListen @Contract("null->false") public boolean canTargetEntity(@Nullable Entity entity) { @@ -5004,10 +5026,10 @@ index b3158b1a7772f1254dd081ff6d3278a92192e896..df55f9a9f684b474a3bff09770694717 public static void applyDarknessAround(ServerLevel world, Vec3 pos, @Nullable Entity entity, int range) { diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java -index fa7cede4a0b59efde4949dba4a010aed5cd0a960..b5033df0db18ef54077cead642e81715ffb8acc9 100644 +index 18eac340386a396c9850f53f30d20a41c1437788..a9be652ff5960f233d95bad98900c63c203473c4 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java -@@ -155,6 +155,28 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -153,6 +153,28 @@ public class Villager extends AbstractVillager implements ReputationEventHandler this.setVillagerData(this.getVillagerData().setType(type).setProfession(VillagerProfession.NONE)); } @@ -5036,16 +5058,16 @@ index fa7cede4a0b59efde4949dba4a010aed5cd0a960..b5033df0db18ef54077cead642e81715 @Override public Brain getBrain() { return (Brain) super.getBrain(); // CraftBukkit - decompile error -@@ -252,7 +274,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -247,7 +269,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler + protected void customServerAiStep() { mobTick(false); } + protected void mobTick(boolean inactive) { this.level.getProfiler().push("villagerBrain"); - // Pufferfish start - if (!inactive) { -- if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish -+ if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider - this.getBrain().tick((ServerLevel) this.level, this); // Paper - } - // Pufferfish end -@@ -312,7 +334,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +- if (!inactive) this.getBrain().tick((ServerLevel) this.level, this); // Paper ++ if (!inactive && (getRider() == null || !this.isControllable())) this.getBrain().tick((ServerLevel) this.level, this); // Paper // Purpur - only use brain if no rider + this.level.getProfiler().pop(); + if (this.assignProfessionWhenSpawned) { + this.assignProfessionWhenSpawned = false; +@@ -304,7 +326,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler if (!itemstack.is(Items.VILLAGER_SPAWN_EGG) && this.isAlive() && !this.isTrading() && !this.isSleeping()) { if (this.isBaby()) { this.setUnhappy(); @@ -5054,7 +5076,7 @@ index fa7cede4a0b59efde4949dba4a010aed5cd0a960..b5033df0db18ef54077cead642e81715 } else { boolean flag = this.getOffers().isEmpty(); -@@ -325,8 +347,9 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -317,8 +339,9 @@ public class Villager extends AbstractVillager implements ReputationEventHandler } if (flag) { @@ -5066,11 +5088,11 @@ index fa7cede4a0b59efde4949dba4a010aed5cd0a960..b5033df0db18ef54077cead642e81715 this.startTrading(player); } diff --git a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java -index 8a4107067938f7ca990a7edd1e271d57cfdb0545..204567f3ce802a0f757d7270b046f905641b0cfb 100644 +index e92e6fb4cf97f4d5406b5b5d5786bfa5fb55f536..0e7d5540763d56020cd59d9aef09f7a7d2cde1b1 100644 --- a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java +++ b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java @@ -66,6 +66,23 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill - //this.setDespawnDelay(48000); // CraftBukkit - set default from MobSpawnerTrader // Paper - move back to MobSpawnerTrader - Vanilla behavior is that only traders spawned by it have this value set. + this.setDespawnDelay(48000); // CraftBukkit - set default from MobSpawnerTrader } + // Purpur - start @@ -5105,10 +5127,10 @@ index 8a4107067938f7ca990a7edd1e271d57cfdb0545..204567f3ce802a0f757d7270b046f905 this.setTradingPlayer(player); this.openTradingScreen(player, this.getDisplayName(), 1); diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java -index 0ea101f155936f7c340d9e1d1077c58b72551027..b7e62e74f3f9c65cb6bca5130b2ae73b2c1fb939 100644 +index 2e6557a19523d18aecff709de30cb4466b46a9fa..0e96ae9381abbf65182a04df28be94709ef66bb3 100644 --- a/src/main/java/net/minecraft/world/entity/player/Player.java +++ b/src/main/java/net/minecraft/world/entity/player/Player.java -@@ -198,6 +198,19 @@ public abstract class Player extends LivingEntity { +@@ -193,6 +193,19 @@ public abstract class Player extends LivingEntity { } // CraftBukkit end @@ -5125,7 +5147,7 @@ index 0ea101f155936f7c340d9e1d1077c58b72551027..b7e62e74f3f9c65cb6bca5130b2ae73b + } + // Purpur end + - public Player(Level world, BlockPos pos, float yaw, GameProfile gameProfile, @Nullable ProfilePublicKey publicKey) { + public Player(Level world, BlockPos pos, float yaw, GameProfile gameProfile) { super(EntityType.PLAYER, world); this.lastItemInMainHand = ItemStack.EMPTY; diff --git a/src/main/java/net/minecraft/world/entity/projectile/LlamaSpit.java b/src/main/java/net/minecraft/world/entity/projectile/LlamaSpit.java @@ -5146,10 +5168,10 @@ index 4132c1113f5437a776e5e3c1cb306904775aed88..1a945a32c3d3705a318ebca72a365931 public void tick() { super.tick(); diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java -index 01132b10799034232e7e5cbb460d848601e04012..32169b7dbfe95bdc5ded6d64524e015f1b939e7a 100644 +index 6cd6cb256bde958416a0e4b13fc1d3df74f230fd..3ac836bd6fccf66771dc0141b9b6a25da9837211 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java -@@ -1390,4 +1390,27 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { +@@ -1392,4 +1392,27 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { return !this.getHandle().level.noCollision(this.getHandle(), aabb); } // Paper End - Collision API @@ -5178,7 +5200,7 @@ index 01132b10799034232e7e5cbb460d848601e04012..32169b7dbfe95bdc5ded6d64524e015f + // Purpur end } diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java -index 03b3f29bde2bf6cb4e7b08a775bcc380a9404543..1c4643e1bff41b5bce92c07c59b1c6fea16d0d43 100644 +index ae59a1259db4c4cef6f0cd128850229a63491845..b53d824bc0f964349e70097285700e5facd3bcdf 100644 --- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java @@ -544,6 +544,15 @@ public class CraftEventFactory { @@ -5222,7 +5244,7 @@ index 03b3f29bde2bf6cb4e7b08a775bcc380a9404543..1c4643e1bff41b5bce92c07c59b1c6fe event = new EntityDamageEvent(damagee.getBukkitEntity(), cause, modifiers, modifierFunctions); } diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -index f05a9d7542c9c1b6c67c5328215c0926a50bf806..1c969433099b5b0f4f6f946291baea3e28722f9f 100644 +index 3fc92f92138d8223e18461758f5fe372b6552480..1da5e898ea5862dd5d1b1d3496132bf8f23caec7 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java @@ -172,4 +172,9 @@ public class PurpurConfig { @@ -5236,7 +5258,7 @@ index f05a9d7542c9c1b6c67c5328215c0926a50bf806..1c969433099b5b0f4f6f946291baea3e + } } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index b1628149a2f3effebbf86fd5615f1c8c1d0fbe73..c2e8eb6b25b21ea3238c5df180e4deb8d59ab5b2 100644 +index efbbe97d29561fa456b40292328eed89650f4322..a258de586a26c43f0316468f0a49e2da94b690da 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -92,4 +92,706 @@ public class PurpurWorldConfig { diff --git a/patches/server/0009-Configurable-entity-base-attributes.patch b/patches/server/0007-Configurable-entity-base-attributes.patch similarity index 94% rename from patches/server/0009-Configurable-entity-base-attributes.patch rename to patches/server/0007-Configurable-entity-base-attributes.patch index 8f108f2ec..1e6c2fcf6 100644 --- a/patches/server/0009-Configurable-entity-base-attributes.patch +++ b/patches/server/0007-Configurable-entity-base-attributes.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Configurable entity base attributes diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 810e0b92e2090c18806297b8c29d4e539ddde68e..b32ce5c62c1a700ee612c4c2177c068e8a2f9f53 100644 +index 3f2813e32a1ea011f760d2df454b8875f32a42f3..d032e666b9738a5e3c7afff3d3597b003d0aa1e7 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -155,7 +155,7 @@ import org.bukkit.plugin.PluginManager; @@ -34,10 +34,10 @@ index 882ab40c8cdea8c214cb8344b3ccecddb2967c1c..cb79d2c958fbd34f8c8818e7e1c0db88 @Override diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 6e626aab5c90100de969125c28c12d8d02e68ea0..86dfb5537f1da7f1e2b8e9bfeb43111b0ac16228 100644 +index 1e75f62ff6bd83f6007090dde5ce521fb6bd5247..10e7c382e3e25ede3452b02af0e4d538e9403061 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -289,6 +289,7 @@ public abstract class LivingEntity extends Entity { +@@ -291,6 +291,7 @@ public abstract class LivingEntity extends Entity { this.useItem = ItemStack.EMPTY; this.lastClimbablePos = Optional.empty(); this.attributes = new AttributeMap(DefaultAttributes.getSupplier(type), this); // Purpur @@ -45,7 +45,7 @@ index 6e626aab5c90100de969125c28c12d8d02e68ea0..86dfb5537f1da7f1e2b8e9bfeb43111b this.craftAttributes = new CraftAttributeMap(this.attributes); // CraftBukkit // CraftBukkit - setHealth(getMaxHealth()) inlined and simplified to skip the instanceof check for EntityPlayer, as getBukkitEntity() is not initialized in constructor this.entityData.set(LivingEntity.DATA_HEALTH_ID, (float) this.getAttribute(Attributes.MAX_HEALTH).getValue()); -@@ -304,6 +305,8 @@ public abstract class LivingEntity extends Entity { +@@ -306,6 +307,8 @@ public abstract class LivingEntity extends Entity { this.brain = this.makeBrain(new Dynamic(dynamicopsnbt, (Tag) dynamicopsnbt.createMap((Map) ImmutableMap.of(dynamicopsnbt.createString("memories"), (Tag) dynamicopsnbt.emptyMap())))); } @@ -55,10 +55,10 @@ index 6e626aab5c90100de969125c28c12d8d02e68ea0..86dfb5537f1da7f1e2b8e9bfeb43111b return this.brain; } diff --git a/src/main/java/net/minecraft/world/entity/ambient/Bat.java b/src/main/java/net/minecraft/world/entity/ambient/Bat.java -index 794bd646fda0d7f2c71b10b8a74880fcdf813d22..6a702b0dfd5e40d9f7abbbbf55c286492755e07c 100644 +index b2b490961ee47d4cfbac0d438dba91eec658ead5..a13d3ba5e7dff532fccfaf697e69815e427d4c96 100644 --- a/src/main/java/net/minecraft/world/entity/ambient/Bat.java +++ b/src/main/java/net/minecraft/world/entity/ambient/Bat.java -@@ -90,6 +90,18 @@ public class Bat extends AmbientCreature { +@@ -93,6 +93,18 @@ public class Bat extends AmbientCreature { setDeltaMovement(mot.scale(0.9D)); } } @@ -78,7 +78,7 @@ index 794bd646fda0d7f2c71b10b8a74880fcdf813d22..6a702b0dfd5e40d9f7abbbbf55c28649 @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/Bee.java b/src/main/java/net/minecraft/world/entity/animal/Bee.java -index 0e3e9c9652da69a66d372173d256e3ca2f1e75f7..7f57a591172708d5cebbd88335ca60d8972bfb0e 100644 +index 16d6b0881746ade2113e2dc7977e7468abde352f..3827d7910b4f615254e321b99e6d5fc795de74ef 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Bee.java +++ b/src/main/java/net/minecraft/world/entity/animal/Bee.java @@ -214,6 +214,11 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { @@ -94,10 +94,10 @@ index 0e3e9c9652da69a66d372173d256e3ca2f1e75f7..7f57a591172708d5cebbd88335ca60d8 @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/Cat.java b/src/main/java/net/minecraft/world/entity/animal/Cat.java -index e163851c02e38c294d95dbabafd4903b8846b551..413205e8214b87f022dda5eeb1eeca3794dcd6ce 100644 +index a13de1a2f2b5a4e6e9a6d8de1de220578f2c623f..43fa6caafabaa09091b6770d88dff7927e75bac9 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cat.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cat.java -@@ -118,6 +118,11 @@ public class Cat extends TamableAnimal { +@@ -119,6 +119,11 @@ public class Cat extends TamableAnimal implements VariantHolder { setLying(false); setRelaxStateOne(false); } @@ -110,10 +110,10 @@ index e163851c02e38c294d95dbabafd4903b8846b551..413205e8214b87f022dda5eeb1eeca37 public ResourceLocation getResourceLocation() { diff --git a/src/main/java/net/minecraft/world/entity/animal/Chicken.java b/src/main/java/net/minecraft/world/entity/animal/Chicken.java -index 58c1102b483ccdddb74023959b9234bcd2af6548..8503a3393026134df18601ed87dcec1f3e6680b8 100644 +index 9494383f1e370964f3e32cf8d6afc03e045320d4..e4200b09f54861d61c9dae40e6883aa19265e295 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Chicken.java +++ b/src/main/java/net/minecraft/world/entity/animal/Chicken.java -@@ -68,6 +68,11 @@ public class Chicken extends Animal { +@@ -69,6 +69,11 @@ public class Chicken extends Animal { public boolean isControllable() { return level.purpurConfig.chickenControllable; } @@ -142,10 +142,10 @@ index 545ef4ab037b3173cc7377ad8147a44a2050d56f..861727f150f28a508d3b1c7067d410f0 @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/Cow.java b/src/main/java/net/minecraft/world/entity/animal/Cow.java -index eccb4af0aba930b04763303e38620700fc991184..b6af466d454ca7d4c0277d2d1db0e23b50677418 100644 +index 04356c2a3f64842582e7a637afb3f77a7920bd63..7eecdb4be5ee7de39ccb86b4bfe98491f8cba9b6 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cow.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cow.java -@@ -55,6 +55,11 @@ public class Cow extends Animal { +@@ -56,6 +56,11 @@ public class Cow extends Animal { public boolean isControllable() { return level.purpurConfig.cowControllable; } @@ -174,10 +174,10 @@ index 7343f6fa6c29d4029cc35e173e5d701efd7f57c6..1ca3ffe212da2c3914c290172e729ba8 @Nullable diff --git a/src/main/java/net/minecraft/world/entity/animal/Fox.java b/src/main/java/net/minecraft/world/entity/animal/Fox.java -index 6b3413593fd68d5e4f97bd7fe9454496ace94287..1f714f980bad7dcdeb361366a2d65c5a9f831a2c 100644 +index 9c3a62540a7c78615081d25af9590060dc9d5e12..4f10430e55d634b4e4bf74582a8032cc42938c7f 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Fox.java +++ b/src/main/java/net/minecraft/world/entity/animal/Fox.java -@@ -176,6 +176,11 @@ public class Fox extends Animal { +@@ -176,6 +176,11 @@ public class Fox extends Animal implements VariantHolder { super.onDismount(rider); setCanPickUpLoot(true); } @@ -206,10 +206,10 @@ index bdd7d46781598fd54e65d9df1efe790579f94c24..4003e4f4128f14e0dffa666ed8f4447a @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java -index 2bc451088a69fb56ff6a6274d4f91cc1ceed2f9c..763a254d820cff3c776570248b9e905c052dd447 100644 +index 38908fd222816efd8c9ae94b6947599b6c301422..19bd997d421a338966fcd3e3dfeb8669a6fb542f 100644 --- a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java +++ b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java -@@ -79,6 +79,11 @@ public class MushroomCow extends Cow implements Shearable { +@@ -78,6 +78,11 @@ public class MushroomCow extends Cow implements Shearable, VariantHolder { } wasOnGround = onGround; } @@ -363,7 +363,7 @@ index 59cb21bc3166f4cc77b962c253ed786fd04090de..3873fb0e2d95973397f9a23dc363f7a6 @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/Sheep.java b/src/main/java/net/minecraft/world/entity/animal/Sheep.java -index 15b2677018abc5047ddedaaf2b640de8dd1966ae..2368c807e9c7146c186654a390e23af99addb804 100644 +index 0be5aaa76997063d2c8df5547e01260e11c08f7a..c64e86aeafad1785a28e7351f16afef749a0851d 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Sheep.java +++ b/src/main/java/net/minecraft/world/entity/animal/Sheep.java @@ -131,6 +131,11 @@ public class Sheep extends Animal implements Shearable { @@ -411,10 +411,10 @@ index 30687391baacd693fa3bb9e3efbd492d4e4d32c8..99248a9e2769a573839b199150da312d @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java b/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java -index cac2845978b9beebb4e1ed6fed3eb33a698bc545..e439f0e24851697e663f783edf643d5b1602a0ff 100644 +index 7df3ee0f4b1a467d95f3eade65c0846b8a2e6337..62f44f830e5b924776d47b3ac36de4166d2e13f7 100644 --- a/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java +++ b/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java -@@ -64,6 +64,11 @@ public class TropicalFish extends AbstractSchoolingFish { +@@ -57,6 +57,11 @@ public class TropicalFish extends AbstractSchoolingFish implements VariantHolder public boolean isControllable() { return level.purpurConfig.tropicalFishControllable; } @@ -427,7 +427,7 @@ index cac2845978b9beebb4e1ed6fed3eb33a698bc545..e439f0e24851697e663f783edf643d5b public static String getPredefinedName(int variant) { diff --git a/src/main/java/net/minecraft/world/entity/animal/Turtle.java b/src/main/java/net/minecraft/world/entity/animal/Turtle.java -index ec095421e4928489a4bebfbb212f1795b57341fc..2aede66752b78036a6bd9eb7719f97766a030301 100644 +index 1d188320b10a640e4667b775e996b4fcdd5a1e73..8c4e0e7fc3a0d2924b910b637748e6e1c23809ce 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Turtle.java +++ b/src/main/java/net/minecraft/world/entity/animal/Turtle.java @@ -97,6 +97,11 @@ public class Turtle extends Animal { @@ -443,7 +443,7 @@ index ec095421e4928489a4bebfbb212f1795b57341fc..2aede66752b78036a6bd9eb7719f9776 public void setHomePos(BlockPos pos) { diff --git a/src/main/java/net/minecraft/world/entity/animal/Wolf.java b/src/main/java/net/minecraft/world/entity/animal/Wolf.java -index 248531727dcafb71d7d2d2767205e09a8c0f1876..01c8508571a88c22359cbf36341338c5497e4d45 100644 +index b9c692a2f42976eb459ed6a4078dca28eddeb459..5f37b335dded41fdd122e8e0677c2c45b7d4ebf1 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Wolf.java +++ b/src/main/java/net/minecraft/world/entity/animal/Wolf.java @@ -122,6 +122,11 @@ public class Wolf extends TamableAnimal implements NeutralMob { @@ -459,10 +459,10 @@ index 248531727dcafb71d7d2d2767205e09a8c0f1876..01c8508571a88c22359cbf36341338c5 @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java b/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java -index 3b576e8944bcef78f5769ccd90591f2db4dfd697..ad6a87ba97138253db2b300dec8a89faff38f075 100644 +index 682c69ea9cdcc1ab9fd19e28eef410ecf27bf9f3..d058f212b226b1f5efa0ba3650381e6c32a6fdac 100644 --- a/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java +++ b/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java -@@ -117,6 +117,11 @@ public class Axolotl extends Animal implements LerpingModel, Bucketable { +@@ -118,6 +118,11 @@ public class Axolotl extends Animal implements LerpingModel, VariantHolder { public boolean rideableUnderWater() { return level.purpurConfig.horseRidableInWater; } @@ -589,10 +589,10 @@ index f711ea32db68fb7aece5081e741c4e161123467f..390f630462c907cd6e961c6ca432804e @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java -index 5db0ed6cc982a276284be50d87e2125921b5d5d6..8e3b091130d33c6ec113f50930af25642ae54cc0 100644 +index 419c458f15fb421c5cd6df98b8e74391915d647d..3de18e1389559678b229a334fb98946810c3f214 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java -@@ -115,6 +115,21 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { +@@ -120,6 +120,21 @@ public class Llama extends AbstractChestedHorse implements VariantHolder type, ServerLevelAccessor world, MobSpawnType spawnReason, BlockPos pos, RandomSource random) { diff --git a/src/main/java/net/minecraft/world/entity/monster/Strider.java b/src/main/java/net/minecraft/world/entity/monster/Strider.java -index 7bdb28de468681884f1cffdda207932ba0412a06..c252a8f04fefbf50a8065026ace02e532ff6e307 100644 +index db8510eeb8ba3218b732d80bb69779a46a439462..ddd4c66193cf6553bdb8f5206e17731a529d0f9e 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Strider.java +++ b/src/main/java/net/minecraft/world/entity/monster/Strider.java @@ -111,6 +111,11 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { @@ -1233,10 +1233,10 @@ index 7bdb28de468681884f1cffdda207932ba0412a06..c252a8f04fefbf50a8065026ace02e53 public static boolean checkStriderSpawnRules(EntityType type, LevelAccessor world, MobSpawnType spawnReason, BlockPos pos, RandomSource random) { diff --git a/src/main/java/net/minecraft/world/entity/monster/Vex.java b/src/main/java/net/minecraft/world/entity/monster/Vex.java -index 9bc60081a1d3f63f3b452ee5a8c8ae327f64b16e..cad3d3741460c21da2e163ed9ec6ba7894ab2712 100644 +index cdfa94f8deeca5ab529e5027b0fdb3c072452582..929b8b2320c8a5b13f5a63bd966af1d0ee8de754 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Vex.java +++ b/src/main/java/net/minecraft/world/entity/monster/Vex.java -@@ -101,6 +101,11 @@ public class Vex extends Monster { +@@ -104,6 +104,11 @@ public class Vex extends Monster { public boolean causeFallDamage(float fallDistance, float damageMultiplier, DamageSource damageSource) { return false; // no fall damage please } @@ -1297,10 +1297,10 @@ index 3b272b5653c6e7672f16eb35314c689910c14250..b374069a1e88db67a56d6d5f9e05318c @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/Zoglin.java b/src/main/java/net/minecraft/world/entity/monster/Zoglin.java -index 9970c2c09b294e601b7cda4f1e8cbf2aed13b0dc..6236a557d2a73dff70141140f79faf851a2062f0 100644 +index 9314af7daf2522c05358a98103780ab1716d2418..1f4317160ca8b628640142a110d93ceb1c4ec421 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zoglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zoglin.java -@@ -83,6 +83,11 @@ public class Zoglin extends Monster implements Enemy, HoglinBase { +@@ -82,6 +82,11 @@ public class Zoglin extends Monster implements Enemy, HoglinBase { public boolean isControllable() { return level.purpurConfig.zoglinControllable; } @@ -1313,10 +1313,10 @@ index 9970c2c09b294e601b7cda4f1e8cbf2aed13b0dc..6236a557d2a73dff70141140f79faf85 @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/Zombie.java b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -index 2040da30822f6f24f6de96bd47f2f8cb4cd2a266..7582f5bf8915af14afe4459fe258e4adcfd35346 100644 +index c7aa68cc7d8403a7dedf445fda30e6ee709f463d..62f607a3d34511a7f3b90739265ea1b825b517de 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zombie.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -@@ -120,6 +120,11 @@ public class Zombie extends Monster { +@@ -121,6 +121,11 @@ public class Zombie extends Monster { public boolean isControllable() { return level.purpurConfig.zombieControllable; } @@ -1328,7 +1328,7 @@ index 2040da30822f6f24f6de96bd47f2f8cb4cd2a266..7582f5bf8915af14afe4459fe258e4ad // Purpur end @Override -@@ -606,7 +611,7 @@ public class Zombie extends Monster { +@@ -614,7 +619,7 @@ public class Zombie extends Monster { } protected void randomizeReinforcementsChance() { @@ -1338,10 +1338,10 @@ index 2040da30822f6f24f6de96bd47f2f8cb4cd2a266..7582f5bf8915af14afe4459fe258e4ad @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java -index 179fe7f6f4f2305f8e07106f0d7151cd8d69a959..a45f743526ff0894cc730f0e9ff393fb27703d9a 100644 +index 09fa0b71bd9b207eba3f0e7ac104ccef9dac1cc8..5bd562ce81955ea8c75e08f69d4a033040a6c679 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java -@@ -93,6 +93,16 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { +@@ -94,6 +94,16 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { public boolean isControllable() { return level.purpurConfig.zombieVillagerControllable; } @@ -1359,10 +1359,10 @@ index 179fe7f6f4f2305f8e07106f0d7151cd8d69a959..a45f743526ff0894cc730f0e9ff393fb @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java -index cf9f43d1205453af88ffdc2e96fe4376ecd45fbf..bc3ffb8867d5f7c2fa548d31256341d388bf8112 100644 +index 838420f5d61eaf5e4abb52751b010d57def21d6f..aca84be04c50188612f69ee20e9a0948fe5e5b7f 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java -@@ -74,6 +74,11 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { +@@ -78,6 +78,11 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { public boolean isControllable() { return level.purpurConfig.zombifiedPiglinControllable; } @@ -1374,7 +1374,7 @@ index cf9f43d1205453af88ffdc2e96fe4376ecd45fbf..bc3ffb8867d5f7c2fa548d31256341d3 // Purpur end @Override -@@ -258,7 +263,7 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { +@@ -267,7 +272,7 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { @Override protected void randomizeReinforcementsChance() { @@ -1384,7 +1384,7 @@ index cf9f43d1205453af88ffdc2e96fe4376ecd45fbf..bc3ffb8867d5f7c2fa548d31256341d3 @Nullable diff --git a/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java b/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java -index f2afd5f8ad916f0cf4674c6b4f973715999c6641..e99ffbf30652e188e88f8e17ed41d39ff25c9f73 100644 +index 0a63ee3a292111143104f764e01cabbc4c2100ba..2d06a3ac4a5763cf948fc578ff5320c22c01c219 100644 --- a/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java @@ -82,6 +82,11 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { @@ -1400,10 +1400,10 @@ index f2afd5f8ad916f0cf4674c6b4f973715999c6641..e99ffbf30652e188e88f8e17ed41d39f @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java b/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java -index e7b3be1e2f36e962239095e81f865792a61aedc9..75fcb651cae925ce5cb0b577a8dc39d71845aa4d 100644 +index 0b6f4460f29e4b04c715eceba0d7fbda0b08c037..272a744ca52c34b5868b7979fa2b4143eeee1084 100644 --- a/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java -@@ -110,6 +110,11 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento +@@ -112,6 +112,11 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento public boolean isControllable() { return level.purpurConfig.piglinControllable; } @@ -1432,10 +1432,10 @@ index ff149234a8f3e1c94961e41d5bc8117460b301d9..75db61c5aab66234b26f7899229ddca8 public static AttributeSupplier.Builder createAttributes() { diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java -index b5033df0db18ef54077cead642e81715ffb8acc9..8127b5175ec2ba06fa4127be85978625bb74e53e 100644 +index a9be652ff5960f233d95bad98900c63c203473c4..6a3c265502b3f7e6500056f6070c762a4c034d47 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java -@@ -175,6 +175,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -173,6 +173,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler protected void registerGoals() { this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); } @@ -1448,7 +1448,7 @@ index b5033df0db18ef54077cead642e81715ffb8acc9..8127b5175ec2ba06fa4127be85978625 @Override diff --git a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java -index 204567f3ce802a0f757d7270b046f905641b0cfb..f730005269717d805fbcee832a1471c490605684 100644 +index 0e7d5540763d56020cd59d9aef09f7a7d2cde1b1..7502940882edea11842b09de57094af37a7d62f9 100644 --- a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java +++ b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java @@ -81,6 +81,11 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill diff --git a/patches/server/0010-Barrels-and-enderchests-6-rows.patch b/patches/server/0008-Barrels-and-enderchests-6-rows.patch similarity index 95% rename from patches/server/0010-Barrels-and-enderchests-6-rows.patch rename to patches/server/0008-Barrels-and-enderchests-6-rows.patch index 5699a7949..f4c44dc47 100644 --- a/patches/server/0010-Barrels-and-enderchests-6-rows.patch +++ b/patches/server/0008-Barrels-and-enderchests-6-rows.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Barrels and enderchests 6 rows diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index 550e53665ac3a8d1723e432f0cf0b4adbd03270f..c8742e5e7fdb89a2239a4fc52e76a19cf367bff6 100644 +index 5f6789783659b3adbdda15705c89a032686f33d5..e35e1bf28463d1f21f3610a31316e825c737b260 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java -@@ -1199,6 +1199,27 @@ public abstract class PlayerList { +@@ -1209,6 +1209,27 @@ public abstract class PlayerList { player.getBukkitEntity().recalculatePermissions(); // CraftBukkit this.server.getCommands().sendCommands(player); } // Paper @@ -37,10 +37,10 @@ index 550e53665ac3a8d1723e432f0cf0b4adbd03270f..c8742e5e7fdb89a2239a4fc52e76a19c public boolean isWhiteListed(GameProfile profile) { diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java -index 307733914109c4eb1a10ffccf169e70c3baa2bc9..f11ba32019abb5d5fef13c8f1beab18f34181a75 100644 +index 0e96ae9381abbf65182a04df28be94709ef66bb3..6bf696b7944cfaae57074eb554e7b7a021eeae2d 100644 --- a/src/main/java/net/minecraft/world/entity/player/Player.java +++ b/src/main/java/net/minecraft/world/entity/player/Player.java -@@ -187,6 +187,7 @@ public abstract class Player extends LivingEntity { +@@ -182,6 +182,7 @@ public abstract class Player extends LivingEntity { // Paper start public boolean affectsSpawning = true; // Paper end @@ -49,7 +49,7 @@ index 307733914109c4eb1a10ffccf169e70c3baa2bc9..f11ba32019abb5d5fef13c8f1beab18f // CraftBukkit start public boolean fauxSleeping; diff --git a/src/main/java/net/minecraft/world/inventory/ChestMenu.java b/src/main/java/net/minecraft/world/inventory/ChestMenu.java -index e9d9245f7efaaeefc8f107b8016a462ce173816a..56dcc1b6ceaad998be62e3b8c125e8f5e833e4c0 100644 +index 82331715e91c6e9a13c0626164368ae16e754126..15d115917e2c9f7d5669cabe2721df9fcdb4ec7b 100644 --- a/src/main/java/net/minecraft/world/inventory/ChestMenu.java +++ b/src/main/java/net/minecraft/world/inventory/ChestMenu.java @@ -67,10 +67,30 @@ public class ChestMenu extends AbstractContainerMenu { @@ -140,7 +140,7 @@ index 7385e91f32f070e86a4e0fd3d214f55d832c7979..c3b78dd2d06be7d64920c6bcffcd16c8 }, CONTAINER_TITLE)); player.awardStat(Stats.OPEN_ENDERCHEST); diff --git a/src/main/java/net/minecraft/world/level/block/entity/BarrelBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/BarrelBlockEntity.java -index f52487e1cfcfab1bf22ab2cb52f998283a86e340..da80e16b7886f22da7028a376d8e8b99c5a829b1 100644 +index 416aa989ebb18a8741cc9d605a1180ab830f6643..e38a0adf5463c48311ad08b8d2e5b5c2d989a3b5 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/BarrelBlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/BarrelBlockEntity.java @@ -67,7 +67,16 @@ public class BarrelBlockEntity extends RandomizableContainerBlockEntity { @@ -198,7 +198,7 @@ index f52487e1cfcfab1bf22ab2cb52f998283a86e340..da80e16b7886f22da7028a376d8e8b99 @Override diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java -index 567449faf1a5d805c44b5a2685904e919f20ade8..b8d7caaf2918d98138097a1ab74d5b229e39703b 100644 +index 1f73834043c2d2be17ae647589653d517db36a1b..39f03d0b74b9bfc2eb62d95f2975bcd15bb25bc2 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java @@ -164,8 +164,19 @@ public class CraftContainer extends AbstractContainerMenu { @@ -223,10 +223,10 @@ index 567449faf1a5d805c44b5a2685904e919f20ade8..b8d7caaf2918d98138097a1ab74d5b22 case DISPENSER: case DROPPER: diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java -index 30ac442049088200e9ab77a561c59cbc58aaa28f..fb3c3c32b89e6a99b50bd04163d29892bbd08256 100644 +index 59457378820d7f2899254a6aeef4c30c926ce543..b280d42a0298c04647945cde7bd5a4f5766c301b 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java -@@ -81,7 +81,7 @@ public class CraftInventory implements Inventory { +@@ -82,7 +82,7 @@ public class CraftInventory implements Inventory { @Override public void setContents(ItemStack[] items) { diff --git a/patches/server/0011-Llama-API.patch b/patches/server/0009-Llama-API.patch similarity index 85% rename from patches/server/0011-Llama-API.patch rename to patches/server/0009-Llama-API.patch index b13878e3f..e02634ac8 100644 --- a/patches/server/0011-Llama-API.patch +++ b/patches/server/0009-Llama-API.patch @@ -25,10 +25,10 @@ index 721971f7618751a2e95f1c49fdc48a9c0c672cab..7b141c495095afcd9c8b04c059d692e8 double d = this.llama.distanceToSqr(this.llama.getCaravanHead()); if (d > 676.0D) { diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java -index 8e3b091130d33c6ec113f50930af25642ae54cc0..f9da2e58b8df88ad103f2549b27fbedee8520bb1 100644 +index 3de18e1389559678b229a334fb98946810c3f214..35fb0f92a94d141c98b3cd8927c76c35a921e04e 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java -@@ -68,6 +68,7 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { +@@ -73,6 +73,7 @@ public class Llama extends AbstractChestedHorse implements VariantHolder type, Level world) { super(type, world); -@@ -164,7 +165,7 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { +@@ -169,7 +170,7 @@ public class Llama extends AbstractChestedHorse implements VariantHolder 0L && this.server.getPlayerIdleTimeout() > 0 && Util.getMillis() - this.player.getLastActionTime() > (long) (this.server.getPlayerIdleTimeout() * 1000 * 60) && !this.player.wonGame) { // Paper - Prevent AFK kick while watching end credits. @@ -110,7 +110,7 @@ index 6ec78e1efff939755b163ab88405e17ba646e706..c37b4000321807ad3c2400019e0be0e6 this.player.resetLastActionTime(); // CraftBukkit - SPIGOT-854 this.disconnect(Component.translatable("multiplayer.disconnect.idling"), org.bukkit.event.player.PlayerKickEvent.Cause.IDLING); // Paper - kick event cause } -@@ -744,6 +764,8 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -735,6 +755,8 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic this.lastYaw = to.getYaw(); this.lastPitch = to.getPitch(); @@ -119,7 +119,7 @@ index 6ec78e1efff939755b163ab88405e17ba646e706..c37b4000321807ad3c2400019e0be0e6 // Skip the first time we do this if (true) { // Spigot - don't skip any move events Location oldTo = to.clone(); -@@ -1548,7 +1570,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -1538,7 +1560,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic if (!this.player.isChangingDimension() && d11 > org.spigotmc.SpigotConfig.movedWronglyThreshold && !this.player.isSleeping() && !this.player.gameMode.isCreative() && this.player.gameMode.getGameModeForPlayer() != GameType.SPECTATOR) { // Spigot flag2 = true; // Paper - diff on change, this should be moved wrongly @@ -128,7 +128,7 @@ index 6ec78e1efff939755b163ab88405e17ba646e706..c37b4000321807ad3c2400019e0be0e6 } this.player.absMoveTo(d0, d1, d2, f, f1); -@@ -1599,6 +1621,8 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -1589,6 +1611,8 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic this.lastYaw = to.getYaw(); this.lastPitch = to.getPitch(); @@ -172,7 +172,7 @@ index 72abebff2018cde2922e97ad6478f93da9aed3ec..412963d7af38a53b6010007278d959a5 private EntitySelector() {} // Paper start diff --git a/src/main/java/net/minecraft/world/entity/ai/targeting/TargetingConditions.java b/src/main/java/net/minecraft/world/entity/ai/targeting/TargetingConditions.java -index e752c83df50fb9b670ecea2abc95426c2a009b6f..baa4f9026d31de92210300ecb8ee8c1b6d575435 100644 +index a7575b5ef56af6f53448d391abb4956e130148ca..0a9e4dc5d6d567605c587df9bcbb57d379b62877 100644 --- a/src/main/java/net/minecraft/world/entity/ai/targeting/TargetingConditions.java +++ b/src/main/java/net/minecraft/world/entity/ai/targeting/TargetingConditions.java @@ -64,6 +64,10 @@ public class TargetingConditions { @@ -187,10 +187,10 @@ index e752c83df50fb9b670ecea2abc95426c2a009b6f..baa4f9026d31de92210300ecb8ee8c1b if (baseEntity == null) { if (this.isCombat && (!targetEntity.canBeSeenAsEnemy() || targetEntity.level.getDifficulty() == Difficulty.PEACEFUL)) { diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java -index 86c0d7e9775042901d01528f9b55298344ea0ff5..d71250144abcb613598e1b795d096b9c740e3169 100644 +index 6bf696b7944cfaae57074eb554e7b7a021eeae2d..173504898e9af92d347c99db7737977a980e22c1 100644 --- a/src/main/java/net/minecraft/world/entity/player/Player.java +++ b/src/main/java/net/minecraft/world/entity/player/Player.java -@@ -202,6 +202,13 @@ public abstract class Player extends LivingEntity { +@@ -197,6 +197,13 @@ public abstract class Player extends LivingEntity { // Purpur start public abstract void resetLastActionTime(); @@ -205,7 +205,7 @@ index 86c0d7e9775042901d01528f9b55298344ea0ff5..d71250144abcb613598e1b795d096b9c public boolean processClick(InteractionHand hand) { Entity vehicle = getRootVehicle(); diff --git a/src/main/java/net/minecraft/world/level/EntityGetter.java b/src/main/java/net/minecraft/world/level/EntityGetter.java -index 6e55f383f48e9a304b0acd541728394615dc6478..be4e1462ca8f8ef7a19e3af44d82826b9e9b8ab9 100644 +index 3b959f42d958bf0f426853aee56753d6c455fcdb..d17abb283ea818244df0379d6b57fc634071e0b9 100644 --- a/src/main/java/net/minecraft/world/level/EntityGetter.java +++ b/src/main/java/net/minecraft/world/level/EntityGetter.java @@ -154,7 +154,7 @@ public interface EntityGetter { @@ -218,10 +218,10 @@ index 6e55f383f48e9a304b0acd541728394615dc6478..be4e1462ca8f8ef7a19e3af44d82826b if (range < 0.0D || d < range * range) { return true; diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 26a05a8835934093054e76057572f3f69410134d..622d0234f5ad1b21aa02e585e3b838368bcd1799 100644 +index 72501f09d42f73a108e96f519be4382ee4e3b230..573d25a15bafce004d8b26c5e7dea3c5f1bf0f99 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -522,10 +522,15 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -524,10 +524,15 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @Override public void setPlayerListName(String name) { @@ -237,8 +237,8 @@ index 26a05a8835934093054e76057572f3f69410134d..622d0234f5ad1b21aa02e585e3b83836 + this.getHandle().listName = name.equals(getName()) ? null : useMM ? io.papermc.paper.adventure.PaperAdventure.asVanilla(net.kyori.adventure.text.minimessage.MiniMessage.miniMessage().deserialize(name)) : CraftChatMessage.fromStringOrNull(name); // Purpur for (ServerPlayer player : (List) server.getHandle().players) { if (player.getBukkitEntity().canSee(this)) { - player.connection.send(new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.UPDATE_DISPLAY_NAME, this.getHandle())); -@@ -2989,5 +2994,20 @@ public class CraftPlayer extends CraftHumanEntity implements Player { + player.connection.send(new ClientboundPlayerInfoUpdatePacket(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_DISPLAY_NAME, this.getHandle())); +@@ -3004,5 +3009,20 @@ public class CraftPlayer extends CraftHumanEntity implements Player { public boolean usesPurpurClient() { return getHandle().purpurClient; } @@ -260,7 +260,7 @@ index 26a05a8835934093054e76057572f3f69410134d..622d0234f5ad1b21aa02e585e3b83836 // Purpur end } diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -index 5bbfde1c69339f4ba1a0ed856b5de19742742c74..c55c434263e0b85fa75c23e943c3bfbc2e836c6c 100644 +index 7cacdea90641b16ad42f34266e8157c246152089..5d034ccb016265edd2b6c1f7f7c622cef3ad52b6 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java @@ -174,8 +174,16 @@ public class PurpurConfig { @@ -281,7 +281,7 @@ index 5bbfde1c69339f4ba1a0ed856b5de19742742c74..c55c434263e0b85fa75c23e943c3bfbc public static int barrelRows = 3; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index b411ba7283b8d6abf7cf53c3c82b612c801ebbee..657dfaa9cf2990fcade8739d3e1c3f9e71e2d38d 100644 +index a85c9f24729ea44ef072a6d3d9ffeb93e8f0a486..765523911e448bd7f73e3f6cb8d0e78ddecb9f66 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -93,6 +93,24 @@ public class PurpurWorldConfig { @@ -310,10 +310,10 @@ index b411ba7283b8d6abf7cf53c3c82b612c801ebbee..657dfaa9cf2990fcade8739d3e1c3f9e public boolean untamedTamablesAreRidable = true; public boolean useNightVisionWhenRiding = false; diff --git a/src/main/java/org/spigotmc/ActivationRange.java b/src/main/java/org/spigotmc/ActivationRange.java -index b87756d9a7b04ea2613208984b2583eca3f32af6..7529bca82efe4c33dbf781bcf6f8b583fa54fa95 100644 +index 1b42c98956342832c37f0aa266f85271daa4ba5b..cea4acefa57cf59dd0863e27777618c49eabab5e 100644 --- a/src/main/java/org/spigotmc/ActivationRange.java +++ b/src/main/java/org/spigotmc/ActivationRange.java -@@ -203,6 +203,7 @@ public class ActivationRange +@@ -199,6 +199,7 @@ public class ActivationRange continue; } diff --git a/patches/server/0013-Bring-back-server-name.patch b/patches/server/0011-Bring-back-server-name.patch similarity index 82% rename from patches/server/0013-Bring-back-server-name.patch rename to patches/server/0011-Bring-back-server-name.patch index e3c3797a0..f758150b7 100644 --- a/patches/server/0013-Bring-back-server-name.patch +++ b/patches/server/0011-Bring-back-server-name.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Bring back server name diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServerProperties.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServerProperties.java -index a32cfa75a9bea896f558bab646d0868391b069a9..01ca7156d86243a80cd343a2a66be9ebedcc3b7c 100644 +index c7e4330c93baff1f3027d7c75cf857b673d38970..5134fed0cd0eedbe0c2177bce91b978b20061517 100644 --- a/src/main/java/net/minecraft/server/dedicated/DedicatedServerProperties.java +++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServerProperties.java -@@ -49,6 +49,7 @@ public class DedicatedServerProperties extends Settings drops = new ArrayList(); public final org.bukkit.craftbukkit.attribute.CraftAttributeMap craftAttributes; -@@ -355,8 +356,8 @@ public abstract class LivingEntity extends Entity { +@@ -357,8 +358,8 @@ public abstract class LivingEntity extends Entity { this.tryAddSoulSpeed(); } @@ -27,7 +27,7 @@ index 86dfb5537f1da7f1e2b8e9bfeb43111b0ac16228..da4fe84f640eacc7c1c3da9a6adee482 if (!state.isAir()) { double d1 = Math.min((double) (0.2F + f / 15.0F), 2.5D); -@@ -2006,7 +2007,7 @@ public abstract class LivingEntity extends Entity { +@@ -1998,7 +1999,7 @@ public abstract class LivingEntity extends Entity { MobEffectInstance mobeffect = this.getEffect(MobEffects.JUMP); float f2 = mobeffect == null ? 0.0F : (float) (mobeffect.getAmplifier() + 1); @@ -37,10 +37,10 @@ index 86dfb5537f1da7f1e2b8e9bfeb43111b0ac16228..da4fe84f640eacc7c1c3da9a6adee482 protected void playBlockFallSound() { diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/AbstractHorse.java b/src/main/java/net/minecraft/world/entity/animal/horse/AbstractHorse.java -index 075c668b6855dd44102bf521864133565fcf16db..a1ffa88c3796df2973a2fc0aeafda5f78208bf85 100644 +index 68dd5611a3d7c943541e42b57457cf24fd2ea577..e6bb70dd641bad1f7cf0b946c922b59a9a43d2f8 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/AbstractHorse.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/AbstractHorse.java -@@ -325,7 +325,7 @@ public abstract class AbstractHorse extends Animal implements ContainerListener, +@@ -341,7 +341,7 @@ public abstract class AbstractHorse extends Animal implements ContainerListener, @Override protected int calculateFallDamage(float fallDistance, float damageMultiplier) { diff --git a/patches/server/0016-Lagging-threshold.patch b/patches/server/0014-Lagging-threshold.patch similarity index 86% rename from patches/server/0016-Lagging-threshold.patch rename to patches/server/0014-Lagging-threshold.patch index 43d8bf5ea..ceb04f8c5 100644 --- a/patches/server/0016-Lagging-threshold.patch +++ b/patches/server/0014-Lagging-threshold.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Lagging threshold diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index ffa6466c21ddc6a312a0a3aa400717a481400237..c1719af753e4efa8fcbd49a801ee86b307d27779 100644 +index bdda859e559f4a26e85d2fdc9e9e8dc13ee66cc7..ac2b692fc5e579dc139540ab6b7e2396bdb84dfb 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -294,6 +294,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop implements EntityTypeTest { - return (EntityType) Registry.register(Registry.ENTITY_TYPE, id, (EntityType) type.build(id)); // CraftBukkit - decompile error +@@ -307,6 +307,16 @@ public class EntityType implements FeatureElement, EntityTypeT + return (EntityType) Registry.register(BuiltInRegistries.ENTITY_TYPE, id, (EntityType) type.build(id)); // CraftBukkit - decompile error } + // Purpur start @@ -18,20 +18,20 @@ index ec0319dd4b115e18b368027cc5dbe4d4d9c64840..6f461397fa0ce8540aecd3c291bb5f59 + } + + public static EntityType getFromKey(ResourceLocation location) { -+ return Registry.ENTITY_TYPE.get(location); ++ return BuiltInRegistries.ENTITY_TYPE.get(location); + } + // Purpur end + public static ResourceLocation getKey(EntityType type) { - return Registry.ENTITY_TYPE.getKey(type); + return BuiltInRegistries.ENTITY_TYPE.getKey(type); } -@@ -465,6 +475,16 @@ public class EntityType implements EntityTypeTest { +@@ -515,6 +525,16 @@ public class EntityType implements FeatureElement, EntityTypeT return this.category; } + // Purpur start + public String getName() { -+ return Registry.ENTITY_TYPE.getKey(this).getPath(); ++ return BuiltInRegistries.ENTITY_TYPE.getKey(this).getPath(); + } + + public String getTranslatedName() { @@ -41,13 +41,13 @@ index ec0319dd4b115e18b368027cc5dbe4d4d9c64840..6f461397fa0ce8540aecd3c291bb5f59 + public String getDescriptionId() { if (this.descriptionId == null) { - this.descriptionId = Util.makeDescriptionId("entity", Registry.ENTITY_TYPE.getKey(this)); + this.descriptionId = Util.makeDescriptionId("entity", BuiltInRegistries.ENTITY_TYPE.getKey(this)); diff --git a/src/main/java/net/minecraft/world/item/SpawnEggItem.java b/src/main/java/net/minecraft/world/item/SpawnEggItem.java -index 6df94a75b7c4c2593598088d84cf0a4a57e3fd99..7aaf698239d0890f9633e6e01ada2a1a02de419a 100644 +index 31268e25056f980798ef7db72c4f955a074cc639..955822da142a2463af536dd1ce48037deda41402 100644 --- a/src/main/java/net/minecraft/world/item/SpawnEggItem.java +++ b/src/main/java/net/minecraft/world/item/SpawnEggItem.java @@ -68,6 +68,15 @@ public class SpawnEggItem extends Item { - BaseSpawner mobspawnerabstract = ((SpawnerBlockEntity) tileentity).getSpawner(); + SpawnerBlockEntity tileentitymobspawner = (SpawnerBlockEntity) tileentity; EntityType entitytypes = this.getType(itemstack.getTag()); + // Purpur start @@ -59,6 +59,6 @@ index 6df94a75b7c4c2593598088d84cf0a4a57e3fd99..7aaf698239d0890f9633e6e01ada2a1a + entitytypes = EntityType.getFromBukkitType(event.getEntityType()); + // Purpur end + - mobspawnerabstract.setEntityId(entitytypes); + tileentitymobspawner.setEntityId(entitytypes, world.getRandom()); tileentity.setChanged(); world.sendBlockUpdated(blockposition, iblockdata, iblockdata, 3); diff --git a/patches/server/0019-Player-invulnerabilities.patch b/patches/server/0016-Player-invulnerabilities.patch similarity index 84% rename from patches/server/0019-Player-invulnerabilities.patch rename to patches/server/0016-Player-invulnerabilities.patch index 077292d95..77baa87e3 100644 --- a/patches/server/0019-Player-invulnerabilities.patch +++ b/patches/server/0016-Player-invulnerabilities.patch @@ -5,18 +5,18 @@ Subject: [PATCH] Player invulnerabilities diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index 1dea5322a07e63f564d506c3255ebb4ee0066b37..f3a90f798f6068e86e1dfd1de49b0fdc074cc7c9 100644 +index 9ab314490b975417e28f129c72077a7198cf4cc7..4dc545c478e24863c8e9c68060af072f748b735e 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java -@@ -262,6 +262,7 @@ public class ServerPlayer extends Player { - // CraftBukkit end +@@ -271,6 +271,7 @@ public class ServerPlayer extends Player { public PlayerNaturallySpawnCreaturesEvent playerNaturallySpawnedEvent; // Paper + public org.bukkit.event.player.PlayerQuitEvent.QuitReason quitReason = null; // Paper - there are a lot of changes to do if we change all methods leading to the event public boolean purpurClient = false; // Purpur + public boolean acceptingResourcePack = false; // Purpur - public boolean isRealPlayer; // Paper - public double lastEntitySpawnRadiusSquared; // Paper - optimise isOutsideRange, this field is in blocks -@@ -365,6 +366,7 @@ public class ServerPlayer extends Player { + public ServerPlayer(MinecraftServer server, ServerLevel world, GameProfile profile) { + super(world, world.getSharedSpawnPos(), world.getSharedSpawnAngle(), profile); +@@ -370,6 +371,7 @@ public class ServerPlayer extends Player { this.bukkitPickUpLoot = true; this.maxHealthCache = this.getMaxHealth(); this.cachedSingleMobDistanceMap = new com.destroystokyo.paper.util.PooledHashSets.PooledObjectLinkedOpenHashSet<>(this); // Paper @@ -24,7 +24,7 @@ index 1dea5322a07e63f564d506c3255ebb4ee0066b37..f3a90f798f6068e86e1dfd1de49b0fdc } // Yes, this doesn't match Vanilla, but it's the best we can do for now. -@@ -1029,6 +1031,12 @@ public class ServerPlayer extends Player { +@@ -1051,6 +1053,12 @@ public class ServerPlayer extends Player { } @@ -37,7 +37,7 @@ index 1dea5322a07e63f564d506c3255ebb4ee0066b37..f3a90f798f6068e86e1dfd1de49b0fdc @Override public boolean hurt(DamageSource source, float amount) { if (this.isInvulnerableTo(source)) { -@@ -1036,7 +1044,7 @@ public class ServerPlayer extends Player { +@@ -1058,7 +1066,7 @@ public class ServerPlayer extends Player { } else { boolean flag = this.server.isDedicatedServer() && this.isPvpAllowed() && "fall".equals(source.msgId); @@ -46,7 +46,7 @@ index 1dea5322a07e63f564d506c3255ebb4ee0066b37..f3a90f798f6068e86e1dfd1de49b0fdc return false; } else { if (source instanceof EntityDamageSource) { -@@ -1210,6 +1218,7 @@ public class ServerPlayer extends Player { +@@ -1232,6 +1240,7 @@ public class ServerPlayer extends Player { } // Paper end @@ -54,7 +54,7 @@ index 1dea5322a07e63f564d506c3255ebb4ee0066b37..f3a90f798f6068e86e1dfd1de49b0fdc return this; } } -@@ -2015,6 +2024,7 @@ public class ServerPlayer extends Player { +@@ -2039,6 +2048,7 @@ public class ServerPlayer extends Player { } public void sendTexturePack(String url, String hash, boolean required, @Nullable Component resourcePackPrompt) { @@ -62,7 +62,7 @@ index 1dea5322a07e63f564d506c3255ebb4ee0066b37..f3a90f798f6068e86e1dfd1de49b0fdc this.connection.send(new ClientboundResourcePackPacket(url, hash, required, resourcePackPrompt)); } -@@ -2545,9 +2555,17 @@ public class ServerPlayer extends Player { +@@ -2585,9 +2595,17 @@ public class ServerPlayer extends Player { @Override public boolean isImmobile() { @@ -82,10 +82,10 @@ index 1dea5322a07e63f564d506c3255ebb4ee0066b37..f3a90f798f6068e86e1dfd1de49b0fdc public Scoreboard getScoreboard() { return this.getBukkitEntity().getScoreboard().getHandle(); diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index c37b4000321807ad3c2400019e0be0e6fd3d4301..deb2027df156d3daab9b999bc20ad4da7c03b8a4 100644 +index 29a6f5da6c655a57e1d13a05f1ff302806b0e8a5..07ef3d814feb51f110a12aaeb5e826ba61cc0812 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -2101,12 +2101,21 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -2094,12 +2094,21 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic @Override public void handleResourcePackResponse(ServerboundResourcePackPacket packet) { PacketUtils.ensureRunningOnSameThread(packet, this, this.player.getLevel()); @@ -108,10 +108,10 @@ index c37b4000321807ad3c2400019e0be0e6fd3d4301..deb2027df156d3daab9b999bc20ad4da this.cserver.getPluginManager().callEvent(new PlayerResourcePackStatusEvent(this.getCraftPlayer(), packStatus)); // CraftBukkit // Paper end diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index c8742e5e7fdb89a2239a4fc52e76a19cf367bff6..989f7ad99f52891b40febc6f988f9394a666b442 100644 +index e35e1bf28463d1f21f3610a31316e825c737b260..5efee586de46ba9d22cab6cbc1ec5912332c4d2a 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java -@@ -1014,6 +1014,8 @@ public abstract class PlayerList { +@@ -1024,6 +1024,8 @@ public abstract class PlayerList { } // Paper end @@ -121,10 +121,10 @@ index c8742e5e7fdb89a2239a4fc52e76a19cf367bff6..989f7ad99f52891b40febc6f988f9394 return entityplayer1; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 622d0234f5ad1b21aa02e585e3b838368bcd1799..e4bb7fcda60eb5382fa9248f6b9900df2b518a37 100644 +index 573d25a15bafce004d8b26c5e7dea3c5f1bf0f99..3f08e9162ccb21661daa021d1c82e917ea089b7e 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -3009,5 +3009,20 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -3024,5 +3024,20 @@ public class CraftPlayer extends CraftHumanEntity implements Player { public void resetIdleTimer() { getHandle().resetLastActionTime(); } @@ -146,7 +146,7 @@ index 622d0234f5ad1b21aa02e585e3b838368bcd1799..e4bb7fcda60eb5382fa9248f6b9900df // Purpur end } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 657dfaa9cf2990fcade8739d3e1c3f9e71e2d38d..8eaac4b3b7e999ec99785fa41463d8e18d25a277 100644 +index 765523911e448bd7f73e3f6cb8d0e78ddecb9f66..fcf58a69e8f3d0e3aa2566ddcdf05554aec979de 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -98,6 +98,8 @@ public class PurpurWorldConfig { diff --git a/patches/server/0020-Anvil-API.patch b/patches/server/0017-Anvil-API.patch similarity index 96% rename from patches/server/0020-Anvil-API.patch rename to patches/server/0017-Anvil-API.patch index e5515ad35..b420bafbf 100644 --- a/patches/server/0020-Anvil-API.patch +++ b/patches/server/0017-Anvil-API.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Anvil API diff --git a/src/main/java/net/minecraft/world/inventory/AbstractContainerMenu.java b/src/main/java/net/minecraft/world/inventory/AbstractContainerMenu.java -index 49b063655dfc09e30d446dbf07503fdda04a7e30..31c9bb73b73be99b95a7dde55d276964522a6d7d 100644 +index 95ba37458e8154dbce6a8590508840d694fcbed1..8b198d31578c4618f730d572844292ae3bdda2c7 100644 --- a/src/main/java/net/minecraft/world/inventory/AbstractContainerMenu.java +++ b/src/main/java/net/minecraft/world/inventory/AbstractContainerMenu.java -@@ -75,6 +75,7 @@ public abstract class AbstractContainerMenu { +@@ -76,6 +76,7 @@ public abstract class AbstractContainerMenu { @Nullable private ContainerSynchronizer synchronizer; private boolean suppressRemoteUpdates; @@ -119,7 +119,7 @@ index 506d758efbf16da9467f120321d2359a8832e477..0363d2263b2d6bd6166fa21d7849297e } diff --git a/src/main/java/net/minecraft/world/inventory/ItemCombinerMenu.java b/src/main/java/net/minecraft/world/inventory/ItemCombinerMenu.java -index 35575434f3c90f1bd23df6584ee8a5a991f93f9f..297f829275a0cdfdd8e9214dfa78a91a7471cc9f 100644 +index c34a66310969c3c837d09693159b827c1edddd3b..25885eb3b7312bd317fc519ad420109ff6531c7d 100644 --- a/src/main/java/net/minecraft/world/inventory/ItemCombinerMenu.java +++ b/src/main/java/net/minecraft/world/inventory/ItemCombinerMenu.java @@ -140,7 +140,9 @@ public abstract class ItemCombinerMenu extends AbstractContainerMenu { @@ -127,7 +127,7 @@ index 35575434f3c90f1bd23df6584ee8a5a991f93f9f..297f829275a0cdfdd8e9214dfa78a91a } + this.activeQuickItem = itemstack; // Purpur - slot.onTake(player, itemstack1); + slot1.onTake(player, itemstack1); + this.activeQuickItem = null; // Purpur } diff --git a/patches/server/0022-Alternative-Keepalive-Handling.patch b/patches/server/0018-Alternative-Keepalive-Handling.patch similarity index 93% rename from patches/server/0022-Alternative-Keepalive-Handling.patch rename to patches/server/0018-Alternative-Keepalive-Handling.patch index 69a91b931..f4676c064 100644 --- a/patches/server/0022-Alternative-Keepalive-Handling.patch +++ b/patches/server/0018-Alternative-Keepalive-Handling.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Alternative Keepalive Handling diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index abb1a20156b70781ccfd4ce15ffcfa0228b41a7d..fad849ac28cb67d696fbdc2525fb8c9e8fb9bbae 100644 +index af1afba7346e573b5704cc6fcec1bb1371928fa5..8920383edbd9908087be320f47d9ba8e536cff42 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -260,6 +260,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -259,6 +259,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic private long keepAliveTime = Util.getMillis(); private boolean keepAlivePending; private long keepAliveChallenge; @@ -16,7 +16,7 @@ index abb1a20156b70781ccfd4ce15ffcfa0228b41a7d..fad849ac28cb67d696fbdc2525fb8c9e // CraftBukkit start - multithreaded fields private final AtomicInteger chatSpamTickCount = new AtomicInteger(); private final java.util.concurrent.atomic.AtomicInteger tabSpamLimiter = new java.util.concurrent.atomic.AtomicInteger(); // Paper - configurable tab spam limits -@@ -421,6 +422,21 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -414,6 +415,21 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic long currentTime = Util.getMillis(); long elapsedTime = currentTime - this.keepAliveTime; @@ -38,7 +38,7 @@ index abb1a20156b70781ccfd4ce15ffcfa0228b41a7d..fad849ac28cb67d696fbdc2525fb8c9e if (this.keepAlivePending) { if (!this.processedDisconnect && elapsedTime >= KEEPALIVE_LIMIT) { // check keepalive limit, don't fire if already disconnected ServerGamePacketListenerImpl.LOGGER.warn("{} was kicked due to keepalive timeout!", this.player.getScoreboardName()); // more info -@@ -3633,6 +3649,16 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -3489,6 +3505,16 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic @Override public void handleKeepAlive(ServerboundKeepAlivePacket packet) { diff --git a/patches/server/0018-EMC-MonsterEggSpawnEvent.patch b/patches/server/0018-EMC-MonsterEggSpawnEvent.patch deleted file mode 100644 index 59e77851e..000000000 --- a/patches/server/0018-EMC-MonsterEggSpawnEvent.patch +++ /dev/null @@ -1,74 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Aikar -Date: Sat, 20 Jul 2013 22:40:56 -0400 -Subject: [PATCH] EMC - MonsterEggSpawnEvent - - -diff --git a/src/main/java/net/minecraft/world/entity/EntityType.java b/src/main/java/net/minecraft/world/entity/EntityType.java -index 1024dd826f7c14ec81b1d1a70c12e3bcf5fca217..11f057bd798ed03f02296b84b394fd0cbc9eaa16 100644 ---- a/src/main/java/net/minecraft/world/entity/EntityType.java -+++ b/src/main/java/net/minecraft/world/entity/EntityType.java -@@ -348,22 +348,40 @@ public class EntityType implements EntityTypeTest { - - @Nullable - public Entity spawn(ServerLevel world, @Nullable ItemStack stack, @Nullable Player player, BlockPos pos, MobSpawnType spawnReason, boolean alignPosition, boolean invertY) { -- return this.spawn(world, stack == null ? null : stack.getTag(), stack != null && stack.hasCustomHoverName() ? stack.getHoverName() : null, player, pos, spawnReason, alignPosition, invertY); -+ return this.spawn(world, stack, stack == null ? null : stack.getTag(), stack != null && stack.hasCustomHoverName() ? stack.getHoverName() : null, player, pos, spawnReason, alignPosition, invertY); // Purpur - } - - @Nullable - public T spawn(ServerLevel world, @Nullable CompoundTag itemNbt, @Nullable Component name, @Nullable Player player, BlockPos pos, MobSpawnType spawnReason, boolean alignPosition, boolean invertY) { -+ // Purpur start -+ return this.spawn(world, null, itemNbt, name, player, pos, spawnReason, alignPosition, invertY); -+ } -+ @Nullable -+ public T spawn(ServerLevel world, @Nullable ItemStack stack, @Nullable CompoundTag itemNbt, @Nullable Component name, @Nullable Player player, BlockPos pos, MobSpawnType spawnReason, boolean alignPosition, boolean invertY) { -+ // Purpur end - // CraftBukkit start -- return this.spawn(world, itemNbt, name, player, pos, spawnReason, alignPosition, invertY, spawnReason == MobSpawnType.DISPENSER ? org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DISPENSE_EGG : org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SPAWNER_EGG); // Paper - use correct spawn reason for dispenser spawn eggs -+ return this.spawn(world, stack, itemNbt, name, player, pos, spawnReason, alignPosition, invertY, spawnReason == MobSpawnType.DISPENSER ? org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DISPENSE_EGG : org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SPAWNER_EGG); // Paper - use correct spawn reason for dispenser spawn eggs // Purpur - } - - @Nullable - public T spawn(ServerLevel worldserver, @Nullable CompoundTag nbttagcompound, @Nullable Component ichatbasecomponent, @Nullable Player entityhuman, BlockPos blockposition, MobSpawnType enummobspawn, boolean flag, boolean flag1, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason spawnReason) { -+ // Purpur start -+ return this.spawn(worldserver, null, nbttagcompound, ichatbasecomponent, entityhuman, blockposition, enummobspawn, flag, flag1, spawnReason); -+ } -+ @Nullable -+ public T spawn(ServerLevel worldserver, @Nullable ItemStack stack, @Nullable CompoundTag nbttagcompound, @Nullable Component ichatbasecomponent, @Nullable Player entityhuman, BlockPos blockposition, MobSpawnType enummobspawn, boolean flag, boolean flag1, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason spawnReason) { -+ // Purpur end - // Paper start - add consumer to modify entity before spawn -- return this.spawn(worldserver, nbttagcompound, ichatbasecomponent, entityhuman, blockposition, enummobspawn, flag, flag1, spawnReason, null); -+ return this.spawn(worldserver, stack, nbttagcompound, ichatbasecomponent, entityhuman, blockposition, enummobspawn, flag, flag1, spawnReason, null); // Purpur - } - @Nullable - public T spawn(ServerLevel worldserver, @Nullable CompoundTag nbttagcompound, @Nullable Component ichatbasecomponent, @Nullable Player entityhuman, BlockPos blockposition, MobSpawnType enummobspawn, boolean flag, boolean flag1, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason spawnReason, @Nullable java.util.function.Consumer op) { -+ // Purpur start -+ return this.spawn(worldserver, null, nbttagcompound, ichatbasecomponent, entityhuman, blockposition, enummobspawn, flag, flag1, spawnReason, op); -+ } -+ @Nullable -+ public T spawn(ServerLevel worldserver, @Nullable ItemStack stack, @Nullable CompoundTag nbttagcompound, @Nullable Component ichatbasecomponent, @Nullable Player entityhuman, BlockPos blockposition, MobSpawnType enummobspawn, boolean flag, boolean flag1, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason spawnReason, @Nullable java.util.function.Consumer op) { -+ // Purpur end - // Paper end - // Paper start - Call PreCreatureSpawnEvent - org.bukkit.entity.EntityType type = org.bukkit.entity.EntityType.fromName(EntityType.getKey(this).getPath()); -@@ -382,6 +400,19 @@ public class EntityType implements EntityTypeTest { - T t0 = this.create(worldserver, nbttagcompound, ichatbasecomponent, entityhuman, blockposition, enummobspawn, flag, flag1); - if (t0 != null && op != null) op.accept(t0); // Paper - -+ // Purpur start -+ if (spawnReason == org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SPAWNER_EGG && stack != null && t0 != null) { -+ final org.purpurmc.purpur.event.entity.MonsterEggSpawnEvent event = new org.purpurmc.purpur.event.entity.MonsterEggSpawnEvent(entityhuman != null ? entityhuman.getBukkitEntity() : null, t0.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(stack)); -+ if (!event.callEvent()) { -+ t0.setRemoved(Entity.RemovalReason.DISCARDED); -+ return null; -+ } -+ if (event.getEntity().getEntityId() != t0.getId()) { -+ return (T) ((org.bukkit.craftbukkit.entity.CraftEntity) event.getEntity()).getHandle(); -+ } -+ } -+ // Purpur end -+ - if (t0 != null) { - worldserver.addFreshEntityWithPassengers(t0, spawnReason); - return !t0.isRemoved() ? t0 : null; // Don't return an entity when CreatureSpawnEvent is canceled diff --git a/patches/server/0023-Silk-touch-spawners.patch b/patches/server/0019-Silk-touch-spawners.patch similarity index 65% rename from patches/server/0023-Silk-touch-spawners.patch rename to patches/server/0019-Silk-touch-spawners.patch index ec09812ea..96b341747 100644 --- a/patches/server/0023-Silk-touch-spawners.patch +++ b/patches/server/0019-Silk-touch-spawners.patch @@ -5,96 +5,55 @@ Subject: [PATCH] Silk touch spawners diff --git a/src/main/java/net/minecraft/world/item/Items.java b/src/main/java/net/minecraft/world/item/Items.java -index 51016663829b1f36b8e752dcf9c9361282c3f06b..e0a635d647113bb363df2ddc293f2495c56e5d3c 100644 +index 21b74b3473553162c0113b2d365605782080cdfc..fd10ecc79b503b3a650bec1db656b86d58da81ac 100644 --- a/src/main/java/net/minecraft/world/item/Items.java +++ b/src/main/java/net/minecraft/world/item/Items.java -@@ -271,7 +271,7 @@ public class Items { - public static final Item PURPUR_BLOCK = registerBlock(Blocks.PURPUR_BLOCK, CreativeModeTab.TAB_BUILDING_BLOCKS); - public static final Item PURPUR_PILLAR = registerBlock(Blocks.PURPUR_PILLAR, CreativeModeTab.TAB_BUILDING_BLOCKS); - public static final Item PURPUR_STAIRS = registerBlock(Blocks.PURPUR_STAIRS, CreativeModeTab.TAB_BUILDING_BLOCKS); -- public static final Item SPAWNER = registerBlock(new BlockItem(Blocks.SPAWNER, (new Item.Properties()).rarity(Rarity.EPIC))); -+ public static final Item SPAWNER = registerBlock(Blocks.SPAWNER, new org.purpurmc.purpur.item.SpawnerItem(Blocks.SPAWNER, new Item.Properties().rarity(Rarity.EPIC))); // Purpur - public static final Item CHEST = registerBlock(Blocks.CHEST, CreativeModeTab.TAB_DECORATIONS); - public static final Item CRAFTING_TABLE = registerBlock(Blocks.CRAFTING_TABLE, CreativeModeTab.TAB_DECORATIONS); - public static final Item FARMLAND = registerBlock(Blocks.FARMLAND, CreativeModeTab.TAB_DECORATIONS); +@@ -280,7 +280,7 @@ public class Items { + public static final Item PURPUR_BLOCK = registerBlock(Blocks.PURPUR_BLOCK); + public static final Item PURPUR_PILLAR = registerBlock(Blocks.PURPUR_PILLAR); + public static final Item PURPUR_STAIRS = registerBlock(Blocks.PURPUR_STAIRS); +- public static final Item SPAWNER = registerBlock(Blocks.SPAWNER); ++ public static final Item SPAWNER = registerBlock(new org.purpurmc.purpur.item.SpawnerItem(Blocks.SPAWNER, new Item.Properties().rarity(Rarity.EPIC))); // Purpur + public static final Item CHEST = registerBlock(Blocks.CHEST); + public static final Item CRAFTING_TABLE = registerBlock(Blocks.CRAFTING_TABLE); + public static final Item FARMLAND = registerBlock(Blocks.FARMLAND); diff --git a/src/main/java/net/minecraft/world/level/block/SpawnerBlock.java b/src/main/java/net/minecraft/world/level/block/SpawnerBlock.java -index 39bc91423c830d69eff1996881373296f322f06a..e0d8bd28576f16822a584f3514dbcb8f36e575d8 100644 +index 5af520104f25d597917e99ac09aa9d68c4864e44..5ab00db14e697085eb96c3c6db9b67ea85918506 100644 --- a/src/main/java/net/minecraft/world/level/block/SpawnerBlock.java +++ b/src/main/java/net/minecraft/world/level/block/SpawnerBlock.java -@@ -1,9 +1,19 @@ - package net.minecraft.world.level.block; - - import javax.annotation.Nullable; -+ -+import net.kyori.adventure.text.minimessage.MiniMessage; - import net.minecraft.core.BlockPos; -+import net.minecraft.nbt.CompoundTag; -+import net.minecraft.nbt.ListTag; -+import net.minecraft.nbt.StringTag; -+import net.minecraft.resources.ResourceLocation; - import net.minecraft.server.level.ServerLevel; -+import net.minecraft.world.entity.EntityType; -+import net.minecraft.world.entity.player.Player; - import net.minecraft.world.item.ItemStack; -+import net.minecraft.world.item.enchantment.EnchantmentHelper; -+import net.minecraft.world.item.enchantment.Enchantments; - import net.minecraft.world.level.BlockGetter; - import net.minecraft.world.level.Level; - import net.minecraft.world.level.block.entity.BlockEntity; -@@ -13,6 +23,20 @@ import net.minecraft.world.level.block.entity.SpawnerBlockEntity; - import net.minecraft.world.level.block.state.BlockBehaviour; - import net.minecraft.world.level.block.state.BlockState; - -+// Purpur start -+import io.papermc.paper.adventure.PaperAdventure; -+import net.kyori.adventure.text.Component; -+import net.kyori.adventure.text.TextReplacementConfig; -+import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; -+import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; -+ -+import java.util.List; -+import java.util.Locale; -+import java.util.Optional; -+ -+import static net.kyori.adventure.text.format.TextDecoration.ITALIC; -+// Purpur end -+ - public class SpawnerBlock extends BaseEntityBlock { - - protected SpawnerBlock(BlockBehaviour.Properties settings) { -@@ -30,6 +54,55 @@ public class SpawnerBlock extends BaseEntityBlock { +@@ -40,6 +40,55 @@ public class SpawnerBlock extends BaseEntityBlock { return createTickerHelper(type, BlockEntityType.MOB_SPAWNER, world.isClientSide ? SpawnerBlockEntity::clientTick : SpawnerBlockEntity::serverTick); } + // Purpur start + @Override -+ public void playerDestroy(Level level, Player player, BlockPos pos, BlockState state, BlockEntity blockEntity, ItemStack stack) { ++ public void playerDestroy(Level level, net.minecraft.world.entity.player.Player player, BlockPos pos, BlockState state, BlockEntity blockEntity, ItemStack stack) { + if (level.purpurConfig.silkTouchEnabled && player.getBukkitEntity().hasPermission("purpur.drop.spawners") && isSilkTouch(level, stack)) { -+ Optional> type = EntityType.by(((SpawnerBlockEntity) blockEntity).getSpawner().nextSpawnData.getEntityToSpawn()); ++ Optional> type = net.minecraft.world.entity.EntityType.by(((SpawnerBlockEntity) blockEntity).getSpawner().nextSpawnData.getEntityToSpawn()); + if (type.isPresent()) { -+ final Component mobName = PaperAdventure.asAdventure(type.get().getDescription()); ++ final net.kyori.adventure.text.Component mobName = io.papermc.paper.adventure.PaperAdventure.asAdventure(type.get().getDescription()); + CompoundTag display = new CompoundTag(); + CompoundTag tag = new CompoundTag(); + + String name = level.purpurConfig.silkTouchSpawnerName; + if (name != null && !name.isEmpty() && !name.equals("Spawner")) { -+ Component displayName = MiniMessage.miniMessage().deserialize(name, net.kyori.adventure.text.minimessage.tag.resolver.Placeholder.component("mob", mobName)); ++ net.kyori.adventure.text.Component displayName = net.kyori.adventure.text.minimessage.MiniMessage.miniMessage().deserialize(name, net.kyori.adventure.text.minimessage.tag.resolver.Placeholder.component("mob", mobName)); + if (name.startsWith("")) { -+ displayName = displayName.decoration(ITALIC, false); ++ displayName = displayName.decoration(net.kyori.adventure.text.format.TextDecoration.ITALIC, false); + } -+ display.put("Name", StringTag.valueOf(PaperAdventure.asJsonString(displayName, Locale.ROOT))); ++ display.put("Name", net.minecraft.nbt.StringTag.valueOf(io.papermc.paper.adventure.PaperAdventure.asJsonString(displayName, java.util.Locale.ROOT))); + tag.put("display", display); + } + + List lore = level.purpurConfig.silkTouchSpawnerLore; + if (lore != null && !lore.isEmpty()) { -+ ListTag list = new ListTag(); ++ net.minecraft.nbt.ListTag list = new net.minecraft.nbt.ListTag(); + for (String line : lore) { -+ Component lineComponent = MiniMessage.miniMessage().deserialize(line, net.kyori.adventure.text.minimessage.tag.resolver.Placeholder.component("mob", mobName)); ++ net.kyori.adventure.text.Component lineComponent = net.kyori.adventure.text.minimessage.MiniMessage.miniMessage().deserialize(line, net.kyori.adventure.text.minimessage.tag.resolver.Placeholder.component("mob", mobName)); + if (line.startsWith("")) { -+ lineComponent = lineComponent.decoration(ITALIC, false); ++ lineComponent = lineComponent.decoration(net.kyori.adventure.text.format.TextDecoration.ITALIC, false); + } -+ list.add(StringTag.valueOf(PaperAdventure.asJsonString(lineComponent, Locale.ROOT))); ++ list.add(net.minecraft.nbt.StringTag.valueOf(io.papermc.paper.adventure.PaperAdventure.asJsonString(lineComponent, java.util.Locale.ROOT))); + } + display.put("Lore", list); + tag.put("display", display); @@ -111,14 +70,14 @@ index 39bc91423c830d69eff1996881373296f322f06a..e0d8bd28576f16822a584f3514dbcb8f + } + + private boolean isSilkTouch(Level level, ItemStack stack) { -+ return stack != null && level.purpurConfig.silkTouchTools.contains(stack.getItem()) && EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, stack) >= level.purpurConfig.minimumSilkTouchSpawnerRequire; ++ return stack != null && level.purpurConfig.silkTouchTools.contains(stack.getItem()) && net.minecraft.world.item.enchantment.EnchantmentHelper.getItemEnchantmentLevel(net.minecraft.world.item.enchantment.Enchantments.SILK_TOUCH, stack) >= level.purpurConfig.minimumSilkTouchSpawnerRequire; + } + // Purpur end + @Override public void spawnAfterBreak(BlockState state, ServerLevel world, BlockPos pos, ItemStack stack, boolean dropExperience) { super.spawnAfterBreak(state, world, pos, stack, dropExperience); -@@ -38,6 +111,7 @@ public class SpawnerBlock extends BaseEntityBlock { +@@ -48,6 +97,7 @@ public class SpawnerBlock extends BaseEntityBlock { @Override public int getExpDrop(BlockState iblockdata, ServerLevel worldserver, BlockPos blockposition, ItemStack itemstack, boolean flag) { @@ -127,7 +86,7 @@ index 39bc91423c830d69eff1996881373296f322f06a..e0d8bd28576f16822a584f3514dbcb8f int i = 15 + worldserver.random.nextInt(15) + worldserver.random.nextInt(15); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index f6bbe6326b60de83ee79c749705edca4ce293a11..a4d4ef2e390df3b1f4d88413bd67fa78e847f35b 100644 +index fcf58a69e8f3d0e3aa2566ddcdf05554aec979de..c46dc432e0a004c1912dc2eeb5da41cc76dfd7e8 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -115,6 +115,38 @@ public class PurpurWorldConfig { @@ -161,7 +120,7 @@ index f6bbe6326b60de83ee79c749705edca4ce293a11..a4d4ef2e390df3b1f4d88413bd67fa78 + "minecraft:diamond_pickaxe", + "minecraft:netherite_pickaxe" + )).forEach(key -> { -+ Item item = Registry.ITEM.get(new ResourceLocation(key.toString())); ++ Item item = BuiltInRegistries.ITEM.get(new ResourceLocation(key.toString())); + if (item != Items.AIR) silkTouchTools.add(item); + }); + } @@ -171,7 +130,7 @@ index f6bbe6326b60de83ee79c749705edca4ce293a11..a4d4ef2e390df3b1f4d88413bd67fa78 public boolean useNightVisionWhenRiding = false; diff --git a/src/main/java/org/purpurmc/purpur/item/SpawnerItem.java b/src/main/java/org/purpurmc/purpur/item/SpawnerItem.java new file mode 100644 -index 0000000000000000000000000000000000000000..ede5c1855e799d250ed47eabff36291a636aa729 +index 0000000000000000000000000000000000000000..c038fb2bbb0f0e78380bc24bbd6348b869669a90 --- /dev/null +++ b/src/main/java/org/purpurmc/purpur/item/SpawnerItem.java @@ -0,0 +1,36 @@ @@ -204,7 +163,7 @@ index 0000000000000000000000000000000000000000..ede5c1855e799d250ed47eabff36291a + CompoundTag tag = stack.getTag(); + if (tag.contains("Purpur.mob_type")) { + EntityType.byString(tag.getString("Purpur.mob_type")).ifPresent(type -> -+ ((SpawnerBlockEntity) spawner).getSpawner().setEntityId(type)); ++ ((SpawnerBlockEntity) spawner).getSpawner().setEntityId(type, level, level.random, pos)); + } + } + } diff --git a/patches/server/0024-MC-168772-Fix-Add-turtle-egg-block-options.patch b/patches/server/0020-MC-168772-Fix-Add-turtle-egg-block-options.patch similarity index 93% rename from patches/server/0024-MC-168772-Fix-Add-turtle-egg-block-options.patch rename to patches/server/0020-MC-168772-Fix-Add-turtle-egg-block-options.patch index 70db218f5..bb68ceed3 100644 --- a/patches/server/0024-MC-168772-Fix-Add-turtle-egg-block-options.patch +++ b/patches/server/0020-MC-168772-Fix-Add-turtle-egg-block-options.patch @@ -5,7 +5,7 @@ Subject: [PATCH] MC-168772 Fix - Add turtle egg block options diff --git a/src/main/java/net/minecraft/world/level/block/TurtleEggBlock.java b/src/main/java/net/minecraft/world/level/block/TurtleEggBlock.java -index 7d25fb0fc64a4f559fe206198fde900afa06f258..1a12fee99a8b69fc6c01e1e217575c7c19e13155 100644 +index 68f122cdfb546a9d0d826bc2ef88549b81de4ab8..d54a46fc8d78df54777e4a7a250a8d0ae74e9831 100644 --- a/src/main/java/net/minecraft/world/level/block/TurtleEggBlock.java +++ b/src/main/java/net/minecraft/world/level/block/TurtleEggBlock.java @@ -9,11 +9,15 @@ import net.minecraft.tags.BlockTags; @@ -24,7 +24,7 @@ index 7d25fb0fc64a4f559fe206198fde900afa06f258..1a12fee99a8b69fc6c01e1e217575c7c import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; -@@ -191,6 +195,23 @@ public class TurtleEggBlock extends Block { +@@ -193,6 +197,23 @@ public class TurtleEggBlock extends Block { } private boolean canDestroyEgg(Level world, Entity entity) { @@ -50,7 +50,7 @@ index 7d25fb0fc64a4f559fe206198fde900afa06f258..1a12fee99a8b69fc6c01e1e217575c7c } } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index a4d4ef2e390df3b1f4d88413bd67fa78e847f35b..8214b85d372c2cb16aa56791f158fc6a88e5a988 100644 +index ed0e411f3960db455a8bdb19a8129db90bd48761..a3da7a5f4337a95adc351f95a806af4caf821945 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -147,6 +147,15 @@ public class PurpurWorldConfig { diff --git a/patches/server/0021-Configurable-villager-brain-ticks.patch b/patches/server/0021-Configurable-villager-brain-ticks.patch deleted file mode 100644 index 64cda9d06..000000000 --- a/patches/server/0021-Configurable-villager-brain-ticks.patch +++ /dev/null @@ -1,59 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: William Blake Galbreath -Date: Tue, 23 Jul 2019 08:28:21 -0500 -Subject: [PATCH] Configurable villager brain ticks - - -diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java -index ef08ec3eb88ee1ab624e2bd38aaff5e8f97720f2..4cb1cf2b51f1c58e2600996f1d67dcef9e05e3fe 100644 ---- a/src/main/java/net/minecraft/world/entity/npc/Villager.java -+++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java -@@ -139,6 +139,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler - }, MemoryModuleType.MEETING_POINT, (entityvillager, holder) -> { - return holder.is(PoiTypes.MEETING); - }); -+ private final int brainTickOffset; // Purpur - - public long nextGolemPanic = -1; // Pufferfish - -@@ -153,6 +154,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler - this.getNavigation().setCanFloat(true); - this.setCanPickUpLoot(true); - this.setVillagerData(this.getVillagerData().setType(type).setProfession(VillagerProfession.NONE)); -+ this.brainTickOffset = getRandom().nextInt(100); // Purpur - } - - // Purpur start -@@ -279,6 +281,10 @@ public class Villager extends AbstractVillager implements ReputationEventHandler - this.level.getProfiler().push("villagerBrain"); - // Pufferfish start - if (!inactive) { -+ // Purpur start -+ boolean tick = (level.getGameTime() + brainTickOffset) % level.purpurConfig.villagerBrainTicks == 0; -+ if (((ServerLevel) level).getServer().lagging ? tick : level.purpurConfig.villagerUseBrainTicksOnlyWhenLagging || tick) -+ // Purpur end - if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider - this.getBrain().tick((ServerLevel) this.level, this); // Paper - } -diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 8eaac4b3b7e999ec99785fa41463d8e18d25a277..f6bbe6326b60de83ee79c749705edca4ce293a11 100644 ---- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1240,6 +1240,8 @@ public class PurpurWorldConfig { - public boolean villagerRidableInWater = false; - public boolean villagerControllable = true; - public double villagerMaxHealth = 20.0D; -+ public int villagerBrainTicks = 1; -+ public boolean villagerUseBrainTicksOnlyWhenLagging = true; - private void villagerSettings() { - villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); - villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); -@@ -1250,6 +1252,8 @@ public class PurpurWorldConfig { - set("mobs.villager.attributes.max_health", oldValue); - } - villagerMaxHealth = getDouble("mobs.villager.attributes.max_health", villagerMaxHealth); -+ villagerBrainTicks = getInt("mobs.villager.brain-ticks", villagerBrainTicks); -+ villagerUseBrainTicksOnlyWhenLagging = getBoolean("mobs.villager.use-brain-ticks-only-when-lagging", villagerUseBrainTicksOnlyWhenLagging); - } - - public boolean vindicatorRidable = false; diff --git a/patches/server/0025-Fix-vanilla-command-permission-handler.patch b/patches/server/0021-Fix-vanilla-command-permission-handler.patch similarity index 100% rename from patches/server/0025-Fix-vanilla-command-permission-handler.patch rename to patches/server/0021-Fix-vanilla-command-permission-handler.patch diff --git a/patches/server/0026-Logger-settings-suppressing-pointless-logs.patch b/patches/server/0022-Logger-settings-suppressing-pointless-logs.patch similarity index 95% rename from patches/server/0026-Logger-settings-suppressing-pointless-logs.patch rename to patches/server/0022-Logger-settings-suppressing-pointless-logs.patch index 3047bc66d..3f76aed6e 100644 --- a/patches/server/0026-Logger-settings-suppressing-pointless-logs.patch +++ b/patches/server/0022-Logger-settings-suppressing-pointless-logs.patch @@ -17,10 +17,10 @@ index a0c19503aabab5378d672a30163d35a5ba05b6c1..897e761be8c1f79562f54101173fbba7 } // CraftBukkit end diff --git a/src/main/java/net/minecraft/server/level/WorldGenRegion.java b/src/main/java/net/minecraft/server/level/WorldGenRegion.java -index 0d3587e2d454fb0994ecff930b5e496a3999746a..6a3538feee986daf186a09156629d3916e993557 100644 +index 877498729c66de9aa6a27c9148f7494d7895615c..acd7468ee3c86d3456e96e4ec3d7e6a4c612e89d 100644 --- a/src/main/java/net/minecraft/server/level/WorldGenRegion.java +++ b/src/main/java/net/minecraft/server/level/WorldGenRegion.java -@@ -296,6 +296,7 @@ public class WorldGenRegion implements WorldGenLevel { +@@ -297,6 +297,7 @@ public class WorldGenRegion implements WorldGenLevel { return true; } else { // Paper start @@ -41,7 +41,7 @@ index d13ed3069e944d138442ea440ac3eaf8d44c18d3..29ac7f202aa23f7e6fcdc9829af3d598 } else { handler.accept((Recipe) optional.get()); diff --git a/src/main/java/org/bukkit/craftbukkit/legacy/CraftLegacy.java b/src/main/java/org/bukkit/craftbukkit/legacy/CraftLegacy.java -index b2a15c986c7500a0ce227a54cb61ec3f5378f6f3..14600a7bc01bf61e8ffb736816d23df6aa794a16 100644 +index 6a083e269b828ef53f943cae56b029f2e0021ef1..05ce90801ede9d7a764791f8729c72644fc51345 100644 --- a/src/main/java/org/bukkit/craftbukkit/legacy/CraftLegacy.java +++ b/src/main/java/org/bukkit/craftbukkit/legacy/CraftLegacy.java @@ -255,6 +255,7 @@ public final class CraftLegacy { diff --git a/patches/server/0027-Disable-outdated-build-check.patch b/patches/server/0023-Disable-outdated-build-check.patch similarity index 92% rename from patches/server/0027-Disable-outdated-build-check.patch rename to patches/server/0023-Disable-outdated-build-check.patch index 2f71d974b..5210eff02 100644 --- a/patches/server/0027-Disable-outdated-build-check.patch +++ b/patches/server/0023-Disable-outdated-build-check.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Disable outdated build check diff --git a/src/main/java/org/bukkit/craftbukkit/Main.java b/src/main/java/org/bukkit/craftbukkit/Main.java -index e859f1078a42de196a69818a34a8b2c24958c717..f42d75f326bc26e4ab15f12a1a3e0cfc68ce91db 100644 +index 1913792032ef81a6f331cfdfc97052cfe53e767e..7b6063bede6771eb15bc5b01dc8bce7c2949c6b4 100644 --- a/src/main/java/org/bukkit/craftbukkit/Main.java +++ b/src/main/java/org/bukkit/craftbukkit/Main.java @@ -278,7 +278,7 @@ public class Main { diff --git a/patches/server/0028-Giants-AI-settings.patch b/patches/server/0024-Giants-AI-settings.patch similarity index 98% rename from patches/server/0028-Giants-AI-settings.patch rename to patches/server/0024-Giants-AI-settings.patch index 67afd71a6..bf015704e 100644 --- a/patches/server/0028-Giants-AI-settings.patch +++ b/patches/server/0024-Giants-AI-settings.patch @@ -120,7 +120,7 @@ index c1c5e884f00398032196ee71b55b348fcfce21ce..ed032918fb33d60c2d60d4db9275dddf } } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 8214b85d372c2cb16aa56791f158fc6a88e5a988..ebea7fe95f5722eb526aa94787e899f9bbfe6e72 100644 +index a3da7a5f4337a95adc351f95a806af4caf821945..60948438791c1c323789ed96ea7487f99dd0e572 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -535,6 +535,10 @@ public class PurpurWorldConfig { diff --git a/patches/server/0029-Zombie-horse-naturally-spawn.patch b/patches/server/0025-Zombie-horse-naturally-spawn.patch similarity index 71% rename from patches/server/0029-Zombie-horse-naturally-spawn.patch rename to patches/server/0025-Zombie-horse-naturally-spawn.patch index 076fbec9c..ff1a7e53d 100644 --- a/patches/server/0029-Zombie-horse-naturally-spawn.patch +++ b/patches/server/0025-Zombie-horse-naturally-spawn.patch @@ -5,33 +5,35 @@ Subject: [PATCH] Zombie horse naturally spawn diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index 503bf34f3c9256ed6f0f31f5396d0baeb9ffea59..125faced389b5f467d96dab4e2ac4ffe85c82f50 100644 +index bc1a8e2bb56e25e49bdbf5a80c5d14ed87605f2c..989c42ac9867add34b151cb4586ba90e12c75dd5 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java -@@ -832,9 +832,15 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -816,10 +816,18 @@ public class ServerLevel extends Level implements WorldGenLevel { boolean flag1 = this.getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING) && this.random.nextDouble() < (double) difficultydamagescaler.getEffectiveDifficulty() * this.paperConfig().entities.spawning.skeletonHorseThunderSpawnChance.or(0.01D) && !this.getBlockState(blockposition.below()).is(Blocks.LIGHTNING_ROD); // Paper if (flag1) { - SkeletonHorse entityhorseskeleton = (SkeletonHorse) EntityType.SKELETON_HORSE.create(this); -- -- entityhorseskeleton.setTrap(true); + // Purpur start -+ net.minecraft.world.entity.animal.horse.AbstractHorse entityhorseskeleton = EntityType.SKELETON_HORSE.create(this); ++ net.minecraft.world.entity.animal.horse.AbstractHorse entityhorseskeleton; + if (purpurConfig.zombieHorseSpawnChance > 0D && random.nextDouble() <= purpurConfig.zombieHorseSpawnChance) { + entityhorseskeleton = EntityType.ZOMBIE_HORSE.create(this); + } else { + entityhorseskeleton = EntityType.SKELETON_HORSE.create(this); -+ ((SkeletonHorse) entityhorseskeleton).setTrap(true); ++ if (entityhorseskeleton != null) ((SkeletonHorse) entityhorseskeleton).setTrap(true); + } + // Purpur end - entityhorseskeleton.setAge(0); - entityhorseskeleton.setPos((double) blockposition.getX(), (double) blockposition.getY(), (double) blockposition.getZ()); - this.addFreshEntity(entityhorseskeleton, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.LIGHTNING); // CraftBukkit + + if (entityhorseskeleton != null) { +- entityhorseskeleton.setTrap(true); ++ //entityhorseskeleton.setTrap(true); // Purpur - moved up + entityhorseskeleton.setAge(0); + entityhorseskeleton.setPos((double) blockposition.getX(), (double) blockposition.getY(), (double) blockposition.getZ()); + this.addFreshEntity(entityhorseskeleton, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.LIGHTNING); // CraftBukkit diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index ebea7fe95f5722eb526aa94787e899f9bbfe6e72..c48312f89859787cdecf667becee866a10c88e3b 100644 +index 60948438791c1c323789ed96ea7487f99dd0e572..3285bfcc8b17a729a42c106764cf7390d49323c5 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1458,6 +1458,7 @@ public class PurpurWorldConfig { +@@ -1454,6 +1454,7 @@ public class PurpurWorldConfig { public double zombieHorseJumpStrengthMax = 1.0D; public double zombieHorseMovementSpeedMin = 0.2D; public double zombieHorseMovementSpeedMax = 0.2D; @@ -39,7 +41,7 @@ index ebea7fe95f5722eb526aa94787e899f9bbfe6e72..c48312f89859787cdecf667becee866a private void zombieHorseSettings() { zombieHorseRidableInWater = getBoolean("mobs.zombie_horse.ridable-in-water", zombieHorseRidableInWater); zombieHorseCanSwim = getBoolean("mobs.zombie_horse.can-swim", zombieHorseCanSwim); -@@ -1473,6 +1474,7 @@ public class PurpurWorldConfig { +@@ -1469,6 +1470,7 @@ public class PurpurWorldConfig { zombieHorseJumpStrengthMax = getDouble("mobs.zombie_horse.attributes.jump_strength.max", zombieHorseJumpStrengthMax); zombieHorseMovementSpeedMin = getDouble("mobs.zombie_horse.attributes.movement_speed.min", zombieHorseMovementSpeedMin); zombieHorseMovementSpeedMax = getDouble("mobs.zombie_horse.attributes.movement_speed.max", zombieHorseMovementSpeedMax); diff --git a/patches/server/0030-Charged-creeper-naturally-spawn.patch b/patches/server/0026-Charged-creeper-naturally-spawn.patch similarity index 90% rename from patches/server/0030-Charged-creeper-naturally-spawn.patch rename to patches/server/0026-Charged-creeper-naturally-spawn.patch index df7599c6f..a55de7c97 100644 --- a/patches/server/0030-Charged-creeper-naturally-spawn.patch +++ b/patches/server/0026-Charged-creeper-naturally-spawn.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Charged creeper naturally spawn diff --git a/src/main/java/net/minecraft/world/entity/monster/Creeper.java b/src/main/java/net/minecraft/world/entity/monster/Creeper.java -index bb9fc7f78514b434aba2de25f79fb3404eac4c72..5b20eea9dd51498842599579b2f105e582ccec58 100644 +index f7af29102b378b769edc6f5a92523c5f4cc12dce..fc44e1f4751d405af73aae62658f0257d599e6f7 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Creeper.java +++ b/src/main/java/net/minecraft/world/entity/monster/Creeper.java -@@ -143,6 +143,14 @@ public class Creeper extends Monster implements PowerableMob { +@@ -142,6 +142,14 @@ public class Creeper extends Monster implements PowerableMob { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.creeperMaxHealth); } @@ -24,7 +24,7 @@ index bb9fc7f78514b434aba2de25f79fb3404eac4c72..5b20eea9dd51498842599579b2f105e5 @Override diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index c48312f89859787cdecf667becee866a10c88e3b..c452a21f82d0b873eea4ec9ce80040e0e5f77fd8 100644 +index 3285bfcc8b17a729a42c106764cf7390d49323c5..904d8166e654da9b10e362a15be187ed30e7060f 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -326,6 +326,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0031-Rabbit-naturally-spawn-toast-and-killer.patch b/patches/server/0027-Rabbit-naturally-spawn-toast-and-killer.patch similarity index 66% rename from patches/server/0031-Rabbit-naturally-spawn-toast-and-killer.patch rename to patches/server/0027-Rabbit-naturally-spawn-toast-and-killer.patch index 6b73dcee4..42f2a0ec7 100644 --- a/patches/server/0031-Rabbit-naturally-spawn-toast-and-killer.patch +++ b/patches/server/0027-Rabbit-naturally-spawn-toast-and-killer.patch @@ -5,40 +5,35 @@ Subject: [PATCH] Rabbit naturally spawn toast and killer diff --git a/src/main/java/net/minecraft/world/entity/animal/Rabbit.java b/src/main/java/net/minecraft/world/entity/animal/Rabbit.java -index eaf040f10e33fdfb57391b6e7bc6901c87270853..47dc84052f1fb0017ff2e608c3f6d8b92c960cc6 100644 +index 45f8e38bf4b4b446fe2ec056e31ffd05feaab929..d5d7b4681e08225d3be86db5712c8520174c55ff 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Rabbit.java +++ b/src/main/java/net/minecraft/world/entity/animal/Rabbit.java -@@ -436,7 +436,11 @@ public class Rabbit extends Animal { - if (!this.hasCustomName()) { - this.setCustomName(Component.translatable(Util.makeDescriptionId("entity", Rabbit.KILLER_BUNNY))); - } -+ // Purpur start -+ } else if (rabbitType == 98) { -+ setCustomName(Component.translatable("Toast")); +@@ -465,10 +465,23 @@ public class Rabbit extends Animal implements VariantHolder { } -+ // Purpur end - this.entityData.set(Rabbit.DATA_TYPE_ID, rabbitType); - } -@@ -457,6 +461,16 @@ public class Rabbit extends Animal { - } - - private int getRandomRabbitType(LevelAccessor world) { + this.setVariant(entityrabbit_variant); ++ + // Purpur start -+ Level level = world.getMinecraftWorld(); -+ if (level.purpurConfig.rabbitNaturalKiller > 0D && random.nextDouble() <= level.purpurConfig.rabbitNaturalKiller) { -+ return 99; -+ } -+ if (level.purpurConfig.rabbitNaturalToast > 0D && random.nextDouble() <= level.purpurConfig.rabbitNaturalToast) { -+ return 98; ++ if (entityrabbit_variant != Variant.EVIL && world.getLevel().purpurConfig.rabbitNaturalToast > 0D && random.nextDouble() <= world.getLevel().purpurConfig.rabbitNaturalToast) { ++ setCustomName(Component.translatable("Toast")); + } + // Purpur end + - Holder holder = world.getBiome(this.blockPosition()); + return super.finalizeSpawn(world, difficulty, spawnReason, (SpawnGroupData) entityData, entityNbt); + } + + private static Rabbit.Variant getRandomRabbitVariant(LevelAccessor world, BlockPos pos) { ++ // Purpur start ++ Level level = world.getMinecraftWorld(); ++ if (level.purpurConfig.rabbitNaturalKiller > 0D && world.getRandom().nextDouble() <= level.purpurConfig.rabbitNaturalKiller) { ++ return Rabbit.Variant.EVIL; ++ } ++ // Purpur end + Holder holder = world.getBiome(pos); int i = world.getRandom().nextInt(100); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index c452a21f82d0b873eea4ec9ce80040e0e5f77fd8..c092ef4a028d7dc335077b6b741bd1991cb3e7ba 100644 +index 68209ce9715e0717486153bd71572d558dd48851..24f529b4ca5f4e83ac33e255d4f602de54732fb3 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -969,6 +969,8 @@ public class PurpurWorldConfig { diff --git a/patches/server/0032-Fix-outdated-server-showing-in-ping-before-server-fu.patch b/patches/server/0028-Fix-outdated-server-showing-in-ping-before-server-fu.patch similarity index 86% rename from patches/server/0032-Fix-outdated-server-showing-in-ping-before-server-fu.patch rename to patches/server/0028-Fix-outdated-server-showing-in-ping-before-server-fu.patch index 140cd1d2d..d5889ab38 100644 --- a/patches/server/0032-Fix-outdated-server-showing-in-ping-before-server-fu.patch +++ b/patches/server/0028-Fix-outdated-server-showing-in-ping-before-server-fu.patch @@ -6,10 +6,10 @@ Subject: [PATCH] Fix 'outdated server' showing in ping before server fully diff --git a/src/main/java/net/minecraft/server/network/ServerStatusPacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerStatusPacketListenerImpl.java -index 29a22da1b94d51300481c071aa16bfd8cd02178f..f67cbb1badc007987e62872bb0160ad6d05e3d97 100644 +index 0725c39d9cbec3282f93975a0ae76f060f70d86d..b1afe7d9fff390cc9668ce9bbb408d64147553e6 100644 --- a/src/main/java/net/minecraft/server/network/ServerStatusPacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerStatusPacketListenerImpl.java -@@ -153,6 +153,7 @@ public class ServerStatusPacketListenerImpl implements ServerStatusPacketListene +@@ -152,6 +152,7 @@ public class ServerStatusPacketListenerImpl implements ServerStatusPacketListene this.connection.send(new ClientboundStatusResponsePacket(ping)); // CraftBukkit end */ diff --git a/patches/server/0033-Tulips-change-fox-type.patch b/patches/server/0029-Tulips-change-fox-type.patch similarity index 79% rename from patches/server/0033-Tulips-change-fox-type.patch rename to patches/server/0029-Tulips-change-fox-type.patch index f30218580..ab1b5d8f2 100644 --- a/patches/server/0033-Tulips-change-fox-type.patch +++ b/patches/server/0029-Tulips-change-fox-type.patch @@ -5,11 +5,11 @@ Subject: [PATCH] Tulips change fox type diff --git a/src/main/java/net/minecraft/world/entity/animal/Fox.java b/src/main/java/net/minecraft/world/entity/animal/Fox.java -index 1f714f980bad7dcdeb361366a2d65c5a9f831a2c..64a564bf1a5133971050882835749807154c3a72 100644 +index 4f10430e55d634b4e4bf74582a8032cc42938c7f..503721cce0a5207a44b016a4234c17a87edee287 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Fox.java +++ b/src/main/java/net/minecraft/world/entity/animal/Fox.java -@@ -35,6 +35,7 @@ import net.minecraft.util.Mth; - import net.minecraft.util.RandomSource; +@@ -34,6 +34,7 @@ import net.minecraft.util.RandomSource; + import net.minecraft.util.StringRepresentable; import net.minecraft.world.DifficultyInstance; import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; @@ -24,7 +24,7 @@ index 1f714f980bad7dcdeb361366a2d65c5a9f831a2c..64a564bf1a5133971050882835749807 import net.minecraft.world.level.pathfinder.BlockPathTypes; import net.minecraft.world.phys.Vec3; -@@ -382,6 +384,11 @@ public class Fox extends Animal { +@@ -386,6 +388,11 @@ public class Fox extends Animal implements VariantHolder { } private void setTargetGoals() { @@ -33,18 +33,18 @@ index 1f714f980bad7dcdeb361366a2d65c5a9f831a2c..64a564bf1a5133971050882835749807 + this.targetSelector.removeGoal(this.turtleEggTargetGoal); + this.targetSelector.removeGoal(this.fishTargetGoal); + // Purpur end - if (this.getFoxType() == Fox.Type.RED) { + if (this.getVariant() == Fox.Type.RED) { this.targetSelector.addGoal(4, this.landTargetGoal); this.targetSelector.addGoal(4, this.turtleEggTargetGoal); -@@ -414,6 +421,7 @@ public class Fox extends Animal { +@@ -419,6 +426,7 @@ public class Fox extends Animal implements VariantHolder { - public void setFoxType(Fox.Type type) { - this.entityData.set(Fox.DATA_TYPE_ID, type.getId()); + public void setVariant(Fox.Type variant) { + this.entityData.set(Fox.DATA_TYPE_ID, variant.getId()); + this.setTargetGoals(); // Purpur - fix API bug not updating pathfinders on type change } List getTrustedUUIDs() { -@@ -750,6 +758,29 @@ public class Fox extends Animal { +@@ -755,6 +763,29 @@ public class Fox extends Animal implements VariantHolder { return this.getTrustedUUIDs().contains(uuid); } @@ -53,14 +53,14 @@ index 1f714f980bad7dcdeb361366a2d65c5a9f831a2c..64a564bf1a5133971050882835749807 + public InteractionResult mobInteract(Player player, InteractionHand hand) { + if (level.purpurConfig.foxTypeChangesWithTulips) { + ItemStack itemstack = player.getItemInHand(hand); -+ if (getFoxType() == Type.RED && itemstack.getItem() == Items.WHITE_TULIP) { -+ setFoxType(Type.SNOW); ++ if (getVariant() == Type.RED && itemstack.getItem() == Items.WHITE_TULIP) { ++ setVariant(Type.SNOW); + if (!player.getAbilities().instabuild) { + itemstack.shrink(1); + } + return InteractionResult.SUCCESS; -+ } else if (getFoxType() == Type.SNOW && itemstack.getItem() == Items.ORANGE_TULIP) { -+ setFoxType(Type.RED); ++ } else if (getVariant() == Type.SNOW && itemstack.getItem() == Items.ORANGE_TULIP) { ++ setVariant(Type.RED); + if (!player.getAbilities().instabuild) { + itemstack.shrink(1); + } @@ -75,7 +75,7 @@ index 1f714f980bad7dcdeb361366a2d65c5a9f831a2c..64a564bf1a5133971050882835749807 // Paper start - Cancellable death event protected org.bukkit.event.entity.EntityDeathEvent dropAllDeathLoot(DamageSource source) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index c092ef4a028d7dc335077b6b741bd1991cb3e7ba..e655b23d45ad4daca07202ae1e03d3dbdeff1813 100644 +index 7abd787324ffff3394ec3f360ff363a6de2534fb..b0ed6d3b829d998d29af650ad723ae104d351bd2 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -490,6 +490,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0034-Breedable-Polar-Bears.patch b/patches/server/0030-Breedable-Polar-Bears.patch similarity index 89% rename from patches/server/0034-Breedable-Polar-Bears.patch rename to patches/server/0030-Breedable-Polar-Bears.patch index e3a86eeda..7a05ac73b 100644 --- a/patches/server/0034-Breedable-Polar-Bears.patch +++ b/patches/server/0030-Breedable-Polar-Bears.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Breedable Polar Bears diff --git a/src/main/java/net/minecraft/world/entity/animal/PolarBear.java b/src/main/java/net/minecraft/world/entity/animal/PolarBear.java -index 798269a1098008e14fc2548e480c815fa4ff4d25..e68782ac48fd9ee11080dfd76c88d9a4768ae769 100644 +index bd1d90fa59d420577baada18d5afd04a85ad76a9..4e837590faebcb35426f8b9d023b2ae226871825 100644 --- a/src/main/java/net/minecraft/world/entity/animal/PolarBear.java +++ b/src/main/java/net/minecraft/world/entity/animal/PolarBear.java @@ -97,6 +97,27 @@ public class PolarBear extends Animal implements NeutralMob { @@ -35,8 +35,8 @@ index 798269a1098008e14fc2548e480c815fa4ff4d25..e68782ac48fd9ee11080dfd76c88d9a4 + } // Purpur end - @Override -@@ -106,7 +127,7 @@ public class PolarBear extends Animal implements NeutralMob { + @Nullable +@@ -107,7 +128,7 @@ public class PolarBear extends Animal implements NeutralMob { @Override public boolean isFood(ItemStack stack) { @@ -45,7 +45,7 @@ index 798269a1098008e14fc2548e480c815fa4ff4d25..e68782ac48fd9ee11080dfd76c88d9a4 } @Override -@@ -116,6 +137,12 @@ public class PolarBear extends Animal implements NeutralMob { +@@ -117,6 +138,12 @@ public class PolarBear extends Animal implements NeutralMob { this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur this.goalSelector.addGoal(1, new PolarBear.PolarBearMeleeAttackGoal()); this.goalSelector.addGoal(1, new PolarBear.PolarBearPanicGoal()); @@ -59,7 +59,7 @@ index 798269a1098008e14fc2548e480c815fa4ff4d25..e68782ac48fd9ee11080dfd76c88d9a4 this.goalSelector.addGoal(5, new RandomStrollGoal(this, 1.0D)); this.goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 6.0F)); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index e655b23d45ad4daca07202ae1e03d3dbdeff1813..2784e968248e5e5ecfbe1a912825c0830ef89083 100644 +index 25b6861e031e87ffa2344a0a014b33e5560f85e2..3af6da4508442d349fb93f9529ef7d17f0544a37 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -941,6 +941,8 @@ public class PurpurWorldConfig { @@ -76,7 +76,7 @@ index e655b23d45ad4daca07202ae1e03d3dbdeff1813..2784e968248e5e5ecfbe1a912825c083 } polarBearMaxHealth = getDouble("mobs.polar_bear.attributes.max_health", polarBearMaxHealth); + polarBearBreedableItemString = getString("mobs.polar_bear.breedable-item", polarBearBreedableItemString); -+ Item item = Registry.ITEM.get(new ResourceLocation(polarBearBreedableItemString)); ++ Item item = BuiltInRegistries.ITEM.get(new ResourceLocation(polarBearBreedableItemString)); + if (item != Items.AIR) polarBearBreedableItem = item; } diff --git a/patches/server/0035-Chickens-can-retaliate.patch b/patches/server/0031-Chickens-can-retaliate.patch similarity index 90% rename from patches/server/0035-Chickens-can-retaliate.patch rename to patches/server/0031-Chickens-can-retaliate.patch index 485107675..936092d12 100644 --- a/patches/server/0035-Chickens-can-retaliate.patch +++ b/patches/server/0031-Chickens-can-retaliate.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Chickens can retaliate diff --git a/src/main/java/net/minecraft/world/entity/animal/Chicken.java b/src/main/java/net/minecraft/world/entity/animal/Chicken.java -index 8503a3393026134df18601ed87dcec1f3e6680b8..96dceb9943c4320e0edfba47cc211d60aa92323b 100644 +index e4200b09f54861d61c9dae40e6883aa19265e295..471647830f3ae90f8867282edd6fb20f8afa25a3 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Chicken.java +++ b/src/main/java/net/minecraft/world/entity/animal/Chicken.java -@@ -72,6 +72,9 @@ public class Chicken extends Animal { +@@ -73,6 +73,9 @@ public class Chicken extends Animal { @Override public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.chickenMaxHealth); @@ -18,7 +18,7 @@ index 8503a3393026134df18601ed87dcec1f3e6680b8..96dceb9943c4320e0edfba47cc211d60 } // Purpur end -@@ -79,13 +82,21 @@ public class Chicken extends Animal { +@@ -80,13 +83,21 @@ public class Chicken extends Animal { protected void registerGoals() { this.goalSelector.addGoal(0, new FloatGoal(this)); this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur @@ -41,7 +41,7 @@ index 8503a3393026134df18601ed87dcec1f3e6680b8..96dceb9943c4320e0edfba47cc211d60 } @Override -@@ -94,7 +105,7 @@ public class Chicken extends Animal { +@@ -95,7 +106,7 @@ public class Chicken extends Animal { } public static AttributeSupplier.Builder createAttributes() { @@ -51,7 +51,7 @@ index 8503a3393026134df18601ed87dcec1f3e6680b8..96dceb9943c4320e0edfba47cc211d60 @Override diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 2784e968248e5e5ecfbe1a912825c0830ef89083..2ba6d4749e20519a6ed2f7f1646f8a77341a7a4a 100644 +index 3af6da4508442d349fb93f9529ef7d17f0544a37..edc82ce158d50ac8def2453ccd980cdcf2f7d970 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -280,6 +280,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0036-Add-option-to-set-armorstand-step-height.patch b/patches/server/0032-Add-option-to-set-armorstand-step-height.patch similarity index 94% rename from patches/server/0036-Add-option-to-set-armorstand-step-height.patch rename to patches/server/0032-Add-option-to-set-armorstand-step-height.patch index 72f620a30..e5daa1d56 100644 --- a/patches/server/0036-Add-option-to-set-armorstand-step-height.patch +++ b/patches/server/0032-Add-option-to-set-armorstand-step-height.patch @@ -17,7 +17,7 @@ index b136cdc13d94bc34c998a1986e0c93525356ac5c..76c83fdd744cc8f31a52c733de521a6f if (!this.canTick) { if (this.noTickPoseDirty) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 2ba6d4749e20519a6ed2f7f1646f8a77341a7a4a..4327261b78eb936d7afc159e6359b293ef15bacc 100644 +index edc82ce158d50ac8def2453ccd980cdcf2f7d970..548f0815516cfdccca7e280410eee15bd268ba87 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -93,6 +93,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0037-Cat-spawning-options.patch b/patches/server/0033-Cat-spawning-options.patch similarity index 92% rename from patches/server/0037-Cat-spawning-options.patch rename to patches/server/0033-Cat-spawning-options.patch index bf2bb1ca3..06f0220b3 100644 --- a/patches/server/0037-Cat-spawning-options.patch +++ b/patches/server/0033-Cat-spawning-options.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Cat spawning options diff --git a/src/main/java/net/minecraft/world/entity/npc/CatSpawner.java b/src/main/java/net/minecraft/world/entity/npc/CatSpawner.java -index 8808cb9f5df43d781cbb9c7943ff2f222e3a6969..f7e3ee98b006a53c3c6bf87fc90e5ef43e87bb74 100644 +index 5f407535298a31a34cfe114dd863fd6a9b977707..29c7e33fe961020e5a0007287fe9b6631689f1b8 100644 --- a/src/main/java/net/minecraft/world/entity/npc/CatSpawner.java +++ b/src/main/java/net/minecraft/world/entity/npc/CatSpawner.java @@ -30,7 +30,7 @@ public class CatSpawner implements CustomSpawner { @@ -26,8 +26,8 @@ index 8808cb9f5df43d781cbb9c7943ff2f222e3a6969..f7e3ee98b006a53c3c6bf87fc90e5ef4 + int range = world.purpurConfig.catSpawnVillageScanRange; + if (range <= 0) return 0; + - if (world.getPoiManager().getCountInRange((holder) -> { - return holder.is(PoiTypes.HOME); + if (world.getPoiManager().getCountInRange((entry) -> { + return entry.is(PoiTypes.HOME); - }, pos, 48, PoiManager.Occupancy.IS_OCCUPIED) > 4L) { - List list = world.getEntitiesOfClass(Cat.class, (new AABB(pos)).inflate(48.0D, 8.0D, 48.0D)); + }, pos, range, PoiManager.Occupancy.IS_OCCUPIED) > 4L) { @@ -51,7 +51,7 @@ index 8808cb9f5df43d781cbb9c7943ff2f222e3a6969..f7e3ee98b006a53c3c6bf87fc90e5ef4 } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 4327261b78eb936d7afc159e6359b293ef15bacc..9ac7c6324f01c6de7f2161cd1bd33d9c5218af90 100644 +index 548f0815516cfdccca7e280410eee15bd268ba87..915853e96d9572a6b057604b1efcee1b4b9129f0 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -253,6 +253,9 @@ public class PurpurWorldConfig { diff --git a/patches/server/0038-Cows-eat-mushrooms.patch b/patches/server/0034-Cows-eat-mushrooms.patch similarity index 85% rename from patches/server/0038-Cows-eat-mushrooms.patch rename to patches/server/0034-Cows-eat-mushrooms.patch index a5332c364..f8adc2bab 100644 --- a/patches/server/0038-Cows-eat-mushrooms.patch +++ b/patches/server/0034-Cows-eat-mushrooms.patch @@ -5,18 +5,18 @@ Subject: [PATCH] Cows eat mushrooms diff --git a/src/main/java/net/minecraft/world/entity/animal/Cow.java b/src/main/java/net/minecraft/world/entity/animal/Cow.java -index b6af466d454ca7d4c0277d2d1db0e23b50677418..00bb7f8f8bc3b1369aec7b139745cf3c47b9f0f6 100644 +index 7eecdb4be5ee7de39ccb86b4bfe98491f8cba9b6..8744649fbd3f11485d5862d6f1fb32ea27f11e77 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cow.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cow.java -@@ -1,6 +1,7 @@ - package net.minecraft.world.entity.animal; +@@ -2,6 +2,7 @@ package net.minecraft.world.entity.animal; + import javax.annotation.Nullable; import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.ParticleTypes; import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; -@@ -28,6 +29,7 @@ import net.minecraft.world.item.ItemUtils; +@@ -29,6 +30,7 @@ import net.minecraft.world.item.ItemUtils; import net.minecraft.world.item.Items; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.level.Level; @@ -24,7 +24,7 @@ index b6af466d454ca7d4c0277d2d1db0e23b50677418..00bb7f8f8bc3b1369aec7b139745cf3c import net.minecraft.world.level.block.state.BlockState; // CraftBukkit start import org.bukkit.craftbukkit.event.CraftEventFactory; -@@ -68,6 +70,7 @@ public class Cow extends Animal { +@@ -69,6 +71,7 @@ public class Cow extends Animal { this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur this.goalSelector.addGoal(1, new PanicGoal(this, 2.0D)); this.goalSelector.addGoal(2, new BreedGoal(this, 1.0D)); @@ -32,7 +32,7 @@ index b6af466d454ca7d4c0277d2d1db0e23b50677418..00bb7f8f8bc3b1369aec7b139745cf3c this.goalSelector.addGoal(3, new TemptGoal(this, 1.25D, Ingredient.of(Items.WHEAT), false)); this.goalSelector.addGoal(4, new FollowParentGoal(this, 1.25D)); this.goalSelector.addGoal(5, new WaterAvoidingRandomStrollGoal(this, 1.0D)); -@@ -123,11 +126,80 @@ public class Cow extends Animal { +@@ -124,6 +127,10 @@ public class Cow extends Animal { player.setItemInHand(hand, itemstack1); return InteractionResult.sidedSuccess(this.level.isClientSide); @@ -43,8 +43,11 @@ index b6af466d454ca7d4c0277d2d1db0e23b50677418..00bb7f8f8bc3b1369aec7b139745cf3c } else { return super.mobInteract(player, hand); } +@@ -139,4 +146,69 @@ public class Cow extends Animal { + protected float getStandingEyeHeight(Pose pose, EntityDimensions dimensions) { + return this.isBaby() ? dimensions.height * 0.95F : 1.3F; } - ++ + // Purpur start - feed mushroom to change to mooshroom + private int redMushroomsFed = 0; + private int brownMushroomsFed = 0; @@ -75,9 +78,9 @@ index b6af466d454ca7d4c0277d2d1db0e23b50677418..00bb7f8f8bc3b1369aec7b139745cf3c + return InteractionResult.PASS; + } + if (stack.getItem() == Blocks.BROWN_MUSHROOM.asItem()) { -+ mooshroom.setMushroomType(MushroomCow.MushroomType.BROWN); ++ mooshroom.setVariant(MushroomCow.MushroomType.BROWN); + } else { -+ mooshroom.setMushroomType(MushroomCow.MushroomType.RED); ++ mooshroom.setVariant(MushroomCow.MushroomType.RED); + } + mooshroom.moveTo(this.getX(), this.getY(), this.getZ(), this.getYRot(), this.getXRot()); + mooshroom.setHealth(this.getHealth()); @@ -103,18 +106,15 @@ index b6af466d454ca7d4c0277d2d1db0e23b50677418..00bb7f8f8bc3b1369aec7b139745cf3c + } + for (int i = 0; i < 15; ++i) { + ((ServerLevel) level).sendParticles(((ServerLevel) level).players(), null, ParticleTypes.HAPPY_VILLAGER, -+ getX() + random.nextFloat(), getY() + (random.nextFloat() * 2), getZ() + random.nextFloat(), 1, -+ random.nextGaussian() * 0.05D, random.nextGaussian() * 0.05D, random.nextGaussian() * 0.05D, 0, true); ++ getX() + random.nextFloat(), getY() + (random.nextFloat() * 2), getZ() + random.nextFloat(), 1, ++ random.nextGaussian() * 0.05D, random.nextGaussian() * 0.05D, random.nextGaussian() * 0.05D, 0, true); + } + return InteractionResult.SUCCESS; + } + // Purpur end -+ - @Override - public Cow getBreedOffspring(ServerLevel world, AgeableMob entity) { - return (Cow) EntityType.COW.create(world); + } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 9ac7c6324f01c6de7f2161cd1bd33d9c5218af90..dee17f0ae23f59c0165cbd410ffc1dd4c4986c02 100644 +index 9a162f069c0452acf3eccfa91198b9b6aa6be35d..5755607fd0066418876fd02b8c4fd45447592cf5 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -323,6 +323,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0035-Fix-cow-rotation-when-shearing-mooshroom.patch b/patches/server/0035-Fix-cow-rotation-when-shearing-mooshroom.patch new file mode 100644 index 000000000..55ff680bb --- /dev/null +++ b/patches/server/0035-Fix-cow-rotation-when-shearing-mooshroom.patch @@ -0,0 +1,24 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: William Blake Galbreath +Date: Fri, 3 May 2019 23:53:16 -0500 +Subject: [PATCH] Fix cow rotation when shearing mooshroom + + +diff --git a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java +index 19bd997d421a338966fcd3e3dfeb8669a6fb542f..2f85004a9dac740a9ddadd18b47cf3be821e5add 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java ++++ b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java +@@ -202,7 +202,13 @@ public class MushroomCow extends Cow implements Shearable, VariantHolder -Date: Fri, 3 May 2019 23:53:16 -0500 -Subject: [PATCH] Fix cow rotation when shearing mooshroom - - -diff --git a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java -index 763a254d820cff3c776570248b9e905c052dd447..bdfca8501edb9209463b70db2d134b488a08e143 100644 ---- a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java -+++ b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java -@@ -202,7 +202,13 @@ public class MushroomCow extends Cow implements Shearable { - - entitycow.moveTo(this.getX(), this.getY(), this.getZ(), this.getYRot(), this.getXRot()); - entitycow.setHealth(this.getHealth()); -+ // Purpur start -+ entitycow.copyPosition(this); - entitycow.yBodyRot = this.yBodyRot; -+ entitycow.setYHeadRot(this.getYHeadRot()); -+ entitycow.yRotO = this.yRotO; -+ entitycow.xRotO = this.xRotO; -+ // Purpur end - if (this.hasCustomName()) { - entitycow.setCustomName(this.getCustomName()); - entitycow.setCustomNameVisible(this.isCustomNameVisible()); diff --git a/patches/server/0043-Signs-editable-on-right-click.patch b/patches/server/0039-Signs-editable-on-right-click.patch similarity index 69% rename from patches/server/0043-Signs-editable-on-right-click.patch rename to patches/server/0039-Signs-editable-on-right-click.patch index 2cfd3300c..6ef90e91b 100644 --- a/patches/server/0043-Signs-editable-on-right-click.patch +++ b/patches/server/0039-Signs-editable-on-right-click.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Signs editable on right click diff --git a/src/main/java/net/minecraft/world/level/block/SignBlock.java b/src/main/java/net/minecraft/world/level/block/SignBlock.java -index ed3d78494735ceda14ad0ea23adeadc374f3b35e..a0d23b7e244e7df8a462b801dee18fd421b3b8ef 100644 +index aface9a9697095a29edaf73c9cdabc2c1414b9d7..1a04d0a601b8e481dd6e2592b849b907a5b9f63f 100644 --- a/src/main/java/net/minecraft/world/level/block/SignBlock.java +++ b/src/main/java/net/minecraft/world/level/block/SignBlock.java @@ -14,6 +14,7 @@ import net.minecraft.world.item.DyeItem; @@ -16,6 +16,21 @@ index ed3d78494735ceda14ad0ea23adeadc374f3b35e..a0d23b7e244e7df8a462b801dee18fd4 import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; +@@ -76,11 +77,11 @@ public abstract class SignBlock extends BaseEntityBlock implements SimpleWaterlo + if (world.isClientSide) { + return bl4 ? InteractionResult.SUCCESS : InteractionResult.CONSUME; + } else { +- BlockEntity bl5 = world.getBlockEntity(pos); +- if (!(bl5 instanceof SignBlockEntity)) { ++ BlockEntity blockEntity = world.getBlockEntity(pos); // Purpur - decompile fix ++ if (!(blockEntity instanceof SignBlockEntity)) { // Purpur - decompile fix + return InteractionResult.PASS; + } else { +- SignBlockEntity signBlockEntity = (SignBlockEntity)bl5; ++ SignBlockEntity signBlockEntity = (SignBlockEntity)blockEntity; // Purpur - decompile fix + boolean bl5 = signBlockEntity.hasGlowingText(); + if ((!bl2 || !bl5) && (!bl3 || bl5)) { + if (bl4) { @@ -108,6 +109,17 @@ public abstract class SignBlock extends BaseEntityBlock implements SimpleWaterlo } } @@ -35,7 +50,7 @@ index ed3d78494735ceda14ad0ea23adeadc374f3b35e..a0d23b7e244e7df8a462b801dee18fd4 } else { return InteractionResult.PASS; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 1997b61722f4b19e206614ddf92d2d63e009d209..97314f926981ba68fafc175ca1768663202210fd 100644 +index 14d8928f43aa8d3bfc34e724356a877e05f19846..a02e09cc37251fbdf0e6336ae628f9f8685dafc9 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -152,6 +152,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0044-Allow-soil-to-moisten-from-water-directly-under-it.patch b/patches/server/0040-Allow-soil-to-moisten-from-water-directly-under-it.patch similarity index 94% rename from patches/server/0044-Allow-soil-to-moisten-from-water-directly-under-it.patch rename to patches/server/0040-Allow-soil-to-moisten-from-water-directly-under-it.patch index f03612c60..d7ad8b1cc 100644 --- a/patches/server/0044-Allow-soil-to-moisten-from-water-directly-under-it.patch +++ b/patches/server/0040-Allow-soil-to-moisten-from-water-directly-under-it.patch @@ -18,7 +18,7 @@ index d089887030ac7c7a79abca97134ba9291e244059..4208833252a5b5c74d294dc3435869d7 @Override diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 97314f926981ba68fafc175ca1768663202210fd..dcad4a05c287fc6448eeafaed16d7163b0ae855a 100644 +index b70d457584a9b3564784e28e47b359917d825aa9..d7cfbfe6a44d076b1e6efee7c9868924290e1fc6 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -152,6 +152,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0045-Minecart-settings-and-WASD-controls.patch b/patches/server/0041-Minecart-settings-and-WASD-controls.patch similarity index 93% rename from patches/server/0045-Minecart-settings-and-WASD-controls.patch rename to patches/server/0041-Minecart-settings-and-WASD-controls.patch index 774b8361a..b4a293a03 100644 --- a/patches/server/0045-Minecart-settings-and-WASD-controls.patch +++ b/patches/server/0041-Minecart-settings-and-WASD-controls.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Minecart settings and WASD controls diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index f3a90f798f6068e86e1dfd1de49b0fdc074cc7c9..c566942d2dc27019cd0a570ac9af4e3d420c2baa 100644 +index 4dc545c478e24863c8e9c68060af072f748b735e..a51453de2837851769f826f0b9eddc812d18614f 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java -@@ -1042,6 +1042,7 @@ public class ServerPlayer extends Player { +@@ -1064,6 +1064,7 @@ public class ServerPlayer extends Player { if (this.isInvulnerableTo(source)) { return false; } else { @@ -17,10 +17,10 @@ index f3a90f798f6068e86e1dfd1de49b0fdc074cc7c9..c566942d2dc27019cd0a570ac9af4e3d if (!flag && isSpawnInvulnerable() && source != DamageSource.OUT_OF_WORLD) { // Purpur diff --git a/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java b/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java -index c71120fe57a76c4638be5dcbda5a756cc2d62ffc..997776ac62d2de1f076a5bc38fcf78a1999748cf 100644 +index eec7d7a5b558830111831792c42665724613af23..6a5e592c5c9a972a7f42eca398aac5f26f1e595d 100644 --- a/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java +++ b/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java -@@ -107,11 +107,13 @@ public abstract class AbstractMinecart extends Entity { +@@ -106,11 +106,13 @@ public abstract class AbstractMinecart extends Entity { private double flyingY = 0.949999988079071D; // Paper - restore vanilla precision private double flyingZ = 0.949999988079071D; // Paper - restore vanilla precision public double maxSpeed = 0.4D; @@ -34,7 +34,7 @@ index c71120fe57a76c4638be5dcbda5a756cc2d62ffc..997776ac62d2de1f076a5bc38fcf78a1 } protected AbstractMinecart(EntityType type, Level world, double x, double y, double z) { -@@ -334,6 +336,12 @@ public abstract class AbstractMinecart extends Entity { +@@ -333,6 +335,12 @@ public abstract class AbstractMinecart extends Entity { @Override public void tick() { @@ -47,7 +47,7 @@ index c71120fe57a76c4638be5dcbda5a756cc2d62ffc..997776ac62d2de1f076a5bc38fcf78a1 // CraftBukkit start double prevX = this.getX(); double prevY = this.getY(); -@@ -497,16 +505,63 @@ public abstract class AbstractMinecart extends Entity { +@@ -496,16 +504,63 @@ public abstract class AbstractMinecart extends Entity { public void activateMinecart(int x, int y, int z, boolean powered) {} @@ -136,11 +136,11 @@ index 127a799f7848b32664b77bf67847ca6b8ac9a90d..178cd88a7de291136e0486617e8347b7 } } diff --git a/src/main/java/net/minecraft/world/level/block/state/BlockBehaviour.java b/src/main/java/net/minecraft/world/level/block/state/BlockBehaviour.java -index b86c17b5572f8f74bfefd0f3c6f9d25187574392..304f0f372d669e3da2e8131c50f2f1246185a56b 100644 +index 9ebc53d434737c8cd39073470b2b5fcbad167812..b40e09b4fdf26c08c048cbf3cad4d4cabec0fe90 100644 --- a/src/main/java/net/minecraft/world/level/block/state/BlockBehaviour.java +++ b/src/main/java/net/minecraft/world/level/block/state/BlockBehaviour.java -@@ -73,7 +73,7 @@ import net.minecraft.world.phys.shapes.VoxelShape; - public abstract class BlockBehaviour { +@@ -77,7 +77,7 @@ import net.minecraft.world.phys.shapes.VoxelShape; + public abstract class BlockBehaviour implements FeatureElement { protected static final Direction[] UPDATE_SHAPE_ORDER = new Direction[]{Direction.WEST, Direction.EAST, Direction.NORTH, Direction.SOUTH, Direction.DOWN, Direction.UP}; - protected final Material material; @@ -149,7 +149,7 @@ index b86c17b5572f8f74bfefd0f3c6f9d25187574392..304f0f372d669e3da2e8131c50f2f124 protected final float explosionResistance; protected final boolean isRandomlyTicking; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index dcad4a05c287fc6448eeafaed16d7163b0ae855a..e4b920976dab1d29d686f7948fb3f8bdd643288b 100644 +index de6e988e6d5d3c5a6d6fd7f00124c832013367a4..722c589bec9a1cf353f36027c63d9cf0a169c417 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -98,6 +98,68 @@ public class PurpurWorldConfig { @@ -207,7 +207,7 @@ index dcad4a05c287fc6448eeafaed16d7163b0ae855a..e4b920976dab1d29d686f7948fb3f8bd + ConfigurationSection section = getConfigurationSection("gameplay-mechanics.minecart.controllable.block-speed"); + if (section != null) { + for (String key : section.getKeys(false)) { -+ Block block = Registry.BLOCK.get(new ResourceLocation(key)); ++ Block block = BuiltInRegistries.BLOCK.get(new ResourceLocation(key)); + if (block != Blocks.AIR) { + minecartControllableBlockSpeeds.put(block, section.getDouble(key, minecartControllableBaseSpeed)); + } diff --git a/patches/server/0046-Disable-loot-drops-on-death-by-cramming.patch b/patches/server/0042-Disable-loot-drops-on-death-by-cramming.patch similarity index 87% rename from patches/server/0046-Disable-loot-drops-on-death-by-cramming.patch rename to patches/server/0042-Disable-loot-drops-on-death-by-cramming.patch index dabe3193b..bb42f87ad 100644 --- a/patches/server/0046-Disable-loot-drops-on-death-by-cramming.patch +++ b/patches/server/0042-Disable-loot-drops-on-death-by-cramming.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Disable loot drops on death by cramming diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index da4fe84f640eacc7c1c3da9a6adee4824c1d10fa..eaac469c2ccad3536c2e20211f7618d4de3e370c 100644 +index d45cc25d37906ba0c2e5d80936aaae1d7f9f4159..a56b9ae0d352db5350cc96ad079eee140aa7d665 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -1765,6 +1765,7 @@ public abstract class LivingEntity extends Entity { +@@ -1759,6 +1759,7 @@ public abstract class LivingEntity extends Entity { this.dropEquipment(); // CraftBukkit - from below if (this.shouldDropLoot() && this.level.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) { @@ -16,7 +16,7 @@ index da4fe84f640eacc7c1c3da9a6adee4824c1d10fa..eaac469c2ccad3536c2e20211f7618d4 this.dropFromLootTable(source, flag); // Paper start final boolean prev = this.clearEquipmentSlots; -@@ -1773,6 +1774,7 @@ public abstract class LivingEntity extends Entity { +@@ -1767,6 +1768,7 @@ public abstract class LivingEntity extends Entity { // Paper end this.dropCustomDeathLoot(source, i, flag); this.clearEquipmentSlots = prev; // Paper @@ -25,7 +25,7 @@ index da4fe84f640eacc7c1c3da9a6adee4824c1d10fa..eaac469c2ccad3536c2e20211f7618d4 // CraftBukkit start - Call death event // Paper start - call advancement triggers with correct entity equipment org.bukkit.event.entity.EntityDeathEvent deathEvent = CraftEventFactory.callEntityDeathEvent(this, this.drops, () -> { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index e4b920976dab1d29d686f7948fb3f8bdd643288b..1d5aecb050f6ef6237ea8c1c32b41741477fdf54 100644 +index 9c708db8f7157bafc66efa7c19ac4b6ccc29fd9e..964d1e0f9f9e7f14cc702f28e135039715f49fc6 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -98,6 +98,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0047-Option-to-toggle-milk-curing-bad-omen.patch b/patches/server/0043-Option-to-toggle-milk-curing-bad-omen.patch similarity index 95% rename from patches/server/0047-Option-to-toggle-milk-curing-bad-omen.patch rename to patches/server/0043-Option-to-toggle-milk-curing-bad-omen.patch index bb07b3a21..67fbebc89 100644 --- a/patches/server/0047-Option-to-toggle-milk-curing-bad-omen.patch +++ b/patches/server/0043-Option-to-toggle-milk-curing-bad-omen.patch @@ -28,7 +28,7 @@ index f33977d95b6db473be4f95075ba99caf90ad0220..56dc04d8875971ee9a5d077a695509af return stack.isEmpty() ? new ItemStack(Items.BUCKET) : stack; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 1d5aecb050f6ef6237ea8c1c32b41741477fdf54..f06462675a155d95a303e7ea0a7dae3be287a0de 100644 +index 964d1e0f9f9e7f14cc702f28e135039715f49fc6..ef8d842ad2dff2124f9a88f0eaa202861a5015af 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -99,8 +99,10 @@ public class PurpurWorldConfig { diff --git a/patches/server/0048-End-gateway-should-check-if-entity-can-use-portal.patch b/patches/server/0044-End-gateway-should-check-if-entity-can-use-portal.patch similarity index 86% rename from patches/server/0048-End-gateway-should-check-if-entity-can-use-portal.patch rename to patches/server/0044-End-gateway-should-check-if-entity-can-use-portal.patch index 54aff5fc6..d1e396e32 100644 --- a/patches/server/0048-End-gateway-should-check-if-entity-can-use-portal.patch +++ b/patches/server/0044-End-gateway-should-check-if-entity-can-use-portal.patch @@ -5,10 +5,10 @@ Subject: [PATCH] End gateway should check if entity can use portal diff --git a/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java -index 89bf5fc4fab2cf39378600aa8925ac4bb7707428..fb77d022ea872deb7f47d033df4a0f201da026c2 100644 +index f80545f80948db27d1fbde77d0505c916eb504ed..95a6284026d17567deb7416abe2bc4d6975aaaf8 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java -@@ -177,6 +177,7 @@ public class TheEndGatewayBlockEntity extends TheEndPortalBlockEntity { +@@ -178,6 +178,7 @@ public class TheEndGatewayBlockEntity extends TheEndPortalBlockEntity { public static void teleportEntity(Level world, BlockPos pos, BlockState state, Entity entity, TheEndGatewayBlockEntity blockEntity) { if (world instanceof ServerLevel && !blockEntity.isCoolingDown()) { diff --git a/patches/server/0049-Skip-events-if-there-s-no-listeners.patch b/patches/server/0045-Skip-events-if-there-s-no-listeners.patch similarity index 88% rename from patches/server/0049-Skip-events-if-there-s-no-listeners.patch rename to patches/server/0045-Skip-events-if-there-s-no-listeners.patch index 2ed047ca3..53bc64ace 100644 --- a/patches/server/0049-Skip-events-if-there-s-no-listeners.patch +++ b/patches/server/0045-Skip-events-if-there-s-no-listeners.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Skip events if there's no listeners diff --git a/src/main/java/net/minecraft/commands/Commands.java b/src/main/java/net/minecraft/commands/Commands.java -index 7c96f7fc5997761426a0c62cad0cab5cc668f282..c3721948ebccdf995f1b3fb10c4bbea1efa08e4c 100644 +index 330f6c79417378da855326b4da665f9d240e748d..6c5d34d65a821c17c464e0868b7b50c0c39ec8db 100644 --- a/src/main/java/net/minecraft/commands/Commands.java +++ b/src/main/java/net/minecraft/commands/Commands.java -@@ -417,6 +417,7 @@ public class Commands { +@@ -425,6 +425,7 @@ public class Commands { private void runSync(ServerPlayer player, Collection bukkit, RootCommandNode rootcommandnode) { // Paper end - Async command map building new com.destroystokyo.paper.event.brigadier.AsyncPlayerSendCommandsEvent(player.getBukkitEntity(), (RootCommandNode) rootcommandnode, false).callEvent(); // Paper @@ -16,7 +16,7 @@ index 7c96f7fc5997761426a0c62cad0cab5cc668f282..c3721948ebccdf995f1b3fb10c4bbea1 PlayerCommandSendEvent event = new PlayerCommandSendEvent(player.getBukkitEntity(), new LinkedHashSet<>(bukkit)); event.getPlayer().getServer().getPluginManager().callEvent(event); -@@ -427,6 +428,7 @@ public class Commands { +@@ -435,6 +436,7 @@ public class Commands { } } // CraftBukkit end diff --git a/patches/server/0050-Add-permission-for-F3-N-debug.patch b/patches/server/0046-Add-permission-for-F3-N-debug.patch similarity index 83% rename from patches/server/0050-Add-permission-for-F3-N-debug.patch rename to patches/server/0046-Add-permission-for-F3-N-debug.patch index 25231a144..68c15308b 100644 --- a/patches/server/0050-Add-permission-for-F3-N-debug.patch +++ b/patches/server/0046-Add-permission-for-F3-N-debug.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add permission for F3+N debug diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index 6fe35f10be757d043a289f85969e64fc03ec38d6..4dbc1744cb07899e6795d74d24c00bb72c7b0911 100644 +index 5efee586de46ba9d22cab6cbc1ec5912332c4d2a..3c5529f965a7b069d13b5a10784452159885bb3b 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java -@@ -1193,6 +1193,7 @@ public abstract class PlayerList { +@@ -1203,6 +1203,7 @@ public abstract class PlayerList { } else { b0 = (byte) (24 + permissionLevel); } diff --git a/patches/server/0051-Configurable-TPS-Catchup.patch b/patches/server/0047-Configurable-TPS-Catchup.patch similarity index 93% rename from patches/server/0051-Configurable-TPS-Catchup.patch rename to patches/server/0047-Configurable-TPS-Catchup.patch index 9ffe53a6f..9884d4bcd 100644 --- a/patches/server/0051-Configurable-TPS-Catchup.patch +++ b/patches/server/0047-Configurable-TPS-Catchup.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Configurable TPS Catchup diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index a02c6b61c93e79e5cdb5ee4679ae1a782c96e5a9..08d09784f168e39444f26aa068b160743c7fe872 100644 +index ac2b692fc5e579dc139540ab6b7e2396bdb84dfb..41187b604b17d47f0f71f9649fc81abaa76a9707 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1177,7 +1177,13 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop= 2) { +- if (this.canConvertToSource(world) && j >= 2) { + if (this.canConvertToSource(world) && j >= getRequiredSources(world)) { BlockState iblockdata2 = world.getBlockState(pos.below()); FluidState fluid1 = iblockdata2.getFluidState(); -@@ -322,6 +322,16 @@ public abstract class FlowingFluid extends Fluid { - return (FluidState) this.getSource().defaultFluidState().setValue(FlowingFluid.FALLING, falling); - } +@@ -289,6 +289,12 @@ public abstract class FlowingFluid extends Fluid { + + protected abstract boolean canConvertToSource(Level world); + // Purpur start -+ protected boolean canConvertToSource(LevelReader world) { -+ return canConvertToSource(); -+ } -+ -+ protected int getRequiredSources(LevelReader world) { ++ protected int getRequiredSources(Level level) { + return 2; + } + // Purpur end + - protected abstract boolean canConvertToSource(); - protected void spreadTo(LevelAccessor world, BlockPos pos, BlockState state, Direction direction, FluidState fluidState) { + if (state.getBlock() instanceof LiquidBlockContainer) { + ((LiquidBlockContainer) state.getBlock()).placeLiquid(world, pos, state, fluidState); diff --git a/src/main/java/net/minecraft/world/level/material/LavaFluid.java b/src/main/java/net/minecraft/world/level/material/LavaFluid.java -index fb23e69e9d46f9c7d562be76e527050a949509cf..d96c52a55cad5f6127b17e1307fe341e8bdd1335 100644 +index 783e315d92227cbcb5cd207b0a06a12e0778d14b..e965d2cafdd887a7c61058ba2931596709e5aaa2 100644 --- a/src/main/java/net/minecraft/world/level/material/LavaFluid.java +++ b/src/main/java/net/minecraft/world/level/material/LavaFluid.java -@@ -198,6 +198,18 @@ public abstract class LavaFluid extends FlowingFluid { +@@ -198,6 +198,13 @@ public abstract class LavaFluid extends FlowingFluid { world.levelEvent(1501, pos, 0); } + // Purpur start + @Override -+ protected boolean canConvertToSource(LevelReader world) { -+ return world.getWorldBorder().world.purpurConfig.lavaInfinite; -+ } -+ -+ @Override -+ protected int getRequiredSources(LevelReader world) { -+ return world.getWorldBorder().world.purpurConfig.lavaInfiniteRequiredSources; ++ protected int getRequiredSources(Level level) { ++ return level.purpurConfig.lavaInfiniteRequiredSources; + } + // Purpur end + @Override - protected boolean canConvertToSource() { - return false; + protected boolean canConvertToSource(Level world) { + return world.getGameRules().getBoolean(GameRules.RULE_LAVA_SOURCE_CONVERSION); diff --git a/src/main/java/net/minecraft/world/level/material/WaterFluid.java b/src/main/java/net/minecraft/world/level/material/WaterFluid.java -index ac33ba631f4b0ae0e08bff5748440ef5b76c2117..29068ca2df90ab0351b91cd0aa3e224c71cbec40 100644 +index 82e85fbbd45244d02df90fa00c9046e7f51275a2..ec6c63075306f9e5389e83641d2c8a82369ddc6b 100644 --- a/src/main/java/net/minecraft/world/level/material/WaterFluid.java +++ b/src/main/java/net/minecraft/world/level/material/WaterFluid.java -@@ -63,6 +63,18 @@ public abstract class WaterFluid extends FlowingFluid { - return true; +@@ -64,6 +64,13 @@ public abstract class WaterFluid extends FlowingFluid { + return world.getGameRules().getBoolean(GameRules.RULE_WATER_SOURCE_CONVERSION); } + // Purpur start + @Override -+ protected boolean canConvertToSource(LevelReader world) { -+ return world.getWorldBorder().world.purpurConfig.waterInfinite; -+ } -+ -+ @Override -+ protected int getRequiredSources(LevelReader world) { -+ return world.getWorldBorder().world.purpurConfig.waterInfiniteRequiredSources; ++ protected int getRequiredSources(Level level) { ++ return level.purpurConfig.waterInfiniteRequiredSources; + } + // Purpur end + @@ -81,7 +67,7 @@ index ac33ba631f4b0ae0e08bff5748440ef5b76c2117..29068ca2df90ab0351b91cd0aa3e224c @Override protected void beforeDestroyingBlock(LevelAccessor world, BlockPos pos, BlockState state, BlockPos source) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 8f21736b201948ae5970812de412a13b878f534e..317ba58b36bbb9a2430a763794c64e0e98f29f00 100644 +index 7948ad7bdfc2de11ee11510a3d0bccf209c14819..e55b60157a55406ffd86a3630c083fd076900ab0 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -228,6 +228,13 @@ public class PurpurWorldConfig { diff --git a/patches/server/0057-Make-lava-flow-speed-configurable.patch b/patches/server/0053-Make-lava-flow-speed-configurable.patch similarity index 90% rename from patches/server/0057-Make-lava-flow-speed-configurable.patch rename to patches/server/0053-Make-lava-flow-speed-configurable.patch index 2417ca662..10bc880cf 100644 --- a/patches/server/0057-Make-lava-flow-speed-configurable.patch +++ b/patches/server/0053-Make-lava-flow-speed-configurable.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Make lava flow speed configurable diff --git a/src/main/java/net/minecraft/world/level/material/LavaFluid.java b/src/main/java/net/minecraft/world/level/material/LavaFluid.java -index d96c52a55cad5f6127b17e1307fe341e8bdd1335..87643b76ea46ddfe0281e8a97a5b0996093b9276 100644 +index e965d2cafdd887a7c61058ba2931596709e5aaa2..3a04cb4c646c07abf4338c70c865a4c4cb34b1bc 100644 --- a/src/main/java/net/minecraft/world/level/material/LavaFluid.java +++ b/src/main/java/net/minecraft/world/level/material/LavaFluid.java @@ -180,7 +180,7 @@ public abstract class LavaFluid extends FlowingFluid { @@ -18,7 +18,7 @@ index d96c52a55cad5f6127b17e1307fe341e8bdd1335..87643b76ea46ddfe0281e8a97a5b0996 @Override diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 317ba58b36bbb9a2430a763794c64e0e98f29f00..b177081ffd734847ea0fe17859036b38e9d72822 100644 +index e55b60157a55406ffd86a3630c083fd076900ab0..2b887d32df30728e0285cae94d418a35edbb5a75 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -230,9 +230,13 @@ public class PurpurWorldConfig { diff --git a/patches/server/0058-Add-player-death-exp-control-options.patch b/patches/server/0054-Add-player-death-exp-control-options.patch similarity index 92% rename from patches/server/0058-Add-player-death-exp-control-options.patch rename to patches/server/0054-Add-player-death-exp-control-options.patch index ed3da3dea..56fe1f91f 100644 --- a/patches/server/0058-Add-player-death-exp-control-options.patch +++ b/patches/server/0054-Add-player-death-exp-control-options.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add player death exp control options diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java -index 265d6b766001cdb8e8b9bc8538119637dd92cd17..2f93121c00c36d389958608cf576af3f1cd7e0ab 100644 +index 173504898e9af92d347c99db7737977a980e22c1..f129bb64a142f16e32f33cfa418ac498d44ad3c2 100644 --- a/src/main/java/net/minecraft/world/entity/player/Player.java +++ b/src/main/java/net/minecraft/world/entity/player/Player.java -@@ -1997,9 +1997,18 @@ public abstract class Player extends LivingEntity { +@@ -1969,9 +1969,18 @@ public abstract class Player extends LivingEntity { @Override public int getExperienceReward() { if (!this.level.getGameRules().getBoolean(GameRules.RULE_KEEPINVENTORY) && !this.isSpectator()) { @@ -31,7 +31,7 @@ index 265d6b766001cdb8e8b9bc8538119637dd92cd17..2f93121c00c36d389958608cf576af3f return 0; } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index b177081ffd734847ea0fe17859036b38e9d72822..9cf7278f13ac13a2cb1451a4dc72878418b7369d 100644 +index 2b887d32df30728e0285cae94d418a35edbb5a75..254c320f867a3d2c14903ebaac532e5db5c9e4f5 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -176,6 +176,8 @@ public class PurpurWorldConfig { diff --git a/patches/server/0059-Configurable-void-damage-height-and-damage.patch b/patches/server/0055-Configurable-void-damage-height-and-damage.patch similarity index 87% rename from patches/server/0059-Configurable-void-damage-height-and-damage.patch rename to patches/server/0055-Configurable-void-damage-height-and-damage.patch index 5b5ea9a56..170e4cad7 100644 --- a/patches/server/0059-Configurable-void-damage-height-and-damage.patch +++ b/patches/server/0055-Configurable-void-damage-height-and-damage.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Configurable void damage height and damage diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index b32ce5c62c1a700ee612c4c2177c068e8a2f9f53..ece73bc2f6d67dde38bb2b42dd2dcf3bd5806691 100644 +index d032e666b9738a5e3c7afff3d3597b003d0aa1e7..ead707682fcb327d7783955d4569bb812be0a653 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -891,7 +891,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -857,7 +857,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { public void checkOutOfWorld() { // Paper start - Configurable nether ceiling damage @@ -18,10 +18,10 @@ index b32ce5c62c1a700ee612c4c2177c068e8a2f9f53..ece73bc2f6d67dde38bb2b42dd2dcf3b && (!(this instanceof Player player) || !player.getAbilities().invulnerable))) { // Paper end diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index eaac469c2ccad3536c2e20211f7618d4de3e370c..519ee9e51dd181c1c1a269151cc832f84e937eed 100644 +index a56b9ae0d352db5350cc96ad079eee140aa7d665..bf5569fc181576d4eeb6ca366090bd959cfc0339 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -2508,7 +2508,7 @@ public abstract class LivingEntity extends Entity { +@@ -2500,7 +2500,7 @@ public abstract class LivingEntity extends Entity { @Override protected void outOfWorld() { @@ -31,7 +31,7 @@ index eaac469c2ccad3536c2e20211f7618d4de3e370c..519ee9e51dd181c1c1a269151cc832f8 protected void updateSwingTime() { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 9cf7278f13ac13a2cb1451a4dc72878418b7369d..44f57a4098d862b8f7930d9af0abbc4a0b02ec3b 100644 +index 254c320f867a3d2c14903ebaac532e5db5c9e4f5..ca1369c842c3ff3b45678ccce851a54c0f607b1b 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -101,10 +101,14 @@ public class PurpurWorldConfig { diff --git a/patches/server/0060-Add-canSaveToDisk-to-Entity.patch b/patches/server/0056-Add-canSaveToDisk-to-Entity.patch similarity index 92% rename from patches/server/0060-Add-canSaveToDisk-to-Entity.patch rename to patches/server/0056-Add-canSaveToDisk-to-Entity.patch index 37363a8b2..b84bf9c99 100644 --- a/patches/server/0060-Add-canSaveToDisk-to-Entity.patch +++ b/patches/server/0056-Add-canSaveToDisk-to-Entity.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add canSaveToDisk to Entity diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index f90e07093db36284dff54b5698cce2679d14e110..00c4afae78f8c11a99dc740cf1f30e869b1c160c 100644 +index ead707682fcb327d7783955d4569bb812be0a653..efb8a0706b40293a1a5f52afce4e9029d8ad73c9 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -4638,5 +4638,9 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -4602,5 +4602,9 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { public boolean processClick(InteractionHand hand) { return false; } @@ -19,10 +19,10 @@ index f90e07093db36284dff54b5698cce2679d14e110..00c4afae78f8c11a99dc740cf1f30e86 // Purpur end } diff --git a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java -index c8f917354676eb26059efb521e09780db32c68b7..46593c26a7a167f22a728c8a87ebcb26ef7b4612 100644 +index e09f98602b2d58e610794e4d5057592c034521b5..8e2711325ee32dda903f191ec4f338173370e738 100644 --- a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java +++ b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java -@@ -220,6 +220,11 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob +@@ -219,6 +219,11 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob // do not hit rider return target != rider && super.canHitEntity(target); } diff --git a/patches/server/0061-Dispenser-curse-of-binding-protection.patch b/patches/server/0057-Dispenser-curse-of-binding-protection.patch similarity index 92% rename from patches/server/0061-Dispenser-curse-of-binding-protection.patch rename to patches/server/0057-Dispenser-curse-of-binding-protection.patch index 7e76f5a77..2aa7fed95 100644 --- a/patches/server/0061-Dispenser-curse-of-binding-protection.patch +++ b/patches/server/0057-Dispenser-curse-of-binding-protection.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Dispenser curse of binding protection diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java -index 5f954d8fe0af776607a8b04566e4f16ddb97664e..8ebdd872c5ce6beebcd2d766cd3a0cb868f4ed02 100644 +index 5a5db83a973a27cabd373f429c4b34cc4a8bb57e..b6f2fbe5a2577696d62e001a3c07b52b07a33c74 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java @@ -65,6 +65,7 @@ import net.minecraft.world.item.ProjectileWeaponItem; @@ -16,7 +16,7 @@ index 5f954d8fe0af776607a8b04566e4f16ddb97664e..8ebdd872c5ce6beebcd2d766cd3a0cb8 import net.minecraft.world.level.GameRules; import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.Level; -@@ -1116,6 +1117,12 @@ public abstract class Mob extends LivingEntity { +@@ -1128,6 +1129,12 @@ public abstract class Mob extends LivingEntity { } @@ -43,7 +43,7 @@ index baa7e055d8ee4a153842128b07984b9f6deac6ca..014dd3aa8a7313d978d4781a1b7c6f53 // CraftBukkit start Level world = pointer.getLevel(); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 44f57a4098d862b8f7930d9af0abbc4a0b02ec3b..9db2f16af2b776805747591f20456319f8aff65a 100644 +index ca1369c842c3ff3b45678ccce851a54c0f607b1b..4401296cc161e782c630d6bed595661af731cced 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -231,6 +231,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0062-Add-option-for-boats-to-eject-players-on-land.patch b/patches/server/0058-Add-option-for-boats-to-eject-players-on-land.patch similarity index 87% rename from patches/server/0062-Add-option-for-boats-to-eject-players-on-land.patch rename to patches/server/0058-Add-option-for-boats-to-eject-players-on-land.patch index 09e5789b6..b26ae41de 100644 --- a/patches/server/0062-Add-option-for-boats-to-eject-players-on-land.patch +++ b/patches/server/0058-Add-option-for-boats-to-eject-players-on-land.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add option for boats to eject players on land diff --git a/src/main/java/net/minecraft/world/entity/vehicle/Boat.java b/src/main/java/net/minecraft/world/entity/vehicle/Boat.java -index 29da8a42406feccf7932097b07b1d32a38fa96b7..539c9d60cecb63fb2b0858951ff58cc0ea26c446 100644 +index 85e1892866cd2ee0cec1552b8541c1f800bdf68c..3c63435d460d2cdbdf344849605d2948ab1e7339 100644 --- a/src/main/java/net/minecraft/world/entity/vehicle/Boat.java +++ b/src/main/java/net/minecraft/world/entity/vehicle/Boat.java -@@ -523,6 +523,7 @@ public class Boat extends Entity { +@@ -537,6 +537,7 @@ public class Boat extends Entity implements VariantHolder { if (f > 0.0F) { this.landFriction = f; @@ -17,7 +17,7 @@ index 29da8a42406feccf7932097b07b1d32a38fa96b7..539c9d60cecb63fb2b0858951ff58cc0 } else { return Boat.Status.IN_AIR; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 9db2f16af2b776805747591f20456319f8aff65a..ebb932d4311cd96dcfec98b9be13b75cd725c6f6 100644 +index 4401296cc161e782c630d6bed595661af731cced..1df016c731e355d6b23c2fe40071d11150ffe32b 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -98,12 +98,14 @@ public class PurpurWorldConfig { diff --git a/patches/server/0063-Mending-mends-most-damages-equipment-first.patch b/patches/server/0059-Mending-mends-most-damages-equipment-first.patch similarity index 90% rename from patches/server/0063-Mending-mends-most-damages-equipment-first.patch rename to patches/server/0059-Mending-mends-most-damages-equipment-first.patch index b0642c098..10f510d3d 100644 --- a/patches/server/0063-Mending-mends-most-damages-equipment-first.patch +++ b/patches/server/0059-Mending-mends-most-damages-equipment-first.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Mending mends most damages equipment first diff --git a/src/main/java/net/minecraft/world/entity/ExperienceOrb.java b/src/main/java/net/minecraft/world/entity/ExperienceOrb.java -index 2d1228670696224452cb432e0279456d8c5fe710..02bc7ccb4db6e9a287b32c887a455976096dcc10 100644 +index cf5c7e8557b0084039a94ef881a36aa9e3f58daf..e3148983e1bf6f7c972a5794d99c03f7061d21a0 100644 --- a/src/main/java/net/minecraft/world/entity/ExperienceOrb.java +++ b/src/main/java/net/minecraft/world/entity/ExperienceOrb.java -@@ -322,7 +322,7 @@ public class ExperienceOrb extends Entity { +@@ -323,7 +323,7 @@ public class ExperienceOrb extends Entity { } private int repairPlayerItems(Player player, int amount) { @@ -18,10 +18,10 @@ index 2d1228670696224452cb432e0279456d8c5fe710..02bc7ccb4db6e9a287b32c887a455976 if (entry != null) { ItemStack itemstack = (ItemStack) entry.getValue(); diff --git a/src/main/java/net/minecraft/world/item/ItemStack.java b/src/main/java/net/minecraft/world/item/ItemStack.java -index c18a0bc94d0210396046f4475e49a739088593f3..3d1ba3d3b12fe649e451b6c8a3726c6991cfe083 100644 +index 8450a22b0fc6e8dc5cad0f61ac52a82b3cd3791e..6538405cae3b601dd19254a0b59c37f9e54f74c8 100644 --- a/src/main/java/net/minecraft/world/item/ItemStack.java +++ b/src/main/java/net/minecraft/world/item/ItemStack.java -@@ -535,6 +535,16 @@ public final class ItemStack { +@@ -543,6 +543,16 @@ public final class ItemStack { return this.isDamageableItem() && this.getDamageValue() > 0; } @@ -39,7 +39,7 @@ index c18a0bc94d0210396046f4475e49a739088593f3..3d1ba3d3b12fe649e451b6c8a3726c69 return this.tag == null ? 0 : this.tag.getInt("Damage"); } diff --git a/src/main/java/net/minecraft/world/item/enchantment/EnchantmentHelper.java b/src/main/java/net/minecraft/world/item/enchantment/EnchantmentHelper.java -index 22925b2f44fc510832ef07290d3109f0394f7d30..4afa30753a90d9bbd3c71b21cb4a8deadf9ccb3b 100644 +index 064783822333d11120daa28f3be5099e10510b72..659cd2d43d3cabc9bcc50857d6de858f417b7c31 100644 --- a/src/main/java/net/minecraft/world/item/enchantment/EnchantmentHelper.java +++ b/src/main/java/net/minecraft/world/item/enchantment/EnchantmentHelper.java @@ -274,6 +274,29 @@ public class EnchantmentHelper { @@ -73,7 +73,7 @@ index 22925b2f44fc510832ef07290d3109f0394f7d30..4afa30753a90d9bbd3c71b21cb4a8dea public static Map.Entry getRandomItemWith(Enchantment enchantment, LivingEntity entity) { return getRandomItemWith(enchantment, entity, (stack) -> { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index ebb932d4311cd96dcfec98b9be13b75cd725c6f6..602b6841bba07fbaa2dc04a1dff2ffd0cecfb5c1 100644 +index 1df016c731e355d6b23c2fe40071d11150ffe32b..f7e923a424b65a2246aed81d791a06c1d299fef6 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -98,6 +98,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0064-Add-5-second-tps-average-in-tps.patch b/patches/server/0060-Add-5-second-tps-average-in-tps.patch similarity index 93% rename from patches/server/0064-Add-5-second-tps-average-in-tps.patch rename to patches/server/0060-Add-5-second-tps-average-in-tps.patch index 575e6329b..b84eb3b70 100644 --- a/patches/server/0064-Add-5-second-tps-average-in-tps.patch +++ b/patches/server/0060-Add-5-second-tps-average-in-tps.patch @@ -27,10 +27,10 @@ index fa56cd09102a89692b42f1d14257990508c5c720..f9251183df72ddc56662fd3f02acf216 setListData(vector); } diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 08d09784f168e39444f26aa068b160743c7fe872..2e17a2c1b536715dd5a38e90615315b8670b1d8b 100644 +index 41187b604b17d47f0f71f9649fc81abaa76a9707..20e241d4cb82b7b415971cb485885d0d2fd45f7c 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -290,7 +290,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0) { @@ -66,7 +66,7 @@ index 399a155fb49e4af144e3296b4ad0c55588c9be5b..9e308183917884dcb2f8831324d45c9a int k = 0; for (int l = 0; j > 0 && l < amount; ++l) { -@@ -619,6 +619,12 @@ public final class ItemStack { +@@ -627,6 +627,12 @@ public final class ItemStack { if (this.hurt(amount, entity.getRandom(), entity /*instanceof ServerPlayer ? (ServerPlayer) entity : null*/)) { // Paper - pass LivingEntity for EntityItemDamageEvent breakCallback.accept(entity); Item item = this.getItem(); @@ -99,7 +99,7 @@ index 9365f886a23a71c41091b22d46896ff18a5a0635..41bd45c0720751f348b5cf6eaecac439 entityhuman.startAutoSpinAttack(20); if (entityhuman.isOnGround()) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 602b6841bba07fbaa2dc04a1dff2ffd0cecfb5c1..80d72a73d119f57c44f0cc5c5517678e67196e2b 100644 +index f7e923a424b65a2246aed81d791a06c1d299fef6..c22ffc0353f73a378372c8bbcf54d9bb95cfc6be 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -115,6 +115,19 @@ public class PurpurWorldConfig { diff --git a/patches/server/0066-Item-entity-immunities.patch b/patches/server/0062-Item-entity-immunities.patch similarity index 81% rename from patches/server/0066-Item-entity-immunities.patch rename to patches/server/0062-Item-entity-immunities.patch index c985d1966..1a4b442fe 100644 --- a/patches/server/0066-Item-entity-immunities.patch +++ b/patches/server/0062-Item-entity-immunities.patch @@ -5,23 +5,23 @@ Subject: [PATCH] Item entity immunities diff --git a/src/main/java/net/minecraft/server/level/ServerEntity.java b/src/main/java/net/minecraft/server/level/ServerEntity.java -index 163f14b4e1ca99d75e5d8e14190f7b91cb58e8f3..7880cdcaf12197f6b36777c51b2859f2463f1595 100644 +index 190e9761087baec5827d722a8281f0ffb6798341..813c3f9b7f9acabc851c9e9d679e9145c9afd709 100644 --- a/src/main/java/net/minecraft/server/level/ServerEntity.java +++ b/src/main/java/net/minecraft/server/level/ServerEntity.java -@@ -65,7 +65,7 @@ public class ServerEntity { - private boolean wasRiding; - private boolean wasOnGround; +@@ -69,7 +69,7 @@ public class ServerEntity { + @Nullable + private List> trackedDataValues; // CraftBukkit start - final Set trackedPlayers; // Paper - private -> package + public final Set trackedPlayers; // Paper - private -> package // Purpur - package -> public - public boolean clearDirtyEntityData = true; // Paper public ServerEntity(ServerLevel worldserver, Entity entity, int i, boolean flag, Consumer> consumer, Set trackedPlayers) { + this.trackedPlayers = trackedPlayers; diff --git a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java -index 8a5efb6c81bbe85b67a6bb83c0c4afdf995121d0..d7e102024b495067335fe008ec1649708f3a4016 100644 +index f0ccdfbd7d7be8c6e302609accf8fe9cac8885c4..ee5ec376cf7495ed99ee822a7b26978c3c107098 100644 --- a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java +++ b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java -@@ -56,6 +56,12 @@ public class ItemEntity extends Entity { +@@ -54,6 +54,12 @@ public class ItemEntity extends Entity { public boolean canMobPickup = true; // Paper private int despawnRate = -1; // Paper public net.kyori.adventure.util.TriState frictionState = net.kyori.adventure.util.TriState.NOT_SET; // Paper @@ -34,7 +34,7 @@ index 8a5efb6c81bbe85b67a6bb83c0c4afdf995121d0..d7e102024b495067335fe008ec164970 public ItemEntity(EntityType type, Level world) { super(type, world); -@@ -342,6 +348,15 @@ public class ItemEntity extends Entity { +@@ -334,6 +340,15 @@ public class ItemEntity extends Entity { return false; } else if (!this.getItem().getItem().canBeHurtBy(source)) { return false; @@ -50,7 +50,7 @@ index 8a5efb6c81bbe85b67a6bb83c0c4afdf995121d0..d7e102024b495067335fe008ec164970 } else if (this.level.isClientSide) { return true; } else { -@@ -543,6 +558,12 @@ public class ItemEntity extends Entity { +@@ -535,6 +550,12 @@ public class ItemEntity extends Entity { this.getEntityData().set(ItemEntity.DATA_ITEM, stack); this.getEntityData().markDirty(ItemEntity.DATA_ITEM); // CraftBukkit - SPIGOT-4591, must mark dirty this.despawnRate = level.paperConfig().entities.spawning.altItemDespawnRate.enabled ? level.paperConfig().entities.spawning.altItemDespawnRate.items.getOrDefault(stack.getItem(), level.spigotConfig.itemDespawnRate) : level.spigotConfig.itemDespawnRate; // Paper @@ -115,7 +115,7 @@ index ecec5e17807a760769fc0ea79c2a0161cc5db1ef..3023cadd21947389158f1bfaf9fe84fd + // Purpur end } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 80d72a73d119f57c44f0cc5c5517678e67196e2b..7d1be131f0fb8631542f429391fed918d36d4534 100644 +index c22ffc0353f73a378372c8bbcf54d9bb95cfc6be..b5b4807e5a54bc4ce0310f323de598e05704f2fc 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -128,6 +128,49 @@ public class PurpurWorldConfig { @@ -130,37 +130,37 @@ index 80d72a73d119f57c44f0cc5c5517678e67196e2b..7d1be131f0fb8631542f429391fed918 + itemImmuneToCactus.clear(); + getList("gameplay-mechanics.item.immune.cactus", new ArrayList<>()).forEach(key -> { + if (key.toString().equals("*")) { -+ Registry.ITEM.stream().filter(item -> item != Items.AIR).forEach((item) -> itemImmuneToCactus.add(item)); ++ BuiltInRegistries.ITEM.stream().filter(item -> item != Items.AIR).forEach((item) -> itemImmuneToCactus.add(item)); + return; + } -+ Item item = Registry.ITEM.get(new ResourceLocation(key.toString())); ++ Item item = BuiltInRegistries.ITEM.get(new ResourceLocation(key.toString())); + if (item != Items.AIR) itemImmuneToCactus.add(item); + }); + itemImmuneToExplosion.clear(); + getList("gameplay-mechanics.item.immune.explosion", new ArrayList<>()).forEach(key -> { + if (key.toString().equals("*")) { -+ Registry.ITEM.stream().filter(item -> item != Items.AIR).forEach((item) -> itemImmuneToExplosion.add(item)); ++ BuiltInRegistries.ITEM.stream().filter(item -> item != Items.AIR).forEach((item) -> itemImmuneToExplosion.add(item)); + return; + } -+ Item item = Registry.ITEM.get(new ResourceLocation(key.toString())); ++ Item item = BuiltInRegistries.ITEM.get(new ResourceLocation(key.toString())); + if (item != Items.AIR) itemImmuneToExplosion.add(item); + }); + itemImmuneToFire.clear(); + getList("gameplay-mechanics.item.immune.fire", new ArrayList<>()).forEach(key -> { + if (key.toString().equals("*")) { -+ Registry.ITEM.stream().filter(item -> item != Items.AIR).forEach((item) -> itemImmuneToFire.add(item)); ++ BuiltInRegistries.ITEM.stream().filter(item -> item != Items.AIR).forEach((item) -> itemImmuneToFire.add(item)); + return; + } -+ Item item = Registry.ITEM.get(new ResourceLocation(key.toString())); ++ Item item = BuiltInRegistries.ITEM.get(new ResourceLocation(key.toString())); + if (item != Items.AIR) itemImmuneToFire.add(item); + }); + itemImmuneToLightning.clear(); + getList("gameplay-mechanics.item.immune.lightning", new ArrayList<>()).forEach(key -> { + if (key.toString().equals("*")) { -+ Registry.ITEM.stream().filter(item -> item != Items.AIR).forEach((item) -> itemImmuneToLightning.add(item)); ++ BuiltInRegistries.ITEM.stream().filter(item -> item != Items.AIR).forEach((item) -> itemImmuneToLightning.add(item)); + return; + } -+ Item item = Registry.ITEM.get(new ResourceLocation(key.toString())); ++ Item item = BuiltInRegistries.ITEM.get(new ResourceLocation(key.toString())); + if (item != Items.AIR) itemImmuneToLightning.add(item); + }); + } diff --git a/patches/server/0067-Add-ping-command.patch b/patches/server/0063-Add-ping-command.patch similarity index 96% rename from patches/server/0067-Add-ping-command.patch rename to patches/server/0063-Add-ping-command.patch index 82d9700a9..56a56dc32 100644 --- a/patches/server/0067-Add-ping-command.patch +++ b/patches/server/0063-Add-ping-command.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add ping command diff --git a/src/main/java/net/minecraft/commands/Commands.java b/src/main/java/net/minecraft/commands/Commands.java -index 98664c95331cee4139711c402dfaf406ee672c22..be38b98894cc24c9af55ba470dc8a03a24737782 100644 +index 6c5d34d65a821c17c464e0868b7b50c0c39ec8db..2de0639ec22d731129ee3d5733dbf5509764c274 100644 --- a/src/main/java/net/minecraft/commands/Commands.java +++ b/src/main/java/net/minecraft/commands/Commands.java -@@ -207,6 +207,7 @@ public class Commands { +@@ -215,6 +215,7 @@ public class Commands { SetPlayerIdleTimeoutCommand.register(this.dispatcher); StopCommand.register(this.dispatcher); WhitelistCommand.register(this.dispatcher); diff --git a/patches/server/0068-Add-demo-command.patch b/patches/server/0064-Add-demo-command.patch similarity index 96% rename from patches/server/0068-Add-demo-command.patch rename to patches/server/0064-Add-demo-command.patch index 48fcf7e65..c0a572336 100644 --- a/patches/server/0068-Add-demo-command.patch +++ b/patches/server/0064-Add-demo-command.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add demo command diff --git a/src/main/java/net/minecraft/commands/Commands.java b/src/main/java/net/minecraft/commands/Commands.java -index be38b98894cc24c9af55ba470dc8a03a24737782..7ffe76f2054259c4e564184bf28be3fede1e7298 100644 +index 2de0639ec22d731129ee3d5733dbf5509764c274..24bb481c2e7163ec41e21d79bcac19db67a4fba1 100644 --- a/src/main/java/net/minecraft/commands/Commands.java +++ b/src/main/java/net/minecraft/commands/Commands.java -@@ -207,6 +207,7 @@ public class Commands { +@@ -215,6 +215,7 @@ public class Commands { SetPlayerIdleTimeoutCommand.register(this.dispatcher); StopCommand.register(this.dispatcher); WhitelistCommand.register(this.dispatcher); diff --git a/patches/server/0069-Add-credits-command.patch b/patches/server/0065-Add-credits-command.patch similarity index 96% rename from patches/server/0069-Add-credits-command.patch rename to patches/server/0065-Add-credits-command.patch index c5b41ce54..f412abf9d 100644 --- a/patches/server/0069-Add-credits-command.patch +++ b/patches/server/0065-Add-credits-command.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add credits command diff --git a/src/main/java/net/minecraft/commands/Commands.java b/src/main/java/net/minecraft/commands/Commands.java -index 7ffe76f2054259c4e564184bf28be3fede1e7298..ab0f00128f8c1b13c3eb5787df0c4e26372e0734 100644 +index 24bb481c2e7163ec41e21d79bcac19db67a4fba1..a7eee1f0ed063d1006c91adcac92e142c7d6701b 100644 --- a/src/main/java/net/minecraft/commands/Commands.java +++ b/src/main/java/net/minecraft/commands/Commands.java -@@ -207,6 +207,7 @@ public class Commands { +@@ -215,6 +215,7 @@ public class Commands { SetPlayerIdleTimeoutCommand.register(this.dispatcher); StopCommand.register(this.dispatcher); WhitelistCommand.register(this.dispatcher); diff --git a/patches/server/0070-Configurable-jockey-options.patch b/patches/server/0066-Configurable-jockey-options.patch similarity index 90% rename from patches/server/0070-Configurable-jockey-options.patch rename to patches/server/0066-Configurable-jockey-options.patch index 08217100e..0405d710d 100644 --- a/patches/server/0070-Configurable-jockey-options.patch +++ b/patches/server/0066-Configurable-jockey-options.patch @@ -57,10 +57,10 @@ index e41cc68649c79dd4ce7455f36112e8347e7c84e6..22daf7d11890a2e9276928ac9b242edf public static boolean checkHuskSpawnRules(EntityType type, ServerLevelAccessor world, MobSpawnType spawnReason, BlockPos pos, RandomSource random) { diff --git a/src/main/java/net/minecraft/world/entity/monster/Zombie.java b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -index 70a673f10591eaaecdafa7b7017b3120b7d1c6da..f8b61bd18b2ae356252fa144dc39b11a9dc120ef 100644 +index 62f607a3d34511a7f3b90739265ea1b825b517de..05cb9eff1ce0d5af9efcd47033878feb22397a2d 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zombie.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -@@ -125,6 +125,18 @@ public class Zombie extends Monster { +@@ -126,6 +126,18 @@ public class Zombie extends Monster { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.zombieMaxHealth); } @@ -79,7 +79,7 @@ index 70a673f10591eaaecdafa7b7017b3120b7d1c6da..f8b61bd18b2ae356252fa144dc39b11a // Purpur end @Override -@@ -545,19 +557,20 @@ public class Zombie extends Monster { +@@ -551,19 +563,20 @@ public class Zombie extends Monster { if (object instanceof Zombie.ZombieGroupData) { Zombie.ZombieGroupData entityzombie_groupdatazombie = (Zombie.ZombieGroupData) object; @@ -105,20 +105,20 @@ index 70a673f10591eaaecdafa7b7017b3120b7d1c6da..f8b61bd18b2ae356252fa144dc39b11a + } else { // Purpur Chicken entitychicken1 = (Chicken) EntityType.CHICKEN.create(this.level); - entitychicken1.moveTo(this.getX(), this.getY(), this.getZ(), this.getYRot(), 0.0F); -@@ -565,6 +578,7 @@ public class Zombie extends Monster { - entitychicken1.setChickenJockey(true); - this.startRiding(entitychicken1); - world.addFreshEntity(entitychicken1, CreatureSpawnEvent.SpawnReason.MOUNT); // CraftBukkit + if (entitychicken1 != null) { +@@ -573,6 +586,7 @@ public class Zombie extends Monster { + this.startRiding(entitychicken1); + world.addFreshEntity(entitychicken1, CreatureSpawnEvent.SpawnReason.MOUNT); // CraftBukkit + } + } // Purpur } } } diff --git a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java -index 51ea3307a9264e665cbf8106e4562afe0c2065c5..9ad16a0fc968b89863ad5ef442a2e178f3d9a52d 100644 +index 5bd562ce81955ea8c75e08f69d4a033040a6c679..24bd4b83b37e65606db9b371db458dcc4a16d419 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java -@@ -103,6 +103,21 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { +@@ -104,6 +104,21 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { protected void randomizeReinforcementsChance() { this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.SPAWN_REINFORCEMENTS_CHANCE).setBaseValue(this.random.nextDouble() * this.level.purpurConfig.zombieVillagerSpawnReinforcements); } @@ -141,10 +141,10 @@ index 51ea3307a9264e665cbf8106e4562afe0c2065c5..9ad16a0fc968b89863ad5ef442a2e178 @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java -index bc3ffb8867d5f7c2fa548d31256341d388bf8112..6c1dd723373f9b1b920548de85aeb6cef0120fa7 100644 +index aca84be04c50188612f69ee20e9a0948fe5e5b7f..9bec6222a8145f84f4b748e8c96e02fa0d6f14d2 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java -@@ -79,6 +79,21 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { +@@ -83,6 +83,21 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.zombifiedPiglinMaxHealth); } @@ -167,7 +167,7 @@ index bc3ffb8867d5f7c2fa548d31256341d388bf8112..6c1dd723373f9b1b920548de85aeb6ce @Override diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 7d1be131f0fb8631542f429391fed918d36d4534..66fa3990f6a7e6e1623d0e911ee18f3eafebf1c1 100644 +index a9a8923ce63391bfaa58dd241ea8addfb195b6a7..00cce1123abca1533b9b62de118249886abb7951 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -578,6 +578,9 @@ public class PurpurWorldConfig { @@ -210,7 +210,7 @@ index 7d1be131f0fb8631542f429391fed918d36d4534..66fa3990f6a7e6e1623d0e911ee18f3e } public boolean illusionerRidable = false; -@@ -1657,6 +1669,9 @@ public class PurpurWorldConfig { +@@ -1653,6 +1665,9 @@ public class PurpurWorldConfig { public boolean zombieControllable = true; public double zombieMaxHealth = 20.0D; public double zombieSpawnReinforcements = 0.1D; @@ -220,7 +220,7 @@ index 7d1be131f0fb8631542f429391fed918d36d4534..66fa3990f6a7e6e1623d0e911ee18f3e private void zombieSettings() { zombieRidable = getBoolean("mobs.zombie.ridable", zombieRidable); zombieRidableInWater = getBoolean("mobs.zombie.ridable-in-water", zombieRidableInWater); -@@ -1668,6 +1683,9 @@ public class PurpurWorldConfig { +@@ -1664,6 +1679,9 @@ public class PurpurWorldConfig { } zombieMaxHealth = getDouble("mobs.zombie.attributes.max_health", zombieMaxHealth); zombieSpawnReinforcements = getDouble("mobs.zombie.attributes.spawn_reinforcements", zombieSpawnReinforcements); @@ -230,7 +230,7 @@ index 7d1be131f0fb8631542f429391fed918d36d4534..66fa3990f6a7e6e1623d0e911ee18f3e } public boolean zombieHorseRidableInWater = false; -@@ -1702,6 +1720,9 @@ public class PurpurWorldConfig { +@@ -1698,6 +1716,9 @@ public class PurpurWorldConfig { public boolean zombieVillagerControllable = true; public double zombieVillagerMaxHealth = 20.0D; public double zombieVillagerSpawnReinforcements = 0.1D; @@ -240,7 +240,7 @@ index 7d1be131f0fb8631542f429391fed918d36d4534..66fa3990f6a7e6e1623d0e911ee18f3e private void zombieVillagerSettings() { zombieVillagerRidable = getBoolean("mobs.zombie_villager.ridable", zombieVillagerRidable); zombieVillagerRidableInWater = getBoolean("mobs.zombie_villager.ridable-in-water", zombieVillagerRidableInWater); -@@ -1713,6 +1734,9 @@ public class PurpurWorldConfig { +@@ -1709,6 +1730,9 @@ public class PurpurWorldConfig { } zombieVillagerMaxHealth = getDouble("mobs.zombie_villager.attributes.max_health", zombieVillagerMaxHealth); zombieVillagerSpawnReinforcements = getDouble("mobs.zombie_villager.attributes.spawn_reinforcements", zombieVillagerSpawnReinforcements); @@ -250,7 +250,7 @@ index 7d1be131f0fb8631542f429391fed918d36d4534..66fa3990f6a7e6e1623d0e911ee18f3e } public boolean zombifiedPiglinRidable = false; -@@ -1720,6 +1744,9 @@ public class PurpurWorldConfig { +@@ -1716,6 +1740,9 @@ public class PurpurWorldConfig { public boolean zombifiedPiglinControllable = true; public double zombifiedPiglinMaxHealth = 20.0D; public double zombifiedPiglinSpawnReinforcements = 0.0D; @@ -260,7 +260,7 @@ index 7d1be131f0fb8631542f429391fed918d36d4534..66fa3990f6a7e6e1623d0e911ee18f3e private void zombifiedPiglinSettings() { zombifiedPiglinRidable = getBoolean("mobs.zombified_piglin.ridable", zombifiedPiglinRidable); zombifiedPiglinRidableInWater = getBoolean("mobs.zombified_piglin.ridable-in-water", zombifiedPiglinRidableInWater); -@@ -1731,5 +1758,8 @@ public class PurpurWorldConfig { +@@ -1727,5 +1754,8 @@ public class PurpurWorldConfig { } zombifiedPiglinMaxHealth = getDouble("mobs.zombified_piglin.attributes.max_health", zombifiedPiglinMaxHealth); zombifiedPiglinSpawnReinforcements = getDouble("mobs.zombified_piglin.attributes.spawn_reinforcements", zombifiedPiglinSpawnReinforcements); diff --git a/patches/server/0071-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch b/patches/server/0067-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch similarity index 97% rename from patches/server/0071-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch rename to patches/server/0067-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch index 0d58910a7..e877e5ba1 100644 --- a/patches/server/0071-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch +++ b/patches/server/0067-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Phantoms attracted to crystals and crystals shoot phantoms diff --git a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java -index 6a08ab40e60b80f8f5c4d3f02da121be9da05111..e1493079d06a91f3e14e333e2a0408725a8f5bea 100644 +index 500500468c12d1d44ea6b83a9176b470a954f59a..d9c7ed7ef8f00e2f903fac3d61590589449b6763 100644 --- a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java +++ b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java -@@ -31,6 +31,12 @@ public class EndCrystal extends Entity { +@@ -29,6 +29,12 @@ public class EndCrystal extends Entity { private static final EntityDataAccessor DATA_SHOW_BOTTOM = SynchedEntityData.defineId(EndCrystal.class, EntityDataSerializers.BOOLEAN); public int time; public boolean generatedByDragonFight = false; // Paper - Fix invulnerable end crystals @@ -21,7 +21,7 @@ index 6a08ab40e60b80f8f5c4d3f02da121be9da05111..e1493079d06a91f3e14e333e2a040872 public EndCrystal(EntityType type, Level world) { super(type, world); -@@ -80,7 +86,50 @@ public class EndCrystal extends Entity { +@@ -78,7 +84,50 @@ public class EndCrystal extends Entity { // Paper end } @@ -258,7 +258,7 @@ index 2294458c7e81147a3efd2ef854fbc08f44231050..b9d737a20b8cca81fca290c13cb640c1 private float speed = 0.1F; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 66fa3990f6a7e6e1623d0e911ee18f3eafebf1c1..3a216283fd76991539b494afacbaeb011fb8f8ec 100644 +index c802a074be642ee8eabf266b387714f65826354a..d5fecd8db1e0820a48c684f35cdaf720f76a1f62 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -1055,6 +1055,9 @@ public class PurpurWorldConfig { diff --git a/patches/server/0072-Add-phantom-spawning-options.patch b/patches/server/0068-Add-phantom-spawning-options.patch similarity index 96% rename from patches/server/0072-Add-phantom-spawning-options.patch rename to patches/server/0068-Add-phantom-spawning-options.patch index 902f35cb1..3de4a6e02 100644 --- a/patches/server/0072-Add-phantom-spawning-options.patch +++ b/patches/server/0068-Add-phantom-spawning-options.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add phantom spawning options diff --git a/src/main/java/net/minecraft/world/level/levelgen/PhantomSpawner.java b/src/main/java/net/minecraft/world/level/levelgen/PhantomSpawner.java -index ee299451437822544f0c79cc878110c959ec5dc4..9cb157bfcbcd309fbe7f763159592a56d2b43ed9 100644 +index 1c3718d9244513d9fc795dceb564a81375734557..69753f0b67a78c565ff455676860dc05b24bb285 100644 --- a/src/main/java/net/minecraft/world/level/levelgen/PhantomSpawner.java +++ b/src/main/java/net/minecraft/world/level/levelgen/PhantomSpawner.java @@ -51,7 +51,7 @@ public class PhantomSpawner implements CustomSpawner { @@ -40,7 +40,7 @@ index ee299451437822544f0c79cc878110c959ec5dc4..9cb157bfcbcd309fbe7f763159592a56 for (int l = 0; l < k; ++l) { // Paper start diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 3a216283fd76991539b494afacbaeb011fb8f8ec..55ea8e64bea557ceac97426b24e4cca96a9c5d0a 100644 +index d5fecd8db1e0820a48c684f35cdaf720f76a1f62..ed3170c111741fe7e0d0044d3c02da2d6352268d 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -1058,6 +1058,12 @@ public class PurpurWorldConfig { diff --git a/patches/server/0073-Implement-bed-explosion-options.patch b/patches/server/0069-Implement-bed-explosion-options.patch similarity index 55% rename from patches/server/0073-Implement-bed-explosion-options.patch rename to patches/server/0069-Implement-bed-explosion-options.patch index a25889082..7f3e1370b 100644 --- a/patches/server/0073-Implement-bed-explosion-options.patch +++ b/patches/server/0069-Implement-bed-explosion-options.patch @@ -5,29 +5,29 @@ Subject: [PATCH] Implement bed explosion options diff --git a/src/main/java/net/minecraft/world/level/block/BedBlock.java b/src/main/java/net/minecraft/world/level/block/BedBlock.java -index 654a859a37bf991c7a7fa8a44a3d20f8feb223db..e1d274a9be856f6fa5be00958c35b7d7c58357a7 100644 +index f1a7c5202d4efbfaf5d88609d243f25f6817ecbe..812a93197774b8fbcb5745a5590717e1e3ba1472 100644 --- a/src/main/java/net/minecraft/world/level/block/BedBlock.java +++ b/src/main/java/net/minecraft/world/level/block/BedBlock.java -@@ -96,7 +96,7 @@ public class BedBlock extends HorizontalDirectionalBlock implements EntityBlock - world.removeBlock(blockposition1, false); - } +@@ -97,7 +97,7 @@ public class BedBlock extends HorizontalDirectionalBlock implements EntityBlock -- world.explode((Entity) null, DamageSource.badRespawnPointExplosion(), (ExplosionDamageCalculator) null, (double) pos.getX() + 0.5D, (double) pos.getY() + 0.5D, (double) pos.getZ() + 0.5D, 5.0F, true, Explosion.BlockInteraction.DESTROY); -+ if (world.purpurConfig.bedExplode) world.explode((Entity) null, DamageSource.badRespawnPointExplosion(), null, (double) pos.getX() + 0.5D, (double) pos.getY() + 0.5D, (double) pos.getZ() + 0.5D, (float) world.purpurConfig.bedExplosionPower, world.purpurConfig.bedExplosionFire, world.purpurConfig.bedExplosionEffect); // Purpur + Vec3 vec3d = pos.getCenter(); + +- world.explode((Entity) null, DamageSource.badRespawnPointExplosion(vec3d), (ExplosionDamageCalculator) null, vec3d, 5.0F, true, Level.ExplosionInteraction.BLOCK); ++ if (world.purpurConfig.bedExplode) world.explode((Entity) null, DamageSource.badRespawnPointExplosion(vec3d), (ExplosionDamageCalculator) null, vec3d, (float) world.purpurConfig.bedExplosionPower, world.purpurConfig.bedExplosionFire, Level.ExplosionInteraction.BLOCK); // Purpur return InteractionResult.SUCCESS; } else if ((Boolean) state.getValue(BedBlock.OCCUPIED)) { if (!this.kickVillagerOutOfBed(world, pos)) { -@@ -145,7 +145,7 @@ public class BedBlock extends HorizontalDirectionalBlock implements EntityBlock - world.removeBlock(blockposition1, false); - } +@@ -148,7 +148,7 @@ public class BedBlock extends HorizontalDirectionalBlock implements EntityBlock -- world.explode((Entity) null, DamageSource.badRespawnPointExplosion(), (ExplosionDamageCalculator) null, (double) blockposition.getX() + 0.5D, (double) blockposition.getY() + 0.5D, (double) blockposition.getZ() + 0.5D, 5.0F, true, Explosion.BlockInteraction.DESTROY); -+ if (world.purpurConfig.bedExplode) world.explode((Entity) null, DamageSource.badRespawnPointExplosion(), null, (double) blockposition.getX() + 0.5D, (double) blockposition.getY() + 0.5D, (double) blockposition.getZ() + 0.5D, (float) world.purpurConfig.bedExplosionPower, world.purpurConfig.bedExplosionFire, world.purpurConfig.bedExplosionEffect); // Purpur + Vec3 vec3d = blockposition.getCenter(); + +- world.explode((Entity) null, DamageSource.badRespawnPointExplosion(vec3d), (ExplosionDamageCalculator) null, vec3d, 5.0F, true, Level.ExplosionInteraction.BLOCK); ++ if (world.purpurConfig.bedExplode) world.explode((Entity) null, DamageSource.badRespawnPointExplosion(vec3d), (ExplosionDamageCalculator) null, vec3d, (float) world.purpurConfig.bedExplosionPower, world.purpurConfig.bedExplosionFire, world.purpurConfig.bedExplosionEffect); // Purpur return InteractionResult.SUCCESS; } } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index b45d0094151d12724705bfa65eef52e5bdcb8426..e80f4a4dca04daa8587c42c476ff6d2012ac9657 100644 +index ed3170c111741fe7e0d0044d3c02da2d6352268d..a6a38979b3d7ea8a4a2bcba2f9c74df547ffcc75 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -291,6 +291,22 @@ public class PurpurWorldConfig { @@ -37,16 +37,16 @@ index b45d0094151d12724705bfa65eef52e5bdcb8426..e80f4a4dca04daa8587c42c476ff6d20 + public boolean bedExplode = true; + public double bedExplosionPower = 5.0D; + public boolean bedExplosionFire = true; -+ public Explosion.BlockInteraction bedExplosionEffect = Explosion.BlockInteraction.DESTROY; ++ public net.minecraft.world.level.Level.ExplosionInteraction bedExplosionEffect = net.minecraft.world.level.Level.ExplosionInteraction.BLOCK; + private void bedSettings() { + bedExplode = getBoolean("blocks.bed.explode", bedExplode); + bedExplosionPower = getDouble("blocks.bed.explosion-power", bedExplosionPower); + bedExplosionFire = getBoolean("blocks.bed.explosion-fire", bedExplosionFire); + try { -+ bedExplosionEffect = Explosion.BlockInteraction.valueOf(getString("blocks.bed.explosion-effect", bedExplosionEffect.name())); ++ bedExplosionEffect = net.minecraft.world.level.Level.ExplosionInteraction.valueOf(getString("blocks.bed.explosion-effect", bedExplosionEffect.name())); + } catch (IllegalArgumentException e) { + log(Level.SEVERE, "Unknown value for `blocks.bed.explosion-effect`! Using default of `DESTROY`"); -+ bedExplosionEffect = Explosion.BlockInteraction.DESTROY; ++ bedExplosionEffect = net.minecraft.world.level.Level.ExplosionInteraction.BLOCK; + } + } + diff --git a/patches/server/0074-Implement-respawn-anchor-explosion-options.patch b/patches/server/0070-Implement-respawn-anchor-explosion-options.patch similarity index 59% rename from patches/server/0074-Implement-respawn-anchor-explosion-options.patch rename to patches/server/0070-Implement-respawn-anchor-explosion-options.patch index 7d48bb2ad..6a8dc763e 100644 --- a/patches/server/0074-Implement-respawn-anchor-explosion-options.patch +++ b/patches/server/0070-Implement-respawn-anchor-explosion-options.patch @@ -5,20 +5,20 @@ Subject: [PATCH] Implement respawn anchor explosion options diff --git a/src/main/java/net/minecraft/world/level/block/RespawnAnchorBlock.java b/src/main/java/net/minecraft/world/level/block/RespawnAnchorBlock.java -index c2f3d3a09327e7cb7d3167609eb3ce68eadf6443..12b25aec1167620ed7048c0c8631b0b502c20dad 100644 +index 53b35f003034e7f4c9dd8ccfaf77389163009453..de5d51eb67205d2f62582aea9465bbb9d55fde19 100644 --- a/src/main/java/net/minecraft/world/level/block/RespawnAnchorBlock.java +++ b/src/main/java/net/minecraft/world/level/block/RespawnAnchorBlock.java -@@ -124,7 +124,7 @@ public class RespawnAnchorBlock extends Block { - return pos.equals(explodedPos) && bl2 ? Optional.of(Blocks.WATER.getExplosionResistance()) : super.getBlockExplosionResistance(explosion, world, pos, blockState, fluidState); +@@ -125,7 +125,7 @@ public class RespawnAnchorBlock extends Block { } }; -- world.explode((Entity)null, DamageSource.badRespawnPointExplosion(), explosionDamageCalculator, (double)explodedPos.getX() + 0.5D, (double)explodedPos.getY() + 0.5D, (double)explodedPos.getZ() + 0.5D, 5.0F, true, Explosion.BlockInteraction.DESTROY); -+ if (world.purpurConfig.respawnAnchorExplode) world.explode(null, DamageSource.badRespawnPointExplosion(), explosionDamageCalculator, (double) explodedPos.getX() + 0.5D, (double) explodedPos.getY() + 0.5D, (double) explodedPos.getZ() + 0.5D, (float) world.purpurConfig.respawnAnchorExplosionPower, world.purpurConfig.respawnAnchorExplosionFire, world.purpurConfig.respawnAnchorExplosionEffect); // Purpur + Vec3 vec3 = explodedPos.getCenter(); +- world.explode((Entity)null, DamageSource.badRespawnPointExplosion(vec3), explosionDamageCalculator, vec3, 5.0F, true, Level.ExplosionInteraction.BLOCK); ++ if (world.purpurConfig.respawnAnchorExplode) world.explode((Entity)null, DamageSource.badRespawnPointExplosion(vec3), explosionDamageCalculator, vec3, (float) world.purpurConfig.respawnAnchorExplosionPower, world.purpurConfig.respawnAnchorExplosionFire, world.purpurConfig.respawnAnchorExplosionEffect); // Purpur } public static boolean canSetSpawn(Level world) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index e80f4a4dca04daa8587c42c476ff6d2012ac9657..ff850c647216d061e06c247f709eff398468c397 100644 +index a6a38979b3d7ea8a4a2bcba2f9c74df547ffcc75..7a01302e0ce1a89f2107cbb110ae4819daf118d2 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -328,6 +328,22 @@ public class PurpurWorldConfig { @@ -28,16 +28,16 @@ index e80f4a4dca04daa8587c42c476ff6d2012ac9657..ff850c647216d061e06c247f709eff39 + public boolean respawnAnchorExplode = true; + public double respawnAnchorExplosionPower = 5.0D; + public boolean respawnAnchorExplosionFire = true; -+ public Explosion.BlockInteraction respawnAnchorExplosionEffect = Explosion.BlockInteraction.DESTROY; ++ public net.minecraft.world.level.Level.ExplosionInteraction respawnAnchorExplosionEffect = net.minecraft.world.level.Level.ExplosionInteraction.BLOCK; + private void respawnAnchorSettings() { + respawnAnchorExplode = getBoolean("blocks.respawn_anchor.explode", respawnAnchorExplode); + respawnAnchorExplosionPower = getDouble("blocks.respawn_anchor.explosion-power", respawnAnchorExplosionPower); + respawnAnchorExplosionFire = getBoolean("blocks.respawn_anchor.explosion-fire", respawnAnchorExplosionFire); + try { -+ respawnAnchorExplosionEffect = Explosion.BlockInteraction.valueOf(getString("blocks.respawn_anchor.explosion-effect", respawnAnchorExplosionEffect.name())); ++ respawnAnchorExplosionEffect = net.minecraft.world.level.Level.ExplosionInteraction.valueOf(getString("blocks.respawn_anchor.explosion-effect", respawnAnchorExplosionEffect.name())); + } catch (IllegalArgumentException e) { -+ log(Level.SEVERE, "Unknown value for `blocks.respawn_anchor.explosion-effect`! Using default of `DESTROY`"); -+ respawnAnchorExplosionEffect = Explosion.BlockInteraction.DESTROY; ++ log(Level.SEVERE, "Unknown value for `blocks.respawn_anchor.explosion-effect`! Using default of `BLOCK`"); ++ respawnAnchorExplosionEffect = net.minecraft.world.level.Level.ExplosionInteraction.BLOCK; + } + } + diff --git a/patches/server/0075-Add-allow-water-in-end-world-option.patch b/patches/server/0071-Add-allow-water-in-end-world-option.patch similarity index 97% rename from patches/server/0075-Add-allow-water-in-end-world-option.patch rename to patches/server/0071-Add-allow-water-in-end-world-option.patch index 375fbc3fd..aac2f1045 100644 --- a/patches/server/0075-Add-allow-water-in-end-world-option.patch +++ b/patches/server/0071-Add-allow-water-in-end-world-option.patch @@ -27,10 +27,10 @@ index 5c6aa9c464784ad5ee366412d080c72d3d22a76f..c03abc9589bf5f37abc1b0d355ed9784 return true; diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index eeab93f6a3eea19a58fe1b78e0727f8c109640d0..6245eaff134cc6b8ad2c13a6a2a7f74a6c4d4085 100644 +index e38d20975f63e2a9847b17e60647624c1eeab6f5..6bf58b1d80dc4309d59e846baba152791b5a483b 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java -@@ -1570,4 +1570,14 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -1534,4 +1534,14 @@ public abstract class Level implements LevelAccessor, AutoCloseable { return null; } // Paper end diff --git a/patches/server/0076-Allow-color-codes-in-books.patch b/patches/server/0072-Allow-color-codes-in-books.patch similarity index 92% rename from patches/server/0076-Allow-color-codes-in-books.patch rename to patches/server/0072-Allow-color-codes-in-books.patch index c3545bdff..94eea328c 100644 --- a/patches/server/0076-Allow-color-codes-in-books.patch +++ b/patches/server/0072-Allow-color-codes-in-books.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Allow color codes in books diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index f10488344791bcc3be15538b75ad211b4858b520..76aae9b733b6c7becd37a2176a68a19c008ebb8e 100644 +index 8920383edbd9908087be320f47d9ba8e536cff42..e1c2ac7e9578db319f582cdd9cbe0084d43e34f0 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -1342,13 +1342,16 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -1332,13 +1332,16 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic itemstack1.setTag(nbttagcompound.copy()); } @@ -28,7 +28,7 @@ index f10488344791bcc3be15538b75ad211b4858b520..76aae9b733b6c7becd37a2176a68a19c this.updateBookPages(pages, (s) -> { return Component.Serializer.toJson(Component.literal(s)); -@@ -1360,10 +1363,13 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -1350,10 +1353,13 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic private void updateBookPages(List list, UnaryOperator unaryoperator, ItemStack itemstack, int slot, ItemStack handItem) { // CraftBukkit ListTag nbttaglist = new ListTag(); @@ -44,7 +44,7 @@ index f10488344791bcc3be15538b75ad211b4858b520..76aae9b733b6c7becd37a2176a68a19c Objects.requireNonNull(nbttaglist); stream.forEach(nbttaglist::add); -@@ -1373,11 +1379,11 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -1363,11 +1369,11 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic for (int j = list.size(); i < j; ++i) { FilteredText filteredtext = (FilteredText) list.get(i); @@ -58,7 +58,7 @@ index f10488344791bcc3be15538b75ad211b4858b520..76aae9b733b6c7becd37a2176a68a19c } } -@@ -1390,6 +1396,16 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -1380,6 +1386,16 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic this.player.getInventory().setItem(slot, CraftEventFactory.handleEditBookEvent(player, slot, handItem, itemstack)); // CraftBukkit // Paper - Don't ignore result (see other callsite for handleEditBookEvent) } diff --git a/patches/server/0077-Entity-lifespan.patch b/patches/server/0073-Entity-lifespan.patch similarity index 85% rename from patches/server/0077-Entity-lifespan.patch rename to patches/server/0073-Entity-lifespan.patch index 3acee4665..bc892bdf4 100644 --- a/patches/server/0077-Entity-lifespan.patch +++ b/patches/server/0073-Entity-lifespan.patch @@ -5,19 +5,19 @@ Subject: [PATCH] Entity lifespan diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index a431d7d1e72092e9274507b3ed463bfdeb3583f5..39381bfc3a0ec0befe144c71b186153ac8d9e03c 100644 +index e1c2ac7e9578db319f582cdd9cbe0084d43e34f0..cb36cc5248a7166fa8d43cabb6ada371c1026aaa 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -2970,6 +2970,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -2823,6 +2823,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic } if (entity.distanceToSqr(this.player.getEyePosition()) < ServerGamePacketListenerImpl.MAX_INTERACTION_DISTANCE) { + if (entity instanceof Mob mob) mob.ticksSinceLastInteraction = 0; // Purpur packet.dispatch(new ServerboundInteractPacket.Handler() { private void performInteraction(InteractionHand enumhand, ServerGamePacketListenerImpl.EntityInteraction playerconnection_a, PlayerInteractEntityEvent event) { // CraftBukkit - ItemStack itemstack = ServerGamePacketListenerImpl.this.player.getItemInHand(enumhand).copy(); + ItemStack itemstack = ServerGamePacketListenerImpl.this.player.getItemInHand(enumhand); diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java -index 8ebdd872c5ce6beebcd2d766cd3a0cb868f4ed02..e08c5ccb2f9e07b9dfebf47ddd94330f6ea5a17b 100644 +index b6f2fbe5a2577696d62e001a3c07b52b07a33c74..d1eb52081277a51610abd83810ea96dfed2ea54b 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java @@ -134,6 +134,7 @@ public abstract class Mob extends LivingEntity { @@ -28,7 +28,7 @@ index 8ebdd872c5ce6beebcd2d766cd3a0cb868f4ed02..e08c5ccb2f9e07b9dfebf47ddd94330f public boolean aware = true; // CraftBukkit protected Mob(EntityType type, Level world) { -@@ -290,6 +291,7 @@ public abstract class Mob extends LivingEntity { +@@ -288,6 +289,7 @@ public abstract class Mob extends LivingEntity { entityliving = null; } } @@ -36,7 +36,7 @@ index 8ebdd872c5ce6beebcd2d766cd3a0cb868f4ed02..e08c5ccb2f9e07b9dfebf47ddd94330f this.target = entityliving; return true; // CraftBukkit end -@@ -336,9 +338,29 @@ public abstract class Mob extends LivingEntity { +@@ -334,9 +336,29 @@ public abstract class Mob extends LivingEntity { this.playAmbientSound(); } @@ -66,7 +66,7 @@ index 8ebdd872c5ce6beebcd2d766cd3a0cb868f4ed02..e08c5ccb2f9e07b9dfebf47ddd94330f @Override protected void playHurtSound(DamageSource source) { this.resetAmbientSoundTime(); -@@ -528,6 +550,7 @@ public abstract class Mob extends LivingEntity { +@@ -526,6 +548,7 @@ public abstract class Mob extends LivingEntity { } nbt.putBoolean("Bukkit.Aware", this.aware); // CraftBukkit @@ -74,7 +74,7 @@ index 8ebdd872c5ce6beebcd2d766cd3a0cb868f4ed02..e08c5ccb2f9e07b9dfebf47ddd94330f } @Override -@@ -598,6 +621,11 @@ public abstract class Mob extends LivingEntity { +@@ -596,6 +619,11 @@ public abstract class Mob extends LivingEntity { this.aware = nbt.getBoolean("Bukkit.Aware"); } // CraftBukkit end @@ -86,7 +86,7 @@ index 8ebdd872c5ce6beebcd2d766cd3a0cb868f4ed02..e08c5ccb2f9e07b9dfebf47ddd94330f } @Override -@@ -1640,6 +1668,7 @@ public abstract class Mob extends LivingEntity { +@@ -1660,6 +1688,7 @@ public abstract class Mob extends LivingEntity { this.setLastHurtMob(target); } @@ -95,7 +95,7 @@ index 8ebdd872c5ce6beebcd2d766cd3a0cb868f4ed02..e08c5ccb2f9e07b9dfebf47ddd94330f } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index ff850c647216d061e06c247f709eff398468c397..0f33736b1daf1d5721cd08abd66c70a9690124b6 100644 +index 7a01302e0ce1a89f2107cbb110ae4819daf118d2..a34e1932fdd32a517b5e627cecbfa4062607f8b7 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -128,6 +128,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0078-Add-option-to-teleport-to-spawn-if-outside-world-bor.patch b/patches/server/0074-Add-option-to-teleport-to-spawn-if-outside-world-bor.patch similarity index 83% rename from patches/server/0078-Add-option-to-teleport-to-spawn-if-outside-world-bor.patch rename to patches/server/0074-Add-option-to-teleport-to-spawn-if-outside-world-bor.patch index 6c01ebc22..e46e98b36 100644 --- a/patches/server/0078-Add-option-to-teleport-to-spawn-if-outside-world-bor.patch +++ b/patches/server/0074-Add-option-to-teleport-to-spawn-if-outside-world-bor.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add option to teleport to spawn if outside world border diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index c566942d2dc27019cd0a570ac9af4e3d420c2baa..43ac7d1d107c110f69464270853ebecb916f23a8 100644 +index a51453de2837851769f826f0b9eddc812d18614f..7775008d456f92c3d373c2f18fff0c7d6b3f32f1 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java -@@ -2614,4 +2614,26 @@ public class ServerPlayer extends Player { +@@ -2654,4 +2654,26 @@ public class ServerPlayer extends Player { return (CraftPlayer) super.getBukkitEntity(); } // CraftBukkit end @@ -36,19 +36,19 @@ index c566942d2dc27019cd0a570ac9af4e3d420c2baa..43ac7d1d107c110f69464270853ebecb + // Purpur end } diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 2eeb3ad5d0286c14b0d61e68e398a459c41058cc..616fb6ef8ec62fad8c910d676ebbe308cbe6da4e 100644 +index f6715870f038dd193fe13e067dcd63b931d88087..52e294ac8df27b5301e83e912ee2f5f3f011d939 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -412,6 +412,7 @@ public abstract class LivingEntity extends Entity { - double d1 = this.level.getWorldBorder().getDamagePerBlock(); +@@ -416,6 +416,7 @@ public abstract class LivingEntity extends Entity { + double d1 = this.level.getWorldBorder().getDamagePerBlock(); - if (d1 > 0.0D) { + if (d1 > 0.0D) { + if (level.purpurConfig.teleportIfOutsideBorder && this instanceof ServerPlayer) { ((ServerPlayer) this).teleport(io.papermc.paper.util.MCUtil.toLocation(level, ((ServerLevel) level).getSharedSpawnPos())); return; } // Purpur - this.hurt(DamageSource.IN_WALL, (float) Math.max(1, Mth.floor(-d0 * d1))); + this.hurt(DamageSource.IN_WALL, (float) Math.max(1, Mth.floor(-d0 * d1))); + } } - } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index e778648a01e6fe134ab6dc632b4f6809f4af32e1..45cda7ef8678456752cbfb3a98608ef01fa28733 100644 +index a34e1932fdd32a517b5e627cecbfa4062607f8b7..c59e3de65057215cf0767254d44d8ae95c1da015 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -247,6 +247,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0079-Squid-EAR-immunity.patch b/patches/server/0075-Squid-EAR-immunity.patch similarity index 90% rename from patches/server/0079-Squid-EAR-immunity.patch rename to patches/server/0075-Squid-EAR-immunity.patch index fcd5cdf70..830bddd0a 100644 --- a/patches/server/0079-Squid-EAR-immunity.patch +++ b/patches/server/0075-Squid-EAR-immunity.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Squid EAR immunity diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 45cda7ef8678456752cbfb3a98608ef01fa28733..85819dd9d93b9c198185cbac1a65217dd8ec2db1 100644 +index 4c03d57fbed6501fd26cb8c745e042fe76b95835..d7f2a4a6b432c296ece503036de7b2e7fc8ad965 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -1422,6 +1422,7 @@ public class PurpurWorldConfig { @@ -25,7 +25,7 @@ index 45cda7ef8678456752cbfb3a98608ef01fa28733..85819dd9d93b9c198185cbac1a65217d public boolean spiderRidable = false; diff --git a/src/main/java/org/spigotmc/ActivationRange.java b/src/main/java/org/spigotmc/ActivationRange.java -index 7529bca82efe4c33dbf781bcf6f8b583fa54fa95..383a13a26ee9445fa6201770bb9bef274d72283a 100644 +index cea4acefa57cf59dd0863e27777618c49eabab5e..3783186d0c3f2f7b241d38f8ee011e8a5c172980 100644 --- a/src/main/java/org/spigotmc/ActivationRange.java +++ b/src/main/java/org/spigotmc/ActivationRange.java @@ -15,6 +15,7 @@ import net.minecraft.world.entity.ambient.AmbientCreature; @@ -36,7 +36,7 @@ index 7529bca82efe4c33dbf781bcf6f8b583fa54fa95..383a13a26ee9445fa6201770bb9bef27 import net.minecraft.world.entity.animal.WaterAnimal; import net.minecraft.world.entity.animal.horse.Llama; import net.minecraft.world.entity.boss.EnderDragonPart; -@@ -396,6 +397,7 @@ public class ActivationRange +@@ -373,6 +374,7 @@ public class ActivationRange */ public static boolean checkIfActive(Entity entity) { diff --git a/patches/server/0080-Phantoms-burn-in-light.patch b/patches/server/0076-Phantoms-burn-in-light.patch similarity index 98% rename from patches/server/0080-Phantoms-burn-in-light.patch rename to patches/server/0076-Phantoms-burn-in-light.patch index ce8607ca8..116dc6ecb 100644 --- a/patches/server/0080-Phantoms-burn-in-light.patch +++ b/patches/server/0076-Phantoms-burn-in-light.patch @@ -53,7 +53,7 @@ index b9d737a20b8cca81fca290c13cb640c17d25bc6e..11cbb89eb062de0cd30158dbfbef1355 list.sort(Comparator.comparing((Entity e) -> { return e.getY(); }).reversed()); // CraftBukkit - decompile error Iterator iterator = list.iterator(); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 85819dd9d93b9c198185cbac1a65217dd8ec2db1..01124f7f92b510e89a5531477a9cdabd3c2592a9 100644 +index 5cb9eeb5f33de2bbf34780976275641a8f584ece..cdbf56d05d09e1269493ef6a7c1730f229f2b0a8 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -1103,6 +1103,9 @@ public class PurpurWorldConfig { diff --git a/patches/server/0081-Configurable-villager-breeding.patch b/patches/server/0077-Configurable-villager-breeding.patch similarity index 68% rename from patches/server/0081-Configurable-villager-breeding.patch rename to patches/server/0077-Configurable-villager-breeding.patch index 074412b12..dc8c9dee1 100644 --- a/patches/server/0081-Configurable-villager-breeding.patch +++ b/patches/server/0077-Configurable-villager-breeding.patch @@ -5,32 +5,32 @@ Subject: [PATCH] Configurable villager breeding diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java -index 60847bbed4890670ea422a238359d8d9de5c08e7..0db007e61478688ca7198587e3a444ef63e3b65a 100644 +index ce70ddaf68cc0c4959fc520492b31f65deb7a3d6..80a0639c35906fdb3ed07f14395fc3009010fa7c 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java -@@ -774,7 +774,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -760,7 +760,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler @Override public boolean canBreed() { -- return this.foodLevel + this.countFoodPointsInInventory() >= 12 && this.getAge() == 0; -+ return level.purpurConfig.villagerCanBreed && this.foodLevel + this.countFoodPointsInInventory() >= 12 && this.getAge() == 0; +- return this.foodLevel + this.countFoodPointsInInventory() >= 12 && !this.isSleeping() && this.getAge() == 0; ++ return this.level.purpurConfig.villagerCanBreed && this.foodLevel + this.countFoodPointsInInventory() >= 12 && !this.isSleeping() && this.getAge() == 0; // Purpur } private boolean hungry() { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 01124f7f92b510e89a5531477a9cdabd3c2592a9..a469231646469604b2ca48f06646dea233db0719 100644 +index a5102b1787b9d4d95c5d90ab0d24e8e53f81b038..f8fa8af8471a6c0194f7d303910d04a5d50f712e 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1582,6 +1582,7 @@ public class PurpurWorldConfig { - public boolean villagerUseBrainTicksOnlyWhenLagging = true; +@@ -1580,6 +1580,7 @@ public class PurpurWorldConfig { + public double villagerMaxHealth = 20.0D; public boolean villagerFollowEmeraldBlock = false; public boolean villagerCanBeLeashed = false; + public boolean villagerCanBreed = true; private void villagerSettings() { villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); -@@ -1596,6 +1597,7 @@ public class PurpurWorldConfig { - villagerUseBrainTicksOnlyWhenLagging = getBoolean("mobs.villager.use-brain-ticks-only-when-lagging", villagerUseBrainTicksOnlyWhenLagging); +@@ -1592,6 +1593,7 @@ public class PurpurWorldConfig { + villagerMaxHealth = getDouble("mobs.villager.attributes.max_health", villagerMaxHealth); villagerFollowEmeraldBlock = getBoolean("mobs.villager.follow-emerald-blocks", villagerFollowEmeraldBlock); villagerCanBeLeashed = getBoolean("mobs.villager.can-be-leashed", villagerCanBeLeashed); + villagerCanBreed = getBoolean("mobs.villager.can-breed", villagerCanBreed); diff --git a/patches/server/0082-Redstone-deactivates-spawners.patch b/patches/server/0078-Redstone-deactivates-spawners.patch similarity index 87% rename from patches/server/0082-Redstone-deactivates-spawners.patch rename to patches/server/0078-Redstone-deactivates-spawners.patch index 607243561..22f266220 100644 --- a/patches/server/0082-Redstone-deactivates-spawners.patch +++ b/patches/server/0078-Redstone-deactivates-spawners.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Redstone deactivates spawners diff --git a/src/main/java/net/minecraft/world/level/BaseSpawner.java b/src/main/java/net/minecraft/world/level/BaseSpawner.java -index 641709c3a2575dbe79165beff814cb77fa7dbdc1..c60f60167e20a4f6a89521ae6b84434d5c1db29b 100644 +index af799b61cec48ca290ed66cb47cfc0b244ac41a7..4e1e1fdbf12768b95dd499bf011009a4c4ca2306 100644 --- a/src/main/java/net/minecraft/world/level/BaseSpawner.java +++ b/src/main/java/net/minecraft/world/level/BaseSpawner.java -@@ -52,6 +52,7 @@ public abstract class BaseSpawner { +@@ -55,6 +55,7 @@ public abstract class BaseSpawner { } public boolean isNearPlayer(Level world, BlockPos pos) { @@ -17,7 +17,7 @@ index 641709c3a2575dbe79165beff814cb77fa7dbdc1..c60f60167e20a4f6a89521ae6b84434d } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 69032e6cc241014ed0a8024757cab66a01235b90..5ad41ae78145e0488676c2addeb0fcdccbfcda85 100644 +index a93f0bc3b0f567118651acb3f7b71bc1ae1157a9..3cf911e9a9f58fbceed3f371c65cf946a8b31637 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -356,6 +356,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0083-Totems-work-in-inventory.patch b/patches/server/0079-Totems-work-in-inventory.patch similarity index 91% rename from patches/server/0083-Totems-work-in-inventory.patch rename to patches/server/0079-Totems-work-in-inventory.patch index ff8ecb7e9..c52a9f43d 100644 --- a/patches/server/0083-Totems-work-in-inventory.patch +++ b/patches/server/0079-Totems-work-in-inventory.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Totems work in inventory diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 616fb6ef8ec62fad8c910d676ebbe308cbe6da4e..211f7455553835bfb7012a95779bb11750a9d621 100644 +index 52e294ac8df27b5301e83e912ee2f5f3f011d939..192da1b616b3a6bcf2c5e6e172903e99867aefbe 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -1560,6 +1560,18 @@ public abstract class LivingEntity extends Entity { +@@ -1554,6 +1554,18 @@ public abstract class LivingEntity extends Entity { } } @@ -28,7 +28,7 @@ index 616fb6ef8ec62fad8c910d676ebbe308cbe6da4e..211f7455553835bfb7012a95779bb117 EntityResurrectEvent event = new EntityResurrectEvent((org.bukkit.entity.LivingEntity) this.getBukkitEntity(), handSlot); event.setCancelled(itemstack == null); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index a2d6192bb20bc2edae00ea903e1d920a65ae1dd4..3ffbab710e050ab71f36417ccf955a1e96ecf379 100644 +index 3cf911e9a9f58fbceed3f371c65cf946a8b31637..4223f2b19a83a27de5f1602f0220768e513d2cbe 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -248,6 +248,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0084-Add-vindicator-johnny-spawn-chance.patch b/patches/server/0080-Add-vindicator-johnny-spawn-chance.patch similarity index 91% rename from patches/server/0084-Add-vindicator-johnny-spawn-chance.patch rename to patches/server/0080-Add-vindicator-johnny-spawn-chance.patch index a219a4d2a..5c3f2861e 100644 --- a/patches/server/0084-Add-vindicator-johnny-spawn-chance.patch +++ b/patches/server/0080-Add-vindicator-johnny-spawn-chance.patch @@ -22,10 +22,10 @@ index c3b8bce2d8e1dccb619267923964e06abfed8762..021550a0465dd1fd152b4c2e76301405 } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 3ffbab710e050ab71f36417ccf955a1e96ecf379..f77772071f28fec0072f4cfa042eaa7505544ff7 100644 +index ef6a8a5460f5f8994ce6712b11b58af15d217648..645368a53a15760660f1a683ebc8c14a7a49bedc 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1611,6 +1611,7 @@ public class PurpurWorldConfig { +@@ -1607,6 +1607,7 @@ public class PurpurWorldConfig { public boolean vindicatorRidableInWater = false; public boolean vindicatorControllable = true; public double vindicatorMaxHealth = 24.0D; @@ -33,7 +33,7 @@ index 3ffbab710e050ab71f36417ccf955a1e96ecf379..f77772071f28fec0072f4cfa042eaa75 private void vindicatorSettings() { vindicatorRidable = getBoolean("mobs.vindicator.ridable", vindicatorRidable); vindicatorRidableInWater = getBoolean("mobs.vindicator.ridable-in-water", vindicatorRidableInWater); -@@ -1621,6 +1622,7 @@ public class PurpurWorldConfig { +@@ -1617,6 +1618,7 @@ public class PurpurWorldConfig { set("mobs.vindicator.attributes.max_health", oldValue); } vindicatorMaxHealth = getDouble("mobs.vindicator.attributes.max_health", vindicatorMaxHealth); diff --git a/patches/server/0085-Add-option-to-disable-certain-block-updates.patch b/patches/server/0081-Add-option-to-disable-certain-block-updates.patch similarity index 94% rename from patches/server/0085-Add-option-to-disable-certain-block-updates.patch rename to patches/server/0081-Add-option-to-disable-certain-block-updates.patch index dc5580500..0f307cfa0 100644 --- a/patches/server/0085-Add-option-to-disable-certain-block-updates.patch +++ b/patches/server/0081-Add-option-to-disable-certain-block-updates.patch @@ -99,24 +99,24 @@ index 3c6d97b51c6fec130b80e5965afa2c49d48843c9..b456cb8efd8f0be8a6860c82462ce9bd @Override diff --git a/src/main/java/net/minecraft/world/level/block/NoteBlock.java b/src/main/java/net/minecraft/world/level/block/NoteBlock.java -index c14eb4f7decdbcd6176d3bff95d595a947d4ec95..58e8905a4b98e2e1ee372b99bdc3de9815063ac9 100644 +index df7965c86b9c9e89b07b76c75b638d391ea6cc34..641725337c65ddf35e7baf731ec37318d4696036 100644 --- a/src/main/java/net/minecraft/world/level/block/NoteBlock.java +++ b/src/main/java/net/minecraft/world/level/block/NoteBlock.java -@@ -37,11 +37,13 @@ public class NoteBlock extends Block { +@@ -60,11 +60,13 @@ public class NoteBlock extends Block { @Override public BlockState getStateForPlacement(BlockPlaceContext ctx) { + if (org.purpurmc.purpur.PurpurConfig.disableNoteBlockUpdates) return this.defaultBlockState(); // Purpur - return (BlockState) this.defaultBlockState().setValue(NoteBlock.INSTRUMENT, NoteBlockInstrument.byState(ctx.getLevel().getBlockState(ctx.getClickedPos().below()))); + return this.setInstrument(ctx.getLevel(), ctx.getClickedPos(), this.defaultBlockState()); } @Override public BlockState updateShape(BlockState state, Direction direction, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { + if (org.purpurmc.purpur.PurpurConfig.disableNoteBlockUpdates) return state; // Purpur - return direction == Direction.DOWN ? (BlockState) state.setValue(NoteBlock.INSTRUMENT, NoteBlockInstrument.byState(neighborState)) : super.updateShape(state, direction, neighborState, world, pos, neighborPos); - } + boolean flag = NoteBlock.isFeatureFlagEnabled(world) ? direction.getAxis() == Direction.Axis.Y : direction == Direction.DOWN; -@@ -55,6 +57,7 @@ public class NoteBlock extends Block { + return flag ? this.setInstrument(world, pos, state) : super.updateShape(state, direction, neighborState, world, pos, neighborPos); +@@ -80,6 +82,7 @@ public class NoteBlock extends Block { state = world.getBlockState(pos); // CraftBukkit - SPIGOT-5617: update in case changed in event } diff --git a/patches/server/0086-Dispensers-place-anvils-option.patch b/patches/server/0082-Dispensers-place-anvils-option.patch similarity index 91% rename from patches/server/0086-Dispensers-place-anvils-option.patch rename to patches/server/0082-Dispensers-place-anvils-option.patch index 4693869af..4de5d8f95 100644 --- a/patches/server/0086-Dispensers-place-anvils-option.patch +++ b/patches/server/0082-Dispensers-place-anvils-option.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Dispensers place anvils option diff --git a/src/main/java/net/minecraft/core/dispenser/DispenseItemBehavior.java b/src/main/java/net/minecraft/core/dispenser/DispenseItemBehavior.java -index 9d601bf258a6d209a889afa7ba7f839c01f83cd8..b0ff4e92079b2171e5fda8319a97add639aedd4b 100644 +index a548d09fa7646254c34f41d30fbc1300e7cef3c1..4205a44473bd5131c9601d1cc56dd629b8ac5b9d 100644 --- a/src/main/java/net/minecraft/core/dispenser/DispenseItemBehavior.java +++ b/src/main/java/net/minecraft/core/dispenser/DispenseItemBehavior.java @@ -51,6 +51,7 @@ import net.minecraft.world.item.SpawnEggItem; @@ -16,7 +16,7 @@ index 9d601bf258a6d209a889afa7ba7f839c01f83cd8..b0ff4e92079b2171e5fda8319a97add6 import net.minecraft.world.level.block.BaseFireBlock; import net.minecraft.world.level.block.BeehiveBlock; import net.minecraft.world.level.block.Block; -@@ -1146,6 +1147,23 @@ public interface DispenseItemBehavior { +@@ -1150,6 +1151,23 @@ public interface DispenseItemBehavior { } } }); @@ -41,7 +41,7 @@ index 9d601bf258a6d209a889afa7ba7f839c01f83cd8..b0ff4e92079b2171e5fda8319a97add6 static void setEntityPokingOutOfBlock(BlockSource pointer, Entity entity, Direction direction) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 6cc8176551a6bd90c7b070095263d4f1b2cb7bec..2421b9d2c41a878ff01c81753d140c50f30ef4c2 100644 +index 614051e304c04c4c561b91155a451671a76dfaf2..5f297cd2a0ea4661c6f59efce49abd6cb38a3042 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -317,8 +317,10 @@ public class PurpurWorldConfig { diff --git a/patches/server/0087-Allow-anvil-colors.patch b/patches/server/0083-Allow-anvil-colors.patch similarity index 98% rename from patches/server/0087-Allow-anvil-colors.patch rename to patches/server/0083-Allow-anvil-colors.patch index 72152f061..56aec6e08 100644 --- a/patches/server/0087-Allow-anvil-colors.patch +++ b/patches/server/0083-Allow-anvil-colors.patch @@ -64,7 +64,7 @@ index 0363d2263b2d6bd6166fa21d7849297e95eddd77..d39b86b90aefab85b92e980f56f690bd } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 2421b9d2c41a878ff01c81753d140c50f30ef4c2..a7b763a1d86c98128a4c5f600ae89ab79fd7e22d 100644 +index 5f297cd2a0ea4661c6f59efce49abd6cb38a3042..2358fcbaa13705ce80956514804aadf400aa53a9 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -300,6 +300,13 @@ public class PurpurWorldConfig { diff --git a/patches/server/0088-Add-option-to-disable-dolphin-treasure-searching.patch b/patches/server/0084-Add-option-to-disable-dolphin-treasure-searching.patch similarity index 95% rename from patches/server/0088-Add-option-to-disable-dolphin-treasure-searching.patch rename to patches/server/0084-Add-option-to-disable-dolphin-treasure-searching.patch index d210c5927..132dffe81 100644 --- a/patches/server/0088-Add-option-to-disable-dolphin-treasure-searching.patch +++ b/patches/server/0084-Add-option-to-disable-dolphin-treasure-searching.patch @@ -17,7 +17,7 @@ index 1ca3ffe212da2c3914c290172e729ba8017f631c..a8ca2d120a545d423fc00aef5299b66b } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index a7b763a1d86c98128a4c5f600ae89ab79fd7e22d..08eca6afc59d1011e2e3ba184c5d8d5e2f31f094 100644 +index 2358fcbaa13705ce80956514804aadf400aa53a9..25212d3a715cb1c9942101fe6ffac51b11916a2c 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -590,6 +590,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0089-Short-enderman-height.patch b/patches/server/0085-Short-enderman-height.patch similarity index 78% rename from patches/server/0089-Short-enderman-height.patch rename to patches/server/0085-Short-enderman-height.patch index 80cf40bc7..751ad91ea 100644 --- a/patches/server/0089-Short-enderman-height.patch +++ b/patches/server/0085-Short-enderman-height.patch @@ -5,24 +5,24 @@ Subject: [PATCH] Short enderman height diff --git a/src/main/java/net/minecraft/world/entity/EntityType.java b/src/main/java/net/minecraft/world/entity/EntityType.java -index 63df8f7c80033dfb34208862771a6c0302653b6f..91be8629612d3afdcd742c2cd0155df738fd992c 100644 +index 2aff49c24bbe2fbdebd70327af34b2dc2f5f83e6..30cfdacc049e9397fad759b26adc3c711d16c9bb 100644 --- a/src/main/java/net/minecraft/world/entity/EntityType.java +++ b/src/main/java/net/minecraft/world/entity/EntityType.java -@@ -291,7 +291,8 @@ public class EntityType implements EntityTypeTest { +@@ -299,7 +299,8 @@ public class EntityType implements FeatureElement, EntityTypeT private Component description; @Nullable private ResourceLocation lootTable; - private final EntityDimensions dimensions; + private EntityDimensions dimensions; // Purpur - remove final + public void setDimensions(EntityDimensions dimensions) { this.dimensions = dimensions; } // Purpur + private final FeatureFlagSet requiredFeatures; + public final String id; // Purpur - private static EntityType register(String id, EntityType.Builder type) { // CraftBukkit - decompile error - return (EntityType) Registry.register(Registry.ENTITY_TYPE, id, (EntityType) type.build(id)); // CraftBukkit - decompile error diff --git a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -index ad47267eb6797e1591841cb7a576fb65f6e81382..9458cab33d4ff468d3d009cc1c3b3736f21f649b 100644 +index c3bda3227736c5f8529b6ecbd0f17076f2d470e8..f130f3f8ceb5ab30e0b53e8b78281bfb953af5a9 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -@@ -413,6 +413,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -423,6 +423,7 @@ public class EnderMan extends Monster implements NeutralMob { if (this.isInvulnerableTo(source)) { return false; } else if (getRider() != null && this.isControllable()) { return super.hurt(source, amount); // Purpur - no teleporting on damage @@ -31,7 +31,7 @@ index ad47267eb6797e1591841cb7a576fb65f6e81382..9458cab33d4ff468d3d009cc1c3b3736 Entity entity = source.getDirectEntity(); boolean flag; diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -index 84cb76a714db476e786c33424d20657ab21c3e05..3b10d9b4e7d3034ca43e6e05b3bccccfe0162a4b 100644 +index 980aaf2a78d3f412767bc9138a668d52bd5e874d..6be967a235249175b18d5828f6d3634b9a4f0ed1 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java @@ -242,6 +242,12 @@ public class PurpurConfig { diff --git a/patches/server/0090-Stop-squids-floating-on-top-of-water.patch b/patches/server/0086-Stop-squids-floating-on-top-of-water.patch similarity index 90% rename from patches/server/0090-Stop-squids-floating-on-top-of-water.patch rename to patches/server/0086-Stop-squids-floating-on-top-of-water.patch index 02ec2eb3a..3665107bb 100644 --- a/patches/server/0090-Stop-squids-floating-on-top-of-water.patch +++ b/patches/server/0086-Stop-squids-floating-on-top-of-water.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Stop squids floating on top of water diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 00c4afae78f8c11a99dc740cf1f30e869b1c160c..3f9aee2be78358cbeaf5767117d952e7f4ed2a72 100644 +index efb8a0706b40293a1a5f52afce4e9029d8ad73c9..2e7e66051099eaeb4caebe81f8feedfa0f524edd 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -4092,6 +4092,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -4102,6 +4102,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { this.yRotO = this.getYRot(); } @@ -19,7 +19,7 @@ index 00c4afae78f8c11a99dc740cf1f30e869b1c160c..3f9aee2be78358cbeaf5767117d952e7 + // Purpur end + public boolean updateFluidHeightAndDoFluidPushing(TagKey tag, double speed) { - if (false && this.touchingUnloadedChunk()) { // Pufferfish - cost of a lookup here is the same cost as below, so skip + if (this.touchingUnloadedChunk()) { return false; diff --git a/src/main/java/net/minecraft/world/entity/animal/Squid.java b/src/main/java/net/minecraft/world/entity/animal/Squid.java index 99248a9e2769a573839b199150da312d33344f95..709aaa9dc834d91219ce1087d8f89ef5bf3d915c 100644 @@ -54,7 +54,7 @@ index 68cc6f2a78a06293a29317fda72ab3ee79b3533a..cfb2e46b34b2982d6724f18214557fc8 + // Purpur } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 888406adb2f020abbeddf5678a10b955daff2892..b952206a8d846de12458a80a0e969e0dcc649779 100644 +index 6548864871e91f7aed24ef4ca7b67699d79e8654..69c54739d8dd3b7810bbee210f5f80dca555c653 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -1447,6 +1447,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0091-Crying-obsidian-valid-for-portal-frames.patch b/patches/server/0087-Crying-obsidian-valid-for-portal-frames.patch similarity index 89% rename from patches/server/0091-Crying-obsidian-valid-for-portal-frames.patch rename to patches/server/0087-Crying-obsidian-valid-for-portal-frames.patch index 3e0470918..8b0f709ba 100644 --- a/patches/server/0091-Crying-obsidian-valid-for-portal-frames.patch +++ b/patches/server/0087-Crying-obsidian-valid-for-portal-frames.patch @@ -5,18 +5,18 @@ Subject: [PATCH] Crying obsidian valid for portal frames diff --git a/src/main/java/net/minecraft/world/level/portal/PortalShape.java b/src/main/java/net/minecraft/world/level/portal/PortalShape.java -index 3414f3190e1a760c602613e82e551e797c3aa575..5368376c126f3b629c0448f937c140abb402ef43 100644 +index c461e0d04047db9c0c5ecc04063cebd38bf96ec2..e7554ec800f321e4e34c926c53f2375a8c3aa979 100644 --- a/src/main/java/net/minecraft/world/level/portal/PortalShape.java +++ b/src/main/java/net/minecraft/world/level/portal/PortalShape.java -@@ -30,7 +30,7 @@ public class PortalShape { +@@ -34,7 +34,7 @@ public class PortalShape { private static final int MIN_HEIGHT = 3; public static final int MAX_HEIGHT = 21; private static final BlockBehaviour.StatePredicate FRAME = (iblockdata, iblockaccess, blockposition) -> { - return iblockdata.is(Blocks.OBSIDIAN); + return iblockdata.is(Blocks.OBSIDIAN) || (org.purpurmc.purpur.PurpurConfig.cryingObsidianValidForPortalFrame && iblockdata.is(Blocks.CRYING_OBSIDIAN)); // Purpur }; - private final LevelAccessor level; - private final Direction.Axis axis; + private static final float SAFE_TRAVEL_MAX_ENTITY_XY = 4.0F; + private static final double SAFE_TRAVEL_MAX_VERTICAL_DELTA = 1.0D; diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java index 3b10d9b4e7d3034ca43e6e05b3bccccfe0162a4b..bc7acc8399f99a7167a03b76cc69f3c9fef1d470 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java diff --git a/patches/server/0092-Entities-can-use-portals-configuration.patch b/patches/server/0088-Entities-can-use-portals-configuration.patch similarity index 89% rename from patches/server/0092-Entities-can-use-portals-configuration.patch rename to patches/server/0088-Entities-can-use-portals-configuration.patch index c85811953..cc8de8c38 100644 --- a/patches/server/0092-Entities-can-use-portals-configuration.patch +++ b/patches/server/0088-Entities-can-use-portals-configuration.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Entities can use portals configuration diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index a2a7fa5508c9975449174365299fc6884f51b936..2f78b7c1b2bad8937ac0cdccd5be8faaf1057cbc 100644 +index 2e7e66051099eaeb4caebe81f8feedfa0f524edd..80dbcf052bf221dfb052976e71f1ec25a1087e46 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -2893,7 +2893,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -2878,7 +2878,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { public void handleInsidePortal(BlockPos pos) { if (this.isOnPortalCooldown()) { this.setPortalCooldown(); @@ -17,7 +17,7 @@ index a2a7fa5508c9975449174365299fc6884f51b936..2f78b7c1b2bad8937ac0cdccd5be8faa if (!this.level.isClientSide && !pos.equals(this.portalEntrancePos)) { this.portalEntrancePos = pos.immutable(); } -@@ -3569,7 +3569,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -3561,7 +3561,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { } public boolean canChangeDimensions() { @@ -27,7 +27,7 @@ index a2a7fa5508c9975449174365299fc6884f51b936..2f78b7c1b2bad8937ac0cdccd5be8faa public float getBlockExplosionResistance(Explosion explosion, BlockGetter world, BlockPos pos, BlockState blockState, FluidState fluidState, float max) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 022d8c904ce5df6c0b1906c99770aa17344bd351..3f3dc194f2b11a4fddab9b178db248e8154f693d 100644 +index b803684a01d092875188ea4de96a1af47b1632da..e6a3f6999c8fbc19a9e748b805298658477ebf03 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -101,6 +101,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0093-LivingEntity-broadcastItemBreak.patch b/patches/server/0089-LivingEntity-broadcastItemBreak.patch similarity index 100% rename from patches/server/0093-LivingEntity-broadcastItemBreak.patch rename to patches/server/0089-LivingEntity-broadcastItemBreak.patch diff --git a/patches/server/0094-Customizable-wither-health-and-healing.patch b/patches/server/0090-Customizable-wither-health-and-healing.patch similarity index 86% rename from patches/server/0094-Customizable-wither-health-and-healing.patch rename to patches/server/0090-Customizable-wither-health-and-healing.patch index 51c33d3f5..b11af9c36 100644 --- a/patches/server/0094-Customizable-wither-health-and-healing.patch +++ b/patches/server/0090-Customizable-wither-health-and-healing.patch @@ -6,10 +6,10 @@ Subject: [PATCH] Customizable wither health and healing Adds the ability to customize the health of the wither, as well as the amount that it heals, and how often. diff --git a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java -index 46593c26a7a167f22a728c8a87ebcb26ef7b4612..abf4490d8366ec6587178688228375093563b9b5 100644 +index 8e2711325ee32dda903f191ec4f338173370e738..991525cb5f0265678d61759ff55c1479ce3a92de 100644 --- a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java +++ b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java -@@ -530,8 +530,10 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob +@@ -528,8 +528,10 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob } } @@ -23,10 +23,10 @@ index 46593c26a7a167f22a728c8a87ebcb26ef7b4612..abf4490d8366ec658717868822837509 this.bossEvent.setProgress(this.getHealth() / this.getMaxHealth()); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index d446566cf5d6fc7b4767273e52d5e1d44ba323c2..f8b26b3dad49559f80b4bf9cd9b8952be6c3fd34 100644 +index acdb6408fe44e452c1c58ad8954c3330abfd532f..be451ee8dc88b60556fd441cd914a4952437742c 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1690,6 +1690,8 @@ public class PurpurWorldConfig { +@@ -1686,6 +1686,8 @@ public class PurpurWorldConfig { public boolean witherControllable = true; public double witherMaxY = 320D; public double witherMaxHealth = 300.0D; @@ -35,7 +35,7 @@ index d446566cf5d6fc7b4767273e52d5e1d44ba323c2..f8b26b3dad49559f80b4bf9cd9b8952b private void witherSettings() { witherRidable = getBoolean("mobs.wither.ridable", witherRidable); witherRidableInWater = getBoolean("mobs.wither.ridable-in-water", witherRidableInWater); -@@ -1705,6 +1707,8 @@ public class PurpurWorldConfig { +@@ -1701,6 +1703,8 @@ public class PurpurWorldConfig { set("mobs.wither.attributes.max_health", oldValue); } witherMaxHealth = getDouble("mobs.wither.attributes.max_health", witherMaxHealth); diff --git a/patches/server/0095-Allow-toggling-special-MobSpawners-per-world.patch b/patches/server/0091-Allow-toggling-special-MobSpawners-per-world.patch similarity index 86% rename from patches/server/0095-Allow-toggling-special-MobSpawners-per-world.patch rename to patches/server/0091-Allow-toggling-special-MobSpawners-per-world.patch index 8b19a8a30..61b1bb069 100644 --- a/patches/server/0095-Allow-toggling-special-MobSpawners-per-world.patch +++ b/patches/server/0091-Allow-toggling-special-MobSpawners-per-world.patch @@ -6,10 +6,10 @@ Subject: [PATCH] Allow toggling special MobSpawners per world In vanilla, these are all hardcoded on for world type 0 (overworld) and hardcoded off for every other world type. Default config behaviour matches this. diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index 125faced389b5f467d96dab4e2ac4ffe85c82f50..b188865b4aa2f33569768359482e2a5fbe11aa28 100644 +index 989c42ac9867add34b151cb4586ba90e12c75dd5..01b777628476b1d116423f013e60963f089253ef 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java -@@ -543,7 +543,24 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -545,7 +545,24 @@ public class ServerLevel extends Level implements WorldGenLevel { this.dragonParts = new Int2ObjectOpenHashMap(); this.tickTime = flag1; this.server = minecraftserver; @@ -36,18 +36,10 @@ index 125faced389b5f467d96dab4e2ac4ffe85c82f50..b188865b4aa2f33569768359482e2a5f ChunkGenerator chunkgenerator = worlddimension.generator(); // CraftBukkit start diff --git a/src/main/java/net/minecraft/world/entity/npc/WanderingTraderSpawner.java b/src/main/java/net/minecraft/world/entity/npc/WanderingTraderSpawner.java -index daa7c4bd8a3f6c28f02b7117b061f0def29e3743..d4699d7eefafffd2d4e0a03d62d5094f001bbcae 100644 +index 0ae8e9134a3671cdf2a480cd4dd6598653e261ab..7d34bd0d727eeb0afbc1869b076ee2078a67e4d0 100644 --- a/src/main/java/net/minecraft/world/entity/npc/WanderingTraderSpawner.java +++ b/src/main/java/net/minecraft/world/entity/npc/WanderingTraderSpawner.java -@@ -4,6 +4,7 @@ import java.util.Iterator; - import java.util.Optional; - import javax.annotation.Nullable; - import net.minecraft.core.BlockPos; -+import net.minecraft.core.Direction; - import net.minecraft.nbt.CompoundTag; - import net.minecraft.network.chat.Component; - import net.minecraft.server.level.ServerLevel; -@@ -162,7 +163,17 @@ public class WanderingTraderSpawner implements CustomSpawner { +@@ -159,7 +159,17 @@ public class WanderingTraderSpawner implements CustomSpawner { int k = pos.getX() + this.random.nextInt(range * 2) - range; int l = pos.getZ() + this.random.nextInt(range * 2) - range; int i1 = world.getHeight(Heightmap.Types.WORLD_SURFACE, k, l); @@ -56,10 +48,10 @@ index daa7c4bd8a3f6c28f02b7117b061f0def29e3743..d4699d7eefafffd2d4e0a03d62d5094f + BlockPos.MutableBlockPos blockposition2 = new BlockPos.MutableBlockPos(k, i1, l); + if (world.dimensionType().hasCeiling()) { + do { -+ blockposition2.relative(Direction.DOWN); ++ blockposition2.relative(net.minecraft.core.Direction.DOWN); + } while (!world.getBlockState(blockposition2).isAir()); + do { -+ blockposition2.relative(Direction.DOWN); ++ blockposition2.relative(net.minecraft.core.Direction.DOWN); + } while (world.getBlockState(blockposition2).isAir() && blockposition2.getY() > 0); + } + // Purpur end @@ -67,7 +59,7 @@ index daa7c4bd8a3f6c28f02b7117b061f0def29e3743..d4699d7eefafffd2d4e0a03d62d5094f if (NaturalSpawner.isSpawnPositionOk(SpawnPlacements.Type.ON_GROUND, world, blockposition2, EntityType.WANDERING_TRADER)) { blockposition1 = blockposition2; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index f8b26b3dad49559f80b4bf9cd9b8952be6c3fd34..bf187a6544fbbd967baec25f9f78c673b39e35f2 100644 +index 54c59de4dc39fb77b791e450f5d593c3ae063948..748e042ed0d8ee482cafac656553b288294f7440 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -72,6 +72,12 @@ public class PurpurWorldConfig { diff --git a/patches/server/0096-Raid-cooldown-setting.patch b/patches/server/0092-Raid-cooldown-setting.patch similarity index 97% rename from patches/server/0096-Raid-cooldown-setting.patch rename to patches/server/0092-Raid-cooldown-setting.patch index 031a02aac..b8e02c0f9 100644 --- a/patches/server/0096-Raid-cooldown-setting.patch +++ b/patches/server/0092-Raid-cooldown-setting.patch @@ -49,7 +49,7 @@ index feb89eb69994bdd1d2f95d2b9992e69251b2bee7..0670775c2de33e69c75644e5d2ff19db if (!this.raidMap.containsKey(raid.getId())) { this.raidMap.put(raid.getId(), raid); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 04604557a57a09127e88a2119aa9a63c764de94a..3c8cb7c2e43a98e6bd1d65c119ae2e28d22e85d4 100644 +index 748e042ed0d8ee482cafac656553b288294f7440..4c3900256f1aedc1052a752c10541ea87364cbe7 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -112,6 +112,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0097-Despawn-rate-config-options-per-projectile-type.patch b/patches/server/0093-Despawn-rate-config-options-per-projectile-type.patch similarity index 63% rename from patches/server/0097-Despawn-rate-config-options-per-projectile-type.patch rename to patches/server/0093-Despawn-rate-config-options-per-projectile-type.patch index 899a851af..b11d7a835 100644 --- a/patches/server/0097-Despawn-rate-config-options-per-projectile-type.patch +++ b/patches/server/0093-Despawn-rate-config-options-per-projectile-type.patch @@ -6,35 +6,8 @@ Subject: [PATCH] Despawn rate config options per projectile type This patch's implementation has been removed in favor of Pufferfish's entity-timeouts. The config remains for migration purposes. -diff --git a/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java b/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java -index 5426e57ed67b0d144818a7e3b917c90d45f548ce..44ee788422cdf946be5f156e2a4662b0b030cdc9 100644 ---- a/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java -+++ b/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java -@@ -113,6 +113,22 @@ public class PufferfishConfig { - config.setComment(key, String.join("\n", comment), CommentType.BLOCK); - } - } -+ -+ // Purpur start -+ public static int getRawInt(String key, int def) { -+ return config.getInt(key, def); -+ } -+ public static void setInt(String key, int value) { -+ config.set(key, value); -+ } -+ public static void save() { -+ try { -+ config.save(new File("pufferfish.yml")); -+ } catch (IOException e) { -+ e.printStackTrace(); -+ } -+ } -+ // Purpur end - - private static boolean getBoolean(String key, boolean defaultValue, String... comment) { - return getBoolean(key, null, defaultValue, comment); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 3c8cb7c2e43a98e6bd1d65c119ae2e28d22e85d4..6f4f71c9a27fa1c0ab354b9b410fba744787a51a 100644 +index a626c9c7db0a04fed1567b17d65819e70b79de19..e1b2b885a4bafffbcd79ce6fcc58bab5e5c36b27 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -293,6 +293,39 @@ public class PurpurWorldConfig { @@ -57,7 +30,7 @@ index 3c8cb7c2e43a98e6bd1d65c119ae2e28d22e85d4..6f4f71c9a27fa1c0ab354b9b410fba74 + migrateProjectileDespawnRateSettings(EntityType.SMALL_FIREBALL); + migrateProjectileDespawnRateSettings(EntityType.SNOWBALL); + migrateProjectileDespawnRateSettings(EntityType.WITHER_SKULL); -+ PufferfishConfig.save(); ++ //PufferfishConfig.save(); + set("gameplay-mechanics.projectile-despawn-rates", null); + // pufferfish's entity_timeout is a global config + // we only want to migrate values from the @@ -66,12 +39,12 @@ index 3c8cb7c2e43a98e6bd1d65c119ae2e28d22e85d4..6f4f71c9a27fa1c0ab354b9b410fba74 + } + } + private void migrateProjectileDespawnRateSettings(EntityType type) { -+ String pufferName = "entity_timeouts." + type.id.toUpperCase(Locale.ROOT); -+ int value = getInt("gameplay-mechanics.projectile-despawn-rates." + type.id, -1); -+ if (value != -1 && PufferfishConfig.getRawInt(pufferName, -1) == -1) { -+ PufferfishConfig.setInt(pufferName, value); -+ type.ttl = value; -+ } ++ //String pufferName = "entity_timeouts." + type.id.toUpperCase(Locale.ROOT); ++ //int value = getInt("gameplay-mechanics.projectile-despawn-rates." + type.id, -1); ++ //if (value != -1 && PufferfishConfig.getRawInt(pufferName, -1) == -1) { ++ // PufferfishConfig.setInt(pufferName, value); ++ // type.ttl = value; ++ //} + } + public boolean silkTouchEnabled = false; diff --git a/patches/server/0098-Add-option-to-disable-zombie-aggressiveness-towards-.patch b/patches/server/0094-Add-option-to-disable-zombie-aggressiveness-towards-.patch similarity index 92% rename from patches/server/0098-Add-option-to-disable-zombie-aggressiveness-towards-.patch rename to patches/server/0094-Add-option-to-disable-zombie-aggressiveness-towards-.patch index faa77bd7d..fc9f76d29 100644 --- a/patches/server/0098-Add-option-to-disable-zombie-aggressiveness-towards-.patch +++ b/patches/server/0094-Add-option-to-disable-zombie-aggressiveness-towards-.patch @@ -6,10 +6,10 @@ Subject: [PATCH] Add option to disable zombie aggressiveness towards villagers diff --git a/src/main/java/com/destroystokyo/paper/entity/ai/MobGoalHelper.java b/src/main/java/com/destroystokyo/paper/entity/ai/MobGoalHelper.java -index 8f47d471c29d89bae5ae06a0d495d8c694117b72..9eb4d1a3d8f1d7d1137508086d5e3be3aec31f15 100644 +index ed74f2b90afaa43ae66fbd4797d23cfac9ea9e88..9b4ebe6a9311aa57609b00b6d40722b1fb39aec5 100644 --- a/src/main/java/com/destroystokyo/paper/entity/ai/MobGoalHelper.java +++ b/src/main/java/com/destroystokyo/paper/entity/ai/MobGoalHelper.java -@@ -135,6 +135,10 @@ public class MobGoalHelper { +@@ -136,6 +136,10 @@ public class MobGoalHelper { static { // TODO these kinda should be checked on each release, in case obfuscation changes deobfuscationMap.put("abstract_skeleton_1", "abstract_skeleton_melee"); @@ -46,10 +46,10 @@ index 968392e9dd124f997d5d5996893363ac7ef2c740..1d57ee963416e784a759f2ecee7b7c38 this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, Axolotl.class, true, false)); this.targetSelector.addGoal(5, new NearestAttackableTargetGoal<>(this, Turtle.class, 10, true, false, Turtle.BABY_ON_LAND_SELECTOR)); diff --git a/src/main/java/net/minecraft/world/entity/monster/Zombie.java b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -index b9b4b81babbac27ad879197f027fba11aebd4c3c..e9482ebe59cba4cea06392fe97b74e4fb70eceda 100644 +index 05cb9eff1ce0d5af9efcd47033878feb22397a2d..35e1e8264d9f1e30b37ad598adab478b4c99ada3 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zombie.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -@@ -155,7 +155,19 @@ public class Zombie extends Monster { +@@ -156,7 +156,19 @@ public class Zombie extends Monster { this.goalSelector.addGoal(7, new WaterAvoidingRandomStrollGoal(this, 1.0D)); this.targetSelector.addGoal(1, (new HurtByTargetGoal(this, new Class[0])).setAlertOthers(ZombifiedPiglin.class)); this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); @@ -71,10 +71,10 @@ index b9b4b81babbac27ad879197f027fba11aebd4c3c..e9482ebe59cba4cea06392fe97b74e4f this.targetSelector.addGoal(5, new NearestAttackableTargetGoal<>(this, Turtle.class, 10, true, false, Turtle.BABY_ON_LAND_SELECTOR)); } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 5158e2c5469e649133eeb4ac61a3aa55fd40bf77..00f1d1c208ca36c7548e36b1654167f24609c880 100644 +index 231b76d2c3025e75b881f62796504954b0bb524d..75a3a8361726c12a6de63f4ecb3389c413704db0 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1823,6 +1823,7 @@ public class PurpurWorldConfig { +@@ -1819,6 +1819,7 @@ public class PurpurWorldConfig { public boolean zombieJockeyOnlyBaby = true; public double zombieJockeyChance = 0.05D; public boolean zombieJockeyTryExistingChickens = true; @@ -82,7 +82,7 @@ index 5158e2c5469e649133eeb4ac61a3aa55fd40bf77..00f1d1c208ca36c7548e36b1654167f2 private void zombieSettings() { zombieRidable = getBoolean("mobs.zombie.ridable", zombieRidable); zombieRidableInWater = getBoolean("mobs.zombie.ridable-in-water", zombieRidableInWater); -@@ -1837,6 +1838,7 @@ public class PurpurWorldConfig { +@@ -1833,6 +1834,7 @@ public class PurpurWorldConfig { zombieJockeyOnlyBaby = getBoolean("mobs.zombie.jockey.only-babies", zombieJockeyOnlyBaby); zombieJockeyChance = getDouble("mobs.zombie.jockey.chance", zombieJockeyChance); zombieJockeyTryExistingChickens = getBoolean("mobs.zombie.jockey.try-existing-chickens", zombieJockeyTryExistingChickens); diff --git a/patches/server/0099-Add-predicate-to-recipe-s-ExactChoice-ingredient.patch b/patches/server/0095-Add-predicate-to-recipe-s-ExactChoice-ingredient.patch similarity index 67% rename from patches/server/0099-Add-predicate-to-recipe-s-ExactChoice-ingredient.patch rename to patches/server/0095-Add-predicate-to-recipe-s-ExactChoice-ingredient.patch index af653bf78..406cc29da 100644 --- a/patches/server/0099-Add-predicate-to-recipe-s-ExactChoice-ingredient.patch +++ b/patches/server/0095-Add-predicate-to-recipe-s-ExactChoice-ingredient.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add predicate to recipe's ExactChoice ingredient diff --git a/src/main/java/net/minecraft/world/item/crafting/Ingredient.java b/src/main/java/net/minecraft/world/item/crafting/Ingredient.java -index 895c0f1600139e340aa22a7c398978add56fa706..4f7e02c8a99ec9012a09baac52717df7504a5049 100644 +index 8d4aca59bd7518179520f4d4fb7137778e232d90..dbc3040bc087a6016a491caf76019663c1cd1b4c 100644 --- a/src/main/java/net/minecraft/world/item/crafting/Ingredient.java +++ b/src/main/java/net/minecraft/world/item/crafting/Ingredient.java -@@ -38,6 +38,7 @@ public final class Ingredient implements Predicate { +@@ -39,6 +39,7 @@ public final class Ingredient implements Predicate { @Nullable private IntList stackingIds; public boolean exact; // CraftBukkit @@ -16,24 +16,24 @@ index 895c0f1600139e340aa22a7c398978add56fa706..4f7e02c8a99ec9012a09baac52717df7 public Ingredient(Stream entries) { this.values = (Ingredient.Value[]) entries.toArray((i) -> { -@@ -69,6 +70,12 @@ public final class Ingredient implements Predicate { - if (this.itemStacks.length == 0) { - return itemstack.isEmpty(); - } else { -+ // Purpur start -+ if (predicate != null) { -+ return predicate.test(itemstack.asBukkitCopy()); -+ } -+ // Purpur end +@@ -64,6 +65,12 @@ public final class Ingredient implements Predicate { + } else if (this.isEmpty()) { + return itemstack.isEmpty(); + } else { ++ // Purpur start ++ if (predicate != null) { ++ return predicate.test(itemstack.asBukkitCopy()); ++ } ++ // Purpur end + - ItemStack[] aitemstack = this.itemStacks; - int i = aitemstack.length; + ItemStack[] aitemstack = this.getItems(); + int i = aitemstack.length; diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftRecipe.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftRecipe.java -index 71486c08db28caf89f2366e082f6f6fab5609b71..eb893920e2520f6be1d13d9235cb0d326e4b05f8 100644 +index 8563fcf77eef0e1e354857b9a4256d78a523a8d0..b94c964790433cb7bd88ad16c5d82d1a8e39312d 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftRecipe.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftRecipe.java -@@ -27,6 +27,7 @@ public interface CraftRecipe extends Recipe { +@@ -29,6 +29,7 @@ public interface CraftRecipe extends Recipe { } else if (bukkit instanceof RecipeChoice.ExactChoice) { stack = new Ingredient(((RecipeChoice.ExactChoice) bukkit).getChoices().stream().map((mat) -> new net.minecraft.world.item.crafting.Ingredient.ItemValue(CraftItemStack.asNMSCopy(mat)))); stack.exact = true; diff --git a/patches/server/0100-Flying-squids-Oh-my.patch b/patches/server/0096-Flying-squids-Oh-my.patch similarity index 97% rename from patches/server/0100-Flying-squids-Oh-my.patch rename to patches/server/0096-Flying-squids-Oh-my.patch index 8fb58db3f..0c45e0830 100644 --- a/patches/server/0100-Flying-squids-Oh-my.patch +++ b/patches/server/0096-Flying-squids-Oh-my.patch @@ -58,7 +58,7 @@ index 709aaa9dc834d91219ce1087d8f89ef5bf3d915c..4850960c7c4f38c7d81b8945f8c87504 float f1 = Mth.cos(f) * 0.2F; float f2 = -0.1F + this.squid.getRandom().nextFloat() * 0.2F; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 00f1d1c208ca36c7548e36b1654167f24609c880..8ba2e5b8dad303d78123470dbd456f34a58ece96 100644 +index 75a3a8361726c12a6de63f4ecb3389c413704db0..761433576c8a5c810a23a10db11f49ae31965fb5 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -882,10 +882,12 @@ public class PurpurWorldConfig { diff --git a/patches/server/0101-Infinity-bow-settings.patch b/patches/server/0097-Infinity-bow-settings.patch similarity index 97% rename from patches/server/0101-Infinity-bow-settings.patch rename to patches/server/0097-Infinity-bow-settings.patch index 6d517f19d..c3d31b638 100644 --- a/patches/server/0101-Infinity-bow-settings.patch +++ b/patches/server/0097-Infinity-bow-settings.patch @@ -27,7 +27,7 @@ index 08d597db1a5345a343777a01427655e6bf2c926b..33df0ca406dc8321b76b393f317bbd1c } else { user.startUsingItem(hand); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 7b2a16c2d474b3931ff629ba58f6987f69fadfec..9a160cfffeb3049f256f56e9df8aab42ebe9ec2f 100644 +index 080c8a6c698d7cc5b800327a442dbde8a029d5f9..b574a6b8d9316c59b864910197d59b8e2065cda2 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -143,6 +143,17 @@ public class PurpurWorldConfig { diff --git a/patches/server/0102-Configurable-daylight-cycle.patch b/patches/server/0098-Configurable-daylight-cycle.patch similarity index 90% rename from patches/server/0102-Configurable-daylight-cycle.patch rename to patches/server/0098-Configurable-daylight-cycle.patch index 275d753af..a08995a3b 100644 --- a/patches/server/0102-Configurable-daylight-cycle.patch +++ b/patches/server/0098-Configurable-daylight-cycle.patch @@ -18,10 +18,10 @@ index 689ad22925b2561f7c8db961743eb1f821dbb25f..fa3c960992cc240161817e54659d83fe public ClientboundSetTimePacket(long time, long timeOfDay, boolean doDaylightCycle) { this.gameTime = time % 192000; // Paper - fix guardian beam diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index a90befe6b38d6789e200535f688804d85dad13e7..a1f830b27137f660fd2f0d95eb4b6692ecb56943 100644 +index 20e241d4cb82b7b415971cb485885d0d2fd45f7c..fd5f4ed9ad706ab907595e2ddbe5a949d941b4a6 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1511,7 +1511,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop recipe, NonNullList slots, int count) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 0a8f9082470b3b70fb21ea620d6dce23120cb65b..624f7ed6054091c89644f3c8bc7cbf23075a52c4 100644 +index df653093c4d00f45f1536c9c9cb2293ad69f9e2e..0acc57bf9ca2a2cfef8a662c8893ca1bc34b9e9a 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -411,6 +411,17 @@ public class PurpurWorldConfig { diff --git a/patches/server/0105-Arrows-should-not-reset-despawn-counter.patch b/patches/server/0101-Arrows-should-not-reset-despawn-counter.patch similarity index 88% rename from patches/server/0105-Arrows-should-not-reset-despawn-counter.patch rename to patches/server/0101-Arrows-should-not-reset-despawn-counter.patch index 4c68ae343..c4ecadaf9 100644 --- a/patches/server/0105-Arrows-should-not-reset-despawn-counter.patch +++ b/patches/server/0101-Arrows-should-not-reset-despawn-counter.patch @@ -7,10 +7,10 @@ This prevents keeping arrows alive indefinitely (such as when the block the arrow is stuck in gets removed, like a piston head going up/down) diff --git a/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java b/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java -index def3b3f8dac4b28eaaafdd9bc2e7f4b9ec9d6855..98cfacc950b088a98f592fdf6e00d8a057628ed5 100644 +index e7ef36dac559d03d127cf45373a7e0dc935b80a8..39fa3fa6d49eb9451f876f7b46bd16555e71da05 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java +++ b/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java -@@ -322,7 +322,7 @@ public abstract class AbstractArrow extends Projectile { +@@ -323,7 +323,7 @@ public abstract class AbstractArrow extends Projectile { Vec3 vec3d = this.getDeltaMovement(); this.setDeltaMovement(vec3d.multiply((double) (this.random.nextFloat() * 0.2F), (double) (this.random.nextFloat() * 0.2F), (double) (this.random.nextFloat() * 0.2F))); @@ -20,7 +20,7 @@ index def3b3f8dac4b28eaaafdd9bc2e7f4b9ec9d6855..98cfacc950b088a98f592fdf6e00d8a0 @Override diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 624f7ed6054091c89644f3c8bc7cbf23075a52c4..4c1e434f92a2754eb2bfc8ef11aa5ee7ff142762 100644 +index 0acc57bf9ca2a2cfef8a662c8893ca1bc34b9e9a..72a409ca200864040eb317fef3090e5719c076f6 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -104,6 +104,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0106-Ability-to-re-add-farmland-mechanics-from-Alpha.patch b/patches/server/0102-Ability-to-re-add-farmland-mechanics-from-Alpha.patch similarity index 95% rename from patches/server/0106-Ability-to-re-add-farmland-mechanics-from-Alpha.patch rename to patches/server/0102-Ability-to-re-add-farmland-mechanics-from-Alpha.patch index 7710244fa..c37bef3e4 100644 --- a/patches/server/0106-Ability-to-re-add-farmland-mechanics-from-Alpha.patch +++ b/patches/server/0102-Ability-to-re-add-farmland-mechanics-from-Alpha.patch @@ -24,7 +24,7 @@ index 4208833252a5b5c74d294dc3435869d71d774e37..a3ff99c461dd862733816d9d1204cf8b return; } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 4c1e434f92a2754eb2bfc8ef11aa5ee7ff142762..e0e32c8f7b5ee4a33c9246bb4b521131b89db875 100644 +index 72a409ca200864040eb317fef3090e5719c076f6..df0d0cdf8a1d8e8119a35445a0364289dce0ab03 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -412,8 +412,10 @@ public class PurpurWorldConfig { diff --git a/patches/server/0107-Add-adjustable-breeding-cooldown-to-config.patch b/patches/server/0103-Add-adjustable-breeding-cooldown-to-config.patch similarity index 94% rename from patches/server/0107-Add-adjustable-breeding-cooldown-to-config.patch rename to patches/server/0103-Add-adjustable-breeding-cooldown-to-config.patch index a241376f7..121288d8b 100644 --- a/patches/server/0107-Add-adjustable-breeding-cooldown-to-config.patch +++ b/patches/server/0103-Add-adjustable-breeding-cooldown-to-config.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add adjustable breeding cooldown to config diff --git a/src/main/java/net/minecraft/world/entity/animal/Animal.java b/src/main/java/net/minecraft/world/entity/animal/Animal.java -index 6216513805add7c8f52e1ed6c77e2d26786b3ab5..34e82b97c5b294f0a6423581220403a10264da8b 100644 +index 3c4d142e982c34a23bdb5da1f51c8dcacc0532c1..f185215b826c4b50a819c8454089cb8ccdb0ed3a 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Animal.java +++ b/src/main/java/net/minecraft/world/entity/animal/Animal.java @@ -150,7 +150,7 @@ public abstract class Animal extends AgeableMob { @@ -33,10 +33,10 @@ index 6216513805add7c8f52e1ed6c77e2d26786b3ab5..34e82b97c5b294f0a6423581220403a1 entityageable.setBaby(true); entityageable.moveTo(this.getX(), this.getY(), this.getZ(), 0.0F, 0.0F); diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index 6245eaff134cc6b8ad2c13a6a2a7f74a6c4d4085..09ae98db728bade8121587e9ded6f3ab98f3bb30 100644 +index 6bf58b1d80dc4309d59e846baba152791b5a483b..730a6e8bac4436a62c4ef5a122f55fc92432ae6a 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java -@@ -193,6 +193,49 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -192,6 +192,49 @@ public abstract class Level implements LevelAccessor, AutoCloseable { } // Paper end - fix and optimise world upgrading @@ -86,7 +86,7 @@ index 6245eaff134cc6b8ad2c13a6a2a7f74a6c4d4085..09ae98db728bade8121587e9ded6f3ab public CraftWorld getWorld() { return this.world; } -@@ -288,6 +331,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -276,6 +319,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { this.spigotConfig = new org.spigotmc.SpigotWorldConfig(((net.minecraft.world.level.storage.PrimaryLevelData) worlddatamutable).getLevelName()); // Spigot this.paperConfig = paperWorldConfigCreator.apply(this.spigotConfig); // Paper this.purpurConfig = new org.purpurmc.purpur.PurpurWorldConfig(((net.minecraft.world.level.storage.PrimaryLevelData) worlddatamutable).getLevelName(), env); // Purpur @@ -95,7 +95,7 @@ index 6245eaff134cc6b8ad2c13a6a2a7f74a6c4d4085..09ae98db728bade8121587e9ded6f3ab this.world = new CraftWorld((ServerLevel) this, gen, biomeProvider, env); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index e0e32c8f7b5ee4a33c9246bb4b521131b89db875..d351b955427c00c4fea4157ac2d0eec3c4688b70 100644 +index df0d0cdf8a1d8e8119a35445a0364289dce0ab03..1bddf06904d7cf82edec42ec73636a35a707a98b 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -118,6 +118,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0108-Make-entity-breeding-times-configurable.patch b/patches/server/0104-Make-entity-breeding-times-configurable.patch similarity index 83% rename from patches/server/0108-Make-entity-breeding-times-configurable.patch rename to patches/server/0104-Make-entity-breeding-times-configurable.patch index ca92dc130..f2cc60537 100644 --- a/patches/server/0108-Make-entity-breeding-times-configurable.patch +++ b/patches/server/0104-Make-entity-breeding-times-configurable.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Make entity breeding times configurable diff --git a/src/main/java/net/minecraft/world/entity/ai/behavior/VillagerMakeLove.java b/src/main/java/net/minecraft/world/entity/ai/behavior/VillagerMakeLove.java -index b3adff55870c673d753f05dee4540bef0d142c7b..bf30980cf41db70e70a0ca4e51d32c331d8a56e7 100644 +index 0951c04533e7c39b969d041271684355770b53c2..02d4ba2ccdce99ca97614baa7c8e49213126af96 100644 --- a/src/main/java/net/minecraft/world/entity/ai/behavior/VillagerMakeLove.java +++ b/src/main/java/net/minecraft/world/entity/ai/behavior/VillagerMakeLove.java @@ -123,8 +123,10 @@ public class VillagerMakeLove extends Behavior { @@ -47,7 +47,7 @@ index f185215b826c4b50a819c8454089cb8ccdb0ed3a..2ac88f06ebb79e515cd9934ac1e3e2c8 other.resetLove(); world.addFreshEntityWithPassengers(entityageable, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING); // CraftBukkit - added SpawnReason diff --git a/src/main/java/net/minecraft/world/entity/animal/Bee.java b/src/main/java/net/minecraft/world/entity/animal/Bee.java -index 7f57a591172708d5cebbd88335ca60d8972bfb0e..8eef2c50ae38ab7ea0942d338d0918c8edbd42b0 100644 +index 3827d7910b4f615254e321b99e6d5fc795de74ef..afc336961b34e31e470644dbd6edf57fbffb1706 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Bee.java +++ b/src/main/java/net/minecraft/world/entity/animal/Bee.java @@ -219,6 +219,11 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { @@ -63,10 +63,10 @@ index 7f57a591172708d5cebbd88335ca60d8972bfb0e..8eef2c50ae38ab7ea0942d338d0918c8 @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/Cat.java b/src/main/java/net/minecraft/world/entity/animal/Cat.java -index 413205e8214b87f022dda5eeb1eeca3794dcd6ce..a731a834098fa78995c7b0445865d3f7fa8700fa 100644 +index 43fa6caafabaa09091b6770d88dff7927e75bac9..b9bee600eb2a8cbe8f87c1183fdadd0974ece90b 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cat.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cat.java -@@ -123,6 +123,11 @@ public class Cat extends TamableAnimal { +@@ -124,6 +124,11 @@ public class Cat extends TamableAnimal implements VariantHolder { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.catMaxHealth); } @@ -79,10 +79,10 @@ index 413205e8214b87f022dda5eeb1eeca3794dcd6ce..a731a834098fa78995c7b0445865d3f7 public ResourceLocation getResourceLocation() { diff --git a/src/main/java/net/minecraft/world/entity/animal/Chicken.java b/src/main/java/net/minecraft/world/entity/animal/Chicken.java -index 96dceb9943c4320e0edfba47cc211d60aa92323b..fe266b94d08b8977451f75ec87c19497ac0ab975 100644 +index 471647830f3ae90f8867282edd6fb20f8afa25a3..d8b825f75ddec59c552c1c43fcd9319f51aeab8e 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Chicken.java +++ b/src/main/java/net/minecraft/world/entity/animal/Chicken.java -@@ -76,6 +76,11 @@ public class Chicken extends Animal { +@@ -77,6 +77,11 @@ public class Chicken extends Animal { this.getAttribute(Attributes.ATTACK_DAMAGE).setBaseValue(2.0D); } } @@ -95,10 +95,10 @@ index 96dceb9943c4320e0edfba47cc211d60aa92323b..fe266b94d08b8977451f75ec87c19497 @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/Cow.java b/src/main/java/net/minecraft/world/entity/animal/Cow.java -index 00bb7f8f8bc3b1369aec7b139745cf3c47b9f0f6..4f69a641686c086245ecc0696a8fd3f75c6b50d1 100644 +index 8744649fbd3f11485d5862d6f1fb32ea27f11e77..c58076635cc94c8908a376fba8804206cda3ac00 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cow.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cow.java -@@ -62,6 +62,11 @@ public class Cow extends Animal { +@@ -63,6 +63,11 @@ public class Cow extends Animal { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.cowMaxHealth); } @@ -111,10 +111,10 @@ index 00bb7f8f8bc3b1369aec7b139745cf3c47b9f0f6..4f69a641686c086245ecc0696a8fd3f7 @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/Fox.java b/src/main/java/net/minecraft/world/entity/animal/Fox.java -index 64a564bf1a5133971050882835749807154c3a72..ae02191f9cd8969a938655e4fba1bbe260d1dd88 100644 +index 503721cce0a5207a44b016a4234c17a87edee287..014fed23d40a20de65fe94046a0e8a34e4717eb8 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Fox.java +++ b/src/main/java/net/minecraft/world/entity/animal/Fox.java -@@ -183,6 +183,11 @@ public class Fox extends Animal { +@@ -183,6 +183,11 @@ public class Fox extends Animal implements VariantHolder { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.foxMaxHealth); } @@ -126,7 +126,7 @@ index 64a564bf1a5133971050882835749807154c3a72..ae02191f9cd8969a938655e4fba1bbe2 // Purpur end @Override -@@ -975,8 +980,10 @@ public class Fox extends Animal { +@@ -980,8 +985,10 @@ public class Fox extends Animal implements VariantHolder { CriteriaTriggers.BRED_ANIMALS.trigger(entityplayer2, this.animal, this.partner, entityfox); } @@ -140,10 +140,10 @@ index 64a564bf1a5133971050882835749807154c3a72..ae02191f9cd8969a938655e4fba1bbe2 this.partner.resetLove(); worldserver.addFreshEntityWithPassengers(entityfox, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING); // CraftBukkit - added SpawnReason diff --git a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java -index bdfca8501edb9209463b70db2d134b488a08e143..74fa3278f39b2e55b7ee9b0c3088d02f44e71259 100644 +index 2f85004a9dac740a9ddadd18b47cf3be821e5add..2b6d1fa7aaffde048678e3f797fb0c6ffd781cff 100644 --- a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java +++ b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java -@@ -84,6 +84,11 @@ public class MushroomCow extends Cow implements Shearable { +@@ -83,6 +83,11 @@ public class MushroomCow extends Cow implements Shearable, VariantHolder { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.rabbitMaxHealth); } @@ -252,7 +252,7 @@ index 47dc84052f1fb0017ff2e608c3f6d8b92c960cc6..93d65e8e7b15060c9d7931d22aa2ff77 // CraftBukkit start - code from constructor diff --git a/src/main/java/net/minecraft/world/entity/animal/Sheep.java b/src/main/java/net/minecraft/world/entity/animal/Sheep.java -index 2368c807e9c7146c186654a390e23af99addb804..dfd8d795abbe3912658c9d847424424e83006408 100644 +index c64e86aeafad1785a28e7351f16afef749a0851d..86c5f88bbeab0a5cb565b15af257160a707c6372 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Sheep.java +++ b/src/main/java/net/minecraft/world/entity/animal/Sheep.java @@ -136,6 +136,11 @@ public class Sheep extends Animal implements Shearable { @@ -268,7 +268,7 @@ index 2368c807e9c7146c186654a390e23af99addb804..dfd8d795abbe3912658c9d847424424e @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/Turtle.java b/src/main/java/net/minecraft/world/entity/animal/Turtle.java -index 2aede66752b78036a6bd9eb7719f97766a030301..e3c20db7bd003bb63d5b1b296c7aa9d7302548c8 100644 +index 8c4e0e7fc3a0d2924b910b637748e6e1c23809ce..56e0f21a002a6112770cf0d9e06136caf3f89c80 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Turtle.java +++ b/src/main/java/net/minecraft/world/entity/animal/Turtle.java @@ -102,6 +102,11 @@ public class Turtle extends Animal { @@ -284,7 +284,7 @@ index 2aede66752b78036a6bd9eb7719f97766a030301..e3c20db7bd003bb63d5b1b296c7aa9d7 public void setHomePos(BlockPos pos) { diff --git a/src/main/java/net/minecraft/world/entity/animal/Wolf.java b/src/main/java/net/minecraft/world/entity/animal/Wolf.java -index 01c8508571a88c22359cbf36341338c5497e4d45..28e35304e76b26af734fcfbccef8f43143345576 100644 +index 5f37b335dded41fdd122e8e0677c2c45b7d4ebf1..d26a4175a08a7489f5bd17a07ed244a83884f024 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Wolf.java +++ b/src/main/java/net/minecraft/world/entity/animal/Wolf.java @@ -127,6 +127,11 @@ public class Wolf extends TamableAnimal implements NeutralMob { @@ -300,10 +300,10 @@ index 01c8508571a88c22359cbf36341338c5497e4d45..28e35304e76b26af734fcfbccef8f431 @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java b/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java -index ad6a87ba97138253db2b300dec8a89faff38f075..e68a40ec759925317a0db2087339cd29351dbeb4 100644 +index d058f212b226b1f5efa0ba3650381e6c32a6fdac..72c3dc27128137d23e0b0dba0ecf7cf5f24e889f 100644 --- a/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java +++ b/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java -@@ -122,6 +122,11 @@ public class Axolotl extends Animal implements LerpingModel, Bucketable { +@@ -123,6 +123,11 @@ public class Axolotl extends Animal implements LerpingModel, VariantHolder { public float getJumpPower() { return (getRider() != null && isControllable()) ? level.purpurConfig.frogRidableJumpHeight * this.getBlockJumpFactor() : super.getJumpPower(); } @@ -331,7 +349,7 @@ index 6a6613f70f9c4cc950882191b00048d4c47bd84f..e739416fa58b182d7bd311be094d6aab @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java b/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java -index 1528728bb66b63f3d4080fe10d3ba9abc309a63b..9b7fce44c097b26b995aa2a0bc93915e77be8b96 100644 +index ee548f48f850e65542d8b0270881ad7664d41272..1393e79320a53bff012f2dfa4e3fd2fb22955a0c 100644 --- a/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java +++ b/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java @@ -109,6 +109,11 @@ public class Goat extends Animal { @@ -347,7 +365,7 @@ index 1528728bb66b63f3d4080fe10d3ba9abc309a63b..9b7fce44c097b26b995aa2a0bc93915e @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Donkey.java b/src/main/java/net/minecraft/world/entity/animal/horse/Donkey.java -index 18550348439a8e5107a25623f0203b7475e95d34..782e9fae7cdd0b3bbf2e1fb408c18663771cc346 100644 +index 9e8af2437b06bd443db849dd3706b56871de2bf9..214b8c4df1b08aac9d454271f58ca3a794b7014e 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/Donkey.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/Donkey.java @@ -35,6 +35,11 @@ public class Donkey extends AbstractChestedHorse { @@ -363,10 +381,10 @@ index 18550348439a8e5107a25623f0203b7475e95d34..782e9fae7cdd0b3bbf2e1fb408c18663 @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Horse.java b/src/main/java/net/minecraft/world/entity/animal/horse/Horse.java -index 390f630462c907cd6e961c6ca432804e2f19f07c..6a7d8ff804b184005fda17f3d7a4b9750a7c2fe5 100644 +index a417678b3eb45f57c9d367dd685dc6ee9cda8990..5e817c3cd0e6dee9572c71544058a5ec60aac402 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/Horse.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/Horse.java -@@ -60,6 +60,11 @@ public class Horse extends AbstractHorse { +@@ -60,6 +60,11 @@ public class Horse extends AbstractHorse implements VariantHolder { public double generateRandomSpeed(RandomSource random) { return generateRandomSpeed(this.level.purpurConfig.horseMovementSpeedMin, this.level.purpurConfig.horseMovementSpeedMax); } @@ -379,10 +397,10 @@ index 390f630462c907cd6e961c6ca432804e2f19f07c..6a7d8ff804b184005fda17f3d7a4b975 @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java -index f9da2e58b8df88ad103f2549b27fbedee8520bb1..7f47cc2caa22f31eb956ec4b7da69a62fa4e5899 100644 +index 35fb0f92a94d141c98b3cd8927c76c35a921e04e..32f3ed0326cfaa80d92dbe75e92abc26945048be 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java -@@ -131,6 +131,11 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { +@@ -136,6 +136,11 @@ public class Llama extends AbstractChestedHorse implements VariantHolder type, LevelAccessor world, MobSpawnType spawnReason, BlockPos pos, RandomSource random) { diff --git a/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java b/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java -index e99ffbf30652e188e88f8e17ed41d39ff25c9f73..c335a32832c6eef95658fbf632b943bb10ac44b0 100644 +index 2d06a3ac4a5763cf948fc578ff5320c22c01c219..56dba90d0bb76b85cf21ace7ad50531fe3ae8381 100644 --- a/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java @@ -87,6 +87,11 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { @@ -491,7 +509,7 @@ index e99ffbf30652e188e88f8e17ed41d39ff25c9f73..c335a32832c6eef95658fbf632b943bb @Override diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index fe2209f5b5b58d5859cbb1b2008d9236b39c4e54..e9767317eebca72f8ff923fb9b04a95cc1997f52 100644 +index 4195261edfb9119cced1250443c7392238cd19c6..0ce0d80860071b5e77b08e02a58007fbadbbeb08 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -505,10 +505,12 @@ public class PurpurWorldConfig { @@ -523,7 +541,19 @@ index fe2209f5b5b58d5859cbb1b2008d9236b39c4e54..e9767317eebca72f8ff923fb9b04a95c } public boolean blazeRidable = false; -@@ -579,6 +583,7 @@ public class PurpurWorldConfig { +@@ -572,6 +576,11 @@ public class PurpurWorldConfig { + blazeMaxHealth = getDouble("mobs.blaze.attributes.max_health", blazeMaxHealth); + } + ++ public int camelBreedingTicks = 6000; ++ private void camelSettings() { ++ camelBreedingTicks = getInt("mobs.camel.breeding-delay-ticks", camelBreedingTicks); ++ } ++ + public boolean catRidable = false; + public boolean catRidableInWater = false; + public boolean catControllable = true; +@@ -579,6 +588,7 @@ public class PurpurWorldConfig { public int catSpawnDelay = 1200; public int catSpawnSwampHutScanRange = 16; public int catSpawnVillageScanRange = 48; @@ -531,7 +561,7 @@ index fe2209f5b5b58d5859cbb1b2008d9236b39c4e54..e9767317eebca72f8ff923fb9b04a95c private void catSettings() { catRidable = getBoolean("mobs.cat.ridable", catRidable); catRidableInWater = getBoolean("mobs.cat.ridable-in-water", catRidableInWater); -@@ -592,6 +597,7 @@ public class PurpurWorldConfig { +@@ -592,6 +602,7 @@ public class PurpurWorldConfig { catSpawnDelay = getInt("mobs.cat.spawn-delay", catSpawnDelay); catSpawnSwampHutScanRange = getInt("mobs.cat.scan-range-for-other-cats.swamp-hut", catSpawnSwampHutScanRange); catSpawnVillageScanRange = getInt("mobs.cat.scan-range-for-other-cats.village", catSpawnVillageScanRange); @@ -539,7 +569,7 @@ index fe2209f5b5b58d5859cbb1b2008d9236b39c4e54..e9767317eebca72f8ff923fb9b04a95c } public boolean caveSpiderRidable = false; -@@ -615,6 +621,7 @@ public class PurpurWorldConfig { +@@ -615,6 +626,7 @@ public class PurpurWorldConfig { public boolean chickenControllable = true; public double chickenMaxHealth = 4.0D; public boolean chickenRetaliate = false; @@ -547,7 +577,7 @@ index fe2209f5b5b58d5859cbb1b2008d9236b39c4e54..e9767317eebca72f8ff923fb9b04a95c private void chickenSettings() { chickenRidable = getBoolean("mobs.chicken.ridable", chickenRidable); chickenRidableInWater = getBoolean("mobs.chicken.ridable-in-water", chickenRidableInWater); -@@ -626,6 +633,7 @@ public class PurpurWorldConfig { +@@ -626,6 +638,7 @@ public class PurpurWorldConfig { } chickenMaxHealth = getDouble("mobs.chicken.attributes.max_health", chickenMaxHealth); chickenRetaliate = getBoolean("mobs.chicken.retaliate", chickenRetaliate); @@ -555,7 +585,7 @@ index fe2209f5b5b58d5859cbb1b2008d9236b39c4e54..e9767317eebca72f8ff923fb9b04a95c } public boolean codRidable = false; -@@ -647,6 +655,7 @@ public class PurpurWorldConfig { +@@ -647,6 +660,7 @@ public class PurpurWorldConfig { public boolean cowControllable = true; public double cowMaxHealth = 10.0D; public int cowFeedMushrooms = 0; @@ -563,7 +593,7 @@ index fe2209f5b5b58d5859cbb1b2008d9236b39c4e54..e9767317eebca72f8ff923fb9b04a95c private void cowSettings() { cowRidable = getBoolean("mobs.cow.ridable", cowRidable); cowRidableInWater = getBoolean("mobs.cow.ridable-in-water", cowRidableInWater); -@@ -658,6 +667,7 @@ public class PurpurWorldConfig { +@@ -658,6 +672,7 @@ public class PurpurWorldConfig { } cowMaxHealth = getDouble("mobs.cow.attributes.max_health", cowMaxHealth); cowFeedMushrooms = getInt("mobs.cow.feed-mushrooms-for-mooshroom", cowFeedMushrooms); @@ -571,7 +601,7 @@ index fe2209f5b5b58d5859cbb1b2008d9236b39c4e54..e9767317eebca72f8ff923fb9b04a95c } public boolean creeperRidable = false; -@@ -709,6 +719,7 @@ public class PurpurWorldConfig { +@@ -709,6 +724,7 @@ public class PurpurWorldConfig { public double donkeyJumpStrengthMax = 0.5D; public double donkeyMovementSpeedMin = 0.175D; public double donkeyMovementSpeedMax = 0.175D; @@ -579,7 +609,7 @@ index fe2209f5b5b58d5859cbb1b2008d9236b39c4e54..e9767317eebca72f8ff923fb9b04a95c private void donkeySettings() { donkeyRidableInWater = getBoolean("mobs.donkey.ridable-in-water", donkeyRidableInWater); if (PurpurConfig.version < 10) { -@@ -724,6 +735,7 @@ public class PurpurWorldConfig { +@@ -724,6 +740,7 @@ public class PurpurWorldConfig { donkeyJumpStrengthMax = getDouble("mobs.donkey.attributes.jump_strength.max", donkeyJumpStrengthMax); donkeyMovementSpeedMin = getDouble("mobs.donkey.attributes.movement_speed.min", donkeyMovementSpeedMin); donkeyMovementSpeedMax = getDouble("mobs.donkey.attributes.movement_speed.max", donkeyMovementSpeedMax); @@ -587,7 +617,7 @@ index fe2209f5b5b58d5859cbb1b2008d9236b39c4e54..e9767317eebca72f8ff923fb9b04a95c } public boolean drownedRidable = false; -@@ -843,6 +855,7 @@ public class PurpurWorldConfig { +@@ -843,6 +860,7 @@ public class PurpurWorldConfig { public boolean foxControllable = true; public double foxMaxHealth = 10.0D; public boolean foxTypeChangesWithTulips = false; @@ -595,7 +625,7 @@ index fe2209f5b5b58d5859cbb1b2008d9236b39c4e54..e9767317eebca72f8ff923fb9b04a95c private void foxSettings() { foxRidable = getBoolean("mobs.fox.ridable", foxRidable); foxRidableInWater = getBoolean("mobs.fox.ridable-in-water", foxRidableInWater); -@@ -854,17 +867,20 @@ public class PurpurWorldConfig { +@@ -854,17 +872,20 @@ public class PurpurWorldConfig { } foxMaxHealth = getDouble("mobs.fox.attributes.max_health", foxMaxHealth); foxTypeChangesWithTulips = getBoolean("mobs.fox.tulips-change-type", foxTypeChangesWithTulips); @@ -616,7 +646,7 @@ index fe2209f5b5b58d5859cbb1b2008d9236b39c4e54..e9767317eebca72f8ff923fb9b04a95c } public boolean ghastRidable = false; -@@ -932,11 +948,13 @@ public class PurpurWorldConfig { +@@ -932,11 +953,13 @@ public class PurpurWorldConfig { public boolean goatRidableInWater = false; public boolean goatControllable = true; public double goatMaxHealth = 10.0D; @@ -630,7 +660,7 @@ index fe2209f5b5b58d5859cbb1b2008d9236b39c4e54..e9767317eebca72f8ff923fb9b04a95c } public boolean guardianRidable = false; -@@ -957,6 +975,7 @@ public class PurpurWorldConfig { +@@ -957,6 +980,7 @@ public class PurpurWorldConfig { public boolean hoglinRidableInWater = false; public boolean hoglinControllable = true; public double hoglinMaxHealth = 40.0D; @@ -638,7 +668,7 @@ index fe2209f5b5b58d5859cbb1b2008d9236b39c4e54..e9767317eebca72f8ff923fb9b04a95c private void hoglinSettings() { hoglinRidable = getBoolean("mobs.hoglin.ridable", hoglinRidable); hoglinRidableInWater = getBoolean("mobs.hoglin.ridable-in-water", hoglinRidableInWater); -@@ -967,6 +986,7 @@ public class PurpurWorldConfig { +@@ -967,6 +991,7 @@ public class PurpurWorldConfig { set("mobs.hoglin.attributes.max_health", oldValue); } hoglinMaxHealth = getDouble("mobs.hoglin.attributes.max_health", hoglinMaxHealth); @@ -646,7 +676,7 @@ index fe2209f5b5b58d5859cbb1b2008d9236b39c4e54..e9767317eebca72f8ff923fb9b04a95c } public boolean horseRidableInWater = false; -@@ -976,6 +996,7 @@ public class PurpurWorldConfig { +@@ -976,6 +1001,7 @@ public class PurpurWorldConfig { public double horseJumpStrengthMax = 1.0D; public double horseMovementSpeedMin = 0.1125D; public double horseMovementSpeedMax = 0.3375D; @@ -654,7 +684,7 @@ index fe2209f5b5b58d5859cbb1b2008d9236b39c4e54..e9767317eebca72f8ff923fb9b04a95c private void horseSettings() { horseRidableInWater = getBoolean("mobs.horse.ridable-in-water", horseRidableInWater); if (PurpurConfig.version < 10) { -@@ -991,6 +1012,7 @@ public class PurpurWorldConfig { +@@ -991,6 +1017,7 @@ public class PurpurWorldConfig { horseJumpStrengthMax = getDouble("mobs.horse.attributes.jump_strength.max", horseJumpStrengthMax); horseMovementSpeedMin = getDouble("mobs.horse.attributes.movement_speed.min", horseMovementSpeedMin); horseMovementSpeedMax = getDouble("mobs.horse.attributes.movement_speed.max", horseMovementSpeedMax); @@ -662,7 +692,7 @@ index fe2209f5b5b58d5859cbb1b2008d9236b39c4e54..e9767317eebca72f8ff923fb9b04a95c } public boolean huskRidable = false; -@@ -1068,6 +1090,7 @@ public class PurpurWorldConfig { +@@ -1068,6 +1095,7 @@ public class PurpurWorldConfig { public double llamaJumpStrengthMax = 0.5D; public double llamaMovementSpeedMin = 0.175D; public double llamaMovementSpeedMax = 0.175D; @@ -670,7 +700,7 @@ index fe2209f5b5b58d5859cbb1b2008d9236b39c4e54..e9767317eebca72f8ff923fb9b04a95c private void llamaSettings() { llamaRidable = getBoolean("mobs.llama.ridable", llamaRidable); llamaRidableInWater = getBoolean("mobs.llama.ridable-in-water", llamaRidableInWater); -@@ -1085,6 +1108,7 @@ public class PurpurWorldConfig { +@@ -1085,6 +1113,7 @@ public class PurpurWorldConfig { llamaJumpStrengthMax = getDouble("mobs.llama.attributes.jump_strength.max", llamaJumpStrengthMax); llamaMovementSpeedMin = getDouble("mobs.llama.attributes.movement_speed.min", llamaMovementSpeedMin); llamaMovementSpeedMax = getDouble("mobs.llama.attributes.movement_speed.max", llamaMovementSpeedMax); @@ -678,7 +708,7 @@ index fe2209f5b5b58d5859cbb1b2008d9236b39c4e54..e9767317eebca72f8ff923fb9b04a95c } public boolean magmaCubeRidable = false; -@@ -1113,6 +1137,7 @@ public class PurpurWorldConfig { +@@ -1113,6 +1142,7 @@ public class PurpurWorldConfig { public boolean mooshroomRidableInWater = false; public boolean mooshroomControllable = true; public double mooshroomMaxHealth = 10.0D; @@ -686,7 +716,7 @@ index fe2209f5b5b58d5859cbb1b2008d9236b39c4e54..e9767317eebca72f8ff923fb9b04a95c private void mooshroomSettings() { mooshroomRidable = getBoolean("mobs.mooshroom.ridable", mooshroomRidable); mooshroomRidableInWater = getBoolean("mobs.mooshroom.ridable-in-water", mooshroomRidableInWater); -@@ -1123,6 +1148,7 @@ public class PurpurWorldConfig { +@@ -1123,6 +1153,7 @@ public class PurpurWorldConfig { set("mobs.mooshroom.attributes.max_health", oldValue); } mooshroomMaxHealth = getDouble("mobs.mooshroom.attributes.max_health", mooshroomMaxHealth); @@ -694,7 +724,7 @@ index fe2209f5b5b58d5859cbb1b2008d9236b39c4e54..e9767317eebca72f8ff923fb9b04a95c } public boolean muleRidableInWater = false; -@@ -1132,6 +1158,7 @@ public class PurpurWorldConfig { +@@ -1132,6 +1163,7 @@ public class PurpurWorldConfig { public double muleJumpStrengthMax = 0.5D; public double muleMovementSpeedMin = 0.175D; public double muleMovementSpeedMax = 0.175D; @@ -702,7 +732,7 @@ index fe2209f5b5b58d5859cbb1b2008d9236b39c4e54..e9767317eebca72f8ff923fb9b04a95c private void muleSettings() { muleRidableInWater = getBoolean("mobs.mule.ridable-in-water", muleRidableInWater); if (PurpurConfig.version < 10) { -@@ -1147,12 +1174,14 @@ public class PurpurWorldConfig { +@@ -1147,12 +1179,14 @@ public class PurpurWorldConfig { muleJumpStrengthMax = getDouble("mobs.mule.attributes.jump_strength.max", muleJumpStrengthMax); muleMovementSpeedMin = getDouble("mobs.mule.attributes.movement_speed.min", muleMovementSpeedMin); muleMovementSpeedMax = getDouble("mobs.mule.attributes.movement_speed.max", muleMovementSpeedMax); @@ -717,7 +747,7 @@ index fe2209f5b5b58d5859cbb1b2008d9236b39c4e54..e9767317eebca72f8ff923fb9b04a95c private void ocelotSettings() { ocelotRidable = getBoolean("mobs.ocelot.ridable", ocelotRidable); ocelotRidableInWater = getBoolean("mobs.ocelot.ridable-in-water", ocelotRidableInWater); -@@ -1163,12 +1192,14 @@ public class PurpurWorldConfig { +@@ -1163,12 +1197,14 @@ public class PurpurWorldConfig { set("mobs.ocelot.attributes.max_health", oldValue); } ocelotMaxHealth = getDouble("mobs.ocelot.attributes.max_health", ocelotMaxHealth); @@ -732,7 +762,7 @@ index fe2209f5b5b58d5859cbb1b2008d9236b39c4e54..e9767317eebca72f8ff923fb9b04a95c private void pandaSettings() { pandaRidable = getBoolean("mobs.panda.ridable", pandaRidable); pandaRidableInWater = getBoolean("mobs.panda.ridable-in-water", pandaRidableInWater); -@@ -1179,6 +1210,7 @@ public class PurpurWorldConfig { +@@ -1179,6 +1215,7 @@ public class PurpurWorldConfig { set("mobs.panda.attributes.max_health", oldValue); } pandaMaxHealth = getDouble("mobs.panda.attributes.max_health", pandaMaxHealth); @@ -740,7 +770,7 @@ index fe2209f5b5b58d5859cbb1b2008d9236b39c4e54..e9767317eebca72f8ff923fb9b04a95c } public boolean parrotRidable = false; -@@ -1262,6 +1294,7 @@ public class PurpurWorldConfig { +@@ -1262,6 +1299,7 @@ public class PurpurWorldConfig { public boolean pigControllable = true; public double pigMaxHealth = 10.0D; public boolean pigGiveSaddleBack = false; @@ -748,7 +778,7 @@ index fe2209f5b5b58d5859cbb1b2008d9236b39c4e54..e9767317eebca72f8ff923fb9b04a95c private void pigSettings() { pigRidable = getBoolean("mobs.pig.ridable", pigRidable); pigRidableInWater = getBoolean("mobs.pig.ridable-in-water", pigRidableInWater); -@@ -1273,6 +1306,7 @@ public class PurpurWorldConfig { +@@ -1273,6 +1311,7 @@ public class PurpurWorldConfig { } pigMaxHealth = getDouble("mobs.pig.attributes.max_health", pigMaxHealth); pigGiveSaddleBack = getBoolean("mobs.pig.give-saddle-back", pigGiveSaddleBack); @@ -756,7 +786,7 @@ index fe2209f5b5b58d5859cbb1b2008d9236b39c4e54..e9767317eebca72f8ff923fb9b04a95c } public boolean piglinRidable = false; -@@ -1329,6 +1363,7 @@ public class PurpurWorldConfig { +@@ -1329,6 +1368,7 @@ public class PurpurWorldConfig { public double polarBearMaxHealth = 30.0D; public String polarBearBreedableItemString = ""; public Item polarBearBreedableItem = null; @@ -764,15 +794,15 @@ index fe2209f5b5b58d5859cbb1b2008d9236b39c4e54..e9767317eebca72f8ff923fb9b04a95c private void polarBearSettings() { polarBearRidable = getBoolean("mobs.polar_bear.ridable", polarBearRidable); polarBearRidableInWater = getBoolean("mobs.polar_bear.ridable-in-water", polarBearRidableInWater); -@@ -1342,6 +1377,7 @@ public class PurpurWorldConfig { +@@ -1342,6 +1382,7 @@ public class PurpurWorldConfig { polarBearBreedableItemString = getString("mobs.polar_bear.breedable-item", polarBearBreedableItemString); - Item item = Registry.ITEM.get(new ResourceLocation(polarBearBreedableItemString)); + Item item = BuiltInRegistries.ITEM.get(new ResourceLocation(polarBearBreedableItemString)); if (item != Items.AIR) polarBearBreedableItem = item; + polarBearBreedingTicks = getInt("mobs.polar_bear.breeding-delay-ticks", polarBearBreedingTicks); } public boolean pufferfishRidable = false; -@@ -1364,6 +1400,7 @@ public class PurpurWorldConfig { +@@ -1364,6 +1405,7 @@ public class PurpurWorldConfig { public double rabbitMaxHealth = 3.0D; public double rabbitNaturalToast = 0.0D; public double rabbitNaturalKiller = 0.0D; @@ -780,7 +810,7 @@ index fe2209f5b5b58d5859cbb1b2008d9236b39c4e54..e9767317eebca72f8ff923fb9b04a95c private void rabbitSettings() { rabbitRidable = getBoolean("mobs.rabbit.ridable", rabbitRidable); rabbitRidableInWater = getBoolean("mobs.rabbit.ridable-in-water", rabbitRidableInWater); -@@ -1376,6 +1413,7 @@ public class PurpurWorldConfig { +@@ -1376,6 +1418,7 @@ public class PurpurWorldConfig { rabbitMaxHealth = getDouble("mobs.rabbit.attributes.max_health", rabbitMaxHealth); rabbitNaturalToast = getDouble("mobs.rabbit.spawn-toast-chance", rabbitNaturalToast); rabbitNaturalKiller = getDouble("mobs.rabbit.spawn-killer-rabbit-chance", rabbitNaturalKiller); @@ -788,7 +818,7 @@ index fe2209f5b5b58d5859cbb1b2008d9236b39c4e54..e9767317eebca72f8ff923fb9b04a95c } public boolean ravagerRidable = false; -@@ -1412,6 +1450,7 @@ public class PurpurWorldConfig { +@@ -1412,6 +1455,7 @@ public class PurpurWorldConfig { public boolean sheepRidableInWater = false; public boolean sheepControllable = true; public double sheepMaxHealth = 8.0D; @@ -796,7 +826,7 @@ index fe2209f5b5b58d5859cbb1b2008d9236b39c4e54..e9767317eebca72f8ff923fb9b04a95c private void sheepSettings() { sheepRidable = getBoolean("mobs.sheep.ridable", sheepRidable); sheepRidableInWater = getBoolean("mobs.sheep.ridable-in-water", sheepRidableInWater); -@@ -1422,6 +1461,7 @@ public class PurpurWorldConfig { +@@ -1422,6 +1466,7 @@ public class PurpurWorldConfig { set("mobs.sheep.attributes.max_health", oldValue); } sheepMaxHealth = getDouble("mobs.sheep.attributes.max_health", sheepMaxHealth); @@ -804,7 +834,7 @@ index fe2209f5b5b58d5859cbb1b2008d9236b39c4e54..e9767317eebca72f8ff923fb9b04a95c } public boolean shulkerRidable = false; -@@ -1597,6 +1637,7 @@ public class PurpurWorldConfig { +@@ -1597,6 +1642,7 @@ public class PurpurWorldConfig { public boolean striderRidableInWater = false; public boolean striderControllable = true; public double striderMaxHealth = 20.0D; @@ -812,7 +842,7 @@ index fe2209f5b5b58d5859cbb1b2008d9236b39c4e54..e9767317eebca72f8ff923fb9b04a95c private void striderSettings() { striderRidable = getBoolean("mobs.strider.ridable", striderRidable); striderRidableInWater = getBoolean("mobs.strider.ridable-in-water", striderRidableInWater); -@@ -1607,6 +1648,7 @@ public class PurpurWorldConfig { +@@ -1607,6 +1653,7 @@ public class PurpurWorldConfig { set("mobs.strider.attributes.max_health", oldValue); } striderMaxHealth = getDouble("mobs.strider.attributes.max_health", striderMaxHealth); @@ -820,7 +850,7 @@ index fe2209f5b5b58d5859cbb1b2008d9236b39c4e54..e9767317eebca72f8ff923fb9b04a95c } public boolean tadpoleRidable = false; -@@ -1627,6 +1669,7 @@ public class PurpurWorldConfig { +@@ -1627,6 +1674,7 @@ public class PurpurWorldConfig { public double traderLlamaJumpStrengthMax = 0.5D; public double traderLlamaMovementSpeedMin = 0.175D; public double traderLlamaMovementSpeedMax = 0.175D; @@ -828,7 +858,7 @@ index fe2209f5b5b58d5859cbb1b2008d9236b39c4e54..e9767317eebca72f8ff923fb9b04a95c private void traderLlamaSettings() { traderLlamaRidable = getBoolean("mobs.trader_llama.ridable", traderLlamaRidable); traderLlamaRidableInWater = getBoolean("mobs.trader_llama.ridable-in-water", traderLlamaRidableInWater); -@@ -1644,6 +1687,7 @@ public class PurpurWorldConfig { +@@ -1644,6 +1692,7 @@ public class PurpurWorldConfig { traderLlamaJumpStrengthMax = getDouble("mobs.trader_llama.attributes.jump_strength.max", traderLlamaJumpStrengthMax); traderLlamaMovementSpeedMin = getDouble("mobs.trader_llama.attributes.movement_speed.min", traderLlamaMovementSpeedMin); traderLlamaMovementSpeedMax = getDouble("mobs.trader_llama.attributes.movement_speed.max", traderLlamaMovementSpeedMax); @@ -836,7 +866,7 @@ index fe2209f5b5b58d5859cbb1b2008d9236b39c4e54..e9767317eebca72f8ff923fb9b04a95c } public boolean tropicalFishRidable = false; -@@ -1664,6 +1708,7 @@ public class PurpurWorldConfig { +@@ -1664,6 +1713,7 @@ public class PurpurWorldConfig { public boolean turtleRidableInWater = false; public boolean turtleControllable = true; public double turtleMaxHealth = 30.0D; @@ -844,7 +874,7 @@ index fe2209f5b5b58d5859cbb1b2008d9236b39c4e54..e9767317eebca72f8ff923fb9b04a95c private void turtleSettings() { turtleRidable = getBoolean("mobs.turtle.ridable", turtleRidable); turtleRidableInWater = getBoolean("mobs.turtle.ridable-in-water", turtleRidableInWater); -@@ -1674,6 +1719,7 @@ public class PurpurWorldConfig { +@@ -1674,6 +1724,7 @@ public class PurpurWorldConfig { set("mobs.turtle.attributes.max_health", oldValue); } turtleMaxHealth = getDouble("mobs.turtle.attributes.max_health", turtleMaxHealth); @@ -852,7 +882,7 @@ index fe2209f5b5b58d5859cbb1b2008d9236b39c4e54..e9767317eebca72f8ff923fb9b04a95c } public boolean vexRidable = false; -@@ -1703,6 +1749,7 @@ public class PurpurWorldConfig { +@@ -1701,6 +1752,7 @@ public class PurpurWorldConfig { public boolean villagerFollowEmeraldBlock = false; public boolean villagerCanBeLeashed = false; public boolean villagerCanBreed = true; @@ -860,7 +890,7 @@ index fe2209f5b5b58d5859cbb1b2008d9236b39c4e54..e9767317eebca72f8ff923fb9b04a95c private void villagerSettings() { villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); -@@ -1718,6 +1765,7 @@ public class PurpurWorldConfig { +@@ -1714,6 +1766,7 @@ public class PurpurWorldConfig { villagerFollowEmeraldBlock = getBoolean("mobs.villager.follow-emerald-blocks", villagerFollowEmeraldBlock); villagerCanBeLeashed = getBoolean("mobs.villager.can-be-leashed", villagerCanBeLeashed); villagerCanBreed = getBoolean("mobs.villager.can-breed", villagerCanBreed); @@ -868,7 +898,7 @@ index fe2209f5b5b58d5859cbb1b2008d9236b39c4e54..e9767317eebca72f8ff923fb9b04a95c } public boolean vindicatorRidable = false; -@@ -1829,6 +1877,7 @@ public class PurpurWorldConfig { +@@ -1825,6 +1878,7 @@ public class PurpurWorldConfig { public boolean wolfRidableInWater = false; public boolean wolfControllable = true; public double wolfMaxHealth = 8.0D; @@ -876,7 +906,7 @@ index fe2209f5b5b58d5859cbb1b2008d9236b39c4e54..e9767317eebca72f8ff923fb9b04a95c private void wolfSettings() { wolfRidable = getBoolean("mobs.wolf.ridable", wolfRidable); wolfRidableInWater = getBoolean("mobs.wolf.ridable-in-water", wolfRidableInWater); -@@ -1839,6 +1888,7 @@ public class PurpurWorldConfig { +@@ -1835,6 +1889,7 @@ public class PurpurWorldConfig { set("mobs.wolf.attributes.max_health", oldValue); } wolfMaxHealth = getDouble("mobs.wolf.attributes.max_health", wolfMaxHealth); diff --git a/patches/server/0109-Apply-display-names-from-item-forms-of-entities-to-e.patch b/patches/server/0105-Apply-display-names-from-item-forms-of-entities-to-e.patch similarity index 90% rename from patches/server/0109-Apply-display-names-from-item-forms-of-entities-to-e.patch rename to patches/server/0105-Apply-display-names-from-item-forms-of-entities-to-e.patch index 71f68984e..4173df1a3 100644 --- a/patches/server/0109-Apply-display-names-from-item-forms-of-entities-to-e.patch +++ b/patches/server/0105-Apply-display-names-from-item-forms-of-entities-to-e.patch @@ -25,10 +25,10 @@ index 76c83fdd744cc8f31a52c733de521a6fb2024499..0c4b76cd3b6248df99d31d28c7521a0f } diff --git a/src/main/java/net/minecraft/world/entity/decoration/ItemFrame.java b/src/main/java/net/minecraft/world/entity/decoration/ItemFrame.java -index d2a77b4ca343d19e1c70afe3f3906a9bd53d0eec..2a3ec299283c2cc039877eade6e2ddee8f3812ea 100644 +index 428523feaa4f30260e32ba03937e88200246c693..16e54d8c29d67d2db3f1186559f5ba71e47db6f3 100644 --- a/src/main/java/net/minecraft/world/entity/decoration/ItemFrame.java +++ b/src/main/java/net/minecraft/world/entity/decoration/ItemFrame.java -@@ -267,7 +267,13 @@ public class ItemFrame extends HangingEntity { +@@ -268,7 +268,13 @@ public class ItemFrame extends HangingEntity { } if (alwaysDrop) { @@ -44,10 +44,10 @@ index d2a77b4ca343d19e1c70afe3f3906a9bd53d0eec..2a3ec299283c2cc039877eade6e2ddee if (!itemstack.isEmpty()) { diff --git a/src/main/java/net/minecraft/world/entity/decoration/Painting.java b/src/main/java/net/minecraft/world/entity/decoration/Painting.java -index 18697701ca6406b2a74f190b22d5b276359547d0..ee72748a8c07587c95bdce8f982fcdd73e8fd8f4 100644 +index 0c5caad2a5bfc14450cf8d37f988ee176e8d1450..c01af317e14ae1a0ed58821557cb7ac6e45b00bc 100644 --- a/src/main/java/net/minecraft/world/entity/decoration/Painting.java +++ b/src/main/java/net/minecraft/world/entity/decoration/Painting.java -@@ -143,7 +143,13 @@ public class Painting extends HangingEntity { +@@ -152,7 +152,13 @@ public class Painting extends HangingEntity implements VariantHolder { } protected void destroy(DamageSource source) { @@ -82,10 +82,10 @@ index 539c9d60cecb63fb2b0858951ff58cc0ea26c446..ed260c5f8cdf9027ad95c81cb84bb918 @Override diff --git a/src/main/java/net/minecraft/world/item/ArmorStandItem.java b/src/main/java/net/minecraft/world/item/ArmorStandItem.java -index af81ba310dbd7fdbdccdd0cc74b7c085ad54027f..3e529ea7548a2a6617f70a3c3ad2d8f482c1b5e5 100644 +index 07850a88f3b8f834669394b733b9dca3968dfabc..d21a6d62d1d8b7c208e72acafc42f975012f7107 100644 --- a/src/main/java/net/minecraft/world/item/ArmorStandItem.java +++ b/src/main/java/net/minecraft/world/item/ArmorStandItem.java -@@ -60,6 +60,14 @@ public class ArmorStandItem extends Item { +@@ -62,6 +62,14 @@ public class ArmorStandItem extends Item { return InteractionResult.FAIL; } // CraftBukkit end @@ -101,12 +101,12 @@ index af81ba310dbd7fdbdccdd0cc74b7c085ad54027f..3e529ea7548a2a6617f70a3c3ad2d8f4 world.playSound((Player) null, entityarmorstand.getX(), entityarmorstand.getY(), entityarmorstand.getZ(), SoundEvents.ARMOR_STAND_PLACE, SoundSource.BLOCKS, 0.75F, 0.8F); entityarmorstand.gameEvent(GameEvent.ENTITY_PLACE, context.getPlayer()); diff --git a/src/main/java/net/minecraft/world/item/BoatItem.java b/src/main/java/net/minecraft/world/item/BoatItem.java -index fdfc85d17c7eeb8433b96173512130a43ddaa014..ee824a0f9280ff015edffa9f58f92c714de99c51 100644 +index 1a95ac11a2fbc811c89afa3adf38e0fc9eaab09b..91280f8c39ea191b90da2a9ff5c49f43c255bd9a 100644 --- a/src/main/java/net/minecraft/world/item/BoatItem.java +++ b/src/main/java/net/minecraft/world/item/BoatItem.java @@ -69,6 +69,11 @@ public class BoatItem extends Item { - entityboat.setType(this.type); + entityboat.setVariant(this.type); entityboat.setYRot(user.getYRot()); + // Purpur start + if (world.purpurConfig.persistentDroppableEntityDisplayNames && itemstack.hasCustomHoverName()) { @@ -142,7 +142,7 @@ index 489558eb0126e7a41e2e379e352bddc034375b61..062152b258224f28e07f96d6135bbb7a if (((HangingEntity) object).survives()) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index da8d0c3b68f0d41a0925b983f0214724764740e1..9312223685dd5d0add8f3e9af5cc9d12a8680442 100644 +index 95db5152a5aefa6a2f9fbb525d0538bba28d3489..31cfad49b65ea3469d77ad967e409422cc1a18fe 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -100,8 +100,10 @@ public class PurpurWorldConfig { diff --git a/patches/server/0110-Set-name-visible-when-using-a-Name-Tag-on-an-Armor-S.patch b/patches/server/0106-Set-name-visible-when-using-a-Name-Tag-on-an-Armor-S.patch similarity index 96% rename from patches/server/0110-Set-name-visible-when-using-a-Name-Tag-on-an-Armor-S.patch rename to patches/server/0106-Set-name-visible-when-using-a-Name-Tag-on-an-Armor-S.patch index a2c4f06f9..a820fd673 100644 --- a/patches/server/0110-Set-name-visible-when-using-a-Name-Tag-on-an-Armor-S.patch +++ b/patches/server/0106-Set-name-visible-when-using-a-Name-Tag-on-an-Armor-S.patch @@ -17,7 +17,7 @@ index 623f78c078fb3aa2665d7e8a37672438227bce6b..500c69e555c7247e20ef8cc59d834155 ((Mob) newEntityLiving).setPersistenceRequired(); // Paper end diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 9312223685dd5d0add8f3e9af5cc9d12a8680442..b9f7eff06f71e7f60ad478b8ddfbaa225678dda2 100644 +index 31cfad49b65ea3469d77ad967e409422cc1a18fe..ceb3e8db000398c775f8df42f3d644420a0f7856 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -101,9 +101,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0111-Add-config-for-allowing-Endermen-to-despawn-even-whi.patch b/patches/server/0107-Add-config-for-allowing-Endermen-to-despawn-even-whi.patch similarity index 85% rename from patches/server/0111-Add-config-for-allowing-Endermen-to-despawn-even-whi.patch rename to patches/server/0107-Add-config-for-allowing-Endermen-to-despawn-even-whi.patch index 8b65dd45a..155985c50 100644 --- a/patches/server/0111-Add-config-for-allowing-Endermen-to-despawn-even-whi.patch +++ b/patches/server/0107-Add-config-for-allowing-Endermen-to-despawn-even-whi.patch @@ -8,10 +8,10 @@ This should help to reduce the amount of dirt, gravel, grass, and etc. that Endermen like to randomly place all over the world. diff --git a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -index 9458cab33d4ff468d3d009cc1c3b3736f21f649b..4443a4a300d17e8568a81bcb9af89251d53a6a46 100644 +index f130f3f8ceb5ab30e0b53e8b78281bfb953af5a9..72bddd57059e4dfffa0c5ac04bb3c80cbcfd3b4a 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -@@ -477,7 +477,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -487,7 +487,7 @@ public class EnderMan extends Monster implements NeutralMob { @Override public boolean requiresCustomPersistence() { @@ -21,10 +21,10 @@ index 9458cab33d4ff468d3d009cc1c3b3736f21f649b..4443a4a300d17e8568a81bcb9af89251 private static class EndermanFreezeWhenLookedAt extends Goal { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index b9f7eff06f71e7f60ad478b8ddfbaa225678dda2..a7549c81217ebe11d7f1b9d605b55597200363f3 100644 +index 08f73c8e1a54769f1c292f0a49dac7dc4a5263c0..216167f1f3b80cc9f84999165aa6b5057f22cf28 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -811,6 +811,7 @@ public class PurpurWorldConfig { +@@ -816,6 +816,7 @@ public class PurpurWorldConfig { public boolean endermanControllable = true; public double endermanMaxHealth = 40.0D; public boolean endermanAllowGriefing = true; @@ -32,7 +32,7 @@ index b9f7eff06f71e7f60ad478b8ddfbaa225678dda2..a7549c81217ebe11d7f1b9d605b55597 private void endermanSettings() { endermanRidable = getBoolean("mobs.enderman.ridable", endermanRidable); endermanRidableInWater = getBoolean("mobs.enderman.ridable-in-water", endermanRidableInWater); -@@ -822,6 +823,7 @@ public class PurpurWorldConfig { +@@ -827,6 +828,7 @@ public class PurpurWorldConfig { } endermanMaxHealth = getDouble("mobs.enderman.attributes.max_health", endermanMaxHealth); endermanAllowGriefing = getBoolean("mobs.enderman.allow-griefing", endermanAllowGriefing); diff --git a/patches/server/0112-Add-configurable-snowball-damage.patch b/patches/server/0108-Add-configurable-snowball-damage.patch similarity index 94% rename from patches/server/0112-Add-configurable-snowball-damage.patch rename to patches/server/0108-Add-configurable-snowball-damage.patch index 0dbc918f3..bed2171f6 100644 --- a/patches/server/0112-Add-configurable-snowball-damage.patch +++ b/patches/server/0108-Add-configurable-snowball-damage.patch @@ -18,11 +18,11 @@ index a725851060f13e734dbd2fbf8c83c9e1af57a8b7..74f798baafc53cd7dd1d4f58bc9a3581 } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index a7549c81217ebe11d7f1b9d605b55597200363f3..6d7078c18579f0416e07a3dafa77c5d32697fd13 100644 +index e7766c8961908296b8d33767a2ca55b8e0ef9d3c..307917fa736e2e12582ebbf9650217bf850ddb92 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -357,6 +357,11 @@ public class PurpurWorldConfig { - } + //} } + public int snowballDamage = -1; diff --git a/patches/server/0113-Changeable-Mob-Left-Handed-Chance.patch b/patches/server/0109-Changeable-Mob-Left-Handed-Chance.patch similarity index 86% rename from patches/server/0113-Changeable-Mob-Left-Handed-Chance.patch rename to patches/server/0109-Changeable-Mob-Left-Handed-Chance.patch index b86adbc3b..90371ef97 100644 --- a/patches/server/0113-Changeable-Mob-Left-Handed-Chance.patch +++ b/patches/server/0109-Changeable-Mob-Left-Handed-Chance.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Changeable Mob Left Handed Chance diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java -index e08c5ccb2f9e07b9dfebf47ddd94330f6ea5a17b..bfa4e93b040d9fd84636619dd0012ad60a8b456b 100644 +index d1eb52081277a51610abd83810ea96dfed2ea54b..cc9e7eeb17d16b402e1f65144f4e4d1be43c5081 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java -@@ -1245,7 +1245,7 @@ public abstract class Mob extends LivingEntity { +@@ -1257,7 +1257,7 @@ public abstract class Mob extends LivingEntity { RandomSource randomsource = world.getRandom(); this.getAttribute(Attributes.FOLLOW_RANGE).addPermanentModifier(new AttributeModifier("Random spawn bonus", randomsource.triangle(0.0D, 0.11485000000000001D), AttributeModifier.Operation.MULTIPLY_BASE)); @@ -18,7 +18,7 @@ index e08c5ccb2f9e07b9dfebf47ddd94330f6ea5a17b..bfa4e93b040d9fd84636619dd0012ad6 } else { this.setLeftHanded(false); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 6d7078c18579f0416e07a3dafa77c5d32697fd13..78bbb55ef2c9370f38253b27f528c6d2e62a7fb3 100644 +index c1a117224072ad73165cec946e13fce6a1a2c012..6dbbb9926f21c69b17672de4cddc00ff99ee57f4 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -159,8 +159,10 @@ public class PurpurWorldConfig { diff --git a/patches/server/0114-Add-boat-fall-damage-config.patch b/patches/server/0110-Add-boat-fall-damage-config.patch similarity index 92% rename from patches/server/0114-Add-boat-fall-damage-config.patch rename to patches/server/0110-Add-boat-fall-damage-config.patch index bcf431bc8..f0e7b0a1b 100644 --- a/patches/server/0114-Add-boat-fall-damage-config.patch +++ b/patches/server/0110-Add-boat-fall-damage-config.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add boat fall damage config diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index 43ac7d1d107c110f69464270853ebecb916f23a8..0e5d361eb5d42036e660946a1cbd9f1cc4b2930f 100644 +index 7775008d456f92c3d373c2f18fff0c7d6b3f32f1..ff05549415c46e1d30d3e2c8fc24c2d03038687f 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java -@@ -1042,7 +1042,16 @@ public class ServerPlayer extends Player { +@@ -1064,7 +1064,16 @@ public class ServerPlayer extends Player { if (this.isInvulnerableTo(source)) { return false; } else { @@ -27,7 +27,7 @@ index 43ac7d1d107c110f69464270853ebecb916f23a8..0e5d361eb5d42036e660946a1cbd9f1c if (!flag && isSpawnInvulnerable() && source != DamageSource.OUT_OF_WORLD) { // Purpur diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 2c1fb29b922b216615f50e5595ca6a53f1be56f8..633f8fa200efe91e7a21a3dc669b29f6474d8a29 100644 +index 6dbbb9926f21c69b17672de4cddc00ff99ee57f4..b0b208bd3c156ee2a7cc34e9b3d616f0df3f7281 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -115,6 +115,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0115-Snow-Golem-rate-of-fire-config.patch b/patches/server/0111-Snow-Golem-rate-of-fire-config.patch similarity index 94% rename from patches/server/0115-Snow-Golem-rate-of-fire-config.patch rename to patches/server/0111-Snow-Golem-rate-of-fire-config.patch index bc15c126b..98cf94180 100644 --- a/patches/server/0115-Snow-Golem-rate-of-fire-config.patch +++ b/patches/server/0111-Snow-Golem-rate-of-fire-config.patch @@ -23,10 +23,10 @@ index b4459d68397cc5bac4f7ef79a2dfb18f3eb24f77..b9025929fcc89e72aa820953b91a6542 this.goalSelector.addGoal(3, new LookAtPlayerGoal(this, Player.class, 6.0F)); this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 633f8fa200efe91e7a21a3dc669b29f6474d8a29..faf278a00309014f3992f5e69f12b214580e20f1 100644 +index 72eabfd1543177cb02ff33f98d20b7f0e57f386e..e64db82ac1305a89a692e851040bd0b6a1202282 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1583,6 +1583,10 @@ public class PurpurWorldConfig { +@@ -1588,6 +1588,10 @@ public class PurpurWorldConfig { public double snowGolemMaxHealth = 4.0D; public boolean snowGolemDropsPumpkin = true; public boolean snowGolemPutPumpkinBack = false; @@ -37,7 +37,7 @@ index 633f8fa200efe91e7a21a3dc669b29f6474d8a29..faf278a00309014f3992f5e69f12b214 private void snowGolemSettings() { snowGolemRidable = getBoolean("mobs.snow_golem.ridable", snowGolemRidable); snowGolemRidableInWater = getBoolean("mobs.snow_golem.ridable-in-water", snowGolemRidableInWater); -@@ -1596,6 +1600,10 @@ public class PurpurWorldConfig { +@@ -1601,6 +1605,10 @@ public class PurpurWorldConfig { snowGolemMaxHealth = getDouble("mobs.snow_golem.attributes.max_health", snowGolemMaxHealth); snowGolemDropsPumpkin = getBoolean("mobs.snow_golem.drop-pumpkin-when-sheared", snowGolemDropsPumpkin); snowGolemPutPumpkinBack = getBoolean("mobs.snow_golem.pumpkin-can-be-added-back", snowGolemPutPumpkinBack); diff --git a/patches/server/0116-EMC-Configurable-disable-give-dropping.patch b/patches/server/0112-EMC-Configurable-disable-give-dropping.patch similarity index 100% rename from patches/server/0116-EMC-Configurable-disable-give-dropping.patch rename to patches/server/0112-EMC-Configurable-disable-give-dropping.patch diff --git a/patches/server/0117-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch b/patches/server/0113-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch similarity index 81% rename from patches/server/0117-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch rename to patches/server/0113-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch index b49b42694..f3d0351e7 100644 --- a/patches/server/0117-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch +++ b/patches/server/0113-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch @@ -8,7 +8,7 @@ farm Nether Wart. Reimplemented based on a feature of the carpet-extra mod. diff --git a/src/main/java/net/minecraft/world/entity/ai/behavior/HarvestFarmland.java b/src/main/java/net/minecraft/world/entity/ai/behavior/HarvestFarmland.java -index 17c76c310435f501d350bd99debacd242739196e..2ad6f887db730466da39ad8fdd7c97c098e9966a 100644 +index 7ad71f2c139c2288b49d6b0fde3f8b8013f5e095..ed67d2adf06f7ae9c451648e30945ad289ceae38 100644 --- a/src/main/java/net/minecraft/world/entity/ai/behavior/HarvestFarmland.java +++ b/src/main/java/net/minecraft/world/entity/ai/behavior/HarvestFarmland.java @@ -34,6 +34,7 @@ public class HarvestFarmland extends Behavior { @@ -41,20 +41,20 @@ index 17c76c310435f501d350bd99debacd242739196e..2ad6f887db730466da39ad8fdd7c97c0 @@ -100,7 +103,7 @@ public class HarvestFarmland extends Behavior { Block block = iblockdata.getBlock(); - Block block1 = worldserver.getBlockState(this.aboveFarmlandPos.below()).getBlock(); + Block block1 = world.getBlockState(this.aboveFarmlandPos.below()).getBlock(); - if (block instanceof CropBlock && ((CropBlock) block).isMaxAge(iblockdata)) { + if (block instanceof CropBlock && ((CropBlock) block).isMaxAge(iblockdata) && !this.clericWartFarmer || this.clericWartFarmer && block == Blocks.NETHER_WART && iblockdata.getValue(net.minecraft.world.level.block.NetherWartBlock.AGE) == 3) { // Purpur // CraftBukkit start - if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entityvillager, this.aboveFarmlandPos, Blocks.AIR.defaultBlockState()).isCancelled()) { - worldserver.destroyBlock(this.aboveFarmlandPos, true, entityvillager); + if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entity, this.aboveFarmlandPos, Blocks.AIR.defaultBlockState()).isCancelled()) { + world.destroyBlock(this.aboveFarmlandPos, true, entity); @@ -108,7 +111,7 @@ public class HarvestFarmland extends Behavior { // CraftBukkit end } -- if (iblockdata.isAir() && block1 instanceof FarmBlock && entityvillager.hasFarmSeeds()) { -+ if (iblockdata.isAir() && (block1 instanceof FarmBlock && !this.clericWartFarmer || this.clericWartFarmer && block1 == Blocks.SOUL_SAND) && entityvillager.hasFarmSeeds()) { // Purpur - SimpleContainer inventorysubcontainer = entityvillager.getInventory(); +- if (iblockdata.isAir() && block1 instanceof FarmBlock && entity.hasFarmSeeds()) { ++ if (iblockdata.isAir() && (block1 instanceof FarmBlock && !this.clericWartFarmer || this.clericWartFarmer && block1 == Blocks.SOUL_SAND) && entity.hasFarmSeeds()) { // Purpur + SimpleContainer inventorysubcontainer = entity.getInventory(); for (int j = 0; j < inventorysubcontainer.getContainerSize(); ++j) { @@ -119,6 +122,12 @@ public class HarvestFarmland extends Behavior { @@ -74,40 +74,40 @@ index 17c76c310435f501d350bd99debacd242739196e..2ad6f887db730466da39ad8fdd7c97c0 } if (flag) { -- worldserver.playSound((Player) null, (double) this.aboveFarmlandPos.getX(), (double) this.aboveFarmlandPos.getY(), (double) this.aboveFarmlandPos.getZ(), SoundEvents.CROP_PLANTED, SoundSource.BLOCKS, 1.0F, 1.0F); -+ worldserver.playSound((Player) null, (double) this.aboveFarmlandPos.getX(), (double) this.aboveFarmlandPos.getY(), (double) this.aboveFarmlandPos.getZ(), this.clericWartFarmer ? SoundEvents.NETHER_WART_PLANTED : SoundEvents.CROP_PLANTED, SoundSource.BLOCKS, 1.0F, 1.0F); // Purpur +- world.playSound((Player) null, (double) this.aboveFarmlandPos.getX(), (double) this.aboveFarmlandPos.getY(), (double) this.aboveFarmlandPos.getZ(), SoundEvents.CROP_PLANTED, SoundSource.BLOCKS, 1.0F, 1.0F); ++ world.playSound((Player) null, (double) this.aboveFarmlandPos.getX(), (double) this.aboveFarmlandPos.getY(), (double) this.aboveFarmlandPos.getZ(), this.clericWartFarmer ? SoundEvents.NETHER_WART_PLANTED : SoundEvents.CROP_PLANTED, SoundSource.BLOCKS, 1.0F, 1.0F); // Purpur itemstack.shrink(1); if (itemstack.isEmpty()) { inventorysubcontainer.setItem(j, ItemStack.EMPTY); diff --git a/src/main/java/net/minecraft/world/entity/ai/behavior/TradeWithVillager.java b/src/main/java/net/minecraft/world/entity/ai/behavior/TradeWithVillager.java -index 50e04df178668ee1ba6a9dcf5e5b315c1bfd587d..6bd428e3d70bfe5ec638a5bd6f1eb03c9104e030 100644 +index 3af715e2f3f3949af614a8fcebbc4a835d48ca49..ade1e411ea1f3b4c9a417265e77b0d6861b222f9 100644 --- a/src/main/java/net/minecraft/world/entity/ai/behavior/TradeWithVillager.java +++ b/src/main/java/net/minecraft/world/entity/ai/behavior/TradeWithVillager.java @@ -56,6 +56,12 @@ public class TradeWithVillager extends Behavior { - throwHalfStack(villager, ImmutableSet.of(Items.WHEAT), villager2); + throwHalfStack(entity, ImmutableSet.of(Items.WHEAT), villager); } + // Purpur start -+ if (serverLevel.purpurConfig.villagerClericsFarmWarts && serverLevel.purpurConfig.villagerClericFarmersThrowWarts && villager.getVillagerData().getProfession() == VillagerProfession.CLERIC && villager.getInventory().countItem(Items.NETHER_WART) > Items.NETHER_WART.getMaxStackSize() / 2) { -+ throwHalfStack(villager, ImmutableSet.of(Items.NETHER_WART), villager2); ++ if (world.purpurConfig.villagerClericsFarmWarts && world.purpurConfig.villagerClericFarmersThrowWarts && entity.getVillagerData().getProfession() == VillagerProfession.CLERIC && entity.getInventory().countItem(Items.NETHER_WART) > Items.NETHER_WART.getMaxStackSize() / 2) { ++ throwHalfStack(entity, ImmutableSet.of(Items.NETHER_WART), villager); + } + // Purpur end + - if (!this.trades.isEmpty() && villager.getInventory().hasAnyOf(this.trades)) { - throwHalfStack(villager, this.trades, villager2); + if (!this.trades.isEmpty() && entity.getInventory().hasAnyOf(this.trades)) { + throwHalfStack(entity, this.trades, villager); } diff --git a/src/main/java/net/minecraft/world/entity/ai/behavior/VillagerGoalPackages.java b/src/main/java/net/minecraft/world/entity/ai/behavior/VillagerGoalPackages.java -index b966fa29d9f1d2253485f4f1d1f75e628151f904..ba17618784b76384737e876d790eafe76a7cec8d 100644 +index 9400556aca4cd06ad311975d74a9e7eb2ccd9c73..9d95daf3f388cf783a68625856e8cde9a64d03ea 100644 --- a/src/main/java/net/minecraft/world/entity/ai/behavior/VillagerGoalPackages.java +++ b/src/main/java/net/minecraft/world/entity/ai/behavior/VillagerGoalPackages.java -@@ -27,8 +27,13 @@ public class VillagerGoalPackages { +@@ -30,8 +30,13 @@ public class VillagerGoalPackages { } - public static ImmutableList>> getWorkPackage(VillagerProfession profession, float speed) { + public static ImmutableList>> getWorkPackage(VillagerProfession profession, float speed) { + // Purpur start + return getWorkPackage(profession, speed, false); + } -+ public static ImmutableList>> getWorkPackage(VillagerProfession profession, float speed, boolean clericsFarmWarts) { ++ public static ImmutableList>> getWorkPackage(VillagerProfession profession, float speed, boolean clericsFarmWarts) { + // Purpur end WorkAtPoi workAtPoi; - if (profession == VillagerProfession.FARMER) { @@ -143,10 +143,10 @@ index cb1d91f9fe98f21c2afbe3894dfd9bca3bdd3ba6..d2703432af207c74ea8d298a784329c3 brain.setMemory(MemoryModuleType.SECONDARY_JOB_SITE, list); } else { diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java -index 0db007e61478688ca7198587e3a444ef63e3b65a..179e15adbb6a5999a24dc9bcb8dd51ca24c38bee 100644 +index 80a0639c35906fdb3ed07f14395fc3009010fa7c..b1fec0d6559f8f6e37e1dfb71a4c9931807bfd96 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java -@@ -224,7 +224,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -220,7 +220,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler brain.addActivity(Activity.PLAY, VillagerGoalPackages.getPlayPackage(0.5F)); } else { brain.setSchedule(Schedule.VILLAGER_DEFAULT); @@ -155,7 +155,7 @@ index 0db007e61478688ca7198587e3a444ef63e3b65a..179e15adbb6a5999a24dc9bcb8dd51ca } brain.addActivity(Activity.CORE, VillagerGoalPackages.getCorePackage(villagerprofession, 0.5F)); -@@ -962,6 +962,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -952,6 +952,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler } public boolean hasFarmSeeds() { @@ -168,10 +168,10 @@ index 0db007e61478688ca7198587e3a444ef63e3b65a..179e15adbb6a5999a24dc9bcb8dd51ca } diff --git a/src/main/java/net/minecraft/world/entity/npc/VillagerProfession.java b/src/main/java/net/minecraft/world/entity/npc/VillagerProfession.java -index b1f20cb356e6b4e89fdddf4e48f2fd932bdb5170..352a7df156c638684a12a864eb5a9d0625a00e0b 100644 +index ac70c2c03241e73943bd517a8c69dd05e0873634..0318663a824d2a9515f867a075d148c3fcb1a907 100644 --- a/src/main/java/net/minecraft/world/entity/npc/VillagerProfession.java +++ b/src/main/java/net/minecraft/world/entity/npc/VillagerProfession.java -@@ -25,7 +25,7 @@ public record VillagerProfession(String name, Predicate> heldJob +@@ -26,7 +26,7 @@ public record VillagerProfession(String name, Predicate> heldJob public static final VillagerProfession ARMORER = register("armorer", PoiTypes.ARMORER, SoundEvents.VILLAGER_WORK_ARMORER); public static final VillagerProfession BUTCHER = register("butcher", PoiTypes.BUTCHER, SoundEvents.VILLAGER_WORK_BUTCHER); public static final VillagerProfession CARTOGRAPHER = register("cartographer", PoiTypes.CARTOGRAPHER, SoundEvents.VILLAGER_WORK_CARTOGRAPHER); @@ -181,10 +181,10 @@ index b1f20cb356e6b4e89fdddf4e48f2fd932bdb5170..352a7df156c638684a12a864eb5a9d06 public static final VillagerProfession FISHERMAN = register("fisherman", PoiTypes.FISHERMAN, SoundEvents.VILLAGER_WORK_FISHERMAN); public static final VillagerProfession FLETCHER = register("fletcher", PoiTypes.FLETCHER, SoundEvents.VILLAGER_WORK_FLETCHER); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index faf278a00309014f3992f5e69f12b214580e20f1..fe5d597bccf3669033bdda0d80c8cc22a396f27d 100644 +index e64db82ac1305a89a692e851040bd0b6a1202282..60b2375d5dceeda700a20a4e7f5d19c0dcd0e8e0 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1775,6 +1775,8 @@ public class PurpurWorldConfig { +@@ -1778,6 +1778,8 @@ public class PurpurWorldConfig { public boolean villagerCanBeLeashed = false; public boolean villagerCanBreed = true; public int villagerBreedingTicks = 6000; @@ -193,7 +193,7 @@ index faf278a00309014f3992f5e69f12b214580e20f1..fe5d597bccf3669033bdda0d80c8cc22 private void villagerSettings() { villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); -@@ -1791,6 +1793,8 @@ public class PurpurWorldConfig { +@@ -1792,6 +1794,8 @@ public class PurpurWorldConfig { villagerCanBeLeashed = getBoolean("mobs.villager.can-be-leashed", villagerCanBeLeashed); villagerCanBreed = getBoolean("mobs.villager.can-breed", villagerCanBreed); villagerBreedingTicks = getInt("mobs.villager.breeding-delay-ticks", villagerBreedingTicks); diff --git a/patches/server/0118-Toggle-for-Zombified-Piglin-death-always-counting-as.patch b/patches/server/0114-Toggle-for-Zombified-Piglin-death-always-counting-as.patch similarity index 87% rename from patches/server/0118-Toggle-for-Zombified-Piglin-death-always-counting-as.patch rename to patches/server/0114-Toggle-for-Zombified-Piglin-death-always-counting-as.patch index 0f82fe487..396feabea 100644 --- a/patches/server/0118-Toggle-for-Zombified-Piglin-death-always-counting-as.patch +++ b/patches/server/0114-Toggle-for-Zombified-Piglin-death-always-counting-as.patch @@ -13,10 +13,10 @@ to the Piglin being angry, even though the player never hit them. This patch adds a toggle to disable this behavior. diff --git a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java -index 6c1dd723373f9b1b920548de85aeb6cef0120fa7..1f0003fb08a45af02e6d38e28fa548abe480426b 100644 +index 9bec6222a8145f84f4b748e8c96e02fa0d6f14d2..2ff0166a26ede86e8410b003a5e7f051559dd05d 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java -@@ -143,7 +143,7 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { +@@ -152,7 +152,7 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { this.maybeAlertOthers(); } @@ -25,7 +25,7 @@ index 6c1dd723373f9b1b920548de85aeb6cef0120fa7..1f0003fb08a45af02e6d38e28fa548ab this.lastHurtByPlayerTime = this.tickCount; } -@@ -198,7 +198,7 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { +@@ -207,7 +207,7 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { this.ticksUntilNextAlert = ZombifiedPiglin.ALERT_INTERVAL.sample(this.random); } @@ -35,10 +35,10 @@ index 6c1dd723373f9b1b920548de85aeb6cef0120fa7..1f0003fb08a45af02e6d38e28fa548ab } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index fe5d597bccf3669033bdda0d80c8cc22a396f27d..d70b1172c7eae2a7f8bd4c3c28638e2c1fe59884 100644 +index 60b2375d5dceeda700a20a4e7f5d19c0dcd0e8e0..49db5068a28a1ee08b076aeef3d9f10c5c206254 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -2021,6 +2021,7 @@ public class PurpurWorldConfig { +@@ -2022,6 +2022,7 @@ public class PurpurWorldConfig { public boolean zombifiedPiglinJockeyOnlyBaby = true; public double zombifiedPiglinJockeyChance = 0.05D; public boolean zombifiedPiglinJockeyTryExistingChickens = true; @@ -46,7 +46,7 @@ index fe5d597bccf3669033bdda0d80c8cc22a396f27d..d70b1172c7eae2a7f8bd4c3c28638e2c private void zombifiedPiglinSettings() { zombifiedPiglinRidable = getBoolean("mobs.zombified_piglin.ridable", zombifiedPiglinRidable); zombifiedPiglinRidableInWater = getBoolean("mobs.zombified_piglin.ridable-in-water", zombifiedPiglinRidableInWater); -@@ -2035,5 +2036,6 @@ public class PurpurWorldConfig { +@@ -2036,5 +2037,6 @@ public class PurpurWorldConfig { 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); diff --git a/patches/server/0120-Configurable-chance-for-wolves-to-spawn-rabid.patch b/patches/server/0115-Configurable-chance-for-wolves-to-spawn-rabid.patch similarity index 97% rename from patches/server/0120-Configurable-chance-for-wolves-to-spawn-rabid.patch rename to patches/server/0115-Configurable-chance-for-wolves-to-spawn-rabid.patch index e4a713d07..65aec8410 100644 --- a/patches/server/0120-Configurable-chance-for-wolves-to-spawn-rabid.patch +++ b/patches/server/0115-Configurable-chance-for-wolves-to-spawn-rabid.patch @@ -7,7 +7,7 @@ Configurable chance to spawn a wolf that is rabid. Rabid wolves attack all players, mobs, and animals. diff --git a/src/main/java/net/minecraft/world/entity/animal/Wolf.java b/src/main/java/net/minecraft/world/entity/animal/Wolf.java -index 28e35304e76b26af734fcfbccef8f43143345576..b0ea5dda197b6ca88e5d80c16a9007a4abc3c7ac 100644 +index d26a4175a08a7489f5bd17a07ed244a83884f024..73741cd019cbe57225203f76f645a6b58c02b5e3 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Wolf.java +++ b/src/main/java/net/minecraft/world/entity/animal/Wolf.java @@ -10,6 +10,7 @@ import net.minecraft.network.syncher.EntityDataAccessor; @@ -222,10 +222,10 @@ index e43fd3e59fd8c74828ae65965fade27f56beef65..b2f133c8baabba1cffa6e92ea0f85453 + // Purpur end } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index d70b1172c7eae2a7f8bd4c3c28638e2c1fe59884..2b2d40f36fa3f4990450bb9e4a81e8abf8b2b2f4 100644 +index 49db5068a28a1ee08b076aeef3d9f10c5c206254..4df6138a186d3dc8701a580596a27c0676d5c65a 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1906,6 +1906,8 @@ public class PurpurWorldConfig { +@@ -1907,6 +1907,8 @@ public class PurpurWorldConfig { public boolean wolfRidableInWater = false; public boolean wolfControllable = true; public double wolfMaxHealth = 8.0D; @@ -234,7 +234,7 @@ index d70b1172c7eae2a7f8bd4c3c28638e2c1fe59884..2b2d40f36fa3f4990450bb9e4a81e8ab public int wolfBreedingTicks = 6000; private void wolfSettings() { wolfRidable = getBoolean("mobs.wolf.ridable", wolfRidable); -@@ -1917,6 +1919,8 @@ public class PurpurWorldConfig { +@@ -1918,6 +1920,8 @@ public class PurpurWorldConfig { set("mobs.wolf.attributes.max_health", oldValue); } wolfMaxHealth = getDouble("mobs.wolf.attributes.max_health", wolfMaxHealth); diff --git a/patches/server/0121-Configurable-default-collar-color.patch b/patches/server/0116-Configurable-default-collar-color.patch similarity index 86% rename from patches/server/0121-Configurable-default-collar-color.patch rename to patches/server/0116-Configurable-default-collar-color.patch index 71a29fd14..f7bdb328a 100644 --- a/patches/server/0121-Configurable-default-collar-color.patch +++ b/patches/server/0116-Configurable-default-collar-color.patch @@ -7,10 +7,10 @@ This allows for the server to set a default collar color when a wolf or cat is t Resets to RED when the value is invalid. diff --git a/src/main/java/net/minecraft/world/entity/animal/Cat.java b/src/main/java/net/minecraft/world/entity/animal/Cat.java -index a731a834098fa78995c7b0445865d3f7fa8700fa..3641599a119d5416b5756a972f9eb7fc6fbabcf6 100644 +index b9bee600eb2a8cbe8f87c1183fdadd0974ece90b..049e1460320e039610b87fe018e4b6c5c49dc233 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cat.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cat.java -@@ -346,6 +346,14 @@ public class Cat extends TamableAnimal { +@@ -348,6 +348,14 @@ public class Cat extends TamableAnimal implements VariantHolder { return Mth.lerp(tickDelta, this.relaxStateOneAmountO, this.relaxStateOneAmount); } @@ -22,11 +22,11 @@ index a731a834098fa78995c7b0445865d3f7fa8700fa..3641599a119d5416b5756a972f9eb7fc + } + // Purpur end + + @Nullable @Override public Cat getBreedOffspring(ServerLevel world, AgeableMob entity) { - Cat entitycat = (Cat) EntityType.CAT.create(world); diff --git a/src/main/java/net/minecraft/world/entity/animal/Wolf.java b/src/main/java/net/minecraft/world/entity/animal/Wolf.java -index b0ea5dda197b6ca88e5d80c16a9007a4abc3c7ac..63d0754427a01fb2bd85b9bf9d6e63d533c6995b 100644 +index 73741cd019cbe57225203f76f645a6b58c02b5e3..ef2405b5e32e581c488e8b943e143faeb9ddd135 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Wolf.java +++ b/src/main/java/net/minecraft/world/entity/animal/Wolf.java @@ -201,6 +201,12 @@ public class Wolf extends TamableAnimal implements NeutralMob { @@ -43,10 +43,10 @@ index b0ea5dda197b6ca88e5d80c16a9007a4abc3c7ac..63d0754427a01fb2bd85b9bf9d6e63d5 @Override diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 2b2d40f36fa3f4990450bb9e4a81e8abf8b2b2f4..5d47a6e938b293bffa5dd27d2155d2048bb0220f 100644 +index 4df6138a186d3dc8701a580596a27c0676d5c65a..c7e0b1bc3b07bf7f163978348c5cf34d09f85d26 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -599,6 +599,7 @@ public class PurpurWorldConfig { +@@ -604,6 +604,7 @@ public class PurpurWorldConfig { public int catSpawnSwampHutScanRange = 16; public int catSpawnVillageScanRange = 48; public int catBreedingTicks = 6000; @@ -54,7 +54,7 @@ index 2b2d40f36fa3f4990450bb9e4a81e8abf8b2b2f4..5d47a6e938b293bffa5dd27d2155d204 private void catSettings() { catRidable = getBoolean("mobs.cat.ridable", catRidable); catRidableInWater = getBoolean("mobs.cat.ridable-in-water", catRidableInWater); -@@ -613,6 +614,11 @@ public class PurpurWorldConfig { +@@ -618,6 +619,11 @@ public class PurpurWorldConfig { catSpawnSwampHutScanRange = getInt("mobs.cat.scan-range-for-other-cats.swamp-hut", catSpawnSwampHutScanRange); catSpawnVillageScanRange = getInt("mobs.cat.scan-range-for-other-cats.village", catSpawnVillageScanRange); catBreedingTicks = getInt("mobs.cat.breeding-delay-ticks", catBreedingTicks); @@ -66,7 +66,7 @@ index 2b2d40f36fa3f4990450bb9e4a81e8abf8b2b2f4..5d47a6e938b293bffa5dd27d2155d204 } public boolean caveSpiderRidable = false; -@@ -1906,6 +1912,7 @@ public class PurpurWorldConfig { +@@ -1907,6 +1913,7 @@ public class PurpurWorldConfig { public boolean wolfRidableInWater = false; public boolean wolfControllable = true; public double wolfMaxHealth = 8.0D; @@ -74,7 +74,7 @@ index 2b2d40f36fa3f4990450bb9e4a81e8abf8b2b2f4..5d47a6e938b293bffa5dd27d2155d204 public boolean wolfMilkCuresRabies = true; public double wolfNaturalRabid = 0.0D; public int wolfBreedingTicks = 6000; -@@ -1919,6 +1926,11 @@ public class PurpurWorldConfig { +@@ -1920,6 +1927,11 @@ public class PurpurWorldConfig { set("mobs.wolf.attributes.max_health", oldValue); } wolfMaxHealth = getDouble("mobs.wolf.attributes.max_health", wolfMaxHealth); diff --git a/patches/server/0122-Phantom-flames-on-swoop.patch b/patches/server/0117-Phantom-flames-on-swoop.patch similarity index 91% rename from patches/server/0122-Phantom-flames-on-swoop.patch rename to patches/server/0117-Phantom-flames-on-swoop.patch index c5baea3d9..0b799afaf 100644 --- a/patches/server/0122-Phantom-flames-on-swoop.patch +++ b/patches/server/0117-Phantom-flames-on-swoop.patch @@ -17,10 +17,10 @@ index 11cbb89eb062de0cd30158dbfbef13554f81cf9f..162f8f6f368266ce238247901277f78c @Override diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 5d47a6e938b293bffa5dd27d2155d2048bb0220f..079226c0708a33edd2e5f498a5490670e5278e74 100644 +index 87951bef82e17c96299f17ed559d39f7c1100bf0..dea71dc10747f814a33f2e0dc8fe022b8acba3d1 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1277,6 +1277,7 @@ public class PurpurWorldConfig { +@@ -1282,6 +1282,7 @@ public class PurpurWorldConfig { public int phantomBurnInLight = 0; public boolean phantomIgnorePlayersWithTorch = false; public boolean phantomBurnInDaylight = true; @@ -28,7 +28,7 @@ index 5d47a6e938b293bffa5dd27d2155d2048bb0220f..079226c0708a33edd2e5f498a5490670 private void phantomSettings() { phantomRidable = getBoolean("mobs.phantom.ridable", phantomRidable); phantomRidableInWater = getBoolean("mobs.phantom.ridable-in-water", phantomRidableInWater); -@@ -1310,6 +1311,7 @@ public class PurpurWorldConfig { +@@ -1315,6 +1316,7 @@ public class PurpurWorldConfig { phantomBurnInLight = getInt("mobs.phantom.burn-in-light", phantomBurnInLight); phantomBurnInDaylight = getBoolean("mobs.phantom.burn-in-daylight", phantomBurnInDaylight); phantomIgnorePlayersWithTorch = getBoolean("mobs.phantom.ignore-players-with-torch", phantomIgnorePlayersWithTorch); diff --git a/patches/server/0123-Option-for-chests-to-open-even-with-a-solid-block-on.patch b/patches/server/0118-Option-for-chests-to-open-even-with-a-solid-block-on.patch similarity index 94% rename from patches/server/0123-Option-for-chests-to-open-even-with-a-solid-block-on.patch rename to patches/server/0118-Option-for-chests-to-open-even-with-a-solid-block-on.patch index 1adbe0315..15db1c692 100644 --- a/patches/server/0123-Option-for-chests-to-open-even-with-a-solid-block-on.patch +++ b/patches/server/0118-Option-for-chests-to-open-even-with-a-solid-block-on.patch @@ -17,7 +17,7 @@ index c6b57d45383441aa35510e759ce3cb82bc98f305..330ff3bc5fd8625e37b79e1204eddbe8 return world.getBlockState(blockposition1).isRedstoneConductor(world, blockposition1); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 4cf965cc6ffaef8b5c655a17faa79fde45a0ff15..3155dbf8ba8871d32cbe13400bbd5d01a5d47a8f 100644 +index ce7477b823d8e7516cc67bb381ab4ffc81996879..7f0454cdda13b145dc6ed3209ddd60f4363ee3c4 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -421,6 +421,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0124-Implement-TPSBar.patch b/patches/server/0119-Implement-TPSBar.patch similarity index 92% rename from patches/server/0124-Implement-TPSBar.patch rename to patches/server/0119-Implement-TPSBar.patch index 19d0cbc6c..3b15f16c6 100644 --- a/patches/server/0124-Implement-TPSBar.patch +++ b/patches/server/0119-Implement-TPSBar.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Implement TPSBar diff --git a/src/main/java/net/minecraft/commands/Commands.java b/src/main/java/net/minecraft/commands/Commands.java -index 756153203a1a1cab7ac46b88d5745cd5bc090438..e5e8f39a63f232b73d74c3350aa74bb5569f21c4 100644 +index a7eee1f0ed063d1006c91adcac92e142c7d6701b..880eb2697c156a1bdf81582a8cc4862a6892f042 100644 --- a/src/main/java/net/minecraft/commands/Commands.java +++ b/src/main/java/net/minecraft/commands/Commands.java -@@ -210,6 +210,7 @@ public class Commands { +@@ -218,6 +218,7 @@ public class Commands { org.purpurmc.purpur.command.CreditsCommand.register(this.dispatcher); // Purpur org.purpurmc.purpur.command.DemoCommand.register(this.dispatcher); // Purpur org.purpurmc.purpur.command.PingCommand.register(this.dispatcher); // Purpur @@ -17,42 +17,42 @@ index 756153203a1a1cab7ac46b88d5745cd5bc090438..e5e8f39a63f232b73d74c3350aa74bb5 if (environment.includeIntegrated) { diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index a1f830b27137f660fd2f0d95eb4b6692ecb56943..d4785d3001ad652f8c01bd0e2f71fe7b4de1661f 100644 +index fd5f4ed9ad706ab907595e2ddbe5a949d941b4a6..35e0499575e9567093c187728bc37273f602531e 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1022,6 +1022,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop -Date: Mon, 7 Dec 2020 17:52:36 +0000 -Subject: [PATCH] Spread out and optimise player list ticksSpread out and - optimise player list ticks - - -diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index 4dbc1744cb07899e6795d74d24c00bb72c7b0911..ebec09ff2816f5212d032847cf7cde4e4aeef82c 100644 ---- a/src/main/java/net/minecraft/server/players/PlayerList.java -+++ b/src/main/java/net/minecraft/server/players/PlayerList.java -@@ -1028,22 +1028,22 @@ public abstract class PlayerList { - } - - public void tick() { -- if (++this.sendAllPlayerInfoIn > 600) { -- // CraftBukkit start -- for (int i = 0; i < this.players.size(); ++i) { -- final ServerPlayer target = (ServerPlayer) this.players.get(i); -- -- target.connection.send(new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.UPDATE_LATENCY, this.players.stream().filter(new Predicate() { -- @Override -- public boolean test(ServerPlayer input) { -- return target.getBukkitEntity().canSee(input.getBukkitEntity()); -- } -- }).collect(Collectors.toList()))); -+ // Purpur start -+ if (this.sendAllPlayerInfoIn < this.players.size()) { -+ final org.bukkit.craftbukkit.entity.CraftPlayer target = this.players.get(this.sendAllPlayerInfoIn).getBukkitEntity(); -+ final List list = new java.util.ArrayList<>(); -+ for (ServerPlayer player : this.players) { -+ if (target.canSee(player.getUUID())) { -+ list.add(player); -+ } - } -- // CraftBukkit end -- this.sendAllPlayerInfoIn = 0; -+ target.getHandle().connection.send(new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.UPDATE_LATENCY, list)); - } - -+ if (++this.sendAllPlayerInfoIn > 600) { -+ this.sendAllPlayerInfoIn = 0; -+ } -+ // Purpur end - } - - public void broadcastAll(Packet packet) { -diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 78e36e1ac3e79ff4f01a3f5b3183956c9223f7e2..c82e2ce3f94f658a0cf66445a4507fc696760820 100644 ---- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -1892,7 +1892,13 @@ public class CraftPlayer extends CraftHumanEntity implements Player { - - @Override - public boolean canSee(org.bukkit.entity.Entity entity) { -- return !this.hiddenEntities.containsKey(entity.getUniqueId()); -+ // Purpur start -+ return this.canSee(entity.getUniqueId()); -+ } -+ -+ public boolean canSee(UUID uuid) { -+ return !this.hiddenEntities.containsKey(uuid); -+ // Purpur end - } - - @Override diff --git a/patches/server/0125-Striders-give-saddle-back.patch b/patches/server/0120-Striders-give-saddle-back.patch similarity index 86% rename from patches/server/0125-Striders-give-saddle-back.patch rename to patches/server/0120-Striders-give-saddle-back.patch index 7dd87683a..5397f0866 100644 --- a/patches/server/0125-Striders-give-saddle-back.patch +++ b/patches/server/0120-Striders-give-saddle-back.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Striders give saddle back diff --git a/src/main/java/net/minecraft/world/entity/monster/Strider.java b/src/main/java/net/minecraft/world/entity/monster/Strider.java -index eb2083d67f9486a24d2f0aa4bf1f5ba8a00e23a3..df9d16a6493a57b6034cd56bf8dbe38fe7c5cda1 100644 +index 162fc0f879b882c934000ebb71e6eef6459876b6..521680926277d4c2bcfa0c6e482c92d9ce9267f4 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Strider.java +++ b/src/main/java/net/minecraft/world/entity/monster/Strider.java -@@ -455,6 +455,19 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { +@@ -456,6 +456,19 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { public InteractionResult mobInteract(Player player, InteractionHand hand) { boolean flag = this.isFood(player.getItemInHand(hand)); @@ -29,10 +29,10 @@ index eb2083d67f9486a24d2f0aa4bf1f5ba8a00e23a3..df9d16a6493a57b6034cd56bf8dbe38f if (!this.level.isClientSide) { player.startRiding(this); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 397edb048462b9162ec8d9d62d53c3530d59b36a..ec34d409156e22666c3a5cd4b9dc1546af594d5d 100644 +index 0569eb47d4b5d5ae318cbeadeb5a855695ade43e..d761febcea8b9e4f139cd59f916a29181d9f40c5 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1676,6 +1676,7 @@ public class PurpurWorldConfig { +@@ -1681,6 +1681,7 @@ public class PurpurWorldConfig { public boolean striderControllable = true; public double striderMaxHealth = 20.0D; public int striderBreedingTicks = 6000; @@ -40,7 +40,7 @@ index 397edb048462b9162ec8d9d62d53c3530d59b36a..ec34d409156e22666c3a5cd4b9dc1546 private void striderSettings() { striderRidable = getBoolean("mobs.strider.ridable", striderRidable); striderRidableInWater = getBoolean("mobs.strider.ridable-in-water", striderRidableInWater); -@@ -1687,6 +1688,7 @@ public class PurpurWorldConfig { +@@ -1692,6 +1693,7 @@ public class PurpurWorldConfig { } striderMaxHealth = getDouble("mobs.strider.attributes.max_health", striderMaxHealth); striderBreedingTicks = getInt("mobs.strider.breeding-delay-ticks", striderBreedingTicks); diff --git a/patches/server/0126-PlayerBookTooLargeEvent.patch b/patches/server/0121-PlayerBookTooLargeEvent.patch similarity index 92% rename from patches/server/0126-PlayerBookTooLargeEvent.patch rename to patches/server/0121-PlayerBookTooLargeEvent.patch index 931855d58..039639044 100644 --- a/patches/server/0126-PlayerBookTooLargeEvent.patch +++ b/patches/server/0121-PlayerBookTooLargeEvent.patch @@ -5,10 +5,10 @@ Subject: [PATCH] PlayerBookTooLargeEvent diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 39381bfc3a0ec0befe144c71b186153ac8d9e03c..8bfabb7cfad23f92156c0e216b75d26cf9120a08 100644 +index cb36cc5248a7166fa8d43cabb6ada371c1026aaa..22c35d1e16bed3b9c16d776ffe1621c3fe21f58f 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -1262,10 +1262,12 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -1252,10 +1252,12 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic int maxBookPageSize = io.papermc.paper.configuration.GlobalConfiguration.get().itemValidation.bookSize.pageMax; double multiplier = Math.max(0.3D, Math.min(1D, io.papermc.paper.configuration.GlobalConfiguration.get().itemValidation.bookSize.totalMultiplier)); long byteAllowed = maxBookPageSize; @@ -21,7 +21,7 @@ index 39381bfc3a0ec0befe144c71b186153ac8d9e03c..8bfabb7cfad23f92156c0e216b75d26c server.scheduleOnMain(() -> this.disconnect("Book too large!", org.bukkit.event.player.PlayerKickEvent.Cause.ILLEGAL_ACTION)); // Paper - kick event cause return; } -@@ -1289,6 +1291,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -1279,6 +1281,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic if (byteTotal > byteAllowed) { ServerGamePacketListenerImpl.LOGGER.warn(this.player.getScoreboardName() + " tried to send too large of a book. Book Size: " + byteTotal + " - Allowed: "+ byteAllowed + " - Pages: " + pageList.size()); diff --git a/patches/server/0127-Full-netherite-armor-grants-fire-resistance.patch b/patches/server/0122-Full-netherite-armor-grants-fire-resistance.patch similarity index 93% rename from patches/server/0127-Full-netherite-armor-grants-fire-resistance.patch rename to patches/server/0122-Full-netherite-armor-grants-fire-resistance.patch index 6baffdf5f..7d0465e74 100644 --- a/patches/server/0127-Full-netherite-armor-grants-fire-resistance.patch +++ b/patches/server/0122-Full-netherite-armor-grants-fire-resistance.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Full netherite armor grants fire resistance diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java -index df34e5332a6d9c36cad89bac72b5f27892c6192a..f10a048d962ff80f566db11a8490e725d4484cb1 100644 +index f129bb64a142f16e32f33cfa418ac498d44ad3c2..45385fe2e5249f4a61acd09b7b7ec3932df95adc 100644 --- a/src/main/java/net/minecraft/world/entity/player/Player.java +++ b/src/main/java/net/minecraft/world/entity/player/Player.java -@@ -368,6 +368,16 @@ public abstract class Player extends LivingEntity { +@@ -361,6 +361,16 @@ public abstract class Player extends LivingEntity { this.addEffect(new MobEffectInstance(MobEffects.WATER_BREATHING, 200, 0, false, false, true), org.bukkit.event.entity.EntityPotionEffectEvent.Cause.TURTLE_HELMET); // CraftBukkit } @@ -26,7 +26,7 @@ index df34e5332a6d9c36cad89bac72b5f27892c6192a..f10a048d962ff80f566db11a8490e725 protected ItemCooldowns createItemCooldowns() { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 20099e9f2abac2a34a3ac86d17dd0860fe0d864a..d0176655802d082a946cf84d06824ff1505ba1bb 100644 +index c67035b2a176e9e0167057f354b249eec08b7512..55f425457666075d7ecb6ece9cfeb29eb6050e8c 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -298,6 +298,19 @@ public class PurpurWorldConfig { diff --git a/patches/server/0128-Fix-rotating-UP-DOWN-CW-and-CCW.patch b/patches/server/0123-Fix-rotating-UP-DOWN-CW-and-CCW.patch similarity index 83% rename from patches/server/0128-Fix-rotating-UP-DOWN-CW-and-CCW.patch rename to patches/server/0123-Fix-rotating-UP-DOWN-CW-and-CCW.patch index 9894962bc..71ad01592 100644 --- a/patches/server/0128-Fix-rotating-UP-DOWN-CW-and-CCW.patch +++ b/patches/server/0123-Fix-rotating-UP-DOWN-CW-and-CCW.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Fix rotating UP/DOWN CW and CCW diff --git a/src/main/java/net/minecraft/core/Direction.java b/src/main/java/net/minecraft/core/Direction.java -index a3bbebcdaea9e0dfddd9825272f84fc76cd13e89..6c27b22dd1d497687c0f4d3835e34149bcf952c1 100644 +index c1172ba542bc07e0c780a50d5b4ce26ac04c1720..a4dc96b1a3bf309584657e3a1e7dfaea967f9425 100644 --- a/src/main/java/net/minecraft/core/Direction.java +++ b/src/main/java/net/minecraft/core/Direction.java -@@ -252,6 +252,12 @@ public enum Direction implements StringRepresentable { +@@ -247,6 +247,12 @@ public enum Direction implements StringRepresentable { case EAST: var10000 = SOUTH; break; @@ -21,7 +21,7 @@ index a3bbebcdaea9e0dfddd9825272f84fc76cd13e89..6c27b22dd1d497687c0f4d3835e34149 default: throw new IllegalStateException("Unable to get Y-rotated facing of " + this); } -@@ -364,6 +370,12 @@ public enum Direction implements StringRepresentable { +@@ -359,6 +365,12 @@ public enum Direction implements StringRepresentable { case EAST: var10000 = NORTH; break; diff --git a/patches/server/0129-Add-mobGriefing-bypass-to-everything-affected.patch b/patches/server/0124-Add-mobGriefing-bypass-to-everything-affected.patch similarity index 86% rename from patches/server/0129-Add-mobGriefing-bypass-to-everything-affected.patch rename to patches/server/0124-Add-mobGriefing-bypass-to-everything-affected.patch index e1ae622fc..48b48bde1 100644 --- a/patches/server/0129-Add-mobGriefing-bypass-to-everything-affected.patch +++ b/patches/server/0124-Add-mobGriefing-bypass-to-everything-affected.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add mobGriefing bypass to everything affected diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 211f7455553835bfb7012a95779bb11750a9d621..7389823c8055f644be63a66d12bada0dddfff009 100644 +index 192da1b616b3a6bcf2c5e6e172903e99867aefbe..78cfa3effceaa96e186abaafa21b68e3f3b4430a 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -1732,7 +1732,7 @@ public abstract class LivingEntity extends Entity { +@@ -1726,7 +1726,7 @@ public abstract class LivingEntity extends Entity { boolean flag = false; if (this.dead && adversary instanceof WitherBoss) { // Paper @@ -18,10 +18,10 @@ index 211f7455553835bfb7012a95779bb11750a9d621..7389823c8055f644be63a66d12bada0d BlockState iblockdata = Blocks.WITHER_ROSE.defaultBlockState(); diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java -index 66f64ed2e8245339343d993199b1ace93ce52cee..7273474e296618663d3fbba813891197bc8480f8 100644 +index cc9e7eeb17d16b402e1f65144f4e4d1be43c5081..e2da9113227d397c8d5f1f8eca167d6fd9b0417d 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java -@@ -670,7 +670,7 @@ public abstract class Mob extends LivingEntity { +@@ -668,7 +668,7 @@ public abstract class Mob extends LivingEntity { public void aiStep() { super.aiStep(); this.level.getProfiler().push("looting"); @@ -31,7 +31,7 @@ index 66f64ed2e8245339343d993199b1ace93ce52cee..7273474e296618663d3fbba813891197 List list = this.level.getEntitiesOfClass(ItemEntity.class, this.getBoundingBox().inflate((double) baseblockposition.getX(), (double) baseblockposition.getY(), (double) baseblockposition.getZ())); Iterator iterator = list.iterator(); diff --git a/src/main/java/net/minecraft/world/entity/ai/behavior/HarvestFarmland.java b/src/main/java/net/minecraft/world/entity/ai/behavior/HarvestFarmland.java -index 2ad6f887db730466da39ad8fdd7c97c098e9966a..6fb6b505b83bbb439eed75ece472074fb752c1fb 100644 +index ed67d2adf06f7ae9c451648e30945ad289ceae38..2dca8e45b9b1f5451db2734cba4c2b03c9dd303b 100644 --- a/src/main/java/net/minecraft/world/entity/ai/behavior/HarvestFarmland.java +++ b/src/main/java/net/minecraft/world/entity/ai/behavior/HarvestFarmland.java @@ -41,7 +41,7 @@ public class HarvestFarmland extends Behavior { @@ -92,10 +92,10 @@ index bd0cbf4390fc7d00b4bd5008cdf8f6f49df4f69b..27e96c4c1377c49f03df032683aac32d } else if (this.nextStartTick > 0) { --this.nextStartTick; diff --git a/src/main/java/net/minecraft/world/entity/animal/Fox.java b/src/main/java/net/minecraft/world/entity/animal/Fox.java -index ae02191f9cd8969a938655e4fba1bbe260d1dd88..18cc92406057b3c47ba00ddfe7cebeb99f8a106d 100644 +index 014fed23d40a20de65fe94046a0e8a34e4717eb8..59a3c234d27a9efe32e01b61848ce4cdec7977be 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Fox.java +++ b/src/main/java/net/minecraft/world/entity/animal/Fox.java -@@ -1371,7 +1371,7 @@ public class Fox extends Animal { +@@ -1376,7 +1376,7 @@ public class Fox extends Animal implements VariantHolder { } protected void onReachedTarget() { @@ -105,10 +105,10 @@ index ae02191f9cd8969a938655e4fba1bbe260d1dd88..18cc92406057b3c47ba00ddfe7cebeb9 if (iblockdata.is(Blocks.SWEET_BERRY_BUSH)) { diff --git a/src/main/java/net/minecraft/world/entity/animal/Rabbit.java b/src/main/java/net/minecraft/world/entity/animal/Rabbit.java -index 93d65e8e7b15060c9d7931d22aa2ff77a2616d0b..b8dd08ad346e90ddde14289441d6e52776c42538 100644 +index 07db7419cc2ca1ba12b34d9e8c00095ecc6d8fde..9e1d703a366e18e8287ed86fbafdc9054bff04d8 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Rabbit.java +++ b/src/main/java/net/minecraft/world/entity/animal/Rabbit.java -@@ -619,7 +619,7 @@ public class Rabbit extends Animal { +@@ -630,7 +630,7 @@ public class Rabbit extends Animal implements VariantHolder { @Override public boolean canUse() { if (this.nextStartTick <= 0) { @@ -131,7 +131,7 @@ index b9025929fcc89e72aa820953b91a65423878ba0f..edf4537f08a54e1a5b043927678bbddf } diff --git a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java -index 84b783862630a001db4a19fd2eceee4db5c51756..5b60abfb44640149e92ead0cda8c426484574fe2 100644 +index e8672137aa9ff8c7ae11b6e5c963a2dbe739cff8..fe1ba45984f253422f58158c6558cb75bbc4a6eb 100644 --- a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java +++ b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java @@ -578,7 +578,7 @@ public class EnderDragon extends Mob implements Enemy { @@ -144,19 +144,10 @@ index 84b783862630a001db4a19fd2eceee4db5c51756..5b60abfb44640149e92ead0cda8c4264 // flag1 = this.level.removeBlock(blockposition, false) || flag1; flag1 = true; diff --git a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java -index abf4490d8366ec6587178688228375093563b9b5..8278cb7b57a1910c822fa85cebec033b95725c03 100644 +index 991525cb5f0265678d61759ff55c1479ce3a92de..75489ea612a74db34977e0ff67edc25350e694f9 100644 --- a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java +++ b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java -@@ -402,7 +402,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob - i = this.getInvulnerableTicks() - 1; - this.bossEvent.setProgress(1.0F - (float) i / 220.0F); - if (i <= 0) { -- Explosion.BlockInteraction explosion_effect = this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) ? Explosion.BlockInteraction.DESTROY : Explosion.BlockInteraction.NONE; -+ Explosion.BlockInteraction explosion_effect = (this.level.purpurConfig.witherBypassMobGriefing || this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) ? Explosion.BlockInteraction.DESTROY : Explosion.BlockInteraction.NONE; // Purpur - // CraftBukkit start - // this.level.explode(this, this.getX(), this.getEyeY(), this.getZ(), 7.0F, false, explosion_effect); - ExplosionPrimeEvent event = new ExplosionPrimeEvent(this.getBukkitEntity(), 7.0F, false); -@@ -497,7 +497,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob +@@ -495,7 +495,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob if (this.destroyBlocksTick > 0) { --this.destroyBlocksTick; @@ -165,24 +156,11 @@ index abf4490d8366ec6587178688228375093563b9b5..8278cb7b57a1910c822fa85cebec033b i = Mth.floor(this.getY()); j = Mth.floor(this.getX()); int i1 = Mth.floor(this.getZ()); -diff --git a/src/main/java/net/minecraft/world/entity/monster/Creeper.java b/src/main/java/net/minecraft/world/entity/monster/Creeper.java -index 262dff21467fa6dc79126a96575a8fe9c49b9116..e5b8e09bfb03663afb19214b2759df30fe448704 100644 ---- a/src/main/java/net/minecraft/world/entity/monster/Creeper.java -+++ b/src/main/java/net/minecraft/world/entity/monster/Creeper.java -@@ -349,7 +349,7 @@ public class Creeper extends Monster implements PowerableMob { - - public void explodeCreeper() { - if (!this.level.isClientSide) { -- Explosion.BlockInteraction explosion_effect = this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) && level.purpurConfig.creeperAllowGriefing ? Explosion.BlockInteraction.DESTROY : Explosion.BlockInteraction.NONE; // Purpur -+ Explosion.BlockInteraction explosion_effect = (this.level.purpurConfig.creeperBypassMobGriefing || this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) && level.purpurConfig.creeperAllowGriefing ? Explosion.BlockInteraction.DESTROY : Explosion.BlockInteraction.NONE; // Purpur - float f = this.isPowered() ? 2.0F : 1.0F; - - // CraftBukkit start diff --git a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -index 4443a4a300d17e8568a81bcb9af89251d53a6a46..9ed04c56e840992a084f77bd667027ef0f6bb184 100644 +index 72bddd57059e4dfffa0c5ac04bb3c80cbcfd3b4a..2b311800af0c636f384e069c54ecd1ce81ddf201 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -@@ -525,7 +525,15 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -535,7 +535,15 @@ public class EnderMan extends Monster implements NeutralMob { @Override public boolean canUse() { if (!enderman.level.purpurConfig.endermanAllowGriefing) return false; // Purpur @@ -199,7 +177,7 @@ index 4443a4a300d17e8568a81bcb9af89251d53a6a46..9ed04c56e840992a084f77bd667027ef } @Override -@@ -573,7 +581,15 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -583,7 +591,15 @@ public class EnderMan extends Monster implements NeutralMob { @Override public boolean canUse() { if (!enderman.level.purpurConfig.endermanAllowGriefing) return false; // Purpur @@ -217,10 +195,10 @@ index 4443a4a300d17e8568a81bcb9af89251d53a6a46..9ed04c56e840992a084f77bd667027ef @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/Evoker.java b/src/main/java/net/minecraft/world/entity/monster/Evoker.java -index 1641d5083cad8b7cd62fc1168834ff99b5239c5a..281e8e6232c30cf5c20e9e2de4ac2ab4d0722ccf 100644 +index c220808b2a7854fa4a4e8170d7c03ba26717a8ee..8658ec12bcdf90797016f446e52c60c3271a6247 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Evoker.java +++ b/src/main/java/net/minecraft/world/entity/monster/Evoker.java -@@ -339,7 +339,7 @@ public class Evoker extends SpellcasterIllager { +@@ -341,7 +341,7 @@ public class Evoker extends SpellcasterIllager { return false; } else if (Evoker.this.tickCount < this.nextAttackTickCount) { return false; @@ -265,10 +243,10 @@ index 44e33d3007f1743f3f18b37ff61af9eb5542f529..0803e461042ea43ea60f3c798f1e1dc8 BlockPos blockposition = (new BlockPos(this.mob.getX(), this.mob.getY() + 0.5D, this.mob.getZ())).relative(this.selectedDirection); BlockState iblockdata = this.mob.level.getBlockState(blockposition); diff --git a/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java b/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java -index 75fcb651cae925ce5cb0b577a8dc39d71845aa4d..fb387956f1bb1b036558c82996c6880a130a0428 100644 +index 272a744ca52c34b5868b7979fa2b4143eeee1084..9c966db99cbc43522108a595ff9666bc518f9a98 100644 --- a/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java -@@ -413,7 +413,7 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento +@@ -431,7 +431,7 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento @Override public boolean wantsToPickUp(ItemStack stack) { @@ -278,10 +256,10 @@ index 75fcb651cae925ce5cb0b577a8dc39d71845aa4d..fb387956f1bb1b036558c82996c6880a protected boolean canReplaceCurrentItem(ItemStack stack) { diff --git a/src/main/java/net/minecraft/world/entity/projectile/LargeFireball.java b/src/main/java/net/minecraft/world/entity/projectile/LargeFireball.java -index 5237b699e000b4fed99be39b0a7e2daab9c8bf42..efa9424f8e2716f073e89b03f3d85e1b7774af9f 100644 +index 3a4b95288d390e72c0d97671ecc2e2ef2f976de1..4a3ba1f44379290b1e89366fa82c4028d888a260 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/LargeFireball.java +++ b/src/main/java/net/minecraft/world/entity/projectile/LargeFireball.java -@@ -18,20 +18,20 @@ public class LargeFireball extends Fireball { +@@ -17,20 +17,20 @@ public class LargeFireball extends Fireball { public LargeFireball(EntityType type, Level world) { super(type, world); @@ -306,10 +284,10 @@ index 5237b699e000b4fed99be39b0a7e2daab9c8bf42..efa9424f8e2716f073e89b03f3d85e1b // CraftBukkit start - fire ExplosionPrimeEvent ExplosionPrimeEvent event = new ExplosionPrimeEvent((org.bukkit.entity.Explosive) this.getBukkitEntity()); diff --git a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java -index bf828b9a36fc70bcf4c4d87d5db2d37aa384499c..466313e17fca9ff6993406b71da62218811e1641 100644 +index 66476b33cede1e44db5ec166a0cea81f82ffe47a..57c4e60e3e5c4a7d0801f353488229156d5b83df 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java +++ b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java -@@ -302,6 +302,6 @@ public abstract class Projectile extends Entity { +@@ -273,6 +273,6 @@ public abstract class Projectile extends Entity { public boolean mayInteract(Level world, BlockPos pos) { Entity entity = this.getOwner(); @@ -330,19 +308,6 @@ index 00ac1cdc4734cc57f15433c5c6e7a3a545739d33..f1601114647b62b0b10064ed43058cb8 } // CraftBukkit end } -diff --git a/src/main/java/net/minecraft/world/entity/projectile/WitherSkull.java b/src/main/java/net/minecraft/world/entity/projectile/WitherSkull.java -index 2867e841e73a3edfdeb83af9d96e0d0cd4116a68..1654b08f76e02e20a8ce5de618f8def82f1feeeb 100644 ---- a/src/main/java/net/minecraft/world/entity/projectile/WitherSkull.java -+++ b/src/main/java/net/minecraft/world/entity/projectile/WitherSkull.java -@@ -93,7 +93,7 @@ public class WitherSkull extends AbstractHurtingProjectile { - protected void onHit(HitResult hitResult) { - super.onHit(hitResult); - if (!this.level.isClientSide) { -- Explosion.BlockInteraction explosion_effect = this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) ? Explosion.BlockInteraction.DESTROY : Explosion.BlockInteraction.NONE; -+ Explosion.BlockInteraction explosion_effect = (this.level.purpurConfig.witherBypassMobGriefing || this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) ? Explosion.BlockInteraction.DESTROY : Explosion.BlockInteraction.NONE; // Purpur - - // CraftBukkit start - // this.level.createExplosion(this, this.locX(), this.locY(), this.locZ(), 1.0F, false, explosion_effect); diff --git a/src/main/java/net/minecraft/world/entity/raid/Raider.java b/src/main/java/net/minecraft/world/entity/raid/Raider.java index e5ccbaf72f29731f1d1aa939b9297b644a408cd4..6c77c67dc6a378b87cd73c6c55b6d41d1542f6f3 100644 --- a/src/main/java/net/minecraft/world/entity/raid/Raider.java @@ -357,7 +322,7 @@ index e5ccbaf72f29731f1d1aa939b9297b644a408cd4..6c77c67dc6a378b87cd73c6c55b6d41d if (this.mob.hasActiveRaid() && !this.mob.getCurrentRaid().isOver() && this.mob.canBeLeader() && !ItemStack.matches(this.mob.getItemBySlot(EquipmentSlot.HEAD), Raid.getLeaderBannerInstance())) { diff --git a/src/main/java/net/minecraft/world/level/block/CropBlock.java b/src/main/java/net/minecraft/world/level/block/CropBlock.java -index 7d8394d09ec11c96b9329857a0d347565dd07b32..36ad7f33eacc63d84db04225fbffcc32abf24fdc 100644 +index 519d02a2009c4f09c9e8be7196a701f0f042012d..f0fbd16c9b9c3772492c32b3924e99e147e412f0 100644 --- a/src/main/java/net/minecraft/world/level/block/CropBlock.java +++ b/src/main/java/net/minecraft/world/level/block/CropBlock.java @@ -164,7 +164,7 @@ public class CropBlock extends BushBlock implements BonemealableBlock { @@ -396,10 +361,10 @@ index 518d3832c36c9ecf1ed9267ffc1f926dc84b7989..af5933b886abf3fd17bfdb8c1cb1ea63 } // CraftBukkit end diff --git a/src/main/java/net/minecraft/world/level/block/TurtleEggBlock.java b/src/main/java/net/minecraft/world/level/block/TurtleEggBlock.java -index 1a12fee99a8b69fc6c01e1e217575c7c19e13155..4907e0acb7d01b7f57b75579e58ce743e3e000bb 100644 +index d54a46fc8d78df54777e4a7a250a8d0ae74e9831..4eeb777a49556c54a3f31c1b9d755b110a3e8fab 100644 --- a/src/main/java/net/minecraft/world/level/block/TurtleEggBlock.java +++ b/src/main/java/net/minecraft/world/level/block/TurtleEggBlock.java -@@ -209,7 +209,7 @@ public class TurtleEggBlock extends Block { +@@ -211,7 +211,7 @@ public class TurtleEggBlock extends Block { return false; } if (entity instanceof LivingEntity && !(entity instanceof Player)) { @@ -409,7 +374,7 @@ index 1a12fee99a8b69fc6c01e1e217575c7c19e13155..4907e0acb7d01b7f57b75579e58ce743 return true; // Purpur end diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index a859dd6915493d7a425d6e4d7e12174178756e71..7106c0fb7b7556162234991e606e01480073195e 100644 +index 86076fc3c6ede94f1b71389dcd10de6aff5b8c63..851b31b6cfa7db4414ab3489bdcdeac118310c7d 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -118,8 +118,11 @@ public class PurpurWorldConfig { @@ -473,7 +438,7 @@ index a859dd6915493d7a425d6e4d7e12174178756e71..7106c0fb7b7556162234991e606e0148 } public boolean waterInfinite = true; -@@ -715,6 +730,7 @@ public class PurpurWorldConfig { +@@ -720,6 +735,7 @@ public class PurpurWorldConfig { public double creeperMaxHealth = 20.0D; public double creeperChargedChance = 0.0D; public boolean creeperAllowGriefing = true; @@ -481,7 +446,7 @@ index a859dd6915493d7a425d6e4d7e12174178756e71..7106c0fb7b7556162234991e606e0148 private void creeperSettings() { creeperRidable = getBoolean("mobs.creeper.ridable", creeperRidable); creeperRidableInWater = getBoolean("mobs.creeper.ridable-in-water", creeperRidableInWater); -@@ -727,6 +743,7 @@ public class PurpurWorldConfig { +@@ -732,6 +748,7 @@ public class PurpurWorldConfig { creeperMaxHealth = getDouble("mobs.creeper.attributes.max_health", creeperMaxHealth); creeperChargedChance = getDouble("mobs.creeper.naturally-charged-chance", creeperChargedChance); creeperAllowGriefing = getBoolean("mobs.creeper.allow-griefing", creeperAllowGriefing); @@ -489,7 +454,7 @@ index a859dd6915493d7a425d6e4d7e12174178756e71..7106c0fb7b7556162234991e606e0148 } public boolean dolphinRidable = false; -@@ -821,6 +838,7 @@ public class PurpurWorldConfig { +@@ -826,6 +843,7 @@ public class PurpurWorldConfig { public double enderDragonMaxY = 320D; public double enderDragonMaxHealth = 200.0D; public boolean enderDragonAlwaysDropsFullExp = false; @@ -497,7 +462,7 @@ index a859dd6915493d7a425d6e4d7e12174178756e71..7106c0fb7b7556162234991e606e0148 private void enderDragonSettings() { enderDragonRidable = getBoolean("mobs.ender_dragon.ridable", enderDragonRidable); enderDragonRidableInWater = getBoolean("mobs.ender_dragon.ridable-in-water", enderDragonRidableInWater); -@@ -837,6 +855,7 @@ public class PurpurWorldConfig { +@@ -842,6 +860,7 @@ public class PurpurWorldConfig { } enderDragonMaxHealth = getDouble("mobs.ender_dragon.attributes.max_health", enderDragonMaxHealth); enderDragonAlwaysDropsFullExp = getBoolean("mobs.ender_dragon.always-drop-full-exp", enderDragonAlwaysDropsFullExp); @@ -505,7 +470,7 @@ index a859dd6915493d7a425d6e4d7e12174178756e71..7106c0fb7b7556162234991e606e0148 } public boolean endermanRidable = false; -@@ -845,6 +864,7 @@ public class PurpurWorldConfig { +@@ -850,6 +869,7 @@ public class PurpurWorldConfig { public double endermanMaxHealth = 40.0D; public boolean endermanAllowGriefing = true; public boolean endermanDespawnEvenWithBlock = false; @@ -513,7 +478,7 @@ index a859dd6915493d7a425d6e4d7e12174178756e71..7106c0fb7b7556162234991e606e0148 private void endermanSettings() { endermanRidable = getBoolean("mobs.enderman.ridable", endermanRidable); endermanRidableInWater = getBoolean("mobs.enderman.ridable-in-water", endermanRidableInWater); -@@ -857,6 +877,7 @@ public class PurpurWorldConfig { +@@ -862,6 +882,7 @@ public class PurpurWorldConfig { endermanMaxHealth = getDouble("mobs.enderman.attributes.max_health", endermanMaxHealth); endermanAllowGriefing = getBoolean("mobs.enderman.allow-griefing", endermanAllowGriefing); endermanDespawnEvenWithBlock = getBoolean("mobs.enderman.can-despawn-with-held-block", endermanDespawnEvenWithBlock); @@ -521,7 +486,7 @@ index a859dd6915493d7a425d6e4d7e12174178756e71..7106c0fb7b7556162234991e606e0148 } public boolean endermiteRidable = false; -@@ -879,6 +900,7 @@ public class PurpurWorldConfig { +@@ -884,6 +905,7 @@ public class PurpurWorldConfig { public boolean evokerRidableInWater = false; public boolean evokerControllable = true; public double evokerMaxHealth = 24.0D; @@ -529,7 +494,7 @@ index a859dd6915493d7a425d6e4d7e12174178756e71..7106c0fb7b7556162234991e606e0148 private void evokerSettings() { evokerRidable = getBoolean("mobs.evoker.ridable", evokerRidable); evokerRidableInWater = getBoolean("mobs.evoker.ridable-in-water", evokerRidableInWater); -@@ -889,6 +911,7 @@ public class PurpurWorldConfig { +@@ -894,6 +916,7 @@ public class PurpurWorldConfig { set("mobs.evoker.attributes.max_health", oldValue); } evokerMaxHealth = getDouble("mobs.evoker.attributes.max_health", evokerMaxHealth); @@ -537,7 +502,7 @@ index a859dd6915493d7a425d6e4d7e12174178756e71..7106c0fb7b7556162234991e606e0148 } public boolean foxRidable = false; -@@ -897,6 +920,7 @@ public class PurpurWorldConfig { +@@ -902,6 +925,7 @@ public class PurpurWorldConfig { public double foxMaxHealth = 10.0D; public boolean foxTypeChangesWithTulips = false; public int foxBreedingTicks = 6000; @@ -545,7 +510,7 @@ index a859dd6915493d7a425d6e4d7e12174178756e71..7106c0fb7b7556162234991e606e0148 private void foxSettings() { foxRidable = getBoolean("mobs.fox.ridable", foxRidable); foxRidableInWater = getBoolean("mobs.fox.ridable-in-water", foxRidableInWater); -@@ -909,6 +933,7 @@ public class PurpurWorldConfig { +@@ -914,6 +938,7 @@ public class PurpurWorldConfig { foxMaxHealth = getDouble("mobs.fox.attributes.max_health", foxMaxHealth); foxTypeChangesWithTulips = getBoolean("mobs.fox.tulips-change-type", foxTypeChangesWithTulips); foxBreedingTicks = getInt("mobs.fox.breeding-delay-ticks", foxBreedingTicks); @@ -553,7 +518,7 @@ index a859dd6915493d7a425d6e4d7e12174178756e71..7106c0fb7b7556162234991e606e0148 } public boolean frogRidable = false; -@@ -1356,6 +1381,7 @@ public class PurpurWorldConfig { +@@ -1361,6 +1386,7 @@ public class PurpurWorldConfig { public boolean piglinRidableInWater = false; public boolean piglinControllable = true; public double piglinMaxHealth = 16.0D; @@ -561,7 +526,7 @@ index a859dd6915493d7a425d6e4d7e12174178756e71..7106c0fb7b7556162234991e606e0148 private void piglinSettings() { piglinRidable = getBoolean("mobs.piglin.ridable", piglinRidable); piglinRidableInWater = getBoolean("mobs.piglin.ridable-in-water", piglinRidableInWater); -@@ -1366,6 +1392,7 @@ public class PurpurWorldConfig { +@@ -1371,6 +1397,7 @@ public class PurpurWorldConfig { set("mobs.piglin.attributes.max_health", oldValue); } piglinMaxHealth = getDouble("mobs.piglin.attributes.max_health", piglinMaxHealth); @@ -569,7 +534,7 @@ index a859dd6915493d7a425d6e4d7e12174178756e71..7106c0fb7b7556162234991e606e0148 } public boolean piglinBruteRidable = false; -@@ -1388,6 +1415,7 @@ public class PurpurWorldConfig { +@@ -1393,6 +1420,7 @@ public class PurpurWorldConfig { public boolean pillagerRidableInWater = false; public boolean pillagerControllable = true; public double pillagerMaxHealth = 24.0D; @@ -577,7 +542,7 @@ index a859dd6915493d7a425d6e4d7e12174178756e71..7106c0fb7b7556162234991e606e0148 private void pillagerSettings() { pillagerRidable = getBoolean("mobs.pillager.ridable", pillagerRidable); pillagerRidableInWater = getBoolean("mobs.pillager.ridable-in-water", pillagerRidableInWater); -@@ -1398,6 +1426,7 @@ public class PurpurWorldConfig { +@@ -1403,6 +1431,7 @@ public class PurpurWorldConfig { set("mobs.pillager.attributes.max_health", oldValue); } pillagerMaxHealth = getDouble("mobs.pillager.attributes.max_health", pillagerMaxHealth); @@ -585,7 +550,7 @@ index a859dd6915493d7a425d6e4d7e12174178756e71..7106c0fb7b7556162234991e606e0148 } public boolean polarBearRidable = false; -@@ -1444,6 +1473,7 @@ public class PurpurWorldConfig { +@@ -1449,6 +1478,7 @@ public class PurpurWorldConfig { public double rabbitNaturalToast = 0.0D; public double rabbitNaturalKiller = 0.0D; public int rabbitBreedingTicks = 6000; @@ -593,7 +558,7 @@ index a859dd6915493d7a425d6e4d7e12174178756e71..7106c0fb7b7556162234991e606e0148 private void rabbitSettings() { rabbitRidable = getBoolean("mobs.rabbit.ridable", rabbitRidable); rabbitRidableInWater = getBoolean("mobs.rabbit.ridable-in-water", rabbitRidableInWater); -@@ -1457,12 +1487,14 @@ public class PurpurWorldConfig { +@@ -1462,12 +1492,14 @@ public class PurpurWorldConfig { 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); @@ -608,7 +573,7 @@ index a859dd6915493d7a425d6e4d7e12174178756e71..7106c0fb7b7556162234991e606e0148 private void ravagerSettings() { ravagerRidable = getBoolean("mobs.ravager.ridable", ravagerRidable); ravagerRidableInWater = getBoolean("mobs.ravager.ridable-in-water", ravagerRidableInWater); -@@ -1473,6 +1505,7 @@ public class PurpurWorldConfig { +@@ -1478,6 +1510,7 @@ public class PurpurWorldConfig { set("mobs.ravager.attributes.max_health", oldValue); } ravagerMaxHealth = getDouble("mobs.ravager.attributes.max_health", ravagerMaxHealth); @@ -616,7 +581,7 @@ index a859dd6915493d7a425d6e4d7e12174178756e71..7106c0fb7b7556162234991e606e0148 } public boolean salmonRidable = false; -@@ -1494,6 +1527,7 @@ public class PurpurWorldConfig { +@@ -1499,6 +1532,7 @@ public class PurpurWorldConfig { public boolean sheepControllable = true; public double sheepMaxHealth = 8.0D; public int sheepBreedingTicks = 6000; @@ -624,7 +589,7 @@ index a859dd6915493d7a425d6e4d7e12174178756e71..7106c0fb7b7556162234991e606e0148 private void sheepSettings() { sheepRidable = getBoolean("mobs.sheep.ridable", sheepRidable); sheepRidableInWater = getBoolean("mobs.sheep.ridable-in-water", sheepRidableInWater); -@@ -1505,6 +1539,7 @@ public class PurpurWorldConfig { +@@ -1510,6 +1544,7 @@ public class PurpurWorldConfig { } sheepMaxHealth = getDouble("mobs.sheep.attributes.max_health", sheepMaxHealth); sheepBreedingTicks = getInt("mobs.sheep.breeding-delay-ticks", sheepBreedingTicks); @@ -632,7 +597,7 @@ index a859dd6915493d7a425d6e4d7e12174178756e71..7106c0fb7b7556162234991e606e0148 } public boolean shulkerRidable = false; -@@ -1527,6 +1562,7 @@ public class PurpurWorldConfig { +@@ -1532,6 +1567,7 @@ public class PurpurWorldConfig { public boolean silverfishRidableInWater = false; public boolean silverfishControllable = true; public double silverfishMaxHealth = 8.0D; @@ -640,7 +605,7 @@ index a859dd6915493d7a425d6e4d7e12174178756e71..7106c0fb7b7556162234991e606e0148 private void silverfishSettings() { silverfishRidable = getBoolean("mobs.silverfish.ridable", silverfishRidable); silverfishRidableInWater = getBoolean("mobs.silverfish.ridable-in-water", silverfishRidableInWater); -@@ -1537,6 +1573,7 @@ public class PurpurWorldConfig { +@@ -1542,6 +1578,7 @@ public class PurpurWorldConfig { set("mobs.silverfish.attributes.max_health", oldValue); } silverfishMaxHealth = getDouble("mobs.silverfish.attributes.max_health", silverfishMaxHealth); @@ -648,7 +613,7 @@ index a859dd6915493d7a425d6e4d7e12174178756e71..7106c0fb7b7556162234991e606e0148 } public boolean skeletonRidable = false; -@@ -1613,6 +1650,7 @@ public class PurpurWorldConfig { +@@ -1618,6 +1655,7 @@ public class PurpurWorldConfig { public int snowGolemSnowBallMax = 20; public float snowGolemSnowBallModifier = 10.0F; public double snowGolemAttackDistance = 1.25D; @@ -656,7 +621,7 @@ index a859dd6915493d7a425d6e4d7e12174178756e71..7106c0fb7b7556162234991e606e0148 private void snowGolemSettings() { snowGolemRidable = getBoolean("mobs.snow_golem.ridable", snowGolemRidable); snowGolemRidableInWater = getBoolean("mobs.snow_golem.ridable-in-water", snowGolemRidableInWater); -@@ -1630,6 +1668,7 @@ public class PurpurWorldConfig { +@@ -1635,6 +1673,7 @@ public class PurpurWorldConfig { 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); @@ -664,7 +629,7 @@ index a859dd6915493d7a425d6e4d7e12174178756e71..7106c0fb7b7556162234991e606e0148 } public boolean squidRidable = false; -@@ -1805,6 +1844,7 @@ public class PurpurWorldConfig { +@@ -1808,6 +1847,7 @@ public class PurpurWorldConfig { public int villagerBreedingTicks = 6000; public boolean villagerClericsFarmWarts = false; public boolean villagerClericFarmersThrowWarts = true; @@ -672,7 +637,7 @@ index a859dd6915493d7a425d6e4d7e12174178756e71..7106c0fb7b7556162234991e606e0148 private void villagerSettings() { villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); -@@ -1823,6 +1863,7 @@ public class PurpurWorldConfig { +@@ -1824,6 +1864,7 @@ public class PurpurWorldConfig { 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); @@ -680,7 +645,7 @@ index a859dd6915493d7a425d6e4d7e12174178756e71..7106c0fb7b7556162234991e606e0148 } public boolean vindicatorRidable = false; -@@ -1895,6 +1936,7 @@ public class PurpurWorldConfig { +@@ -1896,6 +1937,7 @@ public class PurpurWorldConfig { public double witherMaxHealth = 300.0D; public float witherHealthRegenAmount = 1.0f; public int witherHealthRegenDelay = 20; @@ -688,7 +653,7 @@ index a859dd6915493d7a425d6e4d7e12174178756e71..7106c0fb7b7556162234991e606e0148 private void witherSettings() { witherRidable = getBoolean("mobs.wither.ridable", witherRidable); witherRidableInWater = getBoolean("mobs.wither.ridable-in-water", witherRidableInWater); -@@ -1912,6 +1954,7 @@ public class PurpurWorldConfig { +@@ -1913,6 +1955,7 @@ public class PurpurWorldConfig { witherMaxHealth = getDouble("mobs.wither.attributes.max_health", witherMaxHealth); witherHealthRegenAmount = (float) getDouble("mobs.wither.health-regen-amount", witherHealthRegenAmount); witherHealthRegenDelay = getInt("mobs.wither.health-regen-delay", witherHealthRegenDelay); @@ -696,7 +661,7 @@ index a859dd6915493d7a425d6e4d7e12174178756e71..7106c0fb7b7556162234991e606e0148 } public boolean witherSkeletonRidable = false; -@@ -1983,6 +2026,7 @@ public class PurpurWorldConfig { +@@ -1984,6 +2027,7 @@ public class PurpurWorldConfig { public double zombieJockeyChance = 0.05D; public boolean zombieJockeyTryExistingChickens = true; public boolean zombieAggressiveTowardsVillagerWhenLagging = true; @@ -704,7 +669,7 @@ index a859dd6915493d7a425d6e4d7e12174178756e71..7106c0fb7b7556162234991e606e0148 private void zombieSettings() { zombieRidable = getBoolean("mobs.zombie.ridable", zombieRidable); zombieRidableInWater = getBoolean("mobs.zombie.ridable-in-water", zombieRidableInWater); -@@ -1998,6 +2042,7 @@ public class PurpurWorldConfig { +@@ -1999,6 +2043,7 @@ public class PurpurWorldConfig { 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); diff --git a/patches/server/0130-Config-to-allow-Note-Block-sounds-when-blocked.patch b/patches/server/0125-Config-to-allow-Note-Block-sounds-when-blocked.patch similarity index 77% rename from patches/server/0130-Config-to-allow-Note-Block-sounds-when-blocked.patch rename to patches/server/0125-Config-to-allow-Note-Block-sounds-when-blocked.patch index b1839bbde..d220f64c1 100644 --- a/patches/server/0130-Config-to-allow-Note-Block-sounds-when-blocked.patch +++ b/patches/server/0125-Config-to-allow-Note-Block-sounds-when-blocked.patch @@ -9,20 +9,20 @@ Normally, the sounds will only play when the block directly above is air. With this patch enabled, players can place any block above the Note Block and it will still work. diff --git a/src/main/java/net/minecraft/world/level/block/NoteBlock.java b/src/main/java/net/minecraft/world/level/block/NoteBlock.java -index 58e8905a4b98e2e1ee372b99bdc3de9815063ac9..443bf39734ba2b0a7cdf0362d415ff176b2e8c85 100644 +index 641725337c65ddf35e7baf731ec37318d4696036..5c183107df821b67e175bba81f4dbe13d1e316bf 100644 --- a/src/main/java/net/minecraft/world/level/block/NoteBlock.java +++ b/src/main/java/net/minecraft/world/level/block/NoteBlock.java -@@ -64,7 +64,7 @@ public class NoteBlock extends Block { +@@ -89,7 +89,7 @@ public class NoteBlock extends Block { } - private void playNote(@Nullable Entity entity, Level world, BlockPos blockposition, BlockState data) { // CraftBukkit -- if (world.getBlockState(blockposition.above()).isAir()) { -+ if (world.purpurConfig.noteBlockIgnoreAbove || world.getBlockState(blockposition.above()).isAir()) { // Purpur + private void playNote(@Nullable Entity entity, BlockState state, Level world, BlockPos pos) { +- if (!((NoteBlockInstrument) state.getValue(NoteBlock.INSTRUMENT)).requiresAirAbove() || world.getBlockState(pos.above()).isAir()) { ++ if (world.purpurConfig.noteBlockIgnoreAbove || !((NoteBlockInstrument) state.getValue(NoteBlock.INSTRUMENT)).requiresAirAbove() || world.getBlockState(pos.above()).isAir()) { // Purpur // CraftBukkit start - // org.bukkit.event.block.NotePlayEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callNotePlayEvent(world, blockposition, data.getValue(NoteBlock.INSTRUMENT), data.getValue(NoteBlock.NOTE)); // Paper - move event into block event handler + // org.bukkit.event.block.NotePlayEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callNotePlayEvent(world, pos, state.getValue(NoteBlock.INSTRUMENT), state.getValue(NoteBlock.NOTE)); // if (event.isCancelled()) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 48a798236bf46ef076cdd5efa5a6cb5d28b7a1ea..bd6e5bd2116368e2b60fda1bc5a036b44708682e 100644 +index fb2cdf80e7784ea4307ee8f8860583de96749e04..6828d1ff38696b18c66521aefc532d811e3d843e 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -121,6 +121,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0131-Add-EntityTeleportHinderedEvent.patch b/patches/server/0126-Add-EntityTeleportHinderedEvent.patch similarity index 92% rename from patches/server/0131-Add-EntityTeleportHinderedEvent.patch rename to patches/server/0126-Add-EntityTeleportHinderedEvent.patch index c565af370..6ae2c8ed0 100644 --- a/patches/server/0131-Add-EntityTeleportHinderedEvent.patch +++ b/patches/server/0126-Add-EntityTeleportHinderedEvent.patch @@ -38,10 +38,10 @@ index 15c5cccfe02c924c02f605eb47dd0b420b189891..04bae5085756842ce88710646a17e9dc ServerLevel worldserver = ((ServerLevel) world).getServer().getLevel(resourcekey); diff --git a/src/main/java/net/minecraft/world/level/block/NetherPortalBlock.java b/src/main/java/net/minecraft/world/level/block/NetherPortalBlock.java -index 08a84e8fdb242f467fb20eec73764ef71691ad42..65fa00b3d4d35a4125f8de444e77ac54e9e28551 100644 +index 192689be9dfc9373876921bd4da0715d58f9421c..03bed5ec0aa42b36f290e04c20915e934f07b629 100644 --- a/src/main/java/net/minecraft/world/level/block/NetherPortalBlock.java +++ b/src/main/java/net/minecraft/world/level/block/NetherPortalBlock.java -@@ -86,7 +86,15 @@ public class NetherPortalBlock extends Block { +@@ -83,7 +83,15 @@ public class NetherPortalBlock extends Block { @Override public void entityInside(BlockState state, Level world, BlockPos pos, Entity entity) { if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(world, pos)).callEvent()) { return; } // Paper @@ -59,10 +59,10 @@ index 08a84e8fdb242f467fb20eec73764ef71691ad42..65fa00b3d4d35a4125f8de444e77ac54 EntityPortalEnterEvent event = new EntityPortalEnterEvent(entity.getBukkitEntity(), new org.bukkit.Location(world.getWorld(), pos.getX(), pos.getY(), pos.getZ())); world.getCraftServer().getPluginManager().callEvent(event); diff --git a/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java -index fb77d022ea872deb7f47d033df4a0f201da026c2..0f20be71aebc236bfcb8ace98e0be8ad16bc5979 100644 +index 95a6284026d17567deb7416abe2bc4d6975aaaf8..053ec306027a83cdd06d10197d47d7edf8c213ac 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java -@@ -178,6 +178,14 @@ public class TheEndGatewayBlockEntity extends TheEndPortalBlockEntity { +@@ -179,6 +179,14 @@ public class TheEndGatewayBlockEntity extends TheEndPortalBlockEntity { public static void teleportEntity(Level world, BlockPos pos, BlockState state, Entity entity, TheEndGatewayBlockEntity blockEntity) { if (world instanceof ServerLevel && !blockEntity.isCoolingDown()) { if (!entity.canChangeDimensions()) return; // Purpur @@ -78,10 +78,10 @@ index fb77d022ea872deb7f47d033df4a0f201da026c2..0f20be71aebc236bfcb8ace98e0be8ad blockEntity.teleportCooldown = 100; diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java -index 32169b7dbfe95bdc5ded6d64524e015f1b939e7a..edfd2d9450805f05df607b5160a0c0ecf9170915 100644 +index 3ac836bd6fccf66771dc0141b9b6a25da9837211..09b997701f7ebd2d3a8abe90dcf933c0037a95e0 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java -@@ -570,6 +570,10 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { +@@ -572,6 +572,10 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { // Paper end if ((!ignorePassengers && this.entity.isVehicle()) || this.entity.isRemoved()) { // Paper - Teleport passenger API @@ -93,10 +93,10 @@ index 32169b7dbfe95bdc5ded6d64524e015f1b939e7a..edfd2d9450805f05df607b5160a0c0ec } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 461f2d0a72b01251324a197752a23677ac24beb6..c1c5c0edab6dc204dd0e7de09af31f8b3b95ad86 100644 +index 3f08e9162ccb21661daa021d1c82e917ea089b7e..9ca8dab9976838c22cd759ae67c6c0821734cf0d 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -1309,6 +1309,10 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -1267,6 +1267,10 @@ public class CraftPlayer extends CraftHumanEntity implements Player { } if (entity.isVehicle() && !ignorePassengers) { // Paper - Teleport API @@ -108,7 +108,7 @@ index 461f2d0a72b01251324a197752a23677ac24beb6..c1c5c0edab6dc204dd0e7de09af31f8b } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 6d7922ce6a1442a9c4e8968d86ffb494f3616833..565bdd1faedda5d6ed010970a81527d788a05375 100644 +index d379f144761c39fa66976fe8b412e59cc4680105..c9b69f9a17f969deedf3899da341fa22275d9da4 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -120,6 +120,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0132-Farmland-trampling-changes.patch b/patches/server/0127-Farmland-trampling-changes.patch similarity index 97% rename from patches/server/0132-Farmland-trampling-changes.patch rename to patches/server/0127-Farmland-trampling-changes.patch index fe38c29db..bd0380189 100644 --- a/patches/server/0132-Farmland-trampling-changes.patch +++ b/patches/server/0127-Farmland-trampling-changes.patch @@ -37,7 +37,7 @@ index d92ea9f29b9d919871662977d3e3eb41ddf2eb35..e5a3e3a4367dfb924624a913b816b3fd if (CraftEventFactory.callEntityChangeBlockEvent(entity, pos, Blocks.DIRT.defaultBlockState()).isCancelled()) { return; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 88588ca9af08f255e099733c6c0692cde7115394..efdb38bb6cb70176460514cb63e5bf5c984f7911 100644 +index 1a26ba2b0eb2126278b052a41e80944c864dd74c..08501fcd8b74a378b5294b96f379ecdc0d67f494 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -459,10 +459,16 @@ public class PurpurWorldConfig { diff --git a/patches/server/0133-Movement-options-for-armor-stands.patch b/patches/server/0128-Movement-options-for-armor-stands.patch similarity index 91% rename from patches/server/0133-Movement-options-for-armor-stands.patch rename to patches/server/0128-Movement-options-for-armor-stands.patch index 27bd3e119..9a8b8da3c 100644 --- a/patches/server/0133-Movement-options-for-armor-stands.patch +++ b/patches/server/0128-Movement-options-for-armor-stands.patch @@ -17,18 +17,18 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 2f78b7c1b2bad8937ac0cdccd5be8faaf1057cbc..5622d3a0732c3006cd9de90b62dec741da0caac4 100644 +index 80dbcf052bf221dfb052976e71f1ec25a1087e46..0635cd0c6c824d6619d9c19627c9460eedad3ec6 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -1733,7 +1733,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -1705,7 +1705,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { return this.isInWater() || flag; } - void updateInWaterStateAndDoWaterCurrentPushing() { + public void updateInWaterStateAndDoWaterCurrentPushing() { // Purpur - package-private -> public - if (this.getVehicle() instanceof Boat) { - this.wasTouchingWater = false; - } else if (this.updateFluidHeightAndDoFluidPushing(FluidTags.WATER, 0.014D)) { + Entity entity = this.getVehicle(); + + if (entity instanceof Boat) { diff --git a/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java b/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java index 0c4b76cd3b6248df99d31d28c7521a0fe6aea89e..6800d77262c244e5bb32535d920b025b279dd8e2 100644 --- a/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java @@ -66,7 +66,7 @@ index 0c4b76cd3b6248df99d31d28c7521a0fe6aea89e..6800d77262c244e5bb32535d920b025b + // Purpur end } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index efdb38bb6cb70176460514cb63e5bf5c984f7911..97143ad57276e7f62b50578096972c7581a6158b 100644 +index 08501fcd8b74a378b5294b96f379ecdc0d67f494..7ff5c24d97a52f28438529915c29857f480725a2 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -102,10 +102,16 @@ public class PurpurWorldConfig { diff --git a/patches/server/0134-Fix-stuck-in-portals.patch b/patches/server/0129-Fix-stuck-in-portals.patch similarity index 88% rename from patches/server/0134-Fix-stuck-in-portals.patch rename to patches/server/0129-Fix-stuck-in-portals.patch index 113650f7c..b6aa2a8fb 100644 --- a/patches/server/0134-Fix-stuck-in-portals.patch +++ b/patches/server/0129-Fix-stuck-in-portals.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Fix stuck in portals diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index 43e69bcf6910f06bc70f575376e3c4402bfe6837..236b95fc8dfe0157e5af2b2a20973a9e36b9c604 100644 +index 2e9dcb9e4667ef51594508bebabc413edbe41a15..3996b6425ca6c6f329b1cc869fea73cf1dadb2eb 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java -@@ -1195,6 +1195,7 @@ public class ServerPlayer extends Player { +@@ -1217,6 +1217,7 @@ public class ServerPlayer extends Player { playerlist.sendPlayerPermissionLevel(this); worldserver1.removePlayerImmediately(this, Entity.RemovalReason.CHANGED_DIMENSION); this.unsetRemoved(); @@ -17,10 +17,10 @@ index 43e69bcf6910f06bc70f575376e3c4402bfe6837..236b95fc8dfe0157e5af2b2a20973a9e // CraftBukkit end this.setLevel(worldserver); diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index a9967badea51c9821957e774d2eee4dfbd285afb..d1d1fb22b75003e53766947ba421073654eed726 100644 +index 0635cd0c6c824d6619d9c19627c9460eedad3ec6..c4673de12f0de52862ad58f6ccdd6128fa5619cf 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -2890,12 +2890,15 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -2875,12 +2875,15 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { return Vec3.directionFromRotation(this.getRotationVector()); } @@ -37,7 +37,7 @@ index a9967badea51c9821957e774d2eee4dfbd285afb..d1d1fb22b75003e53766947ba4210736 this.isInsidePortal = true; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index a0591dd2f5b438e04264b4ba9628d85ca0318224..bfe540637ec08d098a3b9e951b2d88fd4f618f1a 100644 +index 7ff5c24d97a52f28438529915c29857f480725a2..d7731e199e0992d16950301b8fc0468c34d295cc 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -338,6 +338,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0135-Toggle-for-water-sensitive-mob-damage.patch b/patches/server/0130-Toggle-for-water-sensitive-mob-damage.patch similarity index 89% rename from patches/server/0135-Toggle-for-water-sensitive-mob-damage.patch rename to patches/server/0130-Toggle-for-water-sensitive-mob-damage.patch index a2f4dd0e3..2c928072d 100644 --- a/patches/server/0135-Toggle-for-water-sensitive-mob-damage.patch +++ b/patches/server/0130-Toggle-for-water-sensitive-mob-damage.patch @@ -21,10 +21,10 @@ index b6df98797757462f35c306aa4c6ea1585a9a6ddc..506632a6b5107f5ef08cd87808b8c4be @Override diff --git a/src/main/java/net/minecraft/world/entity/ambient/Bat.java b/src/main/java/net/minecraft/world/entity/ambient/Bat.java -index 6a702b0dfd5e40d9f7abbbbf55c286492755e07c..16ab6feea4af65bfe9b0c6e6c586a9abf8790c94 100644 +index a13d3ba5e7dff532fccfaf697e69815e427d4c96..b2fff9079c7460681d9cbd3d3e57b42dfcece44b 100644 --- a/src/main/java/net/minecraft/world/entity/ambient/Bat.java +++ b/src/main/java/net/minecraft/world/entity/ambient/Bat.java -@@ -102,6 +102,11 @@ public class Bat extends AmbientCreature { +@@ -105,6 +105,11 @@ public class Bat extends AmbientCreature { this.getAttribute(Attributes.ARMOR_TOUGHNESS).setBaseValue(this.level.purpurConfig.batArmorToughness); this.getAttribute(Attributes.ATTACK_KNOCKBACK).setBaseValue(this.level.purpurConfig.batAttackKnockback); } @@ -37,7 +37,7 @@ index 6a702b0dfd5e40d9f7abbbbf55c286492755e07c..16ab6feea4af65bfe9b0c6e6c586a9ab @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/Bee.java b/src/main/java/net/minecraft/world/entity/animal/Bee.java -index 8eef2c50ae38ab7ea0942d338d0918c8edbd42b0..ec13cbb89a794c3d279b33fa197f9f42d0b86b46 100644 +index afc336961b34e31e470644dbd6edf57fbffb1706..dda1710c56b0b96533367b40e9c09acf5ffc0027 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Bee.java +++ b/src/main/java/net/minecraft/world/entity/animal/Bee.java @@ -176,7 +176,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { @@ -62,10 +62,10 @@ index 8eef2c50ae38ab7ea0942d338d0918c8edbd42b0..ec13cbb89a794c3d279b33fa197f9f42 @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/Cat.java b/src/main/java/net/minecraft/world/entity/animal/Cat.java -index 3641599a119d5416b5756a972f9eb7fc6fbabcf6..5b3d824c0ad43ebd30c6d5fb98e50b531cb85ac7 100644 +index 049e1460320e039610b87fe018e4b6c5c49dc233..a166121fd50551cd199b7246dd01df47040eea87 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cat.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cat.java -@@ -128,6 +128,11 @@ public class Cat extends TamableAnimal { +@@ -129,6 +129,11 @@ public class Cat extends TamableAnimal implements VariantHolder { public int getPurpurBreedTime() { return this.level.purpurConfig.catBreedingTicks; } @@ -78,10 +78,10 @@ index 3641599a119d5416b5756a972f9eb7fc6fbabcf6..5b3d824c0ad43ebd30c6d5fb98e50b53 public ResourceLocation getResourceLocation() { diff --git a/src/main/java/net/minecraft/world/entity/animal/Chicken.java b/src/main/java/net/minecraft/world/entity/animal/Chicken.java -index fe266b94d08b8977451f75ec87c19497ac0ab975..14b0160deab7895f0827d5dc75a48a98d906d7c8 100644 +index d8b825f75ddec59c552c1c43fcd9319f51aeab8e..47d2991ba08313fa50fde167020e03d8c2c29c37 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Chicken.java +++ b/src/main/java/net/minecraft/world/entity/animal/Chicken.java -@@ -81,6 +81,11 @@ public class Chicken extends Animal { +@@ -82,6 +82,11 @@ public class Chicken extends Animal { public int getPurpurBreedTime() { return this.level.purpurConfig.chickenBreedingTicks; } @@ -110,10 +110,10 @@ index 861727f150f28a508d3b1c7067d410f0d696aa89..5b79d821e8b55c8876eadcbe811a2c05 @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/Cow.java b/src/main/java/net/minecraft/world/entity/animal/Cow.java -index 4f69a641686c086245ecc0696a8fd3f75c6b50d1..c65fdafb5433fe592dc0061bef4c0afbc611ba13 100644 +index c58076635cc94c8908a376fba8804206cda3ac00..48d20fcd481e76e180410c11040b2164315fce23 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cow.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cow.java -@@ -67,6 +67,11 @@ public class Cow extends Animal { +@@ -68,6 +68,11 @@ public class Cow extends Animal { public int getPurpurBreedTime() { return this.level.purpurConfig.cowBreedingTicks; } @@ -142,10 +142,10 @@ index a8ca2d120a545d423fc00aef5299b66b1636b6d3..b0c933644c1f4b5aa142c7c4d26a9b81 @Nullable diff --git a/src/main/java/net/minecraft/world/entity/animal/Fox.java b/src/main/java/net/minecraft/world/entity/animal/Fox.java -index 18cc92406057b3c47ba00ddfe7cebeb99f8a106d..7fdaba9bd61cf7f9954aa326517b4d075ae78c84 100644 +index 59a3c234d27a9efe32e01b61848ce4cdec7977be..6321466c58352f8ff6e42303a811868eaf26a8f8 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Fox.java +++ b/src/main/java/net/minecraft/world/entity/animal/Fox.java -@@ -188,6 +188,11 @@ public class Fox extends Animal { +@@ -188,6 +188,11 @@ public class Fox extends Animal implements VariantHolder { public int getPurpurBreedTime() { return this.level.purpurConfig.foxBreedingTicks; } @@ -174,10 +174,10 @@ index 4003e4f4128f14e0dffa666ed8f4447aadd1dede..e3d725e656bc5ffc5fc92133794a8079 @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java -index 74fa3278f39b2e55b7ee9b0c3088d02f44e71259..b63569653cdee914f6ecf79f305efc6a2ca9fc89 100644 +index 2b6d1fa7aaffde048678e3f797fb0c6ffd781cff..4973a0da1139bec25d4b9bf16a01934f276f4805 100644 --- a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java +++ b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java -@@ -89,6 +89,11 @@ public class MushroomCow extends Cow implements Shearable { +@@ -88,6 +88,11 @@ public class MushroomCow extends Cow implements Shearable, VariantHolder { public int getPurpurBreedTime() { return this.level.purpurConfig.rabbitBreedingTicks; } @@ -318,7 +318,7 @@ index 3873fb0e2d95973397f9a23dc363f7a65a1edfe6..16171814bab7fbc0c177323cc5f8b026 @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/Sheep.java b/src/main/java/net/minecraft/world/entity/animal/Sheep.java -index dfd8d795abbe3912658c9d847424424e83006408..fbe7d731df4284e2bd99da6bae8d146cf9587d35 100644 +index 86c5f88bbeab0a5cb565b15af257160a707c6372..24d50a595a0a04f386961ad070c81cdb41b35e65 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Sheep.java +++ b/src/main/java/net/minecraft/world/entity/animal/Sheep.java @@ -141,6 +141,11 @@ public class Sheep extends Animal implements Shearable { @@ -363,10 +363,10 @@ index 4850960c7c4f38c7d81b8945f8c87504d5ccd0d0..7a8f8be052dc3ee6dc56dd39017e1148 @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java b/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java -index e439f0e24851697e663f783edf643d5b1602a0ff..77237646232cf3b7975c7a0c1d2b83d688eaa8b8 100644 +index 62f44f830e5b924776d47b3ac36de4166d2e13f7..220a9ca9c78b14b4ca6f76192396db608db184b8 100644 --- a/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java +++ b/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java -@@ -69,6 +69,11 @@ public class TropicalFish extends AbstractSchoolingFish { +@@ -62,6 +62,11 @@ public class TropicalFish extends AbstractSchoolingFish implements VariantHolder public void initAttributes() { this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.tropicalFishMaxHealth); } @@ -379,7 +379,7 @@ index e439f0e24851697e663f783edf643d5b1602a0ff..77237646232cf3b7975c7a0c1d2b83d6 public static String getPredefinedName(int variant) { diff --git a/src/main/java/net/minecraft/world/entity/animal/Turtle.java b/src/main/java/net/minecraft/world/entity/animal/Turtle.java -index e3c20db7bd003bb63d5b1b296c7aa9d7302548c8..d5a029db2831ea817071830ba30d0f50fd001f8d 100644 +index 56e0f21a002a6112770cf0d9e06136caf3f89c80..95ea01f3ded049a65a68cb84db8fb24f52c8dc8d 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Turtle.java +++ b/src/main/java/net/minecraft/world/entity/animal/Turtle.java @@ -107,6 +107,11 @@ public class Turtle extends Animal { @@ -395,7 +395,7 @@ index e3c20db7bd003bb63d5b1b296c7aa9d7302548c8..d5a029db2831ea817071830ba30d0f50 public void setHomePos(BlockPos pos) { diff --git a/src/main/java/net/minecraft/world/entity/animal/Wolf.java b/src/main/java/net/minecraft/world/entity/animal/Wolf.java -index 63d0754427a01fb2bd85b9bf9d6e63d533c6995b..c3264daf9af8c3299d6d2ed539d04a43c9bfce7b 100644 +index ef2405b5e32e581c488e8b943e143faeb9ddd135..f1d7390e9bbc520fa9c41b09b363996e51c7c911 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Wolf.java +++ b/src/main/java/net/minecraft/world/entity/animal/Wolf.java @@ -207,6 +207,11 @@ public class Wolf extends TamableAnimal implements NeutralMob { @@ -411,10 +411,10 @@ index 63d0754427a01fb2bd85b9bf9d6e63d533c6995b..c3264daf9af8c3299d6d2ed539d04a43 @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java b/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java -index e68a40ec759925317a0db2087339cd29351dbeb4..858a5beea8b038822789e6daec9561634c63447c 100644 +index 72c3dc27128137d23e0b0dba0ecf7cf5f24e889f..386eb27ba4c68d0a87ad5c0250b51987b62281e7 100644 --- a/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java +++ b/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java -@@ -127,6 +127,11 @@ public class Axolotl extends Animal implements LerpingModel, Bucketable { +@@ -128,6 +128,11 @@ public class Axolotl extends Animal implements LerpingModel, VariantHolder { public int getPurpurBreedTime() { return this.level.purpurConfig.horseBreedingTicks; } @@ -475,10 +475,10 @@ index 6a7d8ff804b184005fda17f3d7a4b9750a7c2fe5..704e08b1ad0601e9b7f3b355214a8208 @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java -index 7f47cc2caa22f31eb956ec4b7da69a62fa4e5899..43fa12c5e53cc4d1bb9a8c8603f389bc24177e53 100644 +index 32f3ed0326cfaa80d92dbe75e92abc26945048be..5db7ddd3f4bd79dbcb241aad2abf96ade57ae4c4 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java -@@ -136,6 +136,11 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { +@@ -141,6 +141,11 @@ public class Llama extends AbstractChestedHorse implements VariantHolder type, Level world) { super(type, world); this.maxUpStep = 1.0F; @@ -685,7 +685,7 @@ index 9ed04c56e840992a084f77bd667027ef0f6bb184..3d554d0c6f371a10fa939f87893d7dd7 } // Purpur start -@@ -297,7 +297,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -302,7 +302,7 @@ public class EnderMan extends Monster implements NeutralMob { @Override public boolean isSensitiveToWater() { @@ -711,7 +711,7 @@ index 400045d30353899edc89907deab14943bc5c37eb..9b14ad63c2f2fea0e6c0e69a5632621c @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/Evoker.java b/src/main/java/net/minecraft/world/entity/monster/Evoker.java -index 281e8e6232c30cf5c20e9e2de4ac2ab4d0722ccf..912c594c2a5df21663b26da81cc3d78b37055a6a 100644 +index 8658ec12bcdf90797016f446e52c60c3271a6247..64712f1f6fbb9996ac1c4dc8eaa649f87da17236 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Evoker.java +++ b/src/main/java/net/minecraft/world/entity/monster/Evoker.java @@ -68,6 +68,11 @@ public class Evoker extends SpellcasterIllager { @@ -839,10 +839,10 @@ index 162f8f6f368266ce238247901277f78cc1c9cfdf..6b7baf977972b624c5745820d5c3a437 @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/Pillager.java b/src/main/java/net/minecraft/world/entity/monster/Pillager.java -index 13c0c270dc56f0e3d6e60714a3b9abeb6413c74f..d2dc2b73692ddf28272b1196a6ed718f2f14e116 100644 +index f2f0137d8c74165f5ea829599f537c1425e4c872..ec2f96b3517bd99cbd616aee56d0b1c6f6247759 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Pillager.java +++ b/src/main/java/net/minecraft/world/entity/monster/Pillager.java -@@ -83,6 +83,11 @@ public class Pillager extends AbstractIllager implements CrossbowAttackMob, Inve +@@ -82,6 +82,11 @@ public class Pillager extends AbstractIllager implements CrossbowAttackMob, Inve public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.pillagerMaxHealth); } @@ -871,10 +871,10 @@ index f8867270a5eb705b60236abf3351c050f2e27c60..0e55d94669166ce37e054203d4723720 @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/Shulker.java b/src/main/java/net/minecraft/world/entity/monster/Shulker.java -index 9cc44ccd584253cb16a19e7a4747ef39a3ae82f5..2abdeb351fbabec7490c1ce806cebf8886b6be61 100644 +index aeffb232321b7c04b2fd2eef3674669277ec8fbc..76020a1f20cf7009dcff18b721c2175294ca2f26 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Shulker.java +++ b/src/main/java/net/minecraft/world/entity/monster/Shulker.java -@@ -112,6 +112,11 @@ public class Shulker extends AbstractGolem implements Enemy { +@@ -114,6 +114,11 @@ public class Shulker extends AbstractGolem implements VariantHolder type, ServerLevelAccessor world, MobSpawnType spawnReason, BlockPos pos, RandomSource random) { diff --git a/src/main/java/net/minecraft/world/entity/monster/Strider.java b/src/main/java/net/minecraft/world/entity/monster/Strider.java -index df9d16a6493a57b6034cd56bf8dbe38fe7c5cda1..0ac4a2b6ec9c88e8049a8a1cd0518e14e4b08ede 100644 +index 521680926277d4c2bcfa0c6e482c92d9ce9267f4..209d6a6d3ddcb4c254974ba741dc87b0979eb26f 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Strider.java +++ b/src/main/java/net/minecraft/world/entity/monster/Strider.java @@ -90,7 +90,7 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { @@ -989,10 +989,10 @@ index df9d16a6493a57b6034cd56bf8dbe38fe7c5cda1..0ac4a2b6ec9c88e8049a8a1cd0518e14 @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/Vex.java b/src/main/java/net/minecraft/world/entity/monster/Vex.java -index cad3d3741460c21da2e163ed9ec6ba7894ab2712..1e4f227ad895f2099d889c3b9317176449675af1 100644 +index 929b8b2320c8a5b13f5a63bd966af1d0ee8de754..b4a54cd0fda9abb174db2318d1e677d60deea927 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Vex.java +++ b/src/main/java/net/minecraft/world/entity/monster/Vex.java -@@ -106,6 +106,11 @@ public class Vex extends Monster { +@@ -109,6 +109,11 @@ public class Vex extends Monster { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.vexMaxHealth); } @@ -1053,10 +1053,10 @@ index b374069a1e88db67a56d6d5f9e05318c0403d462..dd47abc25f71ad019025e11bdf9f5ca9 @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/Zoglin.java b/src/main/java/net/minecraft/world/entity/monster/Zoglin.java -index 6236a557d2a73dff70141140f79faf851a2062f0..0d8495a73df5b1b6cd2c7e5cf18cb3eb15bbb729 100644 +index 1f4317160ca8b628640142a110d93ceb1c4ec421..e120d5c054585f539bdc086eb33d5eb0b4b07e57 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zoglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zoglin.java -@@ -88,6 +88,11 @@ public class Zoglin extends Monster implements Enemy, HoglinBase { +@@ -87,6 +87,11 @@ public class Zoglin extends Monster implements Enemy, HoglinBase { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.zoglinMaxHealth); } @@ -1069,10 +1069,10 @@ index 6236a557d2a73dff70141140f79faf851a2062f0..0d8495a73df5b1b6cd2c7e5cf18cb3eb @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/Zombie.java b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -index e9482ebe59cba4cea06392fe97b74e4fb70eceda..0eaa8119201cae52340a1a58700906eb96e2a99f 100644 +index 35e1e8264d9f1e30b37ad598adab478b4c99ada3..d0c2167c82da8b2e9e3222c4ebb50ef2e141b34f 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zombie.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -@@ -137,6 +137,11 @@ public class Zombie extends Monster { +@@ -138,6 +138,11 @@ public class Zombie extends Monster { public boolean jockeyTryExistingChickens() { return level.purpurConfig.zombieJockeyTryExistingChickens; } @@ -1085,10 +1085,10 @@ index e9482ebe59cba4cea06392fe97b74e4fb70eceda..0eaa8119201cae52340a1a58700906eb @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java -index 4dcd0e8198a37df01678a62ada3d75d579c08cff..fd4e34549ff65d0ed82d3bc1e8b7067a53a33d4c 100644 +index 24bd4b83b37e65606db9b371db458dcc4a16d419..cd1e454b1e178b5bb2c2a9b83bdab2b70206bde3 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java -@@ -118,6 +118,11 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { +@@ -119,6 +119,11 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { public boolean jockeyTryExistingChickens() { return level.purpurConfig.zombieVillagerJockeyTryExistingChickens; } @@ -1101,10 +1101,10 @@ index 4dcd0e8198a37df01678a62ada3d75d579c08cff..fd4e34549ff65d0ed82d3bc1e8b7067a @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java -index 1f0003fb08a45af02e6d38e28fa548abe480426b..ad5197636e367f863ca3d044dd343ae5ae722cc2 100644 +index 2ff0166a26ede86e8410b003a5e7f051559dd05d..45ed7baaf5cbb3c368bc0051462bfba35c5d6726 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java -@@ -94,6 +94,11 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { +@@ -98,6 +98,11 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { public boolean jockeyTryExistingChickens() { return level.purpurConfig.zombifiedPiglinJockeyTryExistingChickens; } @@ -1117,7 +1117,7 @@ index 1f0003fb08a45af02e6d38e28fa548abe480426b..ad5197636e367f863ca3d044dd343ae5 @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java b/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java -index c335a32832c6eef95658fbf632b943bb10ac44b0..68cb79ad43a11195eb2245f6d9081212c7adb0dd 100644 +index 56dba90d0bb76b85cf21ace7ad50531fe3ae8381..d33f1f3445c36a6c11691bf2d57a8eca074136b1 100644 --- a/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java @@ -92,6 +92,11 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { @@ -1133,10 +1133,10 @@ index c335a32832c6eef95658fbf632b943bb10ac44b0..68cb79ad43a11195eb2245f6d9081212 @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java b/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java -index fb387956f1bb1b036558c82996c6880a130a0428..194e59074b72a56b2188a5ecacbc44d13c4a9021 100644 +index 9c966db99cbc43522108a595ff9666bc518f9a98..79487fd9dae776231210b1116fd104c3e8b747ad 100644 --- a/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java -@@ -115,6 +115,11 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento +@@ -117,6 +117,11 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.piglinMaxHealth); } @@ -1165,10 +1165,10 @@ index 75db61c5aab66234b26f7899229ddca8896e2086..a44f9a59fbec146df95d89c26df12efb public static AttributeSupplier.Builder createAttributes() { diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java -index 179e15adbb6a5999a24dc9bcb8dd51ca24c38bee..63b2d3635d3882d8e2e55659c99c0165603fdfc1 100644 +index b1fec0d6559f8f6e37e1dfb71a4c9931807bfd96..07bd954ff3f203d1747990bcecb87b05fb7d90d9 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java -@@ -188,6 +188,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -184,6 +184,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler public boolean canBeLeashed(Player player) { return level.purpurConfig.villagerCanBeLeashed && !this.isLeashed(); } @@ -1181,7 +1181,7 @@ index 179e15adbb6a5999a24dc9bcb8dd51ca24c38bee..63b2d3635d3882d8e2e55659c99c0165 @Override diff --git a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java -index 3f3d7a36eb204114df4a535ef7f2afdcdd5201f7..bef536f773e662050b8d120d41e1c730aeedd447 100644 +index 2c01e6155124e0c11899b643197badeb3a52691c..a028732368cdc6b249135742b4a86920d95fa76e 100644 --- a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java +++ b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java @@ -91,6 +91,11 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill @@ -1197,7 +1197,7 @@ index 3f3d7a36eb204114df4a535ef7f2afdcdd5201f7..bef536f773e662050b8d120d41e1c730 @Override diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992e666ba8c 100644 +index 5c36fc42a96a7ae7989af68f57f4779bbb712858..c82d5e9179d9d89b8cb62da14f690a3089a10907 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -572,11 +572,13 @@ public class PurpurWorldConfig { @@ -1261,8 +1261,8 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 + blazeTakeDamageFromWater = getBoolean("mobs.blaze.takes-damage-from-water", blazeTakeDamageFromWater); } - public boolean catRidable = false; -@@ -651,6 +659,7 @@ public class PurpurWorldConfig { + public int camelBreedingTicks = 6000; +@@ -656,6 +664,7 @@ public class PurpurWorldConfig { public int catSpawnVillageScanRange = 48; public int catBreedingTicks = 6000; public DyeColor catDefaultCollarColor = DyeColor.RED; @@ -1270,7 +1270,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void catSettings() { catRidable = getBoolean("mobs.cat.ridable", catRidable); catRidableInWater = getBoolean("mobs.cat.ridable-in-water", catRidableInWater); -@@ -670,12 +679,14 @@ public class PurpurWorldConfig { +@@ -675,12 +684,14 @@ public class PurpurWorldConfig { } catch (IllegalArgumentException ignore) { catDefaultCollarColor = DyeColor.RED; } @@ -1285,7 +1285,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void caveSpiderSettings() { caveSpiderRidable = getBoolean("mobs.cave_spider.ridable", caveSpiderRidable); caveSpiderRidableInWater = getBoolean("mobs.cave_spider.ridable-in-water", caveSpiderRidableInWater); -@@ -686,6 +697,7 @@ public class PurpurWorldConfig { +@@ -691,6 +702,7 @@ public class PurpurWorldConfig { set("mobs.cave_spider.attributes.max_health", oldValue); } caveSpiderMaxHealth = getDouble("mobs.cave_spider.attributes.max_health", caveSpiderMaxHealth); @@ -1293,7 +1293,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 } public boolean chickenRidable = false; -@@ -694,6 +706,7 @@ public class PurpurWorldConfig { +@@ -699,6 +711,7 @@ public class PurpurWorldConfig { public double chickenMaxHealth = 4.0D; public boolean chickenRetaliate = false; public int chickenBreedingTicks = 6000; @@ -1301,7 +1301,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void chickenSettings() { chickenRidable = getBoolean("mobs.chicken.ridable", chickenRidable); chickenRidableInWater = getBoolean("mobs.chicken.ridable-in-water", chickenRidableInWater); -@@ -706,11 +719,13 @@ public class PurpurWorldConfig { +@@ -711,11 +724,13 @@ public class PurpurWorldConfig { chickenMaxHealth = getDouble("mobs.chicken.attributes.max_health", chickenMaxHealth); chickenRetaliate = getBoolean("mobs.chicken.retaliate", chickenRetaliate); chickenBreedingTicks = getInt("mobs.chicken.breeding-delay-ticks", chickenBreedingTicks); @@ -1315,7 +1315,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void codSettings() { codRidable = getBoolean("mobs.cod.ridable", codRidable); codControllable = getBoolean("mobs.cod.controllable", codControllable); -@@ -720,6 +735,7 @@ public class PurpurWorldConfig { +@@ -725,6 +740,7 @@ public class PurpurWorldConfig { set("mobs.cod.attributes.max_health", oldValue); } codMaxHealth = getDouble("mobs.cod.attributes.max_health", codMaxHealth); @@ -1323,7 +1323,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 } public boolean cowRidable = false; -@@ -728,6 +744,7 @@ public class PurpurWorldConfig { +@@ -733,6 +749,7 @@ public class PurpurWorldConfig { public double cowMaxHealth = 10.0D; public int cowFeedMushrooms = 0; public int cowBreedingTicks = 6000; @@ -1331,7 +1331,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void cowSettings() { cowRidable = getBoolean("mobs.cow.ridable", cowRidable); cowRidableInWater = getBoolean("mobs.cow.ridable-in-water", cowRidableInWater); -@@ -740,6 +757,7 @@ public class PurpurWorldConfig { +@@ -745,6 +762,7 @@ public class PurpurWorldConfig { cowMaxHealth = getDouble("mobs.cow.attributes.max_health", cowMaxHealth); cowFeedMushrooms = getInt("mobs.cow.feed-mushrooms-for-mooshroom", cowFeedMushrooms); cowBreedingTicks = getInt("mobs.cow.breeding-delay-ticks", cowBreedingTicks); @@ -1339,7 +1339,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 } public boolean creeperRidable = false; -@@ -749,6 +767,7 @@ public class PurpurWorldConfig { +@@ -754,6 +772,7 @@ public class PurpurWorldConfig { public double creeperChargedChance = 0.0D; public boolean creeperAllowGriefing = true; public boolean creeperBypassMobGriefing = false; @@ -1347,7 +1347,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void creeperSettings() { creeperRidable = getBoolean("mobs.creeper.ridable", creeperRidable); creeperRidableInWater = getBoolean("mobs.creeper.ridable-in-water", creeperRidableInWater); -@@ -762,6 +781,7 @@ public class PurpurWorldConfig { +@@ -767,6 +786,7 @@ public class PurpurWorldConfig { creeperChargedChance = getDouble("mobs.creeper.naturally-charged-chance", creeperChargedChance); creeperAllowGriefing = getBoolean("mobs.creeper.allow-griefing", creeperAllowGriefing); creeperBypassMobGriefing = getBoolean("mobs.creeper.bypass-mob-griefing", creeperBypassMobGriefing); @@ -1355,7 +1355,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 } public boolean dolphinRidable = false; -@@ -771,6 +791,7 @@ public class PurpurWorldConfig { +@@ -776,6 +796,7 @@ public class PurpurWorldConfig { public float dolphinSpitDamage = 2.0F; public double dolphinMaxHealth = 10.0D; public boolean dolphinDisableTreasureSearching = false; @@ -1363,7 +1363,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void dolphinSettings() { dolphinRidable = getBoolean("mobs.dolphin.ridable", dolphinRidable); dolphinControllable = getBoolean("mobs.dolphin.controllable", dolphinControllable); -@@ -784,6 +805,7 @@ public class PurpurWorldConfig { +@@ -789,6 +810,7 @@ public class PurpurWorldConfig { } dolphinMaxHealth = getDouble("mobs.dolphin.attributes.max_health", dolphinMaxHealth); dolphinDisableTreasureSearching = getBoolean("mobs.dolphin.disable-treasure-searching", dolphinDisableTreasureSearching); @@ -1371,7 +1371,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 } public boolean donkeyRidableInWater = false; -@@ -794,6 +816,7 @@ public class PurpurWorldConfig { +@@ -799,6 +821,7 @@ public class PurpurWorldConfig { public double donkeyMovementSpeedMin = 0.175D; public double donkeyMovementSpeedMax = 0.175D; public int donkeyBreedingTicks = 6000; @@ -1379,7 +1379,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void donkeySettings() { donkeyRidableInWater = getBoolean("mobs.donkey.ridable-in-water", donkeyRidableInWater); if (PurpurConfig.version < 10) { -@@ -810,6 +833,7 @@ public class PurpurWorldConfig { +@@ -815,6 +838,7 @@ public class PurpurWorldConfig { donkeyMovementSpeedMin = getDouble("mobs.donkey.attributes.movement_speed.min", donkeyMovementSpeedMin); donkeyMovementSpeedMax = getDouble("mobs.donkey.attributes.movement_speed.max", donkeyMovementSpeedMax); donkeyBreedingTicks = getInt("mobs.donkey.breeding-delay-ticks", donkeyBreedingTicks); @@ -1387,7 +1387,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 } public boolean drownedRidable = false; -@@ -820,6 +844,7 @@ public class PurpurWorldConfig { +@@ -825,6 +849,7 @@ public class PurpurWorldConfig { public boolean drownedJockeyOnlyBaby = true; public double drownedJockeyChance = 0.05D; public boolean drownedJockeyTryExistingChickens = true; @@ -1395,7 +1395,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void drownedSettings() { drownedRidable = getBoolean("mobs.drowned.ridable", drownedRidable); drownedRidableInWater = getBoolean("mobs.drowned.ridable-in-water", drownedRidableInWater); -@@ -834,11 +859,13 @@ public class PurpurWorldConfig { +@@ -839,11 +864,13 @@ public class PurpurWorldConfig { drownedJockeyOnlyBaby = getBoolean("mobs.drowned.jockey.only-babies", drownedJockeyOnlyBaby); drownedJockeyChance = getDouble("mobs.drowned.jockey.chance", drownedJockeyChance); drownedJockeyTryExistingChickens = getBoolean("mobs.drowned.jockey.try-existing-chickens", drownedJockeyTryExistingChickens); @@ -1409,7 +1409,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void elderGuardianSettings() { elderGuardianRidable = getBoolean("mobs.elder_guardian.ridable", elderGuardianRidable); elderGuardianControllable = getBoolean("mobs.elder_guardian.controllable", elderGuardianControllable); -@@ -848,6 +875,7 @@ public class PurpurWorldConfig { +@@ -853,6 +880,7 @@ public class PurpurWorldConfig { set("mobs.elder_guardian.attributes.max_health", oldValue); } elderGuardianMaxHealth = getDouble("mobs.elder_guardian.attributes.max_health", elderGuardianMaxHealth); @@ -1417,7 +1417,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 } public boolean enderDragonRidable = false; -@@ -857,6 +885,7 @@ public class PurpurWorldConfig { +@@ -862,6 +890,7 @@ public class PurpurWorldConfig { public double enderDragonMaxHealth = 200.0D; public boolean enderDragonAlwaysDropsFullExp = false; public boolean enderDragonBypassMobGriefing = false; @@ -1425,7 +1425,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void enderDragonSettings() { enderDragonRidable = getBoolean("mobs.ender_dragon.ridable", enderDragonRidable); enderDragonRidableInWater = getBoolean("mobs.ender_dragon.ridable-in-water", enderDragonRidableInWater); -@@ -874,6 +903,7 @@ public class PurpurWorldConfig { +@@ -879,6 +908,7 @@ public class PurpurWorldConfig { 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); @@ -1433,7 +1433,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 } public boolean endermanRidable = false; -@@ -883,6 +913,7 @@ public class PurpurWorldConfig { +@@ -888,6 +918,7 @@ public class PurpurWorldConfig { public boolean endermanAllowGriefing = true; public boolean endermanDespawnEvenWithBlock = false; public boolean endermanBypassMobGriefing = false; @@ -1441,7 +1441,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void endermanSettings() { endermanRidable = getBoolean("mobs.enderman.ridable", endermanRidable); endermanRidableInWater = getBoolean("mobs.enderman.ridable-in-water", endermanRidableInWater); -@@ -896,12 +927,14 @@ public class PurpurWorldConfig { +@@ -901,12 +932,14 @@ public class PurpurWorldConfig { 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); @@ -1456,7 +1456,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void endermiteSettings() { endermiteRidable = getBoolean("mobs.endermite.ridable", endermiteRidable); endermiteRidableInWater = getBoolean("mobs.endermite.ridable-in-water", endermiteRidableInWater); -@@ -912,6 +945,7 @@ public class PurpurWorldConfig { +@@ -917,6 +950,7 @@ public class PurpurWorldConfig { set("mobs.endermite.attributes.max_health", oldValue); } endermiteMaxHealth = getDouble("mobs.endermite.attributes.max_health", endermiteMaxHealth); @@ -1464,7 +1464,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 } public boolean evokerRidable = false; -@@ -919,6 +953,7 @@ public class PurpurWorldConfig { +@@ -924,6 +958,7 @@ public class PurpurWorldConfig { public boolean evokerControllable = true; public double evokerMaxHealth = 24.0D; public boolean evokerBypassMobGriefing = false; @@ -1472,7 +1472,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void evokerSettings() { evokerRidable = getBoolean("mobs.evoker.ridable", evokerRidable); evokerRidableInWater = getBoolean("mobs.evoker.ridable-in-water", evokerRidableInWater); -@@ -930,6 +965,7 @@ public class PurpurWorldConfig { +@@ -935,6 +970,7 @@ public class PurpurWorldConfig { } evokerMaxHealth = getDouble("mobs.evoker.attributes.max_health", evokerMaxHealth); evokerBypassMobGriefing = getBoolean("mobs.evoker.bypass-mob-griefing", evokerBypassMobGriefing); @@ -1480,7 +1480,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 } public boolean foxRidable = false; -@@ -939,6 +975,7 @@ public class PurpurWorldConfig { +@@ -944,6 +980,7 @@ public class PurpurWorldConfig { public boolean foxTypeChangesWithTulips = false; public int foxBreedingTicks = 6000; public boolean foxBypassMobGriefing = false; @@ -1488,7 +1488,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void foxSettings() { foxRidable = getBoolean("mobs.fox.ridable", foxRidable); foxRidableInWater = getBoolean("mobs.fox.ridable-in-water", foxRidableInWater); -@@ -952,6 +989,7 @@ public class PurpurWorldConfig { +@@ -957,6 +994,7 @@ public class PurpurWorldConfig { foxTypeChangesWithTulips = getBoolean("mobs.fox.tulips-change-type", foxTypeChangesWithTulips); foxBreedingTicks = getInt("mobs.fox.breeding-delay-ticks", foxBreedingTicks); foxBypassMobGriefing = getBoolean("mobs.fox.bypass-mob-griefing", foxBypassMobGriefing); @@ -1496,7 +1496,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 } public boolean frogRidable = false; -@@ -972,6 +1010,7 @@ public class PurpurWorldConfig { +@@ -977,6 +1015,7 @@ public class PurpurWorldConfig { public boolean ghastControllable = true; public double ghastMaxY = 320D; public double ghastMaxHealth = 10.0D; @@ -1504,7 +1504,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void ghastSettings() { ghastRidable = getBoolean("mobs.ghast.ridable", ghastRidable); ghastRidableInWater = getBoolean("mobs.ghast.ridable-in-water", ghastRidableInWater); -@@ -983,6 +1022,7 @@ public class PurpurWorldConfig { +@@ -988,6 +1027,7 @@ public class PurpurWorldConfig { set("mobs.ghast.attributes.max_health", oldValue); } ghastMaxHealth = getDouble("mobs.ghast.attributes.max_health", ghastMaxHealth); @@ -1512,7 +1512,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 } public boolean giantRidable = false; -@@ -995,6 +1035,7 @@ public class PurpurWorldConfig { +@@ -1000,6 +1040,7 @@ public class PurpurWorldConfig { public float giantJumpHeight = 1.0F; public boolean giantHaveAI = false; public boolean giantHaveHostileAI = false; @@ -1520,7 +1520,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void giantSettings() { giantRidable = getBoolean("mobs.giant.ridable", giantRidable); giantRidableInWater = getBoolean("mobs.giant.ridable-in-water", giantRidableInWater); -@@ -1015,17 +1056,20 @@ public class PurpurWorldConfig { +@@ -1020,17 +1061,20 @@ public class PurpurWorldConfig { giantJumpHeight = (float) getDouble("mobs.giant.jump-height", giantJumpHeight); giantHaveAI = getBoolean("mobs.giant.have-ai", giantHaveAI); giantHaveHostileAI = getBoolean("mobs.giant.have-hostile-ai", giantHaveHostileAI); @@ -1541,7 +1541,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 } public boolean goatRidable = false; -@@ -1033,17 +1077,20 @@ public class PurpurWorldConfig { +@@ -1038,17 +1082,20 @@ public class PurpurWorldConfig { public boolean goatControllable = true; public double goatMaxHealth = 10.0D; public int goatBreedingTicks = 6000; @@ -1562,7 +1562,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void guardianSettings() { guardianRidable = getBoolean("mobs.guardian.ridable", guardianRidable); guardianControllable = getBoolean("mobs.guardian.controllable", guardianControllable); -@@ -1053,6 +1100,7 @@ public class PurpurWorldConfig { +@@ -1058,6 +1105,7 @@ public class PurpurWorldConfig { set("mobs.guardian.attributes.max_health", oldValue); } guardianMaxHealth = getDouble("mobs.guardian.attributes.max_health", guardianMaxHealth); @@ -1570,7 +1570,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 } public boolean hoglinRidable = false; -@@ -1060,6 +1108,7 @@ public class PurpurWorldConfig { +@@ -1065,6 +1113,7 @@ public class PurpurWorldConfig { public boolean hoglinControllable = true; public double hoglinMaxHealth = 40.0D; public int hoglinBreedingTicks = 6000; @@ -1578,7 +1578,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void hoglinSettings() { hoglinRidable = getBoolean("mobs.hoglin.ridable", hoglinRidable); hoglinRidableInWater = getBoolean("mobs.hoglin.ridable-in-water", hoglinRidableInWater); -@@ -1071,6 +1120,7 @@ public class PurpurWorldConfig { +@@ -1076,6 +1125,7 @@ public class PurpurWorldConfig { } hoglinMaxHealth = getDouble("mobs.hoglin.attributes.max_health", hoglinMaxHealth); hoglinBreedingTicks = getInt("mobs.hoglin.breeding-delay-ticks", hoglinBreedingTicks); @@ -1586,7 +1586,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 } public boolean horseRidableInWater = false; -@@ -1081,6 +1131,7 @@ public class PurpurWorldConfig { +@@ -1086,6 +1136,7 @@ public class PurpurWorldConfig { public double horseMovementSpeedMin = 0.1125D; public double horseMovementSpeedMax = 0.3375D; public int horseBreedingTicks = 6000; @@ -1594,7 +1594,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void horseSettings() { horseRidableInWater = getBoolean("mobs.horse.ridable-in-water", horseRidableInWater); if (PurpurConfig.version < 10) { -@@ -1097,6 +1148,7 @@ public class PurpurWorldConfig { +@@ -1102,6 +1153,7 @@ public class PurpurWorldConfig { horseMovementSpeedMin = getDouble("mobs.horse.attributes.movement_speed.min", horseMovementSpeedMin); horseMovementSpeedMax = getDouble("mobs.horse.attributes.movement_speed.max", horseMovementSpeedMax); horseBreedingTicks = getInt("mobs.horse.breeding-delay-ticks", horseBreedingTicks); @@ -1602,7 +1602,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 } public boolean huskRidable = false; -@@ -1107,6 +1159,7 @@ public class PurpurWorldConfig { +@@ -1112,6 +1164,7 @@ public class PurpurWorldConfig { public boolean huskJockeyOnlyBaby = true; public double huskJockeyChance = 0.05D; public boolean huskJockeyTryExistingChickens = true; @@ -1610,7 +1610,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void huskSettings() { huskRidable = getBoolean("mobs.husk.ridable", huskRidable); huskRidableInWater = getBoolean("mobs.husk.ridable-in-water", huskRidableInWater); -@@ -1121,6 +1174,7 @@ public class PurpurWorldConfig { +@@ -1126,6 +1179,7 @@ public class PurpurWorldConfig { huskJockeyOnlyBaby = getBoolean("mobs.husk.jockey.only-babies", huskJockeyOnlyBaby); huskJockeyChance = getDouble("mobs.husk.jockey.chance", huskJockeyChance); huskJockeyTryExistingChickens = getBoolean("mobs.husk.jockey.try-existing-chickens", huskJockeyTryExistingChickens); @@ -1618,7 +1618,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 } public boolean illusionerRidable = false; -@@ -1129,6 +1183,7 @@ public class PurpurWorldConfig { +@@ -1134,6 +1188,7 @@ public class PurpurWorldConfig { public double illusionerMovementSpeed = 0.5D; public double illusionerFollowRange = 18.0D; public double illusionerMaxHealth = 32.0D; @@ -1626,7 +1626,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void illusionerSettings() { illusionerRidable = getBoolean("mobs.illusioner.ridable", illusionerRidable); illusionerRidableInWater = getBoolean("mobs.illusioner.ridable-in-water", illusionerRidableInWater); -@@ -1145,6 +1200,7 @@ public class PurpurWorldConfig { +@@ -1150,6 +1205,7 @@ public class PurpurWorldConfig { set("mobs.illusioner.attributes.max_health", oldValue); } illusionerMaxHealth = getDouble("mobs.illusioner.attributes.max_health", illusionerMaxHealth); @@ -1634,7 +1634,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 } public boolean ironGolemRidable = false; -@@ -1152,6 +1208,7 @@ public class PurpurWorldConfig { +@@ -1157,6 +1213,7 @@ public class PurpurWorldConfig { public boolean ironGolemControllable = true; public boolean ironGolemCanSwim = false; public double ironGolemMaxHealth = 100.0D; @@ -1642,7 +1642,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void ironGolemSettings() { ironGolemRidable = getBoolean("mobs.iron_golem.ridable", ironGolemRidable); ironGolemRidableInWater = getBoolean("mobs.iron_golem.ridable-in-water", ironGolemRidableInWater); -@@ -1163,6 +1220,7 @@ public class PurpurWorldConfig { +@@ -1168,6 +1225,7 @@ public class PurpurWorldConfig { set("mobs.iron_golem.attributes.max_health", oldValue); } ironGolemMaxHealth = getDouble("mobs.iron_golem.attributes.max_health", ironGolemMaxHealth); @@ -1650,7 +1650,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 } public boolean llamaRidable = false; -@@ -1175,6 +1233,7 @@ public class PurpurWorldConfig { +@@ -1180,6 +1238,7 @@ public class PurpurWorldConfig { public double llamaMovementSpeedMin = 0.175D; public double llamaMovementSpeedMax = 0.175D; public int llamaBreedingTicks = 6000; @@ -1658,7 +1658,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void llamaSettings() { llamaRidable = getBoolean("mobs.llama.ridable", llamaRidable); llamaRidableInWater = getBoolean("mobs.llama.ridable-in-water", llamaRidableInWater); -@@ -1193,6 +1252,7 @@ public class PurpurWorldConfig { +@@ -1198,6 +1257,7 @@ public class PurpurWorldConfig { llamaMovementSpeedMin = getDouble("mobs.llama.attributes.movement_speed.min", llamaMovementSpeedMin); llamaMovementSpeedMax = getDouble("mobs.llama.attributes.movement_speed.max", llamaMovementSpeedMax); llamaBreedingTicks = getInt("mobs.llama.breeding-delay-ticks", llamaBreedingTicks); @@ -1666,7 +1666,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 } public boolean magmaCubeRidable = false; -@@ -1202,6 +1262,7 @@ public class PurpurWorldConfig { +@@ -1207,6 +1267,7 @@ public class PurpurWorldConfig { public String magmaCubeAttackDamage = "size"; public Map magmaCubeMaxHealthCache = new HashMap<>(); public Map magmaCubeAttackDamageCache = new HashMap<>(); @@ -1674,7 +1674,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void magmaCubeSettings() { magmaCubeRidable = getBoolean("mobs.magma_cube.ridable", magmaCubeRidable); magmaCubeRidableInWater = getBoolean("mobs.magma_cube.ridable-in-water", magmaCubeRidableInWater); -@@ -1215,6 +1276,7 @@ public class PurpurWorldConfig { +@@ -1220,6 +1281,7 @@ public class PurpurWorldConfig { magmaCubeAttackDamage = getString("mobs.magma_cube.attributes.attack_damage", magmaCubeAttackDamage); magmaCubeMaxHealthCache.clear(); magmaCubeAttackDamageCache.clear(); @@ -1682,7 +1682,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 } public boolean mooshroomRidable = false; -@@ -1222,6 +1284,7 @@ public class PurpurWorldConfig { +@@ -1227,6 +1289,7 @@ public class PurpurWorldConfig { public boolean mooshroomControllable = true; public double mooshroomMaxHealth = 10.0D; public int mooshroomBreedingTicks = 6000; @@ -1690,7 +1690,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void mooshroomSettings() { mooshroomRidable = getBoolean("mobs.mooshroom.ridable", mooshroomRidable); mooshroomRidableInWater = getBoolean("mobs.mooshroom.ridable-in-water", mooshroomRidableInWater); -@@ -1233,6 +1296,7 @@ public class PurpurWorldConfig { +@@ -1238,6 +1301,7 @@ public class PurpurWorldConfig { } mooshroomMaxHealth = getDouble("mobs.mooshroom.attributes.max_health", mooshroomMaxHealth); mooshroomBreedingTicks = getInt("mobs.mooshroom.breeding-delay-ticks", mooshroomBreedingTicks); @@ -1698,7 +1698,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 } public boolean muleRidableInWater = false; -@@ -1243,6 +1307,7 @@ public class PurpurWorldConfig { +@@ -1248,6 +1312,7 @@ public class PurpurWorldConfig { public double muleMovementSpeedMin = 0.175D; public double muleMovementSpeedMax = 0.175D; public int muleBreedingTicks = 6000; @@ -1706,7 +1706,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void muleSettings() { muleRidableInWater = getBoolean("mobs.mule.ridable-in-water", muleRidableInWater); if (PurpurConfig.version < 10) { -@@ -1259,6 +1324,7 @@ public class PurpurWorldConfig { +@@ -1264,6 +1329,7 @@ public class PurpurWorldConfig { muleMovementSpeedMin = getDouble("mobs.mule.attributes.movement_speed.min", muleMovementSpeedMin); muleMovementSpeedMax = getDouble("mobs.mule.attributes.movement_speed.max", muleMovementSpeedMax); muleBreedingTicks = getInt("mobs.mule.breeding-delay-ticks", muleBreedingTicks); @@ -1714,7 +1714,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 } public boolean ocelotRidable = false; -@@ -1266,6 +1332,7 @@ public class PurpurWorldConfig { +@@ -1271,6 +1337,7 @@ public class PurpurWorldConfig { public boolean ocelotControllable = true; public double ocelotMaxHealth = 10.0D; public int ocelotBreedingTicks = 6000; @@ -1722,7 +1722,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void ocelotSettings() { ocelotRidable = getBoolean("mobs.ocelot.ridable", ocelotRidable); ocelotRidableInWater = getBoolean("mobs.ocelot.ridable-in-water", ocelotRidableInWater); -@@ -1277,6 +1344,7 @@ public class PurpurWorldConfig { +@@ -1282,6 +1349,7 @@ public class PurpurWorldConfig { } ocelotMaxHealth = getDouble("mobs.ocelot.attributes.max_health", ocelotMaxHealth); ocelotBreedingTicks = getInt("mobs.ocelot.breeding-delay-ticks", ocelotBreedingTicks); @@ -1730,7 +1730,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 } public boolean pandaRidable = false; -@@ -1284,6 +1352,7 @@ public class PurpurWorldConfig { +@@ -1289,6 +1357,7 @@ public class PurpurWorldConfig { public boolean pandaControllable = true; public double pandaMaxHealth = 20.0D; public int pandaBreedingTicks = 6000; @@ -1738,7 +1738,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void pandaSettings() { pandaRidable = getBoolean("mobs.panda.ridable", pandaRidable); pandaRidableInWater = getBoolean("mobs.panda.ridable-in-water", pandaRidableInWater); -@@ -1295,6 +1364,7 @@ public class PurpurWorldConfig { +@@ -1300,6 +1369,7 @@ public class PurpurWorldConfig { } pandaMaxHealth = getDouble("mobs.panda.attributes.max_health", pandaMaxHealth); pandaBreedingTicks = getInt("mobs.panda.breeding-delay-ticks", pandaBreedingTicks); @@ -1746,7 +1746,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 } public boolean parrotRidable = false; -@@ -1302,6 +1372,7 @@ public class PurpurWorldConfig { +@@ -1307,6 +1377,7 @@ public class PurpurWorldConfig { public boolean parrotControllable = true; public double parrotMaxY = 320D; public double parrotMaxHealth = 6.0D; @@ -1754,7 +1754,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void parrotSettings() { parrotRidable = getBoolean("mobs.parrot.ridable", parrotRidable); parrotRidableInWater = getBoolean("mobs.parrot.ridable-in-water", parrotRidableInWater); -@@ -1313,6 +1384,7 @@ public class PurpurWorldConfig { +@@ -1318,6 +1389,7 @@ public class PurpurWorldConfig { set("mobs.parrot.attributes.max_health", oldValue); } parrotMaxHealth = getDouble("mobs.parrot.attributes.max_health", parrotMaxHealth); @@ -1762,7 +1762,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 } public boolean phantomRidable = false; -@@ -1339,6 +1411,7 @@ public class PurpurWorldConfig { +@@ -1344,6 +1416,7 @@ public class PurpurWorldConfig { public boolean phantomIgnorePlayersWithTorch = false; public boolean phantomBurnInDaylight = true; public boolean phantomFlamesOnSwoop = false; @@ -1770,7 +1770,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void phantomSettings() { phantomRidable = getBoolean("mobs.phantom.ridable", phantomRidable); phantomRidableInWater = getBoolean("mobs.phantom.ridable-in-water", phantomRidableInWater); -@@ -1373,6 +1446,7 @@ public class PurpurWorldConfig { +@@ -1378,6 +1451,7 @@ public class PurpurWorldConfig { phantomBurnInDaylight = getBoolean("mobs.phantom.burn-in-daylight", phantomBurnInDaylight); phantomIgnorePlayersWithTorch = getBoolean("mobs.phantom.ignore-players-with-torch", phantomIgnorePlayersWithTorch); phantomFlamesOnSwoop = getBoolean("mobs.phantom.flames-on-swoop", phantomFlamesOnSwoop); @@ -1778,7 +1778,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 } public boolean pigRidable = false; -@@ -1381,6 +1455,7 @@ public class PurpurWorldConfig { +@@ -1386,6 +1460,7 @@ public class PurpurWorldConfig { public double pigMaxHealth = 10.0D; public boolean pigGiveSaddleBack = false; public int pigBreedingTicks = 6000; @@ -1786,7 +1786,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void pigSettings() { pigRidable = getBoolean("mobs.pig.ridable", pigRidable); pigRidableInWater = getBoolean("mobs.pig.ridable-in-water", pigRidableInWater); -@@ -1393,6 +1468,7 @@ public class PurpurWorldConfig { +@@ -1398,6 +1473,7 @@ public class PurpurWorldConfig { pigMaxHealth = getDouble("mobs.pig.attributes.max_health", pigMaxHealth); pigGiveSaddleBack = getBoolean("mobs.pig.give-saddle-back", pigGiveSaddleBack); pigBreedingTicks = getInt("mobs.pig.breeding-delay-ticks", pigBreedingTicks); @@ -1794,7 +1794,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 } public boolean piglinRidable = false; -@@ -1400,6 +1476,7 @@ public class PurpurWorldConfig { +@@ -1405,6 +1481,7 @@ public class PurpurWorldConfig { public boolean piglinControllable = true; public double piglinMaxHealth = 16.0D; public boolean piglinBypassMobGriefing = false; @@ -1802,7 +1802,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void piglinSettings() { piglinRidable = getBoolean("mobs.piglin.ridable", piglinRidable); piglinRidableInWater = getBoolean("mobs.piglin.ridable-in-water", piglinRidableInWater); -@@ -1411,12 +1488,14 @@ public class PurpurWorldConfig { +@@ -1416,12 +1493,14 @@ public class PurpurWorldConfig { } piglinMaxHealth = getDouble("mobs.piglin.attributes.max_health", piglinMaxHealth); piglinBypassMobGriefing = getBoolean("mobs.piglin.bypass-mob-griefing", piglinBypassMobGriefing); @@ -1817,7 +1817,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void piglinBruteSettings() { piglinBruteRidable = getBoolean("mobs.piglin_brute.ridable", piglinBruteRidable); piglinBruteRidableInWater = getBoolean("mobs.piglin_brute.ridable-in-water", piglinBruteRidableInWater); -@@ -1427,6 +1506,7 @@ public class PurpurWorldConfig { +@@ -1432,6 +1511,7 @@ public class PurpurWorldConfig { set("mobs.piglin_brute.attributes.max_health", oldValue); } piglinBruteMaxHealth = getDouble("mobs.piglin_brute.attributes.max_health", piglinBruteMaxHealth); @@ -1825,7 +1825,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 } public boolean pillagerRidable = false; -@@ -1434,6 +1514,7 @@ public class PurpurWorldConfig { +@@ -1439,6 +1519,7 @@ public class PurpurWorldConfig { public boolean pillagerControllable = true; public double pillagerMaxHealth = 24.0D; public boolean pillagerBypassMobGriefing = false; @@ -1833,7 +1833,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void pillagerSettings() { pillagerRidable = getBoolean("mobs.pillager.ridable", pillagerRidable); pillagerRidableInWater = getBoolean("mobs.pillager.ridable-in-water", pillagerRidableInWater); -@@ -1445,6 +1526,7 @@ public class PurpurWorldConfig { +@@ -1450,6 +1531,7 @@ public class PurpurWorldConfig { } pillagerMaxHealth = getDouble("mobs.pillager.attributes.max_health", pillagerMaxHealth); pillagerBypassMobGriefing = getBoolean("mobs.pillager.bypass-mob-griefing", pillagerBypassMobGriefing); @@ -1841,7 +1841,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 } public boolean polarBearRidable = false; -@@ -1454,6 +1536,7 @@ public class PurpurWorldConfig { +@@ -1459,6 +1541,7 @@ public class PurpurWorldConfig { public String polarBearBreedableItemString = ""; public Item polarBearBreedableItem = null; public int polarBearBreedingTicks = 6000; @@ -1849,8 +1849,8 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void polarBearSettings() { polarBearRidable = getBoolean("mobs.polar_bear.ridable", polarBearRidable); polarBearRidableInWater = getBoolean("mobs.polar_bear.ridable-in-water", polarBearRidableInWater); -@@ -1468,11 +1551,13 @@ public class PurpurWorldConfig { - Item item = Registry.ITEM.get(new ResourceLocation(polarBearBreedableItemString)); +@@ -1473,11 +1556,13 @@ public class PurpurWorldConfig { + Item item = BuiltInRegistries.ITEM.get(new ResourceLocation(polarBearBreedableItemString)); if (item != Items.AIR) polarBearBreedableItem = item; polarBearBreedingTicks = getInt("mobs.polar_bear.breeding-delay-ticks", polarBearBreedingTicks); + polarBearTakeDamageFromWater = getBoolean("mobs.polar_bear.takes-damage-from-water", polarBearTakeDamageFromWater); @@ -1863,7 +1863,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void pufferfishSettings() { pufferfishRidable = getBoolean("mobs.pufferfish.ridable", pufferfishRidable); pufferfishControllable = getBoolean("mobs.pufferfish.controllable", pufferfishControllable); -@@ -1482,6 +1567,7 @@ public class PurpurWorldConfig { +@@ -1487,6 +1572,7 @@ public class PurpurWorldConfig { set("mobs.pufferfish.attributes.max_health", oldValue); } pufferfishMaxHealth = getDouble("mobs.pufferfish.attributes.max_health", pufferfishMaxHealth); @@ -1871,7 +1871,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 } public boolean rabbitRidable = false; -@@ -1492,6 +1578,7 @@ public class PurpurWorldConfig { +@@ -1497,6 +1583,7 @@ public class PurpurWorldConfig { public double rabbitNaturalKiller = 0.0D; public int rabbitBreedingTicks = 6000; public boolean rabbitBypassMobGriefing = false; @@ -1879,7 +1879,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void rabbitSettings() { rabbitRidable = getBoolean("mobs.rabbit.ridable", rabbitRidable); rabbitRidableInWater = getBoolean("mobs.rabbit.ridable-in-water", rabbitRidableInWater); -@@ -1506,6 +1593,7 @@ public class PurpurWorldConfig { +@@ -1511,6 +1598,7 @@ public class PurpurWorldConfig { 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); @@ -1887,7 +1887,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 } public boolean ravagerRidable = false; -@@ -1513,6 +1601,7 @@ public class PurpurWorldConfig { +@@ -1518,6 +1606,7 @@ public class PurpurWorldConfig { public boolean ravagerControllable = true; public double ravagerMaxHealth = 100.0D; public boolean ravagerBypassMobGriefing = false; @@ -1895,7 +1895,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void ravagerSettings() { ravagerRidable = getBoolean("mobs.ravager.ridable", ravagerRidable); ravagerRidableInWater = getBoolean("mobs.ravager.ridable-in-water", ravagerRidableInWater); -@@ -1524,11 +1613,13 @@ public class PurpurWorldConfig { +@@ -1529,11 +1618,13 @@ public class PurpurWorldConfig { } ravagerMaxHealth = getDouble("mobs.ravager.attributes.max_health", ravagerMaxHealth); ravagerBypassMobGriefing = getBoolean("mobs.ravager.bypass-mob-griefing", ravagerBypassMobGriefing); @@ -1909,7 +1909,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void salmonSettings() { salmonRidable = getBoolean("mobs.salmon.ridable", salmonRidable); salmonControllable = getBoolean("mobs.salmon.controllable", salmonControllable); -@@ -1538,6 +1629,7 @@ public class PurpurWorldConfig { +@@ -1543,6 +1634,7 @@ public class PurpurWorldConfig { set("mobs.salmon.attributes.max_health", oldValue); } salmonMaxHealth = getDouble("mobs.salmon.attributes.max_health", salmonMaxHealth); @@ -1917,7 +1917,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 } public boolean sheepRidable = false; -@@ -1546,6 +1638,7 @@ public class PurpurWorldConfig { +@@ -1551,6 +1643,7 @@ public class PurpurWorldConfig { public double sheepMaxHealth = 8.0D; public int sheepBreedingTicks = 6000; public boolean sheepBypassMobGriefing = false; @@ -1925,7 +1925,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void sheepSettings() { sheepRidable = getBoolean("mobs.sheep.ridable", sheepRidable); sheepRidableInWater = getBoolean("mobs.sheep.ridable-in-water", sheepRidableInWater); -@@ -1558,12 +1651,14 @@ public class PurpurWorldConfig { +@@ -1563,12 +1656,14 @@ public class PurpurWorldConfig { sheepMaxHealth = getDouble("mobs.sheep.attributes.max_health", sheepMaxHealth); sheepBreedingTicks = getInt("mobs.sheep.breeding-delay-ticks", sheepBreedingTicks); sheepBypassMobGriefing = getBoolean("mobs.sheep.bypass-mob-griefing", sheepBypassMobGriefing); @@ -1940,7 +1940,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void shulkerSettings() { shulkerRidable = getBoolean("mobs.shulker.ridable", shulkerRidable); shulkerRidableInWater = getBoolean("mobs.shulker.ridable-in-water", shulkerRidableInWater); -@@ -1574,6 +1669,7 @@ public class PurpurWorldConfig { +@@ -1579,6 +1674,7 @@ public class PurpurWorldConfig { set("mobs.shulker.attributes.max_health", oldValue); } shulkerMaxHealth = getDouble("mobs.shulker.attributes.max_health", shulkerMaxHealth); @@ -1948,7 +1948,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 } public boolean silverfishRidable = false; -@@ -1581,6 +1677,7 @@ public class PurpurWorldConfig { +@@ -1586,6 +1682,7 @@ public class PurpurWorldConfig { public boolean silverfishControllable = true; public double silverfishMaxHealth = 8.0D; public boolean silverfishBypassMobGriefing = false; @@ -1956,7 +1956,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void silverfishSettings() { silverfishRidable = getBoolean("mobs.silverfish.ridable", silverfishRidable); silverfishRidableInWater = getBoolean("mobs.silverfish.ridable-in-water", silverfishRidableInWater); -@@ -1592,12 +1689,14 @@ public class PurpurWorldConfig { +@@ -1597,12 +1694,14 @@ public class PurpurWorldConfig { } silverfishMaxHealth = getDouble("mobs.silverfish.attributes.max_health", silverfishMaxHealth); silverfishBypassMobGriefing = getBoolean("mobs.silverfish.bypass-mob-griefing", silverfishBypassMobGriefing); @@ -1971,7 +1971,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void skeletonSettings() { skeletonRidable = getBoolean("mobs.skeleton.ridable", skeletonRidable); skeletonRidableInWater = getBoolean("mobs.skeleton.ridable-in-water", skeletonRidableInWater); -@@ -1608,6 +1707,7 @@ public class PurpurWorldConfig { +@@ -1613,6 +1712,7 @@ public class PurpurWorldConfig { set("mobs.skeleton.attributes.max_health", oldValue); } skeletonMaxHealth = getDouble("mobs.skeleton.attributes.max_health", skeletonMaxHealth); @@ -1979,7 +1979,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 } public boolean skeletonHorseRidableInWater = true; -@@ -1618,6 +1718,7 @@ public class PurpurWorldConfig { +@@ -1623,6 +1723,7 @@ public class PurpurWorldConfig { public double skeletonHorseJumpStrengthMax = 1.0D; public double skeletonHorseMovementSpeedMin = 0.2D; public double skeletonHorseMovementSpeedMax = 0.2D; @@ -1987,7 +1987,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void skeletonHorseSettings() { skeletonHorseRidableInWater = getBoolean("mobs.skeleton_horse.ridable-in-water", skeletonHorseRidableInWater); skeletonHorseCanSwim = getBoolean("mobs.skeleton_horse.can-swim", skeletonHorseCanSwim); -@@ -1633,6 +1734,7 @@ public class PurpurWorldConfig { +@@ -1638,6 +1739,7 @@ public class PurpurWorldConfig { skeletonHorseJumpStrengthMax = getDouble("mobs.skeleton_horse.attributes.jump_strength.max", skeletonHorseJumpStrengthMax); skeletonHorseMovementSpeedMin = getDouble("mobs.skeleton_horse.attributes.movement_speed.min", skeletonHorseMovementSpeedMin); skeletonHorseMovementSpeedMax = getDouble("mobs.skeleton_horse.attributes.movement_speed.max", skeletonHorseMovementSpeedMax); @@ -1995,7 +1995,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 } public boolean slimeRidable = false; -@@ -1642,6 +1744,7 @@ public class PurpurWorldConfig { +@@ -1647,6 +1749,7 @@ public class PurpurWorldConfig { public String slimeAttackDamage = "size"; public Map slimeMaxHealthCache = new HashMap<>(); public Map slimeAttackDamageCache = new HashMap<>(); @@ -2003,7 +2003,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void slimeSettings() { slimeRidable = getBoolean("mobs.slime.ridable", slimeRidable); slimeRidableInWater = getBoolean("mobs.slime.ridable-in-water", slimeRidableInWater); -@@ -1655,6 +1758,7 @@ public class PurpurWorldConfig { +@@ -1660,6 +1763,7 @@ public class PurpurWorldConfig { slimeAttackDamage = getString("mobs.slime.attributes.attack_damage", slimeAttackDamage); slimeMaxHealthCache.clear(); slimeAttackDamageCache.clear(); @@ -2011,7 +2011,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 } public boolean snowGolemRidable = false; -@@ -1669,6 +1773,7 @@ public class PurpurWorldConfig { +@@ -1674,6 +1778,7 @@ public class PurpurWorldConfig { public float snowGolemSnowBallModifier = 10.0F; public double snowGolemAttackDistance = 1.25D; public boolean snowGolemBypassMobGriefing = false; @@ -2019,7 +2019,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void snowGolemSettings() { snowGolemRidable = getBoolean("mobs.snow_golem.ridable", snowGolemRidable); snowGolemRidableInWater = getBoolean("mobs.snow_golem.ridable-in-water", snowGolemRidableInWater); -@@ -1687,6 +1792,7 @@ public class PurpurWorldConfig { +@@ -1692,6 +1797,7 @@ public class PurpurWorldConfig { 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); @@ -2027,7 +2027,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 } public boolean squidRidable = false; -@@ -1695,6 +1801,7 @@ public class PurpurWorldConfig { +@@ -1700,6 +1806,7 @@ public class PurpurWorldConfig { public boolean squidImmuneToEAR = true; public double squidOffsetWaterCheck = 0.0D; public boolean squidsCanFly = false; @@ -2035,7 +2035,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void squidSettings() { squidRidable = getBoolean("mobs.squid.ridable", squidRidable); squidControllable = getBoolean("mobs.squid.controllable", squidControllable); -@@ -1707,12 +1814,14 @@ public class PurpurWorldConfig { +@@ -1712,12 +1819,14 @@ public class PurpurWorldConfig { squidImmuneToEAR = getBoolean("mobs.squid.immune-to-EAR", squidImmuneToEAR); squidOffsetWaterCheck = getDouble("mobs.squid.water-offset-check", squidOffsetWaterCheck); squidsCanFly = getBoolean("mobs.squid.can-fly", squidsCanFly); @@ -2050,7 +2050,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void spiderSettings() { spiderRidable = getBoolean("mobs.spider.ridable", spiderRidable); spiderRidableInWater = getBoolean("mobs.spider.ridable-in-water", spiderRidableInWater); -@@ -1723,12 +1832,14 @@ public class PurpurWorldConfig { +@@ -1728,12 +1837,14 @@ public class PurpurWorldConfig { set("mobs.spider.attributes.max_health", oldValue); } spiderMaxHealth = getDouble("mobs.spider.attributes.max_health", spiderMaxHealth); @@ -2065,7 +2065,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void straySettings() { strayRidable = getBoolean("mobs.stray.ridable", strayRidable); strayRidableInWater = getBoolean("mobs.stray.ridable-in-water", strayRidableInWater); -@@ -1739,6 +1850,7 @@ public class PurpurWorldConfig { +@@ -1744,6 +1855,7 @@ public class PurpurWorldConfig { set("mobs.stray.attributes.max_health", oldValue); } strayMaxHealth = getDouble("mobs.stray.attributes.max_health", strayMaxHealth); @@ -2073,7 +2073,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 } public boolean striderRidable = false; -@@ -1747,6 +1859,7 @@ public class PurpurWorldConfig { +@@ -1752,6 +1864,7 @@ public class PurpurWorldConfig { public double striderMaxHealth = 20.0D; public int striderBreedingTicks = 6000; public boolean striderGiveSaddleBack = false; @@ -2081,7 +2081,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void striderSettings() { striderRidable = getBoolean("mobs.strider.ridable", striderRidable); striderRidableInWater = getBoolean("mobs.strider.ridable-in-water", striderRidableInWater); -@@ -1759,6 +1872,7 @@ public class PurpurWorldConfig { +@@ -1764,6 +1877,7 @@ public class PurpurWorldConfig { striderMaxHealth = getDouble("mobs.strider.attributes.max_health", striderMaxHealth); striderBreedingTicks = getInt("mobs.strider.breeding-delay-ticks", striderBreedingTicks); striderGiveSaddleBack = getBoolean("mobs.strider.give-saddle-back", striderGiveSaddleBack); @@ -2089,7 +2089,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 } public boolean tadpoleRidable = false; -@@ -1780,6 +1894,7 @@ public class PurpurWorldConfig { +@@ -1785,6 +1899,7 @@ public class PurpurWorldConfig { public double traderLlamaMovementSpeedMin = 0.175D; public double traderLlamaMovementSpeedMax = 0.175D; public int traderLlamaBreedingTicks = 6000; @@ -2097,7 +2097,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void traderLlamaSettings() { traderLlamaRidable = getBoolean("mobs.trader_llama.ridable", traderLlamaRidable); traderLlamaRidableInWater = getBoolean("mobs.trader_llama.ridable-in-water", traderLlamaRidableInWater); -@@ -1798,11 +1913,13 @@ public class PurpurWorldConfig { +@@ -1803,11 +1918,13 @@ public class PurpurWorldConfig { traderLlamaMovementSpeedMin = getDouble("mobs.trader_llama.attributes.movement_speed.min", traderLlamaMovementSpeedMin); traderLlamaMovementSpeedMax = getDouble("mobs.trader_llama.attributes.movement_speed.max", traderLlamaMovementSpeedMax); traderLlamaBreedingTicks = getInt("mobs.trader_llama.breeding-delay-ticks", traderLlamaBreedingTicks); @@ -2111,7 +2111,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void tropicalFishSettings() { tropicalFishRidable = getBoolean("mobs.tropical_fish.ridable", tropicalFishRidable); tropicalFishControllable = getBoolean("mobs.tropical_fish.controllable", tropicalFishControllable); -@@ -1812,6 +1929,7 @@ public class PurpurWorldConfig { +@@ -1817,6 +1934,7 @@ public class PurpurWorldConfig { set("mobs.tropical_fish.attributes.max_health", oldValue); } tropicalFishMaxHealth = getDouble("mobs.tropical_fish.attributes.max_health", tropicalFishMaxHealth); @@ -2119,7 +2119,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 } public boolean turtleRidable = false; -@@ -1819,6 +1937,7 @@ public class PurpurWorldConfig { +@@ -1824,6 +1942,7 @@ public class PurpurWorldConfig { public boolean turtleControllable = true; public double turtleMaxHealth = 30.0D; public int turtleBreedingTicks = 6000; @@ -2127,7 +2127,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void turtleSettings() { turtleRidable = getBoolean("mobs.turtle.ridable", turtleRidable); turtleRidableInWater = getBoolean("mobs.turtle.ridable-in-water", turtleRidableInWater); -@@ -1830,6 +1949,7 @@ public class PurpurWorldConfig { +@@ -1835,6 +1954,7 @@ public class PurpurWorldConfig { } turtleMaxHealth = getDouble("mobs.turtle.attributes.max_health", turtleMaxHealth); turtleBreedingTicks = getInt("mobs.turtle.breeding-delay-ticks", turtleBreedingTicks); @@ -2135,7 +2135,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 } public boolean vexRidable = false; -@@ -1837,6 +1957,7 @@ public class PurpurWorldConfig { +@@ -1842,6 +1962,7 @@ public class PurpurWorldConfig { public boolean vexControllable = true; public double vexMaxY = 320D; public double vexMaxHealth = 14.0D; @@ -2143,7 +2143,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void vexSettings() { vexRidable = getBoolean("mobs.vex.ridable", vexRidable); vexRidableInWater = getBoolean("mobs.vex.ridable-in-water", vexRidableInWater); -@@ -1848,6 +1969,7 @@ public class PurpurWorldConfig { +@@ -1853,6 +1974,7 @@ public class PurpurWorldConfig { set("mobs.vex.attributes.max_health", oldValue); } vexMaxHealth = getDouble("mobs.vex.attributes.max_health", vexMaxHealth); @@ -2151,7 +2151,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 } public boolean villagerRidable = false; -@@ -1863,6 +1985,7 @@ public class PurpurWorldConfig { +@@ -1866,6 +1988,7 @@ public class PurpurWorldConfig { public boolean villagerClericsFarmWarts = false; public boolean villagerClericFarmersThrowWarts = true; public boolean villagerBypassMobGriefing = false; @@ -2159,7 +2159,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void villagerSettings() { villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); -@@ -1882,6 +2005,7 @@ public class PurpurWorldConfig { +@@ -1883,6 +2006,7 @@ public class PurpurWorldConfig { 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); @@ -2167,7 +2167,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 } public boolean vindicatorRidable = false; -@@ -1889,6 +2013,7 @@ public class PurpurWorldConfig { +@@ -1890,6 +2014,7 @@ public class PurpurWorldConfig { public boolean vindicatorControllable = true; public double vindicatorMaxHealth = 24.0D; public double vindicatorJohnnySpawnChance = 0D; @@ -2175,7 +2175,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void vindicatorSettings() { vindicatorRidable = getBoolean("mobs.vindicator.ridable", vindicatorRidable); vindicatorRidableInWater = getBoolean("mobs.vindicator.ridable-in-water", vindicatorRidableInWater); -@@ -1900,6 +2025,7 @@ public class PurpurWorldConfig { +@@ -1901,6 +2026,7 @@ public class PurpurWorldConfig { } vindicatorMaxHealth = getDouble("mobs.vindicator.attributes.max_health", vindicatorMaxHealth); vindicatorJohnnySpawnChance = getDouble("mobs.vindicator.johnny.spawn-chance", vindicatorJohnnySpawnChance); @@ -2183,7 +2183,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 } public boolean wanderingTraderRidable = false; -@@ -1908,6 +2034,7 @@ public class PurpurWorldConfig { +@@ -1909,6 +2035,7 @@ public class PurpurWorldConfig { public double wanderingTraderMaxHealth = 20.0D; public boolean wanderingTraderFollowEmeraldBlock = false; public boolean wanderingTraderCanBeLeashed = false; @@ -2191,7 +2191,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void wanderingTraderSettings() { wanderingTraderRidable = getBoolean("mobs.wandering_trader.ridable", wanderingTraderRidable); wanderingTraderRidableInWater = getBoolean("mobs.wandering_trader.ridable-in-water", wanderingTraderRidableInWater); -@@ -1920,6 +2047,7 @@ public class PurpurWorldConfig { +@@ -1921,6 +2048,7 @@ public class PurpurWorldConfig { wanderingTraderMaxHealth = getDouble("mobs.wandering_trader.attributes.max_health", wanderingTraderMaxHealth); wanderingTraderFollowEmeraldBlock = getBoolean("mobs.wandering_trader.follow-emerald-blocks", wanderingTraderFollowEmeraldBlock); wanderingTraderCanBeLeashed = getBoolean("mobs.wandering_trader.can-be-leashed", wanderingTraderCanBeLeashed); @@ -2199,7 +2199,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 } public boolean wardenRidable = false; -@@ -1935,6 +2063,7 @@ public class PurpurWorldConfig { +@@ -1936,6 +2064,7 @@ public class PurpurWorldConfig { public boolean witchRidableInWater = false; public boolean witchControllable = true; public double witchMaxHealth = 26.0D; @@ -2207,7 +2207,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void witchSettings() { witchRidable = getBoolean("mobs.witch.ridable", witchRidable); witchRidableInWater = getBoolean("mobs.witch.ridable-in-water", witchRidableInWater); -@@ -1945,6 +2074,7 @@ public class PurpurWorldConfig { +@@ -1946,6 +2075,7 @@ public class PurpurWorldConfig { set("mobs.witch.attributes.max_health", oldValue); } witchMaxHealth = getDouble("mobs.witch.attributes.max_health", witchMaxHealth); @@ -2215,7 +2215,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 } public boolean witherRidable = false; -@@ -1955,6 +2085,7 @@ public class PurpurWorldConfig { +@@ -1956,6 +2086,7 @@ public class PurpurWorldConfig { public float witherHealthRegenAmount = 1.0f; public int witherHealthRegenDelay = 20; public boolean witherBypassMobGriefing = false; @@ -2223,7 +2223,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void witherSettings() { witherRidable = getBoolean("mobs.wither.ridable", witherRidable); witherRidableInWater = getBoolean("mobs.wither.ridable-in-water", witherRidableInWater); -@@ -1973,12 +2104,14 @@ public class PurpurWorldConfig { +@@ -1974,12 +2105,14 @@ public class PurpurWorldConfig { 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); @@ -2238,7 +2238,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void witherSkeletonSettings() { witherSkeletonRidable = getBoolean("mobs.wither_skeleton.ridable", witherSkeletonRidable); witherSkeletonRidableInWater = getBoolean("mobs.wither_skeleton.ridable-in-water", witherSkeletonRidableInWater); -@@ -1989,6 +2122,7 @@ public class PurpurWorldConfig { +@@ -1990,6 +2123,7 @@ public class PurpurWorldConfig { set("mobs.wither_skeleton.attributes.max_health", oldValue); } witherSkeletonMaxHealth = getDouble("mobs.wither_skeleton.attributes.max_health", witherSkeletonMaxHealth); @@ -2246,7 +2246,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 } public boolean wolfRidable = false; -@@ -1999,6 +2133,7 @@ public class PurpurWorldConfig { +@@ -2000,6 +2134,7 @@ public class PurpurWorldConfig { public boolean wolfMilkCuresRabies = true; public double wolfNaturalRabid = 0.0D; public int wolfBreedingTicks = 6000; @@ -2254,7 +2254,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void wolfSettings() { wolfRidable = getBoolean("mobs.wolf.ridable", wolfRidable); wolfRidableInWater = getBoolean("mobs.wolf.ridable-in-water", wolfRidableInWater); -@@ -2017,12 +2152,14 @@ public class PurpurWorldConfig { +@@ -2018,12 +2153,14 @@ public class PurpurWorldConfig { wolfMilkCuresRabies = getBoolean("mobs.wolf.milk-cures-rabid-wolves", wolfMilkCuresRabies); wolfNaturalRabid = getDouble("mobs.wolf.spawn-rabid-chance", wolfNaturalRabid); wolfBreedingTicks = getInt("mobs.wolf.breeding-delay-ticks", wolfBreedingTicks); @@ -2269,7 +2269,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void zoglinSettings() { zoglinRidable = getBoolean("mobs.zoglin.ridable", zoglinRidable); zoglinRidableInWater = getBoolean("mobs.zoglin.ridable-in-water", zoglinRidableInWater); -@@ -2033,6 +2170,7 @@ public class PurpurWorldConfig { +@@ -2034,6 +2171,7 @@ public class PurpurWorldConfig { set("mobs.zoglin.attributes.max_health", oldValue); } zoglinMaxHealth = getDouble("mobs.zoglin.attributes.max_health", zoglinMaxHealth); @@ -2277,7 +2277,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 } public boolean zombieRidable = false; -@@ -2045,6 +2183,7 @@ public class PurpurWorldConfig { +@@ -2046,6 +2184,7 @@ public class PurpurWorldConfig { public boolean zombieJockeyTryExistingChickens = true; public boolean zombieAggressiveTowardsVillagerWhenLagging = true; public boolean zombieBypassMobGriefing = false; @@ -2285,7 +2285,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void zombieSettings() { zombieRidable = getBoolean("mobs.zombie.ridable", zombieRidable); zombieRidableInWater = getBoolean("mobs.zombie.ridable-in-water", zombieRidableInWater); -@@ -2061,6 +2200,7 @@ public class PurpurWorldConfig { +@@ -2062,6 +2201,7 @@ public class PurpurWorldConfig { 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); @@ -2293,7 +2293,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 } public boolean zombieHorseRidableInWater = false; -@@ -2072,6 +2212,7 @@ public class PurpurWorldConfig { +@@ -2073,6 +2213,7 @@ public class PurpurWorldConfig { public double zombieHorseMovementSpeedMin = 0.2D; public double zombieHorseMovementSpeedMax = 0.2D; public double zombieHorseSpawnChance = 0.0D; @@ -2301,7 +2301,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void zombieHorseSettings() { zombieHorseRidableInWater = getBoolean("mobs.zombie_horse.ridable-in-water", zombieHorseRidableInWater); zombieHorseCanSwim = getBoolean("mobs.zombie_horse.can-swim", zombieHorseCanSwim); -@@ -2088,6 +2229,7 @@ public class PurpurWorldConfig { +@@ -2089,6 +2230,7 @@ public class PurpurWorldConfig { zombieHorseMovementSpeedMin = getDouble("mobs.zombie_horse.attributes.movement_speed.min", zombieHorseMovementSpeedMin); zombieHorseMovementSpeedMax = getDouble("mobs.zombie_horse.attributes.movement_speed.max", zombieHorseMovementSpeedMax); zombieHorseSpawnChance = getDouble("mobs.zombie_horse.spawn-chance", zombieHorseSpawnChance); @@ -2309,7 +2309,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 } public boolean zombieVillagerRidable = false; -@@ -2098,6 +2240,7 @@ public class PurpurWorldConfig { +@@ -2099,6 +2241,7 @@ public class PurpurWorldConfig { public boolean zombieVillagerJockeyOnlyBaby = true; public double zombieVillagerJockeyChance = 0.05D; public boolean zombieVillagerJockeyTryExistingChickens = true; @@ -2317,7 +2317,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void zombieVillagerSettings() { zombieVillagerRidable = getBoolean("mobs.zombie_villager.ridable", zombieVillagerRidable); zombieVillagerRidableInWater = getBoolean("mobs.zombie_villager.ridable-in-water", zombieVillagerRidableInWater); -@@ -2112,6 +2255,7 @@ public class PurpurWorldConfig { +@@ -2113,6 +2256,7 @@ public class PurpurWorldConfig { zombieVillagerJockeyOnlyBaby = getBoolean("mobs.zombie_villager.jockey.only-babies", zombieVillagerJockeyOnlyBaby); zombieVillagerJockeyChance = getDouble("mobs.zombie_villager.jockey.chance", zombieVillagerJockeyChance); zombieVillagerJockeyTryExistingChickens = getBoolean("mobs.zombie_villager.jockey.try-existing-chickens", zombieVillagerJockeyTryExistingChickens); @@ -2325,7 +2325,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 } public boolean zombifiedPiglinRidable = false; -@@ -2123,6 +2267,7 @@ public class PurpurWorldConfig { +@@ -2124,6 +2268,7 @@ public class PurpurWorldConfig { public double zombifiedPiglinJockeyChance = 0.05D; public boolean zombifiedPiglinJockeyTryExistingChickens = true; public boolean zombifiedPiglinCountAsPlayerKillWhenAngry = true; @@ -2333,7 +2333,7 @@ index bfe540637ec08d098a3b9e951b2d88fd4f618f1a..2137335cac886ac967ad318f449b4992 private void zombifiedPiglinSettings() { zombifiedPiglinRidable = getBoolean("mobs.zombified_piglin.ridable", zombifiedPiglinRidable); zombifiedPiglinRidableInWater = getBoolean("mobs.zombified_piglin.ridable-in-water", zombifiedPiglinRidableInWater); -@@ -2138,5 +2283,6 @@ public class PurpurWorldConfig { +@@ -2139,5 +2284,6 @@ public class PurpurWorldConfig { zombifiedPiglinJockeyChance = getDouble("mobs.zombified_piglin.jockey.chance", zombifiedPiglinJockeyChance); zombifiedPiglinJockeyTryExistingChickens = getBoolean("mobs.zombified_piglin.jockey.try-existing-chickens", zombifiedPiglinJockeyTryExistingChickens); zombifiedPiglinCountAsPlayerKillWhenAngry = getBoolean("mobs.zombified_piglin.count-as-player-kill-when-angry", zombifiedPiglinCountAsPlayerKillWhenAngry); diff --git a/patches/server/0136-Config-to-always-tame-in-Creative.patch b/patches/server/0131-Config-to-always-tame-in-Creative.patch similarity index 90% rename from patches/server/0136-Config-to-always-tame-in-Creative.patch rename to patches/server/0131-Config-to-always-tame-in-Creative.patch index 8c9a47537..a7bf4a6a8 100644 --- a/patches/server/0136-Config-to-always-tame-in-Creative.patch +++ b/patches/server/0131-Config-to-always-tame-in-Creative.patch @@ -20,10 +20,10 @@ index 5c64905e90ccca6e0b347241ddf9cc3f71058b8e..3bd7521b131b2b40f807bdc7ab95e64c return; } diff --git a/src/main/java/net/minecraft/world/entity/animal/Cat.java b/src/main/java/net/minecraft/world/entity/animal/Cat.java -index 5b3d824c0ad43ebd30c6d5fb98e50b531cb85ac7..97b5b9f63fc01b6945a5c61406a394cba80c10ec 100644 +index a166121fd50551cd199b7246dd01df47040eea87..76c99eab479d762120fbb40144a5a3b201c4dd9e 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cat.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cat.java -@@ -468,7 +468,7 @@ public class Cat extends TamableAnimal { +@@ -473,7 +473,7 @@ public class Cat extends TamableAnimal implements VariantHolder { } } else if (this.isFood(itemstack)) { this.usePlayerItem(player, hand, itemstack); @@ -33,10 +33,10 @@ index 5b3d824c0ad43ebd30c6d5fb98e50b531cb85ac7..97b5b9f63fc01b6945a5c61406a394cb this.setOrderedToSit(true); this.level.broadcastEntityEvent(this, (byte) 7); diff --git a/src/main/java/net/minecraft/world/entity/animal/Parrot.java b/src/main/java/net/minecraft/world/entity/animal/Parrot.java -index 55b14422fea113ea64717f64226aac142f6f60bd..11291851f11127f6781b3c77c0d59534606eb9dd 100644 +index f021c0c872158d463d38629ea4a8c61084be3abd..ab00e8d796ff7c903ea678dedb64cb25cf7e462e 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Parrot.java +++ b/src/main/java/net/minecraft/world/entity/animal/Parrot.java -@@ -330,7 +330,7 @@ public class Parrot extends ShoulderRidingEntity implements FlyingAnimal { +@@ -334,7 +334,7 @@ public class Parrot extends ShoulderRidingEntity implements VariantHolder iterable = world.getCollisions(this.player, this.player.getBoundingBox().deflate(9.999999747378752E-6D)); VoxelShape voxelshape = Shapes.create(box.deflate(9.999999747378752E-6D)); diff --git a/src/main/java/net/minecraft/world/damagesource/DamageSource.java b/src/main/java/net/minecraft/world/damagesource/DamageSource.java -index c4088446d30c3b25cf196f51fd394cd056be0495..8b03b8e58e16ab9b677ba14cf1d09b417cf369f5 100644 +index f2ef4d93e070167d70f597e8893bf29b53433a28..f3a682fdc1c9ba24a9532c6c17ea3c4e733ae6ef 100644 --- a/src/main/java/net/minecraft/world/damagesource/DamageSource.java +++ b/src/main/java/net/minecraft/world/damagesource/DamageSource.java -@@ -38,6 +38,14 @@ public class DamageSource { +@@ -35,6 +35,14 @@ public class DamageSource { + public static final DamageSource SWEET_BERRY_BUSH = new DamageSource("sweetBerryBush"); public static final DamageSource FREEZE = (new DamageSource("freeze")).bypassArmor(); - public static final DamageSource FALLING_STALACTITE = (new DamageSource("fallingStalactite")).damageHelmet(); public static final DamageSource STALAGMITE = (new DamageSource("stalagmite")).bypassArmor().setIsFall(); + // Purpur start + public static final DamageSource SCISSORS = (new DamageSource("scissors") { @@ -55,7 +55,7 @@ index c4088446d30c3b25cf196f51fd394cd056be0495..8b03b8e58e16ab9b677ba14cf1d09b41 private boolean bypassArmor; private boolean bypassInvul; diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java -index 1c4643e1bff41b5bce92c07c59b1c6fea16d0d43..49cd0e6f2eae6a182ea9ef43e734751da28bab4a 100644 +index b53d824bc0f964349e70097285700e5facd3bcdf..07ecccf5eddb0088e5409b3bb8a6b3c1883189d2 100644 --- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java @@ -1132,6 +1132,10 @@ public class CraftEventFactory { @@ -95,7 +95,7 @@ index 0507a090fb9122fdda4111fbd2ad3c51e4ef5c36..0d40cd506342c006bddc769c57f11d34 public static String serverModName = "Purpur"; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 13eb84cf590bbe4c5a71b47f1c08e57b5711f089..3465a47b74cd02dd8af0e297f86c0eddd5f833ed 100644 +index ec110add6bd3ad89b9a542edfd7b2014930b2702..d6dc72598aa1481419ccdf176b67f3bb37437505 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -200,6 +200,8 @@ public class PurpurWorldConfig { @@ -108,7 +108,7 @@ index 13eb84cf590bbe4c5a71b47f1c08e57b5711f089..3465a47b74cd02dd8af0e297f86c0edd itemImmuneToCactus.clear(); getList("gameplay-mechanics.item.immune.cactus", new ArrayList<>()).forEach(key -> { @@ -237,6 +239,8 @@ public class PurpurWorldConfig { - Item item = Registry.ITEM.get(new ResourceLocation(key.toString())); + Item item = BuiltInRegistries.ITEM.get(new ResourceLocation(key.toString())); if (item != Items.AIR) itemImmuneToLightning.add(item); }); + dontRunWithScissors = getBoolean("gameplay-mechanics.item.shears.damage-if-sprinting", dontRunWithScissors); diff --git a/patches/server/0140-One-Punch-Man.patch b/patches/server/0135-One-Punch-Man.patch similarity index 91% rename from patches/server/0140-One-Punch-Man.patch rename to patches/server/0135-One-Punch-Man.patch index c05683afa..43a7fa83f 100644 --- a/patches/server/0140-One-Punch-Man.patch +++ b/patches/server/0135-One-Punch-Man.patch @@ -5,10 +5,10 @@ Subject: [PATCH] One Punch Man! diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 7389823c8055f644be63a66d12bada0dddfff009..9fca48d69a0917aa31e553d5910da77beaf40bab 100644 +index 78cfa3effceaa96e186abaafa21b68e3f3b4430a..6a2b4138c8668da80e53560e41fbadcd52e78f1c 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -2239,6 +2239,20 @@ public abstract class LivingEntity extends Entity { +@@ -2231,6 +2231,20 @@ public abstract class LivingEntity extends Entity { ((ServerPlayer) damagesource.getEntity()).awardStat(Stats.DAMAGE_DEALT_ABSORBED, Math.round(f2 * 10.0F)); } @@ -30,7 +30,7 @@ index 7389823c8055f644be63a66d12bada0dddfff009..9fca48d69a0917aa31e553d5910da77b if (human) { // PAIL: Be sure to drag all this code from the EntityHuman subclass each update. diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 90dee3ce858b5c8c526b2094ac53cb1580436f0e..aa05b65c7e0812465508a280d5faa72bf522327b 100644 +index d6dc72598aa1481419ccdf176b67f3bb37437505..03939bfdf95f9e7f8b6f7c097ab37d6e5727ffa2 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -345,6 +345,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0141-Configurable-Ender-Pearl-cooldown-damage-and-Endermi.patch b/patches/server/0136-Configurable-Ender-Pearl-cooldown-damage-and-Endermi.patch similarity index 92% rename from patches/server/0141-Configurable-Ender-Pearl-cooldown-damage-and-Endermi.patch rename to patches/server/0136-Configurable-Ender-Pearl-cooldown-damage-and-Endermi.patch index 8016fd140..2c56a734c 100644 --- a/patches/server/0141-Configurable-Ender-Pearl-cooldown-damage-and-Endermi.patch +++ b/patches/server/0136-Configurable-Ender-Pearl-cooldown-damage-and-Endermi.patch @@ -8,7 +8,7 @@ Subject: [PATCH] Configurable Ender Pearl cooldown, damage, and Endermite RNG - Endermite spawn chance diff --git a/src/main/java/net/minecraft/world/entity/projectile/ThrownEnderpearl.java b/src/main/java/net/minecraft/world/entity/projectile/ThrownEnderpearl.java -index 23f77dfc6df93ef6a70e14a7e410263d39fae2cb..b72618209be2b99221686aef0d3732785bc55357 100644 +index f224ebbc0efefddede43d87f0300c014077b9931..9b176a40d95e983d32d52636ac5f1c1ee2d66910 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/ThrownEnderpearl.java +++ b/src/main/java/net/minecraft/world/entity/projectile/ThrownEnderpearl.java @@ -69,7 +69,7 @@ public class ThrownEnderpearl extends ThrowableItemProjectile { @@ -19,8 +19,8 @@ index 23f77dfc6df93ef6a70e14a7e410263d39fae2cb..b72618209be2b99221686aef0d373278 + if (this.random.nextFloat() < this.level.purpurConfig.enderPearlEndermiteChance && this.level.getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING)) { // Purpur Endermite entityendermite = (Endermite) EntityType.ENDERMITE.create(this.level); - entityendermite.moveTo(entity.getX(), entity.getY(), entity.getZ(), entity.getYRot(), entity.getXRot()); -@@ -83,7 +83,7 @@ public class ThrownEnderpearl extends ThrowableItemProjectile { + if (entityendermite != null) { +@@ -85,7 +85,7 @@ public class ThrownEnderpearl extends ThrowableItemProjectile { entityplayer.connection.teleport(teleEvent.getTo()); entity.resetFallDistance(); CraftEventFactory.entityDamage = this; @@ -43,7 +43,7 @@ index 749ab72edc0d2e9c6f1161415ab8d59d3d6ca976..897c202c0905040072a06fdfa2032a7f // Paper end if (user instanceof net.minecraft.server.level.ServerPlayer) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 76d0134835e2ec6747e41371f1f32f1a2cefabe6..63434a7e92dbc10ec957bd14a040997e56944f6e 100644 +index 03939bfdf95f9e7f8b6f7c097ab37d6e5727ffa2..fc795f2dc6957f831ef69aa49c247a86a09f9975 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -202,6 +202,10 @@ public class PurpurWorldConfig { diff --git a/patches/server/0142-Config-to-ignore-nearby-mobs-when-sleeping.patch b/patches/server/0137-Config-to-ignore-nearby-mobs-when-sleeping.patch similarity index 89% rename from patches/server/0142-Config-to-ignore-nearby-mobs-when-sleeping.patch rename to patches/server/0137-Config-to-ignore-nearby-mobs-when-sleeping.patch index e6cb8a0c1..e4b6084a9 100644 --- a/patches/server/0142-Config-to-ignore-nearby-mobs-when-sleeping.patch +++ b/patches/server/0137-Config-to-ignore-nearby-mobs-when-sleeping.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Config to ignore nearby mobs when sleeping diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index 236b95fc8dfe0157e5af2b2a20973a9e36b9c604..91d327fc77d3b42a48eef06ed4347560fe7f57f9 100644 +index 3996b6425ca6c6f329b1cc869fea73cf1dadb2eb..a7b720a2b79a1bc53c0f90c3dbfe9b68b0cfb3e0 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java -@@ -1354,7 +1354,7 @@ public class ServerPlayer extends Player { +@@ -1376,7 +1376,7 @@ public class ServerPlayer extends Player { return entitymonster.isPreventingPlayerRest(this); }); @@ -18,7 +18,7 @@ index 236b95fc8dfe0157e5af2b2a20973a9e36b9c604..91d327fc77d3b42a48eef06ed4347560 } } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 61757ab81e39741a9f2d3ea6c1c354eb64c992dc..91e1ea30559a28af96aed5cf0f454c5fa782355b 100644 +index fc795f2dc6957f831ef69aa49c247a86a09f9975..222cfcf62307b8313e9326ab3ceaf10f62bdb292 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -354,6 +354,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0143-Add-back-player-spawned-endermite-API.patch b/patches/server/0138-Add-back-player-spawned-endermite-API.patch similarity index 81% rename from patches/server/0143-Add-back-player-spawned-endermite-API.patch rename to patches/server/0138-Add-back-player-spawned-endermite-API.patch index 3929f440a..c5e0386e7 100644 --- a/patches/server/0143-Add-back-player-spawned-endermite-API.patch +++ b/patches/server/0138-Add-back-player-spawned-endermite-API.patch @@ -47,17 +47,17 @@ index 9b14ad63c2f2fea0e6c0e69a5632621c98b7a28f..195bcfee5961bb69f98532a15f625593 @Override diff --git a/src/main/java/net/minecraft/world/entity/projectile/ThrownEnderpearl.java b/src/main/java/net/minecraft/world/entity/projectile/ThrownEnderpearl.java -index b72618209be2b99221686aef0d3732785bc55357..332e12bdb686532333bb95682f420dab56ac7930 100644 +index 9b176a40d95e983d32d52636ac5f1c1ee2d66910..26991a8259e99c73ac79368642b1812264216c47 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/ThrownEnderpearl.java +++ b/src/main/java/net/minecraft/world/entity/projectile/ThrownEnderpearl.java -@@ -72,6 +72,7 @@ public class ThrownEnderpearl extends ThrowableItemProjectile { - if (this.random.nextFloat() < this.level.purpurConfig.enderPearlEndermiteChance && this.level.getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING)) { // Purpur +@@ -73,6 +73,7 @@ public class ThrownEnderpearl extends ThrowableItemProjectile { Endermite entityendermite = (Endermite) EntityType.ENDERMITE.create(this.level); -+ entityendermite.setPlayerSpawned(true); // Purpur - entityendermite.moveTo(entity.getX(), entity.getY(), entity.getZ(), entity.getYRot(), entity.getXRot()); - this.level.addFreshEntity(entityendermite, CreatureSpawnEvent.SpawnReason.ENDER_PEARL); - } + if (entityendermite != null) { ++ entityendermite.setPlayerSpawned(true); // Purpur + entityendermite.moveTo(entity.getX(), entity.getY(), entity.getZ(), entity.getYRot(), entity.getXRot()); + this.level.addFreshEntity(entityendermite, CreatureSpawnEvent.SpawnReason.ENDER_PEARL); + } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEndermite.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEndermite.java index 75c7645fb5732c43d1da15181cf5c7ee4c3ecd6c..e7f5ea4d8d72672cf03483e720c6389425f28f6d 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEndermite.java diff --git a/patches/server/0144-Config-Enderman-aggressiveness-towards-Endermites.patch b/patches/server/0139-Config-Enderman-aggressiveness-towards-Endermites.patch similarity index 90% rename from patches/server/0144-Config-Enderman-aggressiveness-towards-Endermites.patch rename to patches/server/0139-Config-Enderman-aggressiveness-towards-Endermites.patch index 9de60386d..51a2abc77 100644 --- a/patches/server/0144-Config-Enderman-aggressiveness-towards-Endermites.patch +++ b/patches/server/0139-Config-Enderman-aggressiveness-towards-Endermites.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Config Enderman aggressiveness towards Endermites diff --git a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -index 3d554d0c6f371a10fa939f87893d7dd727439541..78501dcf53672125d6895fb5ca1597450157e1d8 100644 +index 3cab85703315ea9f79b77b6fbb52d50596350454..22b74af4ead64389a53fe019b259c498ac10feaf 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -@@ -123,7 +123,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -128,7 +128,7 @@ public class EnderMan extends Monster implements NeutralMob { this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur this.targetSelector.addGoal(1, new EnderMan.EndermanLookForPlayerGoal(this, this::isAngryAt)); this.targetSelector.addGoal(2, new HurtByTargetGoal(this, new Class[0])); @@ -18,10 +18,10 @@ index 3d554d0c6f371a10fa939f87893d7dd727439541..78501dcf53672125d6895fb5ca159745 } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index a1ed00066243e86c796acf49ed830b184e4871c5..66582892312d6cdcd0c8b3b2a14d424138929318 100644 +index 521db43e966b01de3e0e1659a04d129f2deba5a6..75c2b5a19b22b4c6b69ccf2f65f19506631467a4 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -963,6 +963,8 @@ public class PurpurWorldConfig { +@@ -968,6 +968,8 @@ public class PurpurWorldConfig { public boolean endermanDespawnEvenWithBlock = false; public boolean endermanBypassMobGriefing = false; public boolean endermanTakeDamageFromWater = true; @@ -30,7 +30,7 @@ index a1ed00066243e86c796acf49ed830b184e4871c5..66582892312d6cdcd0c8b3b2a14d4241 private void endermanSettings() { endermanRidable = getBoolean("mobs.enderman.ridable", endermanRidable); endermanRidableInWater = getBoolean("mobs.enderman.ridable-in-water", endermanRidableInWater); -@@ -972,11 +974,17 @@ public class PurpurWorldConfig { +@@ -977,11 +979,17 @@ public class PurpurWorldConfig { set("mobs.enderman.attributes.max-health", null); set("mobs.enderman.attributes.max_health", oldValue); } diff --git a/patches/server/0145-Config-to-ignore-Dragon-Head-wearers-and-stare-aggro.patch b/patches/server/0140-Config-to-ignore-Dragon-Head-wearers-and-stare-aggro.patch similarity index 88% rename from patches/server/0145-Config-to-ignore-Dragon-Head-wearers-and-stare-aggro.patch rename to patches/server/0140-Config-to-ignore-Dragon-Head-wearers-and-stare-aggro.patch index c74716739..5ca0f22c9 100644 --- a/patches/server/0145-Config-to-ignore-Dragon-Head-wearers-and-stare-aggro.patch +++ b/patches/server/0140-Config-to-ignore-Dragon-Head-wearers-and-stare-aggro.patch @@ -7,10 +7,10 @@ Prevents Enderman from becoming aggresive towards players that are wearing a Dra Adds functionality to a useless item! diff --git a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -index 78501dcf53672125d6895fb5ca1597450157e1d8..6c1de46576c3cb65526de48400d268695ca53024 100644 +index 22b74af4ead64389a53fe019b259c498ac10feaf..b7ca9f5135cb65d7fdd69f258f2e84ee9e252d26 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -@@ -260,7 +260,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -265,7 +265,7 @@ public class EnderMan extends Monster implements NeutralMob { // Paper end ItemStack itemstack = (ItemStack) player.getInventory().armor.get(3); @@ -20,10 +20,10 @@ index 78501dcf53672125d6895fb5ca1597450157e1d8..6c1de46576c3cb65526de48400d26869 } else { Vec3 vec3d = player.getViewVector(1.0F).normalize(); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 66582892312d6cdcd0c8b3b2a14d424138929318..e07f75e38d012d5f266df7ac86f6239674d4281e 100644 +index 75c2b5a19b22b4c6b69ccf2f65f19506631467a4..d305af7b7d890de9e9d1ebf25bc8b8b5f5e130ba 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -965,6 +965,8 @@ public class PurpurWorldConfig { +@@ -970,6 +970,8 @@ public class PurpurWorldConfig { public boolean endermanTakeDamageFromWater = true; public boolean endermanAggroEndermites = true; public boolean endermanAggroEndermitesOnlyIfPlayerSpawned = false; @@ -32,7 +32,7 @@ index 66582892312d6cdcd0c8b3b2a14d424138929318..e07f75e38d012d5f266df7ac86f62396 private void endermanSettings() { endermanRidable = getBoolean("mobs.enderman.ridable", endermanRidable); endermanRidableInWater = getBoolean("mobs.enderman.ridable-in-water", endermanRidableInWater); -@@ -985,6 +987,8 @@ public class PurpurWorldConfig { +@@ -990,6 +992,8 @@ public class PurpurWorldConfig { 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); diff --git a/patches/server/0146-Tick-fluids-config.patch b/patches/server/0141-Tick-fluids-config.patch similarity index 97% rename from patches/server/0146-Tick-fluids-config.patch rename to patches/server/0141-Tick-fluids-config.patch index d2c6f12a3..64fa08cc4 100644 --- a/patches/server/0146-Tick-fluids-config.patch +++ b/patches/server/0141-Tick-fluids-config.patch @@ -36,7 +36,7 @@ index 43e8ef1d6a65d4fd3fe53a587639ffb814368217..9c22a730772f71b34c63d1e43d48943f } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index e07f75e38d012d5f266df7ac86f6239674d4281e..e62ebd4a24de2e5b231a4db21d25e4b01b5b0f02 100644 +index b9b9440cec8c1b6c04200ae7251af345066ed0a4..6cd886c71d890410ad33129a6c7480560fa82f75 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -132,6 +132,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0147-Config-to-disable-Llama-caravans.patch b/patches/server/0142-Config-to-disable-Llama-caravans.patch similarity index 89% rename from patches/server/0147-Config-to-disable-Llama-caravans.patch rename to patches/server/0142-Config-to-disable-Llama-caravans.patch index c64d7a4cc..0268fa08b 100644 --- a/patches/server/0147-Config-to-disable-Llama-caravans.patch +++ b/patches/server/0142-Config-to-disable-Llama-caravans.patch @@ -19,10 +19,10 @@ index 7b141c495095afcd9c8b04c059d692e829259e7a..ad30f2d678cfc4b0d693e84e6e152c63 List list = this.llama.level.getEntities(this.llama, this.llama.getBoundingBox().inflate(9.0D, 4.0D, 9.0D), (entity) -> { EntityType entityType = entity.getType(); diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java -index 43fa12c5e53cc4d1bb9a8c8603f389bc24177e53..eaf44b0d0c6ea1a137d12998b164def3272ad1a3 100644 +index 5db7ddd3f4bd79dbcb241aad2abf96ade57ae4c4..c8d3f2ffb0f4d5586921421cda8acf27f7afe4b8 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java -@@ -534,7 +534,7 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { +@@ -540,7 +540,7 @@ public class Llama extends AbstractChestedHorse implements VariantHolder type, Level world) { -@@ -156,6 +157,14 @@ public class Creeper extends Monster implements PowerableMob { +@@ -155,6 +156,14 @@ public class Creeper extends Monster implements PowerableMob { public boolean isSensitiveToWater() { return this.level.purpurConfig.creeperTakeDamageFromWater; } @@ -32,14 +32,14 @@ index 6de0dccb7a70d9ebde7a518f820258a445bed000..2ffa10ddd1a19aa44c088a41fdfcbd59 // Purpur end @Override -@@ -353,6 +362,7 @@ public class Creeper extends Monster implements PowerableMob { +@@ -354,6 +363,7 @@ public class Creeper extends Monster implements PowerableMob { } public void explodeCreeper() { + this.exploding = true; // Purpur if (!this.level.isClientSide) { - Explosion.BlockInteraction explosion_effect = (this.level.purpurConfig.creeperBypassMobGriefing || this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) && level.purpurConfig.creeperAllowGriefing ? Explosion.BlockInteraction.DESTROY : Explosion.BlockInteraction.NONE; // Purpur float f = this.isPowered() ? 2.0F : 1.0F; + @@ -371,7 +381,7 @@ public class Creeper extends Monster implements PowerableMob { } // CraftBukkit end @@ -50,10 +50,10 @@ index 6de0dccb7a70d9ebde7a518f820258a445bed000..2ffa10ddd1a19aa44c088a41fdfcbd59 private void spawnLingeringCloud() { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 6b2d5f92c9884d2c3e3ae997a7d90800b09186b0..141aca86c5fe70f3fad838021d93c66d4b630139 100644 +index 016772cdd18f82d8aaeefdc9db7e080a8517f9ee..94e383fa58b99e3c35916a5ee80cf997e8b99316 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -817,6 +817,7 @@ public class PurpurWorldConfig { +@@ -822,6 +822,7 @@ public class PurpurWorldConfig { public boolean creeperAllowGriefing = true; public boolean creeperBypassMobGriefing = false; public boolean creeperTakeDamageFromWater = false; @@ -61,7 +61,7 @@ index 6b2d5f92c9884d2c3e3ae997a7d90800b09186b0..141aca86c5fe70f3fad838021d93c66d private void creeperSettings() { creeperRidable = getBoolean("mobs.creeper.ridable", creeperRidable); creeperRidableInWater = getBoolean("mobs.creeper.ridable-in-water", creeperRidableInWater); -@@ -831,6 +832,7 @@ public class PurpurWorldConfig { +@@ -836,6 +837,7 @@ public class PurpurWorldConfig { creeperAllowGriefing = getBoolean("mobs.creeper.allow-griefing", creeperAllowGriefing); creeperBypassMobGriefing = getBoolean("mobs.creeper.bypass-mob-griefing", creeperBypassMobGriefing); creeperTakeDamageFromWater = getBoolean("mobs.creeper.takes-damage-from-water", creeperTakeDamageFromWater); diff --git a/patches/server/0149-Configurable-ravager-griefable-blocks-list.patch b/patches/server/0144-Configurable-ravager-griefable-blocks-list.patch similarity index 92% rename from patches/server/0149-Configurable-ravager-griefable-blocks-list.patch rename to patches/server/0144-Configurable-ravager-griefable-blocks-list.patch index b4ab72c5f..26a0e15f4 100644 --- a/patches/server/0149-Configurable-ravager-griefable-blocks-list.patch +++ b/patches/server/0144-Configurable-ravager-griefable-blocks-list.patch @@ -18,7 +18,7 @@ index 0e55d94669166ce37e054203d4723720049a940d..51f6cdf23150402a59b4e5977850d52d } } diff --git a/src/main/java/net/minecraft/world/level/block/CropBlock.java b/src/main/java/net/minecraft/world/level/block/CropBlock.java -index 36ad7f33eacc63d84db04225fbffcc32abf24fdc..a6e03d12ecd85992215e1128cd6afd280e91b249 100644 +index f0fbd16c9b9c3772492c32b3924e99e147e412f0..c0c3bba1555e356c0af7e79e1ecb2aa0de578306 100644 --- a/src/main/java/net/minecraft/world/level/block/CropBlock.java +++ b/src/main/java/net/minecraft/world/level/block/CropBlock.java @@ -164,7 +164,7 @@ public class CropBlock extends BushBlock implements BonemealableBlock { @@ -31,10 +31,10 @@ index 36ad7f33eacc63d84db04225fbffcc32abf24fdc..a6e03d12ecd85992215e1128cd6afd28 } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 3b3c1ca9c4034ed954d6bd55fb1b42f8a1c3efe1..579c85ff8ac4f77246aba457377d9c24873b35ab 100644 +index 0f2e6d7a3114cfb6a41daa0a75d3448bed6c906e..59be4a17c4317f8d73e157b1d8d0f5e2468a2a5f 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1669,6 +1669,7 @@ public class PurpurWorldConfig { +@@ -1674,6 +1674,7 @@ public class PurpurWorldConfig { public double ravagerMaxHealth = 100.0D; public boolean ravagerBypassMobGriefing = false; public boolean ravagerTakeDamageFromWater = false; @@ -42,7 +42,7 @@ index 3b3c1ca9c4034ed954d6bd55fb1b42f8a1c3efe1..579c85ff8ac4f77246aba457377d9c24 private void ravagerSettings() { ravagerRidable = getBoolean("mobs.ravager.ridable", ravagerRidable); ravagerRidableInWater = getBoolean("mobs.ravager.ridable-in-water", ravagerRidableInWater); -@@ -1681,6 +1682,23 @@ public class PurpurWorldConfig { +@@ -1686,6 +1687,23 @@ public class PurpurWorldConfig { ravagerMaxHealth = getDouble("mobs.ravager.attributes.max_health", ravagerMaxHealth); ravagerBypassMobGriefing = getBoolean("mobs.ravager.bypass-mob-griefing", ravagerBypassMobGriefing); ravagerTakeDamageFromWater = getBoolean("mobs.ravager.takes-damage-from-water", ravagerTakeDamageFromWater); @@ -58,7 +58,7 @@ index 3b3c1ca9c4034ed954d6bd55fb1b42f8a1c3efe1..579c85ff8ac4f77246aba457377d9c24 + add("minecraft:potatoes"); + add("minecraft:wheat"); + }}).forEach(key -> { -+ Block block = Registry.BLOCK.get(new ResourceLocation(key.toString())); ++ Block block = BuiltInRegistries.BLOCK.get(new ResourceLocation(key.toString())); + if (!block.defaultBlockState().isAir()) { + ravagerGriefableBlocks.add(block); + } diff --git a/patches/server/0150-Sneak-to-bulk-process-composter.patch b/patches/server/0145-Sneak-to-bulk-process-composter.patch similarity index 94% rename from patches/server/0150-Sneak-to-bulk-process-composter.patch rename to patches/server/0145-Sneak-to-bulk-process-composter.patch index b7ac26bd7..3f2dc70ef 100644 --- a/patches/server/0150-Sneak-to-bulk-process-composter.patch +++ b/patches/server/0145-Sneak-to-bulk-process-composter.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Sneak to bulk process composter diff --git a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java -index 0a5f8d990cce5df339fd9b2b0fcb291a20ddad41..e832bca50878a34339e142da5a9c765ae57eb3c8 100644 +index 58b093bb1de78ee3b3b2ea364aa50474883f443a..2fd89736091bda7005ef27e42a2aad0df27fa3b5 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java -@@ -566,7 +566,7 @@ public class ServerPlayerGameMode { +@@ -568,7 +568,7 @@ public class ServerPlayerGameMode { boolean flag1 = player.isSecondaryUseActive() && flag; ItemStack itemstack1 = stack.copy(); @@ -18,7 +18,7 @@ index 0a5f8d990cce5df339fd9b2b0fcb291a20ddad41..e832bca50878a34339e142da5a9c765a if (enuminteractionresult.consumesAction()) { diff --git a/src/main/java/net/minecraft/world/level/block/ComposterBlock.java b/src/main/java/net/minecraft/world/level/block/ComposterBlock.java -index 492e3ffd6a4588a521486db631f3e8b2a25b74ec..954c4a112d675144befd253abe880251f4ea1876 100644 +index 564822911c25238900b361d564c5db3103900fb3..5d1567f7413b4065b5587ae45ccf9a3e11355c20 100644 --- a/src/main/java/net/minecraft/world/level/block/ComposterBlock.java +++ b/src/main/java/net/minecraft/world/level/block/ComposterBlock.java @@ -220,23 +220,21 @@ public class ComposterBlock extends Block implements WorldlyContainerHolder { @@ -90,7 +90,7 @@ index 492e3ffd6a4588a521486db631f3e8b2a25b74ec..954c4a112d675144befd253abe880251 int i = (Integer) iblockdata.getValue(ComposterBlock.LEVEL); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 37d4e08d6c1c3683514f679a9ab772a28d4010a1..9649618c5d5721e1ce2fb4f59d22e352b4b614dd 100644 +index a319d476d7aef05a06aa59fbf310adcfa061bdc4..ddeb49925b984f4b9feff238970e3c60ce06d227 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -477,6 +477,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0151-Config-for-skipping-night.patch b/patches/server/0146-Config-for-skipping-night.patch similarity index 90% rename from patches/server/0151-Config-for-skipping-night.patch rename to patches/server/0146-Config-for-skipping-night.patch index b4df09a15..71ee33dc6 100644 --- a/patches/server/0151-Config-for-skipping-night.patch +++ b/patches/server/0146-Config-for-skipping-night.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Config for skipping night diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index 1689ae9fc4635c42755699b5bff43af2f866fa3e..66817fa844fc03d0137a6cd9aab1a41b05d94d1c 100644 +index 14ac6e79ec2358119d117e5913e940536e04d7d8..7167eb607844bec58a3e075aea1ff090f8fd90b5 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java -@@ -664,7 +664,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -666,7 +666,7 @@ public class ServerLevel extends Level implements WorldGenLevel { int i = this.getGameRules().getInt(GameRules.RULE_PLAYERS_SLEEPING_PERCENTAGE); long j; @@ -18,7 +18,7 @@ index 1689ae9fc4635c42755699b5bff43af2f866fa3e..66817fa844fc03d0137a6cd9aab1a41b j = this.levelData.getDayTime() + 24000L; TimeSkipEvent event = new TimeSkipEvent(this.getWorld(), TimeSkipEvent.SkipReason.NIGHT_SKIP, (j - j % 24000L) - this.getDayTime()); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 08a973b2c5195b0d85a28b480dc0f40ed8c9e3e9..686236d4d91e5207904d91e2035a067cf0408fcc 100644 +index ddeb49925b984f4b9feff238970e3c60ce06d227..9a8136d52aa88a562787bbf82c47d983dae136c2 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -357,6 +357,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0152-Add-config-for-villager-trading.patch b/patches/server/0147-Add-config-for-villager-trading.patch similarity index 87% rename from patches/server/0152-Add-config-for-villager-trading.patch rename to patches/server/0147-Add-config-for-villager-trading.patch index e19808773..689ecb139 100644 --- a/patches/server/0152-Add-config-for-villager-trading.patch +++ b/patches/server/0147-Add-config-for-villager-trading.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add config for villager trading diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java -index 63b2d3635d3882d8e2e55659c99c0165603fdfc1..14834853354adb222f99c4a12169fd05e02477da 100644 +index 07bd954ff3f203d1747990bcecb87b05fb7d90d9..1db5d966c2ce26c2e5e2999ae8639a20e30d6fa8 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java -@@ -372,7 +372,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -358,7 +358,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler return tryRide(player, hand); // Purpur } else { if (level.purpurConfig.villagerRidable && itemstack.isEmpty()) return tryRide(player, hand); // Purpur @@ -18,7 +18,7 @@ index 63b2d3635d3882d8e2e55659c99c0165603fdfc1..14834853354adb222f99c4a12169fd05 } diff --git a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java -index bef536f773e662050b8d120d41e1c730aeedd447..8214506faf26bc973594f1bd8a19e0458be9b544 100644 +index a028732368cdc6b249135742b4a86920d95fa76e..eed9fed34fde4d27e424507f2f05510d46f64601 100644 --- a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java +++ b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java @@ -149,7 +149,7 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill @@ -31,10 +31,10 @@ index bef536f773e662050b8d120d41e1c730aeedd447..8214506faf26bc973594f1bd8a19e045 this.openTradingScreen(player, this.getDisplayName(), 1); } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 686236d4d91e5207904d91e2035a067cf0408fcc..5016f11f7de2c210acb70b18a8be3aa727ac69c3 100644 +index 309b024341615a3605e0f1dad3a1dd913e2ab08d..e981e3e1e22b7f5a85484d3577a989995f183ad1 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -2078,6 +2078,7 @@ public class PurpurWorldConfig { +@@ -2081,6 +2081,7 @@ public class PurpurWorldConfig { public boolean villagerClericFarmersThrowWarts = true; public boolean villagerBypassMobGriefing = false; public boolean villagerTakeDamageFromWater = false; @@ -42,7 +42,7 @@ index 686236d4d91e5207904d91e2035a067cf0408fcc..5016f11f7de2c210acb70b18a8be3aa7 private void villagerSettings() { villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); -@@ -2098,6 +2099,7 @@ public class PurpurWorldConfig { +@@ -2099,6 +2100,7 @@ public class PurpurWorldConfig { villagerClericFarmersThrowWarts = getBoolean("mobs.villager.cleric-wart-farmers-throw-warts-at-villagers", villagerClericFarmersThrowWarts); villagerBypassMobGriefing = getBoolean("mobs.villager.bypass-mob-griefing", villagerBypassMobGriefing); villagerTakeDamageFromWater = getBoolean("mobs.villager.takes-damage-from-water", villagerTakeDamageFromWater); @@ -50,7 +50,7 @@ index 686236d4d91e5207904d91e2035a067cf0408fcc..5016f11f7de2c210acb70b18a8be3aa7 } public boolean vindicatorRidable = false; -@@ -2127,6 +2129,7 @@ public class PurpurWorldConfig { +@@ -2128,6 +2130,7 @@ public class PurpurWorldConfig { public boolean wanderingTraderFollowEmeraldBlock = false; public boolean wanderingTraderCanBeLeashed = false; public boolean wanderingTraderTakeDamageFromWater = false; @@ -58,7 +58,7 @@ index 686236d4d91e5207904d91e2035a067cf0408fcc..5016f11f7de2c210acb70b18a8be3aa7 private void wanderingTraderSettings() { wanderingTraderRidable = getBoolean("mobs.wandering_trader.ridable", wanderingTraderRidable); wanderingTraderRidableInWater = getBoolean("mobs.wandering_trader.ridable-in-water", wanderingTraderRidableInWater); -@@ -2140,6 +2143,7 @@ public class PurpurWorldConfig { +@@ -2141,6 +2144,7 @@ public class PurpurWorldConfig { wanderingTraderFollowEmeraldBlock = getBoolean("mobs.wandering_trader.follow-emerald-blocks", wanderingTraderFollowEmeraldBlock); wanderingTraderCanBeLeashed = getBoolean("mobs.wandering_trader.can-be-leashed", wanderingTraderCanBeLeashed); wanderingTraderTakeDamageFromWater = getBoolean("mobs.wandering_trader.takes-damage-from-water", wanderingTraderTakeDamageFromWater); diff --git a/patches/server/0153-Allow-infinity-on-crossbows.patch b/patches/server/0148-Allow-infinity-on-crossbows.patch similarity index 95% rename from patches/server/0153-Allow-infinity-on-crossbows.patch rename to patches/server/0148-Allow-infinity-on-crossbows.patch index 8568c2af9..c759e7918 100644 --- a/patches/server/0153-Allow-infinity-on-crossbows.patch +++ b/patches/server/0148-Allow-infinity-on-crossbows.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Allow infinity on crossbows diff --git a/src/main/java/net/minecraft/world/item/CrossbowItem.java b/src/main/java/net/minecraft/world/item/CrossbowItem.java -index 3b8629d31dc7bc66debe9c56593fbd071a6ddd11..25a95a64dfb79ef80e9d21f551d0cc5a50906d36 100644 +index caa5f5f5d58b8ddbca0910412b695cb810570623..fa3ec61b93282a0f1241b0fabc197713e2fafffd 100644 --- a/src/main/java/net/minecraft/world/item/CrossbowItem.java +++ b/src/main/java/net/minecraft/world/item/CrossbowItem.java @@ -112,7 +112,7 @@ public class CrossbowItem extends ProjectileWeaponItem implements Vanishable { @@ -17,7 +17,7 @@ index 3b8629d31dc7bc66debe9c56593fbd071a6ddd11..25a95a64dfb79ef80e9d21f551d0cc5a ItemStack itemstack1 = shooter.getProjectile(projectile); ItemStack itemstack2 = itemstack1.copy(); -@@ -303,7 +303,7 @@ public class CrossbowItem extends ProjectileWeaponItem implements Vanishable { +@@ -302,7 +302,7 @@ public class CrossbowItem extends ProjectileWeaponItem implements Vanishable { for (int i = 0; i < list.size(); ++i) { ItemStack itemstack1 = (ItemStack) list.get(i); @@ -65,7 +65,7 @@ index 6f6106ca4d74d50a7b74b086adc96c58c7906cb6..d6417c1e77ac8823e18a179dc9f61757 public abstract boolean canEnchant(Item item); diff --git a/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java b/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java -index 873185fd4d4c994130f2e7c271b3e03cefb2278c..a371bbe337daf9abce320ce0d8c21fa35badb6e4 100644 +index 3d0ce0803e1da8a2681a3cb41096ac942ece54a1..bcd075a771c7f43c6d1549aeec2ccb20ee168b57 100644 --- a/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java +++ b/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java @@ -59,6 +59,7 @@ public class CraftEnchantment extends Enchantment { diff --git a/patches/server/0154-Drowning-Settings.patch b/patches/server/0149-Drowning-Settings.patch similarity index 86% rename from patches/server/0154-Drowning-Settings.patch rename to patches/server/0149-Drowning-Settings.patch index 9b2797fbc..9071f5130 100644 --- a/patches/server/0154-Drowning-Settings.patch +++ b/patches/server/0149-Drowning-Settings.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Drowning Settings diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index c8d08fb02eefee08799661423fd4342f05f1b8f2..a3a76273bb6ce1621366cfd8dec22e5bd3f5c45e 100644 +index c4673de12f0de52862ad58f6ccdd6128fa5619cf..684144de36c2f6c98d7329f181bbecff746bdaf4 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -3129,7 +3129,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -3114,7 +3114,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { } public int getMaxAirSupply() { @@ -18,10 +18,10 @@ index c8d08fb02eefee08799661423fd4342f05f1b8f2..a3a76273bb6ce1621366cfd8dec22e5b public int getAirSupply() { diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 9fca48d69a0917aa31e553d5910da77beaf40bab..cbaf99b4cd7b6d949695b1a66e66f18329e87148 100644 +index 6a2b4138c8668da80e53560e41fbadcd52e78f1c..1a16df9566b3b0f026cafeb95443952937aa16cc 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -423,7 +423,7 @@ public abstract class LivingEntity extends Entity { +@@ -428,7 +428,7 @@ public abstract class LivingEntity extends Entity { if (flag1) { this.setAirSupply(this.decreaseAirSupply(this.getAirSupply())); @@ -30,7 +30,7 @@ index 9fca48d69a0917aa31e553d5910da77beaf40bab..cbaf99b4cd7b6d949695b1a66e66f183 this.setAirSupply(0); Vec3 vec3d = this.getDeltaMovement(); -@@ -435,7 +435,7 @@ public abstract class LivingEntity extends Entity { +@@ -440,7 +440,7 @@ public abstract class LivingEntity extends Entity { this.level.addParticle(ParticleTypes.BUBBLE, this.getX() + d2, this.getY() + d3, this.getZ() + d4, vec3d.x, vec3d.y, vec3d.z); } @@ -40,7 +40,7 @@ index 9fca48d69a0917aa31e553d5910da77beaf40bab..cbaf99b4cd7b6d949695b1a66e66f183 } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 5016f11f7de2c210acb70b18a8be3aa727ac69c3..75e3d231ce15c12bfbff81017e43c60b64f2c758 100644 +index f10f16e9dc7fa3b4cfa302f946b168102e8b5732..9a8a2cca4de503d07ee61cd32f7b6b8484804631 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -167,6 +167,15 @@ public class PurpurWorldConfig { diff --git a/patches/server/0155-Break-individual-slabs-when-sneaking.patch b/patches/server/0150-Break-individual-slabs-when-sneaking.patch similarity index 94% rename from patches/server/0155-Break-individual-slabs-when-sneaking.patch rename to patches/server/0150-Break-individual-slabs-when-sneaking.patch index 6e1457790..1073e0f65 100644 --- a/patches/server/0155-Break-individual-slabs-when-sneaking.patch +++ b/patches/server/0150-Break-individual-slabs-when-sneaking.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Break individual slabs when sneaking diff --git a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java -index e832bca50878a34339e142da5a9c765ae57eb3c8..47b43df836651ab94f7a64a9b22dad2357c0e0a6 100644 +index 2fd89736091bda7005ef27e42a2aad0df27fa3b5..0034831358550491d57360966b1458b34b0908e2 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java @@ -389,6 +389,7 @@ public class ServerPlayerGameMode { @@ -47,7 +47,7 @@ index 18b603d646081926343dea108b55d641df1c2c34..fdbbd2e5d4fd970a4593b55f16bd0f82 + // Purpur end } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index efba22df32b2c89360046005a381bf8b9c332f18..e920bf83bfd5ea009d72c0fbcb848115d1779ad5 100644 +index 9a8a2cca4de503d07ee61cd32f7b6b8484804631..e3f8b5f644c9b64f1aa5f97a38a65180c455cb9f 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -592,6 +592,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0156-Config-to-disable-hostile-mob-spawn-on-ice.patch b/patches/server/0151-Config-to-disable-hostile-mob-spawn-on-ice.patch similarity index 96% rename from patches/server/0156-Config-to-disable-hostile-mob-spawn-on-ice.patch rename to patches/server/0151-Config-to-disable-hostile-mob-spawn-on-ice.patch index 946c8e3cb..e910f3568 100644 --- a/patches/server/0156-Config-to-disable-hostile-mob-spawn-on-ice.patch +++ b/patches/server/0151-Config-to-disable-hostile-mob-spawn-on-ice.patch @@ -24,7 +24,7 @@ index 55c245d0dfa369dc6de2197ae37335fba4fae4ae..c9b40515f4c2ff1eedfc9510930c3bae return false; } else { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index e920bf83bfd5ea009d72c0fbcb848115d1779ad5..d866acee76f81954813daf2cc988cccaa83cb791 100644 +index e3f8b5f644c9b64f1aa5f97a38a65180c455cb9f..723bcd1c3cd4fd95a5cdf78595edf302a55d1df4 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -555,6 +555,13 @@ public class PurpurWorldConfig { diff --git a/patches/server/0157-Config-to-show-Armor-Stand-arms-on-spawn.patch b/patches/server/0152-Config-to-show-Armor-Stand-arms-on-spawn.patch similarity index 96% rename from patches/server/0157-Config-to-show-Armor-Stand-arms-on-spawn.patch rename to patches/server/0152-Config-to-show-Armor-Stand-arms-on-spawn.patch index 84ff653dc..8e1221193 100644 --- a/patches/server/0157-Config-to-show-Armor-Stand-arms-on-spawn.patch +++ b/patches/server/0152-Config-to-show-Armor-Stand-arms-on-spawn.patch @@ -17,7 +17,7 @@ index 6800d77262c244e5bb32535d920b025b279dd8e2..e9e50f353757340aee2196f2150dc7e4 public ArmorStand(Level world, double x, double y, double z) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index d866acee76f81954813daf2cc988cccaa83cb791..3427a092ee2ab58dfa9e8cec1d1ec77b85e45486 100644 +index 723bcd1c3cd4fd95a5cdf78595edf302a55d1df4..6a2a7d86fb6e5d2018ea25e8504017f3cb456652 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -105,6 +105,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0158-Option-to-make-doors-require-redstone.patch b/patches/server/0153-Option-to-make-doors-require-redstone.patch similarity index 66% rename from patches/server/0158-Option-to-make-doors-require-redstone.patch rename to patches/server/0153-Option-to-make-doors-require-redstone.patch index 5f46cfb70..f010a90ef 100644 --- a/patches/server/0158-Option-to-make-doors-require-redstone.patch +++ b/patches/server/0153-Option-to-make-doors-require-redstone.patch @@ -5,41 +5,41 @@ Subject: [PATCH] Option to make doors require redstone diff --git a/src/main/java/net/minecraft/world/entity/ai/behavior/InteractWithDoor.java b/src/main/java/net/minecraft/world/entity/ai/behavior/InteractWithDoor.java -index 4abfeffa72bc70fd26908252ed596e816b4b9eb2..e5c20f40a63e8db215876c03ba6de9721d6675c0 100644 +index c3fb86dc3d94d3a0d2464f2dbb83cda2fb9f7bbe..fd77dd0c0bfaba57e5bdfd13f7a90241ecdf813a 100644 --- a/src/main/java/net/minecraft/world/entity/ai/behavior/InteractWithDoor.java +++ b/src/main/java/net/minecraft/world/entity/ai/behavior/InteractWithDoor.java -@@ -65,7 +65,7 @@ public class InteractWithDoor extends Behavior { +@@ -57,7 +57,7 @@ public class InteractWithDoor { - if (iblockdata.is(BlockTags.WOODEN_DOORS, (blockbase_blockdata) -> { - return blockbase_blockdata.getBlock() instanceof DoorBlock; -- })) { -+ }) && !DoorBlock.requiresRedstone(entity.level, iblockdata, blockposition)) { // Purpur - DoorBlock blockdoor = (DoorBlock) iblockdata.getBlock(); - - if (!blockdoor.isOpen(iblockdata)) { -@@ -87,7 +87,7 @@ public class InteractWithDoor extends Behavior { - - if (iblockdata1.is(BlockTags.WOODEN_DOORS, (blockbase_blockdata) -> { - return blockbase_blockdata.getBlock() instanceof DoorBlock; -- })) { -+ }) && !DoorBlock.requiresRedstone(entity.level, iblockdata, blockposition1)) { // Purpur - DoorBlock blockdoor1 = (DoorBlock) iblockdata1.getBlock(); - - if (!blockdoor1.isOpen(iblockdata1)) { -@@ -124,7 +124,7 @@ public class InteractWithDoor extends Behavior { - - if (!iblockdata.is(BlockTags.WOODEN_DOORS, (blockbase_blockdata) -> { + if (iblockdata.is(BlockTags.WOODEN_DOORS, (blockbase_blockdata) -> { return blockbase_blockdata.getBlock() instanceof DoorBlock; - })) { -+ }) || DoorBlock.requiresRedstone(entity.level, iblockdata, blockposition)) { // Purpur - iterator.remove(); - } else { ++ }) && !DoorBlock.requiresRedstone(entityliving.level, iblockdata, blockposition)) { // Purpur DoorBlock blockdoor = (DoorBlock) iblockdata.getBlock(); + + if (!blockdoor.isOpen(iblockdata)) { +@@ -79,7 +79,7 @@ public class InteractWithDoor { + + if (iblockdata1.is(BlockTags.WOODEN_DOORS, (blockbase_blockdata) -> { + return blockbase_blockdata.getBlock() instanceof DoorBlock; +- })) { ++ }) && !DoorBlock.requiresRedstone(entityliving.level, iblockdata, blockposition1)) { // Purpur + DoorBlock blockdoor1 = (DoorBlock) iblockdata1.getBlock(); + + if (!blockdoor1.isOpen(iblockdata1)) { +@@ -122,7 +122,7 @@ public class InteractWithDoor { + + if (!iblockdata.is(BlockTags.WOODEN_DOORS, (blockbase_blockdata) -> { + return blockbase_blockdata.getBlock() instanceof DoorBlock; +- })) { ++ }) || DoorBlock.requiresRedstone(entity.level, iblockdata, blockposition)) { // Purpur + iterator.remove(); + } else { + DoorBlock blockdoor = (DoorBlock) iblockdata.getBlock(); diff --git a/src/main/java/net/minecraft/world/level/block/DoorBlock.java b/src/main/java/net/minecraft/world/level/block/DoorBlock.java -index aa5289f652392515952cc10f70627ed2cdc6c398..d1d3323559f12f60ef0564e2218ca15313ab225f 100644 +index fc4793fefe52adfeb0272bf5324c32c1c3946416..58e5acea025287214757cba632e1268e418d7dfa 100644 --- a/src/main/java/net/minecraft/world/level/block/DoorBlock.java +++ b/src/main/java/net/minecraft/world/level/block/DoorBlock.java -@@ -169,6 +169,7 @@ public class DoorBlock extends Block { +@@ -167,6 +167,7 @@ public class DoorBlock extends Block { public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { if (this.material == Material.METAL) { return InteractionResult.PASS; @@ -47,7 +47,7 @@ index aa5289f652392515952cc10f70627ed2cdc6c398..d1d3323559f12f60ef0564e2218ca153 } else { state = (BlockState) state.cycle(DoorBlock.OPEN); world.setBlock(pos, state, 10); -@@ -264,4 +265,18 @@ public class DoorBlock extends Block { +@@ -262,4 +263,18 @@ public class DoorBlock extends Block { public static boolean isWoodenDoor(BlockState state) { return state.getBlock() instanceof DoorBlock && (state.getMaterial() == Material.WOOD || state.getMaterial() == Material.NETHER_WOOD); } @@ -67,7 +67,7 @@ index aa5289f652392515952cc10f70627ed2cdc6c398..d1d3323559f12f60ef0564e2218ca153 + // Purpur end } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 3427a092ee2ab58dfa9e8cec1d1ec77b85e45486..592d8f28bb1c5f35ff2a48874a0f76a64be9bd50 100644 +index 802325603b28fa624f01b2c29e5c770d4ecf3b3e..81a27a654c70cd11b16f1fa49063e813b3c79762 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -502,6 +502,16 @@ public class PurpurWorldConfig { @@ -77,7 +77,7 @@ index 3427a092ee2ab58dfa9e8cec1d1ec77b85e45486..592d8f28bb1c5f35ff2a48874a0f76a6 + public List doorRequiresRedstone = new ArrayList<>(); + private void doorSettings() { + getList("blocks.door.requires-redstone", new ArrayList()).forEach(key -> { -+ Block block = Registry.BLOCK.get(new ResourceLocation(key.toString())); ++ Block block = BuiltInRegistries.BLOCK.get(new ResourceLocation(key.toString())); + if (!block.defaultBlockState().isAir()) { + doorRequiresRedstone.add(block); + } diff --git a/patches/server/0159-Config-to-allow-for-unsafe-enchants.patch b/patches/server/0154-Config-to-allow-for-unsafe-enchants.patch similarity index 87% rename from patches/server/0159-Config-to-allow-for-unsafe-enchants.patch rename to patches/server/0154-Config-to-allow-for-unsafe-enchants.patch index d8abd105d..03b1bde17 100644 --- a/patches/server/0159-Config-to-allow-for-unsafe-enchants.patch +++ b/patches/server/0154-Config-to-allow-for-unsafe-enchants.patch @@ -5,25 +5,25 @@ Subject: [PATCH] Config to allow for unsafe enchants diff --git a/src/main/java/net/minecraft/server/commands/EnchantCommand.java b/src/main/java/net/minecraft/server/commands/EnchantCommand.java -index 7c012f1e37b0085c0939797b0dae8996b4953ab8..155b0a1aa58b891e98a55e10f112f611ff0b35c5 100644 +index e639c0ec642910e66b1d68ae0b9208ef58d91fce..24c4ad919eeb9c5e15572ee32b0895c993ac6735 100644 --- a/src/main/java/net/minecraft/server/commands/EnchantCommand.java +++ b/src/main/java/net/minecraft/server/commands/EnchantCommand.java -@@ -44,7 +44,7 @@ public class EnchantCommand { - } +@@ -48,7 +48,7 @@ public class EnchantCommand { - private static int enchant(CommandSourceStack source, Collection targets, Enchantment enchantment, int level) throws CommandSyntaxException { -- if (level > enchantment.getMaxLevel()) { -+ if (!org.purpurmc.purpur.PurpurConfig.allowUnsafeEnchantCommand && level > enchantment.getMaxLevel()) { // Purpur - throw ERROR_LEVEL_TOO_HIGH.create(level, enchantment.getMaxLevel()); + private static int enchant(CommandSourceStack source, Collection targets, Holder enchantment, int level) throws CommandSyntaxException { + Enchantment enchantment2 = enchantment.value(); +- if (level > enchantment2.getMaxLevel()) { ++ if (!org.purpurmc.purpur.PurpurConfig.allowUnsafeEnchantCommand && level > enchantment2.getMaxLevel()) { // Purpur + throw ERROR_LEVEL_TOO_HIGH.create(level, enchantment2.getMaxLevel()); } else { int i = 0; -@@ -54,7 +54,7 @@ public class EnchantCommand { +@@ -58,7 +58,7 @@ public class EnchantCommand { LivingEntity livingEntity = (LivingEntity)entity; ItemStack itemStack = livingEntity.getMainHandItem(); if (!itemStack.isEmpty()) { -- if (enchantment.canEnchant(itemStack) && EnchantmentHelper.isEnchantmentCompatible(EnchantmentHelper.getEnchantments(itemStack).keySet(), enchantment)) { -+ if ((enchantment.canEnchant(itemStack) && EnchantmentHelper.isEnchantmentCompatible(EnchantmentHelper.getEnchantments(itemStack).keySet(), enchantment)) || (org.purpurmc.purpur.PurpurConfig.allowUnsafeEnchantCommand && !itemStack.hasEnchantment(enchantment))) { // Purpur - itemStack.enchant(enchantment, level); +- if (enchantment2.canEnchant(itemStack) && EnchantmentHelper.isEnchantmentCompatible(EnchantmentHelper.getEnchantments(itemStack).keySet(), enchantment2)) { ++ if ((enchantment2.canEnchant(itemStack) && EnchantmentHelper.isEnchantmentCompatible(EnchantmentHelper.getEnchantments(itemStack).keySet(), enchantment2)) || (org.purpurmc.purpur.PurpurConfig.allowUnsafeEnchantCommand && !itemStack.hasEnchantment(enchantment2))) { // Purpur + itemStack.enchant(enchantment2, level); ++i; } else if (targets.size() == 1) { diff --git a/src/main/java/net/minecraft/world/inventory/AnvilMenu.java b/src/main/java/net/minecraft/world/inventory/AnvilMenu.java @@ -70,10 +70,10 @@ index d39b86b90aefab85b92e980f56f690bdfb9da82f..eb942aa4cea106f2cd5eaf1e55f96373 ((ServerPlayer) player).connection.send(new ClientboundContainerSetDataPacket(containerId, 0, cost.get())); } diff --git a/src/main/java/net/minecraft/world/item/ItemStack.java b/src/main/java/net/minecraft/world/item/ItemStack.java -index 9e308183917884dcb2f8831324d45c9aeef55051..c124f2f3a3cd5a4abfa07d47a230e1730c19455a 100644 +index 7d721cf67b688dfd05d8d847c47626de1f6f3392..7fff7d366a7f75e2fdd7e5f739976bb0fd0ba725 100644 --- a/src/main/java/net/minecraft/world/item/ItemStack.java +++ b/src/main/java/net/minecraft/world/item/ItemStack.java -@@ -1153,6 +1153,12 @@ public final class ItemStack { +@@ -1164,6 +1164,12 @@ public final class ItemStack { return this.tag != null && this.tag.contains("Enchantments", 9) ? !this.tag.getList("Enchantments", 10).isEmpty() : false; } diff --git a/patches/server/0160-Configurable-sponge-absorption.patch b/patches/server/0155-Configurable-sponge-absorption.patch similarity index 97% rename from patches/server/0160-Configurable-sponge-absorption.patch rename to patches/server/0155-Configurable-sponge-absorption.patch index ad813860c..e0a5f9a16 100644 --- a/patches/server/0160-Configurable-sponge-absorption.patch +++ b/patches/server/0155-Configurable-sponge-absorption.patch @@ -43,7 +43,7 @@ index 7304b2659eb45bc4bc9fa7c43e6ca07221d0fc73..d96e3fbc0fd4275c29e7e6154ef66e9e } } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 592d8f28bb1c5f35ff2a48874a0f76a64be9bd50..f5260bea7f54bd9f05099f6a34f582b1f69d3daf 100644 +index 19c0943594b702066d0781e7b222507fce098b93..1de94f0bfcc60be28896274cebd0c9a8c7aa4810 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -621,6 +621,13 @@ public class PurpurWorldConfig { diff --git a/patches/server/0161-Projectile-offset-config.patch b/patches/server/0156-Projectile-offset-config.patch similarity index 97% rename from patches/server/0161-Projectile-offset-config.patch rename to patches/server/0156-Projectile-offset-config.patch index 0697152a0..93df36014 100644 --- a/patches/server/0161-Projectile-offset-config.patch +++ b/patches/server/0156-Projectile-offset-config.patch @@ -18,7 +18,7 @@ index 33df0ca406dc8321b76b393f317bbd1c8ebe6366..220513d3fd5645322886522ea4f6b8c5 entityarrow.setCritArrow(true); } diff --git a/src/main/java/net/minecraft/world/item/CrossbowItem.java b/src/main/java/net/minecraft/world/item/CrossbowItem.java -index 25a95a64dfb79ef80e9d21f551d0cc5a50906d36..2d30300de78de957358cfddac12294b308062e2a 100644 +index fa3ec61b93282a0f1241b0fabc197713e2fafffd..8a3c0b52c64c0116872abbcad8f5d743b9aa9bd9 100644 --- a/src/main/java/net/minecraft/world/item/CrossbowItem.java +++ b/src/main/java/net/minecraft/world/item/CrossbowItem.java @@ -63,7 +63,7 @@ public class CrossbowItem extends ProjectileWeaponItem implements Vanishable { @@ -83,7 +83,7 @@ index de5bdceb4c8578fb972a2fd5ee0dfdae509e46dc..bcf63ccb6e679cb97d658780b2663aaf com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent((org.bukkit.entity.Player) user.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemStack), (org.bukkit.entity.Projectile) thrownPotion.getBukkitEntity()); if (event.callEvent() && world.addFreshEntity(thrownPotion)) { diff --git a/src/main/java/net/minecraft/world/item/TridentItem.java b/src/main/java/net/minecraft/world/item/TridentItem.java -index 5beaafec0759543d3bddf99028c97d0d005be209..086f746cc632a90c67a6c30ea9197c5bb5485b22 100644 +index 41bd45c0720751f348b5cf6eaecac4397a439857..60512d08a45670a164a9b93191aafa40b2c2287c 100644 --- a/src/main/java/net/minecraft/world/item/TridentItem.java +++ b/src/main/java/net/minecraft/world/item/TridentItem.java @@ -77,7 +77,7 @@ public class TridentItem extends Item implements Vanishable { @@ -96,11 +96,11 @@ index 5beaafec0759543d3bddf99028c97d0d005be209..086f746cc632a90c67a6c30ea9197c5b entitythrowntrident.pickup = AbstractArrow.Pickup.CREATIVE_ONLY; } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index f5260bea7f54bd9f05099f6a34f582b1f69d3daf..00c1ff2cf7435ccc69df870ace00beeb2cd68bf5 100644 +index 6a8a11f529f096c66c76f1072ec58c99850123ac..54318a2015c3105b78d0a2254e4d7879658f0655 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -425,6 +425,23 @@ public class PurpurWorldConfig { - } + //} } + public double bowProjectileOffset = 1.0D; diff --git a/patches/server/0162-Config-for-powered-rail-activation-distance.patch b/patches/server/0157-Config-for-powered-rail-activation-distance.patch similarity index 94% rename from patches/server/0162-Config-for-powered-rail-activation-distance.patch rename to patches/server/0157-Config-for-powered-rail-activation-distance.patch index 657bf9bc9..f149ad85c 100644 --- a/patches/server/0162-Config-for-powered-rail-activation-distance.patch +++ b/patches/server/0157-Config-for-powered-rail-activation-distance.patch @@ -18,7 +18,7 @@ index 7fddb6fa8fd30ef88346a59f7867aae792f13772..40893e71fe8447b695350273bef9623b } else { int j = pos.getX(); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 00c1ff2cf7435ccc69df870ace00beeb2cd68bf5..b1ee7134cf9e3bc51fcd4fb7c64f151244f2f34c 100644 +index 7b7a74d2bd7112ad1774a3b4e3bc0cffa69d1b84..7412f5be64ea35d3bc6248d81ee239ccdd09bce2 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -607,6 +607,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0163-Piglin-portal-spawn-modifier.patch b/patches/server/0158-Piglin-portal-spawn-modifier.patch similarity index 88% rename from patches/server/0163-Piglin-portal-spawn-modifier.patch rename to patches/server/0158-Piglin-portal-spawn-modifier.patch index fcdebfc37..35d9c6f0a 100644 --- a/patches/server/0163-Piglin-portal-spawn-modifier.patch +++ b/patches/server/0158-Piglin-portal-spawn-modifier.patch @@ -18,10 +18,10 @@ Difficulties: 3 - hard diff --git a/src/main/java/net/minecraft/world/level/block/NetherPortalBlock.java b/src/main/java/net/minecraft/world/level/block/NetherPortalBlock.java -index 65fa00b3d4d35a4125f8de444e77ac54e9e28551..dd9badfb2879def258bf725a5d802f7d93bebce8 100644 +index 03bed5ec0aa42b36f290e04c20915e934f07b629..307a05fa07bdfbc1586dde5f7672522f9f7dd9ca 100644 --- a/src/main/java/net/minecraft/world/level/block/NetherPortalBlock.java +++ b/src/main/java/net/minecraft/world/level/block/NetherPortalBlock.java -@@ -55,7 +55,7 @@ public class NetherPortalBlock extends Block { +@@ -52,7 +52,7 @@ public class NetherPortalBlock extends Block { @Override public void randomTick(BlockState state, ServerLevel world, BlockPos pos, RandomSource random) { @@ -31,10 +31,10 @@ index 65fa00b3d4d35a4125f8de444e77ac54e9e28551..dd9badfb2879def258bf725a5d802f7d pos = pos.below(); } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index f0c778af2a7eb63cfecca980391d6a79948d195d..c728a5186fb0a4ff5f4a174f51463fe35b346242 100644 +index b6d2452556ab670a8ec2c021b157e93a21ac53d2..29d260249617d22bd706d24d1bfab8f3a60fe516 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1613,6 +1613,7 @@ public class PurpurWorldConfig { +@@ -1618,6 +1618,7 @@ public class PurpurWorldConfig { public double piglinMaxHealth = 16.0D; public boolean piglinBypassMobGriefing = false; public boolean piglinTakeDamageFromWater = false; @@ -42,7 +42,7 @@ index f0c778af2a7eb63cfecca980391d6a79948d195d..c728a5186fb0a4ff5f4a174f51463fe3 private void piglinSettings() { piglinRidable = getBoolean("mobs.piglin.ridable", piglinRidable); piglinRidableInWater = getBoolean("mobs.piglin.ridable-in-water", piglinRidableInWater); -@@ -1625,6 +1626,7 @@ public class PurpurWorldConfig { +@@ -1630,6 +1631,7 @@ public class PurpurWorldConfig { piglinMaxHealth = getDouble("mobs.piglin.attributes.max_health", piglinMaxHealth); piglinBypassMobGriefing = getBoolean("mobs.piglin.bypass-mob-griefing", piglinBypassMobGriefing); piglinTakeDamageFromWater = getBoolean("mobs.piglin.takes-damage-from-water", piglinTakeDamageFromWater); diff --git a/patches/server/0164-Config-to-change-max-number-of-bees.patch b/patches/server/0159-Config-to-change-max-number-of-bees.patch similarity index 100% rename from patches/server/0164-Config-to-change-max-number-of-bees.patch rename to patches/server/0159-Config-to-change-max-number-of-bees.patch diff --git a/patches/server/0165-Config-for-wither-explosion-radius.patch b/patches/server/0160-Config-for-wither-explosion-radius.patch similarity index 80% rename from patches/server/0165-Config-for-wither-explosion-radius.patch rename to patches/server/0160-Config-for-wither-explosion-radius.patch index 24d0d7688..d5af4c4d8 100644 --- a/patches/server/0165-Config-for-wither-explosion-radius.patch +++ b/patches/server/0160-Config-for-wither-explosion-radius.patch @@ -5,23 +5,23 @@ Subject: [PATCH] Config for wither explosion radius diff --git a/src/main/java/net/minecraft/world/entity/projectile/WitherSkull.java b/src/main/java/net/minecraft/world/entity/projectile/WitherSkull.java -index 1654b08f76e02e20a8ce5de618f8def82f1feeeb..7938a81fea35ef79fb1054e7b11175738063c896 100644 +index 9665095240a370983878350aed41badacfb6f261..623b90b263257dd633af330a63e4bb9d4d507493 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/WitherSkull.java +++ b/src/main/java/net/minecraft/world/entity/projectile/WitherSkull.java -@@ -97,7 +97,7 @@ public class WitherSkull extends AbstractHurtingProjectile { - +@@ -94,7 +94,7 @@ public class WitherSkull extends AbstractHurtingProjectile { + if (!this.level.isClientSide) { // CraftBukkit start - // this.level.createExplosion(this, this.locX(), this.locY(), this.locZ(), 1.0F, false, explosion_effect); + // this.level.explode(this, this.getX(), this.getY(), this.getZ(), 1.0F, false, World.a.MOB); - ExplosionPrimeEvent event = new ExplosionPrimeEvent(this.getBukkitEntity(), 1.0F, false); + ExplosionPrimeEvent event = new ExplosionPrimeEvent(this.getBukkitEntity(), this.level.purpurConfig.witherExplosionRadius, false); // Purpur this.level.getCraftServer().getPluginManager().callEvent(event); if (!event.isCancelled()) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index c728a5186fb0a4ff5f4a174f51463fe35b346242..e17584956c12ec4936aa1a2c0de3749e71bf9cb1 100644 +index d00bb10ca6b010cd05ae75bdcc85170d0267a689..edb7b84f6170369f7044f8233554fc6b449e036d 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -2247,6 +2247,7 @@ public class PurpurWorldConfig { +@@ -2248,6 +2248,7 @@ public class PurpurWorldConfig { public boolean witherBypassMobGriefing = false; public boolean witherTakeDamageFromWater = false; public boolean witherCanRideVehicles = false; @@ -29,7 +29,7 @@ index c728a5186fb0a4ff5f4a174f51463fe35b346242..e17584956c12ec4936aa1a2c0de3749e private void witherSettings() { witherRidable = getBoolean("mobs.wither.ridable", witherRidable); witherRidableInWater = getBoolean("mobs.wither.ridable-in-water", witherRidableInWater); -@@ -2267,6 +2268,7 @@ public class PurpurWorldConfig { +@@ -2268,6 +2269,7 @@ public class PurpurWorldConfig { witherBypassMobGriefing = getBoolean("mobs.wither.bypass-mob-griefing", witherBypassMobGriefing); witherTakeDamageFromWater = getBoolean("mobs.wither.takes-damage-from-water", witherTakeDamageFromWater); witherCanRideVehicles = getBoolean("mobs.wither.can-ride-vehicles", witherCanRideVehicles); diff --git a/patches/server/0166-Gamemode-extra-permissions.patch b/patches/server/0161-Gamemode-extra-permissions.patch similarity index 95% rename from patches/server/0166-Gamemode-extra-permissions.patch rename to patches/server/0161-Gamemode-extra-permissions.patch index 9ae8cbb32..09df79416 100644 --- a/patches/server/0166-Gamemode-extra-permissions.patch +++ b/patches/server/0161-Gamemode-extra-permissions.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Gamemode extra permissions diff --git a/src/main/java/net/minecraft/commands/CommandSourceStack.java b/src/main/java/net/minecraft/commands/CommandSourceStack.java -index 901edaae2230c48fa0584991ed82498d568d5fc0..d38acbb03d74dd237f007f392ec2c3db775cadf7 100644 +index b8d49f7607c646216d42f4e047997d47b49f228f..613b3fb0a90ef19161f0df09a014c3811e5b8c9e 100644 --- a/src/main/java/net/minecraft/commands/CommandSourceStack.java +++ b/src/main/java/net/minecraft/commands/CommandSourceStack.java -@@ -214,6 +214,21 @@ public class CommandSourceStack implements SharedSuggestionProvider, com.destroy +@@ -212,6 +212,21 @@ public class CommandSourceStack implements SharedSuggestionProvider, com.destroy } // CraftBukkit end @@ -31,10 +31,10 @@ index 901edaae2230c48fa0584991ed82498d568d5fc0..d38acbb03d74dd237f007f392ec2c3db return this.worldPosition; } diff --git a/src/main/java/net/minecraft/server/commands/GameModeCommand.java b/src/main/java/net/minecraft/server/commands/GameModeCommand.java -index 7882ee2b7813d437d3b7580f046f38e79fc9e7b6..afdf86826efc1c8c73a722d7709641b3fa16d542 100644 +index 27c0aaf123c3e945eb24e8a3892bd8ac42115733..85e1c1d6eb4472baa958b4f482791e8479dfcbf0 100644 --- a/src/main/java/net/minecraft/server/commands/GameModeCommand.java +++ b/src/main/java/net/minecraft/server/commands/GameModeCommand.java -@@ -47,6 +47,18 @@ public class GameModeCommand { +@@ -41,6 +41,18 @@ public class GameModeCommand { } private static int setMode(CommandContext context, Collection targets, GameType gameMode) { diff --git a/patches/server/0167-Config-for-changing-the-blocks-that-turn-into-dirt-p.patch b/patches/server/0162-Config-for-changing-the-blocks-that-turn-into-dirt-p.patch similarity index 92% rename from patches/server/0167-Config-for-changing-the-blocks-that-turn-into-dirt-p.patch rename to patches/server/0162-Config-for-changing-the-blocks-that-turn-into-dirt-p.patch index 5651b4a5b..7234db808 100644 --- a/patches/server/0167-Config-for-changing-the-blocks-that-turn-into-dirt-p.patch +++ b/patches/server/0162-Config-for-changing-the-blocks-that-turn-into-dirt-p.patch @@ -18,7 +18,7 @@ index c7195f2e12bbd6545f7bffcc2b4ba5cc3d48df20..5e730bc9c8ff94b16ac2bf8567dda8ae Runnable afterAction = null; // Paper if (blockState2 != null && level.getBlockState(blockPos.above()).isAir()) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 87476d216f4e6ecfc3289fc6f5332187a0a2405a..f6f076b8e5231b8f68a121f9a432b74647cdde14 100644 +index a1603d84e541cb76516fc5f37bf1553314c8d5e4..d1fc1baf17a3f2bb5e1612125052c75c3c2f288a 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -447,6 +447,21 @@ public class PurpurWorldConfig { @@ -35,7 +35,7 @@ index 87476d216f4e6ecfc3289fc6f5332187a0a2405a..f6f076b8e5231b8f68a121f9a432b746 + add("minecraft:podzol"); + add("minecraft:rooted_dirt"); + }}).forEach(key -> { -+ Block block = Registry.BLOCK.get(new ResourceLocation(key.toString())); ++ Block block = BuiltInRegistries.BLOCK.get(new ResourceLocation(key.toString())); + if (block != Blocks.AIR) shovelTurnsBlockToGrassPath.add(block); + }); + } diff --git a/patches/server/0168-Configurable-piston-push-limit.patch b/patches/server/0163-Configurable-piston-push-limit.patch similarity index 96% rename from patches/server/0168-Configurable-piston-push-limit.patch rename to patches/server/0163-Configurable-piston-push-limit.patch index 04181693c..e60d617df 100644 --- a/patches/server/0168-Configurable-piston-push-limit.patch +++ b/patches/server/0163-Configurable-piston-push-limit.patch @@ -36,7 +36,7 @@ index 744d91546d1a810f60a43c15ed74b4158f341a4a..354538daefa603f6df5a139b6bff87db } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index f6f076b8e5231b8f68a121f9a432b74647cdde14..b787b34b11f7379249575b058fe3a07a1a7d3d83 100644 +index dcd136732def702a76666095f35dbf2d19fecb11..cba3ee6c0cd140c0d0dd5023cb79806dfa46b8c0 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -617,6 +617,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0169-Configurable-broadcast-settings.patch b/patches/server/0164-Configurable-broadcast-settings.patch similarity index 95% rename from patches/server/0169-Configurable-broadcast-settings.patch rename to patches/server/0164-Configurable-broadcast-settings.patch index b12b229cd..4c31ef09a 100644 --- a/patches/server/0169-Configurable-broadcast-settings.patch +++ b/patches/server/0164-Configurable-broadcast-settings.patch @@ -17,10 +17,10 @@ index 897e761be8c1f79562f54101173fbba7656a37ec..ce42e91a95ccd42deff65e1942b918e9 // Paper end } diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index 91d327fc77d3b42a48eef06ed4347560fe7f57f9..c8f429a7fcfc60783c3667e082b4c4d8a9fc645e 100644 +index a7b720a2b79a1bc53c0f90c3dbfe9b68b0cfb3e0..f0923a7b1db1a77764dd13f1b2c86a5f4b76b555 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java -@@ -933,6 +933,7 @@ public class ServerPlayer extends Player { +@@ -955,6 +955,7 @@ public class ServerPlayer extends Player { })); Team scoreboardteambase = this.getTeam(); diff --git a/patches/server/0170-Configurable-mob-blindness.patch b/patches/server/0165-Configurable-mob-blindness.patch similarity index 84% rename from patches/server/0170-Configurable-mob-blindness.patch rename to patches/server/0165-Configurable-mob-blindness.patch index 81d9755e2..dbb34bc65 100644 --- a/patches/server/0170-Configurable-mob-blindness.patch +++ b/patches/server/0165-Configurable-mob-blindness.patch @@ -6,11 +6,11 @@ Subject: [PATCH] Configurable mob blindness Ported from https://github.com/raltsmc/mobblindness diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index cbaf99b4cd7b6d949695b1a66e66f18329e87148..5fd0ec5cff82bff9f44d03dc4d979eabe4c507e2 100644 +index 1a16df9566b3b0f026cafeb95443952937aa16cc..272dd6c5fd760e7310069420941ad90d36f9ddbe 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -1025,6 +1025,17 @@ public abstract class LivingEntity extends Entity { - if (entitytypes == EntityType.SKELETON && itemstack.is(Items.SKELETON_SKULL) || entitytypes == EntityType.ZOMBIE && itemstack.is(Items.ZOMBIE_HEAD) || entitytypes == EntityType.CREEPER && itemstack.is(Items.CREEPER_HEAD)) { +@@ -1026,6 +1026,17 @@ public abstract class LivingEntity extends Entity { + if (entitytypes == EntityType.SKELETON && itemstack.is(Items.SKELETON_SKULL) || entitytypes == EntityType.ZOMBIE && itemstack.is(Items.ZOMBIE_HEAD) || entitytypes == EntityType.PIGLIN && itemstack.is(Items.PIGLIN_HEAD) || entitytypes == EntityType.PIGLIN_BRUTE && itemstack.is(Items.PIGLIN_HEAD) || entitytypes == EntityType.CREEPER && itemstack.is(Items.CREEPER_HEAD)) { d0 *= 0.5D; } + @@ -28,7 +28,7 @@ index cbaf99b4cd7b6d949695b1a66e66f18329e87148..5fd0ec5cff82bff9f44d03dc4d979eab return d0; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 7c126828d8ce8e988746e06aad41d913985e951e..29fc1c042245c69fbdc4aa282d0f838b8226c9cf 100644 +index cba3ee6c0cd140c0d0dd5023cb79806dfa46b8c0..f1105ea3d141fd97740b4c859c8e92939f374029 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -135,6 +135,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0171-Hide-hidden-players-from-entity-selector.patch b/patches/server/0166-Hide-hidden-players-from-entity-selector.patch similarity index 91% rename from patches/server/0171-Hide-hidden-players-from-entity-selector.patch rename to patches/server/0166-Hide-hidden-players-from-entity-selector.patch index 71f0cb875..c42b05685 100644 --- a/patches/server/0171-Hide-hidden-players-from-entity-selector.patch +++ b/patches/server/0166-Hide-hidden-players-from-entity-selector.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Hide hidden players from entity selector diff --git a/src/main/java/net/minecraft/commands/arguments/selector/EntitySelector.java b/src/main/java/net/minecraft/commands/arguments/selector/EntitySelector.java -index 35cc3bba20afd4a47160cc674415ba6a3a0ec0ec..2cba35dcc479ed9ad3e698aa2e02b4aa408c84c4 100644 +index f25b9330e068c7d9e12cb57a7761cfef9ebaf7bc..7e66aaa960ce7b6dda7c064d4c6856cc4b368b58 100644 --- a/src/main/java/net/minecraft/commands/arguments/selector/EntitySelector.java +++ b/src/main/java/net/minecraft/commands/arguments/selector/EntitySelector.java -@@ -184,10 +184,10 @@ public class EntitySelector { +@@ -200,10 +200,10 @@ public class EntitySelector { if (this.playerName != null) { entityplayer = source.getServer().getPlayerList().getPlayerByName(this.playerName); @@ -21,7 +21,7 @@ index 35cc3bba20afd4a47160cc674415ba6a3a0ec0ec..2cba35dcc479ed9ad3e698aa2e02b4aa } else { Vec3 vec3d = (Vec3) this.position.apply(source.getPosition()); Predicate predicate = this.getPredicate(vec3d); -@@ -197,7 +197,7 @@ public class EntitySelector { +@@ -213,7 +213,7 @@ public class EntitySelector { ServerPlayer entityplayer1 = (ServerPlayer) source.getEntity(); if (predicate.test(entityplayer1)) { @@ -30,24 +30,24 @@ index 35cc3bba20afd4a47160cc674415ba6a3a0ec0ec..2cba35dcc479ed9ad3e698aa2e02b4aa } } -@@ -207,6 +207,7 @@ public class EntitySelector { +@@ -224,6 +224,7 @@ public class EntitySelector { if (this.isWorldLimited()) { - object = source.getLevel().getPlayers(predicate); + object = source.getLevel().getPlayers(predicate, i); + ((List) object).removeIf(entityplayer3 -> !canSee(source, (ServerPlayer) entityplayer3)); // Purpur } else { object = Lists.newArrayList(); Iterator iterator = source.getServer().getPlayerList().getPlayers().iterator(); -@@ -214,7 +215,7 @@ public class EntitySelector { +@@ -231,7 +232,7 @@ public class EntitySelector { while (iterator.hasNext()) { ServerPlayer entityplayer2 = (ServerPlayer) iterator.next(); - if (predicate.test(entityplayer2)) { + if (predicate.test(entityplayer2) && canSee(source, entityplayer2)) { // Purpur ((List) object).add(entityplayer2); - } - } -@@ -256,4 +257,10 @@ public class EntitySelector { + if (((List) object).size() >= i) { + return (List) object; +@@ -276,4 +277,10 @@ public class EntitySelector { public static Component joinNames(List entities) { return ComponentUtils.formatList(entities, Entity::getDisplayName); } diff --git a/patches/server/0172-Config-for-health-to-impact-Creeper-explosion-radius.patch b/patches/server/0167-Config-for-health-to-impact-Creeper-explosion-radius.patch similarity index 80% rename from patches/server/0172-Config-for-health-to-impact-Creeper-explosion-radius.patch rename to patches/server/0167-Config-for-health-to-impact-Creeper-explosion-radius.patch index 7ae2021d3..2110f34ae 100644 --- a/patches/server/0172-Config-for-health-to-impact-Creeper-explosion-radius.patch +++ b/patches/server/0167-Config-for-health-to-impact-Creeper-explosion-radius.patch @@ -5,12 +5,12 @@ Subject: [PATCH] Config for health to impact Creeper explosion radius diff --git a/src/main/java/net/minecraft/world/entity/monster/Creeper.java b/src/main/java/net/minecraft/world/entity/monster/Creeper.java -index 2ffa10ddd1a19aa44c088a41fdfcbd596e493791..663232752b74fea95010510d237b439d217be9ca 100644 +index b6f8d2927152a8e5a1203f3d57efb436cf72b30a..5e7dcb99daf6dcb61b8cd907d882778b48161d42 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Creeper.java +++ b/src/main/java/net/minecraft/world/entity/monster/Creeper.java @@ -366,9 +366,10 @@ public class Creeper extends Monster implements PowerableMob { + this.exploding = true; // Purpur if (!this.level.isClientSide) { - Explosion.BlockInteraction explosion_effect = (this.level.purpurConfig.creeperBypassMobGriefing || this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) && level.purpurConfig.creeperAllowGriefing ? Explosion.BlockInteraction.DESTROY : Explosion.BlockInteraction.NONE; // Purpur float f = this.isPowered() ? 2.0F : 1.0F; + float multiplier = this.level.purpurConfig.creeperHealthRadius ? this.getHealth() / this.getMaxHealth() : 1; // Purpur @@ -21,10 +21,10 @@ index 2ffa10ddd1a19aa44c088a41fdfcbd596e493791..663232752b74fea95010510d237b439d if (!event.isCancelled()) { this.dead = true; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index d5b2ff0a8527f074b3a0cd145086e5218d557c8a..59c8a0d0f7b98020c30c4696f814e91436c3ef61 100644 +index 85ef8d61fbd9aab463a0bf4690652097b0b8cde0..c954275dbb593ae5500e3deccbecac3abbffaac7 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -909,6 +909,7 @@ public class PurpurWorldConfig { +@@ -914,6 +914,7 @@ public class PurpurWorldConfig { public boolean creeperBypassMobGriefing = false; public boolean creeperTakeDamageFromWater = false; public boolean creeperExplodeWhenKilled = false; @@ -32,7 +32,7 @@ index d5b2ff0a8527f074b3a0cd145086e5218d557c8a..59c8a0d0f7b98020c30c4696f814e914 private void creeperSettings() { creeperRidable = getBoolean("mobs.creeper.ridable", creeperRidable); creeperRidableInWater = getBoolean("mobs.creeper.ridable-in-water", creeperRidableInWater); -@@ -924,6 +925,7 @@ public class PurpurWorldConfig { +@@ -929,6 +930,7 @@ public class PurpurWorldConfig { creeperBypassMobGriefing = getBoolean("mobs.creeper.bypass-mob-griefing", creeperBypassMobGriefing); creeperTakeDamageFromWater = getBoolean("mobs.creeper.takes-damage-from-water", creeperTakeDamageFromWater); creeperExplodeWhenKilled = getBoolean("mobs.creeper.explode-when-killed", creeperExplodeWhenKilled); diff --git a/patches/server/0173-Iron-golem-calm-anger-options.patch b/patches/server/0168-Iron-golem-calm-anger-options.patch similarity index 96% rename from patches/server/0173-Iron-golem-calm-anger-options.patch rename to patches/server/0168-Iron-golem-calm-anger-options.patch index 572829ed9..05fd58189 100644 --- a/patches/server/0173-Iron-golem-calm-anger-options.patch +++ b/patches/server/0168-Iron-golem-calm-anger-options.patch @@ -26,10 +26,10 @@ index e3d725e656bc5ffc5fc92133794a80799fb21c48..fdad66c329ff8945a76a944deca7751a } } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 59c8a0d0f7b98020c30c4696f814e91436c3ef61..3d3b717aa59abf63528afc383e99c083e9be6aff 100644 +index c954275dbb593ae5500e3deccbecac3abbffaac7..4726b08ee6b5bba463f912ccbe3ee7ba750e620b 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1367,6 +1367,8 @@ public class PurpurWorldConfig { +@@ -1372,6 +1372,8 @@ public class PurpurWorldConfig { public boolean ironGolemCanSwim = false; public double ironGolemMaxHealth = 100.0D; public boolean ironGolemTakeDamageFromWater = false; @@ -38,7 +38,7 @@ index 59c8a0d0f7b98020c30c4696f814e91436c3ef61..3d3b717aa59abf63528afc383e99c083 private void ironGolemSettings() { ironGolemRidable = getBoolean("mobs.iron_golem.ridable", ironGolemRidable); ironGolemRidableInWater = getBoolean("mobs.iron_golem.ridable-in-water", ironGolemRidableInWater); -@@ -1379,6 +1381,8 @@ public class PurpurWorldConfig { +@@ -1384,6 +1386,8 @@ public class PurpurWorldConfig { } ironGolemMaxHealth = getDouble("mobs.iron_golem.attributes.max_health", ironGolemMaxHealth); ironGolemTakeDamageFromWater = getBoolean("mobs.iron_golem.takes-damage-from-water", ironGolemTakeDamageFromWater); diff --git a/patches/server/0174-Breedable-parrots.patch b/patches/server/0169-Breedable-parrots.patch similarity index 81% rename from patches/server/0174-Breedable-parrots.patch rename to patches/server/0169-Breedable-parrots.patch index 40c3c55c0..592bb83cd 100644 --- a/patches/server/0174-Breedable-parrots.patch +++ b/patches/server/0169-Breedable-parrots.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Breedable parrots diff --git a/src/main/java/net/minecraft/world/entity/animal/Parrot.java b/src/main/java/net/minecraft/world/entity/animal/Parrot.java -index 11291851f11127f6781b3c77c0d59534606eb9dd..4f4df0f5459e3f62db4b15c57a536dc298b02877 100644 +index ab00e8d796ff7c903ea678dedb64cb25cf7e462e..29c13eee52a9f32a07853bd824687601601e3869 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Parrot.java +++ b/src/main/java/net/minecraft/world/entity/animal/Parrot.java -@@ -224,6 +224,7 @@ public class Parrot extends ShoulderRidingEntity implements FlyingAnimal { +@@ -228,6 +228,7 @@ public class Parrot extends ShoulderRidingEntity implements VariantHolder type, LevelAccessor world, MobSpawnType spawnReason, BlockPos pos, RandomSource random) { -@@ -380,13 +382,13 @@ public class Parrot extends ShoulderRidingEntity implements FlyingAnimal { +@@ -384,13 +386,13 @@ public class Parrot extends ShoulderRidingEntity implements VariantHolder 0.01D) { double d20 = 0.06D; @@ -18,7 +18,7 @@ index 997776ac62d2de1f076a5bc38fcf78a1999748cf..2cf873bffe06bc6905eebf8be243609c Vec3 vec3d5 = this.getDeltaMovement(); double d21 = vec3d5.x; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 8d4dc7d526cf9f4ec05e845ec9b10a47ff422d1e..9973dbee6ea493d7a4f70ac6627abd69123ab622 100644 +index 7b601106fdc5119df5bc9759a870d17bb42744b1..34c3507c8ac04764707c588ce864ae1bad6455be 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -274,6 +274,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0176-Add-config-change-multiplier-critical-damage-value.patch b/patches/server/0171-Add-config-change-multiplier-critical-damage-value.patch similarity index 89% rename from patches/server/0176-Add-config-change-multiplier-critical-damage-value.patch rename to patches/server/0171-Add-config-change-multiplier-critical-damage-value.patch index 29a8e475d..2abf797fe 100644 --- a/patches/server/0176-Add-config-change-multiplier-critical-damage-value.patch +++ b/patches/server/0171-Add-config-change-multiplier-critical-damage-value.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add config change multiplier critical damage value diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java -index 2b2eaac5ebddacada7690219c5ece3e8f2c76a6e..2270ef3d2c0982dda203ae2517b6d9121135637a 100644 +index 45385fe2e5249f4a61acd09b7b7ec3932df95adc..9e8cdcf56586351abc69bd4884d1f5fd2209cc68 100644 --- a/src/main/java/net/minecraft/world/entity/player/Player.java +++ b/src/main/java/net/minecraft/world/entity/player/Player.java -@@ -1324,7 +1324,7 @@ public abstract class Player extends LivingEntity { +@@ -1306,7 +1306,7 @@ public abstract class Player extends LivingEntity { flag2 = flag2 && !level.paperConfig().entities.behavior.disablePlayerCrits; // Paper flag2 = flag2 && !this.isSprinting(); if (flag2) { @@ -18,7 +18,7 @@ index 2b2eaac5ebddacada7690219c5ece3e8f2c76a6e..2270ef3d2c0982dda203ae2517b6d912 f += f1; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 9973dbee6ea493d7a4f70ac6627abd69123ab622..ef4c053236914f87c4ec48d1bfd0437ff75abd13 100644 +index 34c3507c8ac04764707c588ce864ae1bad6455be..d1608a3054e9cb1d55d3fec953e9f3526c7d8bab 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -373,6 +373,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0177-Option-to-disable-dragon-egg-teleporting.patch b/patches/server/0172-Option-to-disable-dragon-egg-teleporting.patch similarity index 95% rename from patches/server/0177-Option-to-disable-dragon-egg-teleporting.patch rename to patches/server/0172-Option-to-disable-dragon-egg-teleporting.patch index 5a4254b4e..4671b3a32 100644 --- a/patches/server/0177-Option-to-disable-dragon-egg-teleporting.patch +++ b/patches/server/0172-Option-to-disable-dragon-egg-teleporting.patch @@ -19,7 +19,7 @@ index 7e1edcc7b9f170b7c649437c2f0dd78c0bab9be4..5f8ac1fdac2c334951261f2b9702f5e7 BlockPos blockposition1 = pos.offset(world.random.nextInt(16) - world.random.nextInt(16), world.random.nextInt(8) - world.random.nextInt(8), world.random.nextInt(16) - world.random.nextInt(16)); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index ef4c053236914f87c4ec48d1bfd0437ff75abd13..d346d1fa9badcf979b7aa2b2d69ad99316837944 100644 +index d1608a3054e9cb1d55d3fec953e9f3526c7d8bab..58294dd6629f3296cf9f86b35c73abe6e019f0e4 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -550,6 +550,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0178-Config-for-unverified-username-message.patch b/patches/server/0173-Config-for-unverified-username-message.patch similarity index 94% rename from patches/server/0178-Config-for-unverified-username-message.patch rename to patches/server/0173-Config-for-unverified-username-message.patch index a9647b7a3..7fe38688a 100644 --- a/patches/server/0178-Config-for-unverified-username-message.patch +++ b/patches/server/0173-Config-for-unverified-username-message.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Config for unverified username message diff --git a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java -index fbd9807e3a9ad555999fa99e06211ecaf455a091..5fc79bc0b053465a59c08ec0e6716fab20979a3d 100644 +index f3b340fc6be9878d677a76673450aac3e0b73d4b..4ab0a893677acbbcf939f28799b2df8bba8b5567 100644 --- a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java -@@ -378,7 +378,7 @@ public class ServerLoginPacketListenerImpl implements TickablePacketListener, Se +@@ -339,7 +339,7 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener, ServerLoginPacketListenerImpl.this.gameProfile = gameprofile; ServerLoginPacketListenerImpl.this.state = ServerLoginPacketListenerImpl.State.READY_TO_ACCEPT; } else { diff --git a/patches/server/0179-Make-anvil-cumulative-cost-configurable.patch b/patches/server/0174-Make-anvil-cumulative-cost-configurable.patch similarity index 100% rename from patches/server/0179-Make-anvil-cumulative-cost-configurable.patch rename to patches/server/0174-Make-anvil-cumulative-cost-configurable.patch diff --git a/patches/server/0180-ShulkerBox-allow-oversized-stacks.patch b/patches/server/0175-ShulkerBox-allow-oversized-stacks.patch similarity index 89% rename from patches/server/0180-ShulkerBox-allow-oversized-stacks.patch rename to patches/server/0175-ShulkerBox-allow-oversized-stacks.patch index 2a53c4d36..d497ef4e9 100644 --- a/patches/server/0180-ShulkerBox-allow-oversized-stacks.patch +++ b/patches/server/0175-ShulkerBox-allow-oversized-stacks.patch @@ -9,7 +9,7 @@ creating an itemstack using the TileEntity's NBT data (how it handles it for creative players) instead of routing it through the LootableBuilder. diff --git a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java -index 47b43df836651ab94f7a64a9b22dad2357c0e0a6..61a4219f286a81af3e108f83658838c2464fdec7 100644 +index 0034831358550491d57360966b1458b34b0908e2..88c8f2c53c024021e7bad1e4666e3438b53ab588 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java @@ -420,7 +420,7 @@ public class ServerPlayerGameMode { @@ -22,10 +22,10 @@ index 47b43df836651ab94f7a64a9b22dad2357c0e0a6..61a4219f286a81af3e108f83658838c2 } else { ItemStack itemstack = this.player.getMainHandItem(); diff --git a/src/main/java/net/minecraft/world/level/block/ShulkerBoxBlock.java b/src/main/java/net/minecraft/world/level/block/ShulkerBoxBlock.java -index 0ca6d495005bded447c3f940dfd571a003301cb0..f4c47f7a7f2572dedbaee4890c98e1f3589a40c2 100644 +index c89978ecbc5a13dda6f76ea6d1cc3056efc9a174..39868ad3ee4bb573a4dd562894d93f64be4ee5ac 100644 --- a/src/main/java/net/minecraft/world/level/block/ShulkerBoxBlock.java +++ b/src/main/java/net/minecraft/world/level/block/ShulkerBoxBlock.java -@@ -120,7 +120,7 @@ public class ShulkerBoxBlock extends BaseEntityBlock { +@@ -138,7 +138,7 @@ public class ShulkerBoxBlock extends BaseEntityBlock { public void playerWillDestroy(Level world, BlockPos pos, BlockState state, Player player) { BlockEntity blockEntity = world.getBlockEntity(pos); if (blockEntity instanceof ShulkerBoxBlockEntity shulkerBoxBlockEntity) { @@ -35,7 +35,7 @@ index 0ca6d495005bded447c3f940dfd571a003301cb0..f4c47f7a7f2572dedbaee4890c98e1f3 blockEntity.saveToItem(itemStack); if (shulkerBoxBlockEntity.hasCustomName()) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index d346d1fa9badcf979b7aa2b2d69ad99316837944..9e5093d566f78cd3b28570ade5529bcce2db027f 100644 +index 58294dd6629f3296cf9f86b35c73abe6e019f0e4..6f0cc1fb353b017c2476b933958668affd6f8a09 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -659,6 +659,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0181-Bee-can-work-when-raining-or-at-night.patch b/patches/server/0176-Bee-can-work-when-raining-or-at-night.patch similarity index 95% rename from patches/server/0181-Bee-can-work-when-raining-or-at-night.patch rename to patches/server/0176-Bee-can-work-when-raining-or-at-night.patch index c7443baa3..0d4fda152 100644 --- a/patches/server/0181-Bee-can-work-when-raining-or-at-night.patch +++ b/patches/server/0176-Bee-can-work-when-raining-or-at-night.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Bee can work when raining or at night diff --git a/src/main/java/net/minecraft/world/entity/animal/Bee.java b/src/main/java/net/minecraft/world/entity/animal/Bee.java -index ec13cbb89a794c3d279b33fa197f9f42d0b86b46..0e5988fc636cbd7a76cf73ed91d65f0f9571987a 100644 +index dda1710c56b0b96533367b40e9c09acf5ffc0027..12c86e9227c21cef93ee9c00b505456a3a881d7c 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Bee.java +++ b/src/main/java/net/minecraft/world/entity/animal/Bee.java @@ -410,7 +410,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { @@ -31,7 +31,7 @@ index a16a1df28258d605cf5908dbe19bda5d71ad4f45..7b82842b97ce795745cf6ee6399f618c return false; } else { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 9e5093d566f78cd3b28570ade5529bcce2db027f..14eeef9823c1631d08d05fab579a18f72669dbfc 100644 +index 6f0cc1fb353b017c2476b933958668affd6f8a09..dad973fb21b2c3259c323e83c1ed08fbd696ca88 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -769,6 +769,8 @@ public class PurpurWorldConfig { diff --git a/patches/server/0182-API-for-any-mob-to-burn-daylight.patch b/patches/server/0177-API-for-any-mob-to-burn-daylight.patch similarity index 93% rename from patches/server/0182-API-for-any-mob-to-burn-daylight.patch rename to patches/server/0177-API-for-any-mob-to-burn-daylight.patch index 92f090d36..6aaedbaac 100644 --- a/patches/server/0182-API-for-any-mob-to-burn-daylight.patch +++ b/patches/server/0177-API-for-any-mob-to-burn-daylight.patch @@ -6,10 +6,10 @@ Subject: [PATCH] API for any mob to burn daylight Co-authored by: Encode42 diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index ca31164e78799d9143cc3c791b4b6393e6db4fe5..6e039e35d12101c757c560e6d89f1c1fd97adbd4 100644 +index 684144de36c2f6c98d7329f181bbecff746bdaf4..b2a84f1afb636218b0fa60c9129245b29d29268d 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -4651,5 +4651,20 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -4615,5 +4615,20 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { public boolean canSaveToDisk() { return true; } @@ -31,10 +31,10 @@ index ca31164e78799d9143cc3c791b4b6393e6db4fe5..6e039e35d12101c757c560e6d89f1c1f // Purpur end } diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 5fd0ec5cff82bff9f44d03dc4d979eabe4c507e2..6c506c32814b9e068b92094aab54be7647178c89 100644 +index 272dd6c5fd760e7310069420941ad90d36f9ddbe..c975f66f5f7f80547202c7cff7ad0c6f90f0cbc9 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -265,6 +265,7 @@ public abstract class LivingEntity extends Entity { +@@ -267,6 +267,7 @@ public abstract class LivingEntity extends Entity { public org.bukkit.craftbukkit.entity.CraftLivingEntity getBukkitLivingEntity() { return (org.bukkit.craftbukkit.entity.CraftLivingEntity) super.getBukkitEntity(); } // Paper public boolean silentDeath = false; // Paper - mark entity as dying silently for cancellable death event public net.kyori.adventure.util.TriState frictionState = net.kyori.adventure.util.TriState.NOT_SET; // Paper @@ -42,7 +42,7 @@ index 5fd0ec5cff82bff9f44d03dc4d979eabe4c507e2..6c506c32814b9e068b92094aab54be76 @Override public float getBukkitYaw() { -@@ -793,6 +794,7 @@ public abstract class LivingEntity extends Entity { +@@ -794,6 +795,7 @@ public abstract class LivingEntity extends Entity { dataresult.resultOrPartial(logger::error).ifPresent((nbtbase) -> { nbt.put("Brain", nbtbase); }); @@ -50,7 +50,7 @@ index 5fd0ec5cff82bff9f44d03dc4d979eabe4c507e2..6c506c32814b9e068b92094aab54be76 } @Override -@@ -877,6 +879,11 @@ public abstract class LivingEntity extends Entity { +@@ -878,6 +880,11 @@ public abstract class LivingEntity extends Entity { this.brain = this.makeBrain(new Dynamic(NbtOps.INSTANCE, nbt.get("Brain"))); } @@ -91,10 +91,10 @@ index 5fd0ec5cff82bff9f44d03dc4d979eabe4c507e2..6c506c32814b9e068b92094aab54be76 public boolean isSensitiveToWater() { diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java -index 7273474e296618663d3fbba813891197bc8480f8..8c534ea4b461550c14c6d5ee131e5650784c2e0f 100644 +index e2da9113227d397c8d5f1f8eca167d6fd9b0417d..8df6af3a4ceea5ed6209df489a0f728d384bef89 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java -@@ -1685,17 +1685,7 @@ public abstract class Mob extends LivingEntity { +@@ -1705,17 +1705,7 @@ public abstract class Mob extends LivingEntity { } public boolean isSunBurnTick() { @@ -275,10 +275,10 @@ index 6b7baf977972b624c5745820d5c3a4375c6854b0..f032a45969d6835a36e2c7598425bc09 // Paper end private static enum AttackPhase { diff --git a/src/main/java/net/minecraft/world/entity/monster/Zombie.java b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -index 0eaa8119201cae52340a1a58700906eb96e2a99f..f9e6f1788ae5e02372140a40373b4dec31e5d7d3 100644 +index d0c2167c82da8b2e9e3222c4ebb50ef2e141b34f..d6093557894789eb20f79b83547620b47bb65ffb 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zombie.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -@@ -94,11 +94,12 @@ public class Zombie extends Monster { +@@ -95,11 +95,12 @@ public class Zombie extends Monster { private int inWaterTime; public int conversionTime; private int lastTick = MinecraftServer.currentTick; // CraftBukkit - add field @@ -292,7 +292,7 @@ index 0eaa8119201cae52340a1a58700906eb96e2a99f..f9e6f1788ae5e02372140a40373b4dec } public Zombie(Level world) { -@@ -294,30 +295,7 @@ public class Zombie extends Monster { +@@ -295,30 +296,7 @@ public class Zombie extends Monster { @Override public void aiStep() { @@ -324,7 +324,7 @@ index 0eaa8119201cae52340a1a58700906eb96e2a99f..f9e6f1788ae5e02372140a40373b4dec super.aiStep(); } -@@ -355,6 +333,7 @@ public class Zombie extends Monster { +@@ -356,6 +334,7 @@ public class Zombie extends Monster { } @@ -332,7 +332,7 @@ index 0eaa8119201cae52340a1a58700906eb96e2a99f..f9e6f1788ae5e02372140a40373b4dec public boolean isSunSensitive() { return this.shouldBurnInDay; // Paper - use api value instead } -@@ -484,7 +463,7 @@ public class Zombie extends Monster { +@@ -485,7 +464,7 @@ public class Zombie extends Monster { nbt.putBoolean("CanBreakDoors", this.canBreakDoors()); nbt.putInt("InWaterTime", this.isInWater() ? this.inWaterTime : -1); nbt.putInt("DrownedConversionTime", this.isUnderWaterConverting() ? this.conversionTime : -1); @@ -341,7 +341,7 @@ index 0eaa8119201cae52340a1a58700906eb96e2a99f..f9e6f1788ae5e02372140a40373b4dec } @Override -@@ -498,7 +477,7 @@ public class Zombie extends Monster { +@@ -499,7 +478,7 @@ public class Zombie extends Monster { } // Paper start if (nbt.contains("Paper.ShouldBurnInDay")) { @@ -351,10 +351,10 @@ index 0eaa8119201cae52340a1a58700906eb96e2a99f..f9e6f1788ae5e02372140a40373b4dec // Paper end diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java -index edfd2d9450805f05df607b5160a0c0ecf9170915..e08cbcb9230889cc86b0726d67038e1cf9914c87 100644 +index 09b997701f7ebd2d3a8abe90dcf933c0037a95e0..f5f30763a8d497aa02c9e02938e49a644fcf2754 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java -@@ -205,6 +205,11 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { +@@ -206,6 +206,11 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { this.entity = entity; } diff --git a/patches/server/0183-Config-MobEffect-by-world.patch b/patches/server/0178-Config-MobEffect-by-world.patch similarity index 96% rename from patches/server/0183-Config-MobEffect-by-world.patch rename to patches/server/0178-Config-MobEffect-by-world.patch index cbc8dfa9a..cb246491c 100644 --- a/patches/server/0183-Config-MobEffect-by-world.patch +++ b/patches/server/0178-Config-MobEffect-by-world.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Config MobEffect by world diff --git a/src/main/java/net/minecraft/world/effect/MobEffect.java b/src/main/java/net/minecraft/world/effect/MobEffect.java -index 17ffab92f4ae2c06fa9f9249a474d4b6c9c55090..bb15cf2aa35ce8754bba56f5b312d92b1a50c9f8 100644 +index e708b2c987fac150c22b3367cec2e3e2bcb9914c..434f229c9e67c4ca459ab612345a1754d8be9780 100644 --- a/src/main/java/net/minecraft/world/effect/MobEffect.java +++ b/src/main/java/net/minecraft/world/effect/MobEffect.java @@ -61,16 +61,16 @@ public class MobEffect { @@ -40,7 +40,7 @@ index 17ffab92f4ae2c06fa9f9249a474d4b6c9c55090..bb15cf2aa35ce8754bba56f5b312d92b ((ServerPlayer) entityhuman).connection.send(new ClientboundSetHealthPacket(((ServerPlayer) entityhuman).getBukkitEntity().getScaledHealth(), entityhuman.getFoodData().foodLevel, entityhuman.getFoodData().saturationLevel)); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 14eeef9823c1631d08d05fab579a18f72669dbfc..4a41e0c169d31ae29d1039f3c06691b941026f66 100644 +index dad973fb21b2c3259c323e83c1ed08fbd696ca88..ce6379280814a5ce88ea2dbdf8185220204044a6 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -330,6 +330,21 @@ public class PurpurWorldConfig { diff --git a/patches/server/0184-Beacon-Activation-Range-Configurable.patch b/patches/server/0179-Beacon-Activation-Range-Configurable.patch similarity index 88% rename from patches/server/0184-Beacon-Activation-Range-Configurable.patch rename to patches/server/0179-Beacon-Activation-Range-Configurable.patch index c5790381c..3d5536c4f 100644 --- a/patches/server/0184-Beacon-Activation-Range-Configurable.patch +++ b/patches/server/0179-Beacon-Activation-Range-Configurable.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Beacon Activation Range Configurable diff --git a/src/main/java/net/minecraft/world/level/block/entity/BeaconBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/BeaconBlockEntity.java -index bb4ab75ec0e7a5d71dafeeb55e26d2204455e7a1..b7f60bdbb4938e57220002a47c588982bfcf1e8b 100644 +index 49ca1d45bb4b3ddafc1d5952ff9830ba69b745e2..c1a76a7a029a4795b7a7cd61009993f93e93b9ef 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/BeaconBlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/BeaconBlockEntity.java -@@ -82,6 +82,16 @@ public class BeaconBlockEntity extends BlockEntity implements MenuProvider { +@@ -84,6 +84,16 @@ public class BeaconBlockEntity extends BlockEntity implements MenuProvider, Name public double getEffectRange() { if (this.effectRange < 0) { @@ -26,7 +26,7 @@ index bb4ab75ec0e7a5d71dafeeb55e26d2204455e7a1..b7f60bdbb4938e57220002a47c588982 } else { return effectRange; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 4a41e0c169d31ae29d1039f3c06691b941026f66..b6110258766f41604adcb28629ad02bf563b62b4 100644 +index ce6379280814a5ce88ea2dbdf8185220204044a6..19d90a881168409514fa4d31d3ccaa770b4edac3 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -522,6 +522,17 @@ public class PurpurWorldConfig { diff --git a/patches/server/0185-Add-toggle-for-sand-duping-fix.patch b/patches/server/0180-Add-toggle-for-sand-duping-fix.patch similarity index 85% rename from patches/server/0185-Add-toggle-for-sand-duping-fix.patch rename to patches/server/0180-Add-toggle-for-sand-duping-fix.patch index 13fdb53e1..21821aca7 100644 --- a/patches/server/0185-Add-toggle-for-sand-duping-fix.patch +++ b/patches/server/0180-Add-toggle-for-sand-duping-fix.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add toggle for sand duping fix diff --git a/src/main/java/net/minecraft/world/entity/item/FallingBlockEntity.java b/src/main/java/net/minecraft/world/entity/item/FallingBlockEntity.java -index b2d1a17867cdbaad0c6e5c2376c716f9461af124..6943bf2bfa29bce3a1425d75c3ddf560438f5ea0 100644 +index 72f1866226269396ba0f0c1be269e237925d9322..7e6cff38ad3f160efb0a30b482304e035e6dd593 100644 --- a/src/main/java/net/minecraft/world/entity/item/FallingBlockEntity.java +++ b/src/main/java/net/minecraft/world/entity/item/FallingBlockEntity.java -@@ -128,7 +128,7 @@ public class FallingBlockEntity extends Entity { +@@ -130,7 +130,7 @@ public class FallingBlockEntity extends Entity { @Override public void tick() { // Paper start - fix sand duping @@ -17,7 +17,7 @@ index b2d1a17867cdbaad0c6e5c2376c716f9461af124..6943bf2bfa29bce3a1425d75c3ddf560 return; } // Paper end - fix sand duping -@@ -145,7 +145,7 @@ public class FallingBlockEntity extends Entity { +@@ -147,7 +147,7 @@ public class FallingBlockEntity extends Entity { this.move(MoverType.SELF, this.getDeltaMovement()); // Paper start - fix sand duping @@ -27,7 +27,7 @@ index b2d1a17867cdbaad0c6e5c2376c716f9461af124..6943bf2bfa29bce3a1425d75c3ddf560 } // Paper end - fix sand duping diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index b6110258766f41604adcb28629ad02bf563b62b4..6944ed93105adb3833f870c03b9bba89aa083f6f 100644 +index 19d90a881168409514fa4d31d3ccaa770b4edac3..25e7d308281131b066642140abc64e648e959d78 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -685,6 +685,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0186-Add-toggle-for-end-portal-safe-teleporting.patch b/patches/server/0181-Add-toggle-for-end-portal-safe-teleporting.patch similarity index 92% rename from patches/server/0186-Add-toggle-for-end-portal-safe-teleporting.patch rename to patches/server/0181-Add-toggle-for-end-portal-safe-teleporting.patch index 8627e5752..39d9d7f4e 100644 --- a/patches/server/0186-Add-toggle-for-end-portal-safe-teleporting.patch +++ b/patches/server/0181-Add-toggle-for-end-portal-safe-teleporting.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add toggle for end portal safe teleporting diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index bd76451230bb0b5abb744088b67b7e558a3241a4..c18ec8ea889eda26498ec7a31c631cafdaf53432 100644 +index b2a84f1afb636218b0fa60c9129245b29d29268d..eb9c8f025c35402b0d07475c9cf0ca58334be2f9 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -2949,7 +2949,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -2934,7 +2934,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { } this.processPortalCooldown(); @@ -45,7 +45,7 @@ index 04bae5085756842ce88710646a17e9dc1aad5994..e7658fa9806701505e15cbf1d28ea3bd entity.portalWorld = ((ServerLevel)world); entity.portalBlock = pos.immutable(); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 6944ed93105adb3833f870c03b9bba89aa083f6f..ebf607069030efaa5dc8fe70187533f0aec4918e 100644 +index 25e7d308281131b066642140abc64e648e959d78..12fd1b68a04caa9e5b6c2ea6d92845f01464bff9 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -636,6 +636,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0187-Flying-Fall-Damage-API.patch b/patches/server/0182-Flying-Fall-Damage-API.patch similarity index 82% rename from patches/server/0187-Flying-Fall-Damage-API.patch rename to patches/server/0182-Flying-Fall-Damage-API.patch index 05b950f59..72a1b9599 100644 --- a/patches/server/0187-Flying-Fall-Damage-API.patch +++ b/patches/server/0182-Flying-Fall-Damage-API.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Flying Fall Damage API diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java -index 3e8334e4d7164a286ae3c497dbb1aa61521df0dd..853c005a6dffe93f47acc30166282287234ca4e0 100644 +index 9e8cdcf56586351abc69bd4884d1f5fd2209cc68..747e3c7abaae99e60273c75fc45a7a58d6e6c96e 100644 --- a/src/main/java/net/minecraft/world/entity/player/Player.java +++ b/src/main/java/net/minecraft/world/entity/player/Player.java -@@ -188,6 +188,7 @@ public abstract class Player extends LivingEntity { +@@ -183,6 +183,7 @@ public abstract class Player extends LivingEntity { public boolean affectsSpawning = true; // Paper end public int sixRowEnderchestSlotCount = -1; // Purpur @@ -16,7 +16,7 @@ index 3e8334e4d7164a286ae3c497dbb1aa61521df0dd..853c005a6dffe93f47acc30166282287 // CraftBukkit start public boolean fauxSleeping; -@@ -1807,7 +1808,7 @@ public abstract class Player extends LivingEntity { +@@ -1784,7 +1785,7 @@ public abstract class Player extends LivingEntity { @Override public boolean causeFallDamage(float fallDistance, float damageMultiplier, DamageSource damageSource) { @@ -26,10 +26,10 @@ index 3e8334e4d7164a286ae3c497dbb1aa61521df0dd..853c005a6dffe93f47acc30166282287 } else { if (fallDistance >= 2.0F) { diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index c1c5c0edab6dc204dd0e7de09af31f8b3b95ad86..98a08e304ddd9628101fc90bfa8201b11792fc16 100644 +index 9ca8dab9976838c22cd759ae67c6c0821734cf0d..6addde66b83defbcf450936a3a878225a1dfcc92 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -3034,5 +3034,14 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -3043,5 +3043,14 @@ public class CraftPlayer extends CraftHumanEntity implements Player { public void setSpawnInvulnerableTicks(int spawnInvulnerableTime) { getHandle().spawnInvulnerableTime = spawnInvulnerableTime; } diff --git a/patches/server/0188-Make-lightning-rod-range-configurable.patch b/patches/server/0183-Make-lightning-rod-range-configurable.patch similarity index 93% rename from patches/server/0188-Make-lightning-rod-range-configurable.patch rename to patches/server/0183-Make-lightning-rod-range-configurable.patch index 050bc0ac2..16d03ee62 100644 --- a/patches/server/0188-Make-lightning-rod-range-configurable.patch +++ b/patches/server/0183-Make-lightning-rod-range-configurable.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Make lightning rod range configurable diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index 66817fa844fc03d0137a6cd9aab1a41b05d94d1c..8567ab80b3eb9a450313862d2ff3832e64240d6f 100644 +index 7167eb607844bec58a3e075aea1ff090f8fd90b5..e9d220904d22523336ec699c678a4dcb5fec95f5 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java -@@ -975,7 +975,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -981,7 +981,7 @@ public class ServerLevel extends Level implements WorldGenLevel { return holder.is(PoiTypes.LIGHTNING_ROD); }, (blockposition1) -> { return blockposition1.getY() == this.getHeight(Heightmap.Types.WORLD_SURFACE, blockposition1.getX(), blockposition1.getZ()) - 1; diff --git a/patches/server/0189-Burp-delay-burp-after-eating-food-fills-hunger-bar-c.patch b/patches/server/0184-Burp-delay-burp-after-eating-food-fills-hunger-bar-c.patch similarity index 91% rename from patches/server/0189-Burp-delay-burp-after-eating-food-fills-hunger-bar-c.patch rename to patches/server/0184-Burp-delay-burp-after-eating-food-fills-hunger-bar-c.patch index 870812687..07bafab12 100644 --- a/patches/server/0189-Burp-delay-burp-after-eating-food-fills-hunger-bar-c.patch +++ b/patches/server/0184-Burp-delay-burp-after-eating-food-fills-hunger-bar-c.patch @@ -6,10 +6,10 @@ Subject: [PATCH] Burp delay, burp after eating food fills hunger bar diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java -index 8106457a149d2a28872fc81aba7bb595aa491f21..89a1959bcc4bc9e086b108714ffc73d57bfb9aec 100644 +index 747e3c7abaae99e60273c75fc45a7a58d6e6c96e..a3d092fb6fe5df8018af37d12cdd085041cb96fd 100644 --- a/src/main/java/net/minecraft/world/entity/player/Player.java +++ b/src/main/java/net/minecraft/world/entity/player/Player.java -@@ -201,6 +201,8 @@ public abstract class Player extends LivingEntity { +@@ -196,6 +196,8 @@ public abstract class Player extends LivingEntity { // CraftBukkit end // Purpur start @@ -18,7 +18,7 @@ index 8106457a149d2a28872fc81aba7bb595aa491f21..89a1959bcc4bc9e086b108714ffc73d5 public abstract void resetLastActionTime(); public void setAfk(boolean afk) { -@@ -265,6 +267,12 @@ public abstract class Player extends LivingEntity { +@@ -259,6 +261,12 @@ public abstract class Player extends LivingEntity { @Override public void tick() { @@ -31,7 +31,7 @@ index 8106457a149d2a28872fc81aba7bb595aa491f21..89a1959bcc4bc9e086b108714ffc73d5 this.noPhysics = this.isSpectator(); if (this.isSpectator()) { this.onGround = false; -@@ -2373,7 +2381,7 @@ public abstract class Player extends LivingEntity { +@@ -2345,7 +2353,7 @@ public abstract class Player extends LivingEntity { public ItemStack eat(Level world, ItemStack stack) { this.getFoodData().eat(stack.getItem(), stack); this.awardStat(Stats.ITEM_USED.get(stack.getItem())); @@ -56,7 +56,7 @@ index 2934b6de1f1fb914a532ee20184df99d1acd8e65..4c1e9b6f4a52d7b1506b9016cc4d30e5 public void eat(Item item, ItemStack stack) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index ebf607069030efaa5dc8fe70187533f0aec4918e..4e5f8bc3042d68a10d670e8c42d27bef207a0c14 100644 +index 12fd1b68a04caa9e5b6c2ea6d92845f01464bff9..78174622485b3c6092f35737a70405a2fa981dc2 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -389,6 +389,8 @@ public class PurpurWorldConfig { diff --git a/patches/server/0190-Allow-player-join-full-server-by-permission.patch b/patches/server/0185-Allow-player-join-full-server-by-permission.patch similarity index 89% rename from patches/server/0190-Allow-player-join-full-server-by-permission.patch rename to patches/server/0185-Allow-player-join-full-server-by-permission.patch index 7eba0e477..2e8d6f500 100644 --- a/patches/server/0190-Allow-player-join-full-server-by-permission.patch +++ b/patches/server/0185-Allow-player-join-full-server-by-permission.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Allow player join full server by permission diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index 1d369d4a540f4b4731c3a07d2b70256462de34f3..eb3d0956a43f96d495ce6712f413e84acbc0fa1c 100644 +index cf72427cf13a23f76b812657abbfa6243ae13a82..23cea7dd67dd1890a8fd34c294d140b30e89f59c 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java -@@ -783,7 +783,7 @@ public abstract class PlayerList { +@@ -791,7 +791,7 @@ public abstract class PlayerList { event.disallow(PlayerLoginEvent.Result.KICK_BANNED, PaperAdventure.asAdventure(ichatmutablecomponent)); // Paper - Adventure } else { // return this.players.size() >= this.maxPlayers && !this.canBypassPlayerLimit(gameprofile) ? IChatBaseComponent.translatable("multiplayer.disconnect.server_full") : null; diff --git a/patches/server/0191-Add-permission-bypass-for-portal-waiting.patch b/patches/server/0186-Add-permission-bypass-for-portal-waiting.patch similarity index 88% rename from patches/server/0191-Add-permission-bypass-for-portal-waiting.patch rename to patches/server/0186-Add-permission-bypass-for-portal-waiting.patch index 93ff12565..d94f115e9 100644 --- a/patches/server/0191-Add-permission-bypass-for-portal-waiting.patch +++ b/patches/server/0186-Add-permission-bypass-for-portal-waiting.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add permission bypass for portal waiting diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java -index 0bcb88b9fc4e7289153177bd71d8a72458af1dbe..a53b828a23de5cd008504441d1506b29d03261eb 100644 +index a3d092fb6fe5df8018af37d12cdd085041cb96fd..4255eb4ec520b07a9b32e967e31d0b58d359b29e 100644 --- a/src/main/java/net/minecraft/world/entity/player/Player.java +++ b/src/main/java/net/minecraft/world/entity/player/Player.java -@@ -189,6 +189,7 @@ public abstract class Player extends LivingEntity { +@@ -184,6 +184,7 @@ public abstract class Player extends LivingEntity { // Paper end public int sixRowEnderchestSlotCount = -1; // Purpur public boolean flyingFallDamage = false; // Purpur @@ -16,7 +16,7 @@ index 0bcb88b9fc4e7289153177bd71d8a72458af1dbe..a53b828a23de5cd008504441d1506b29 // CraftBukkit start public boolean fauxSleeping; -@@ -473,7 +474,7 @@ public abstract class Player extends LivingEntity { +@@ -466,7 +467,7 @@ public abstract class Player extends LivingEntity { @Override public int getPortalWaitTime() { diff --git a/patches/server/0192-Shulker-spawn-from-bullet-options.patch b/patches/server/0187-Shulker-spawn-from-bullet-options.patch similarity index 81% rename from patches/server/0192-Shulker-spawn-from-bullet-options.patch rename to patches/server/0187-Shulker-spawn-from-bullet-options.patch index f02fc59a2..f96dab826 100644 --- a/patches/server/0192-Shulker-spawn-from-bullet-options.patch +++ b/patches/server/0187-Shulker-spawn-from-bullet-options.patch @@ -13,10 +13,10 @@ Subject: [PATCH] Shulker spawn from bullet options (7 - 1) / 5.0 = 1.2 1.0 - 1.2 = -0.2 0% (6 other shulkers) diff --git a/src/main/java/net/minecraft/world/entity/monster/Shulker.java b/src/main/java/net/minecraft/world/entity/monster/Shulker.java -index 2abdeb351fbabec7490c1ce806cebf8886b6be61..ada070d8e1a2d328c02455eb9e5ad056046bcd0a 100644 +index 76020a1f20cf7009dcff18b721c2175294ca2f26..70237d8891889818135ea024d0c8f31cbfe75524 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Shulker.java +++ b/src/main/java/net/minecraft/world/entity/monster/Shulker.java -@@ -507,13 +507,22 @@ public class Shulker extends AbstractGolem implements Enemy { +@@ -509,11 +509,20 @@ public class Shulker extends AbstractGolem implements VariantHolder getVariant() { +- return Optional.ofNullable(this.getColor()); ++ return Optional.ofNullable(this.level.purpurConfig.shulkerSpawnFromBulletRandomColor ? DyeColor.random(this.level.random) : this.getColor()); // Purpur + } + + @Nullable diff --git a/src/main/java/net/minecraft/world/item/DyeColor.java b/src/main/java/net/minecraft/world/item/DyeColor.java -index 2d3dbc228a6a7b88167a36ba739d9eb2f03472ba..7621978ab3d90d58e8b7c6807e0e0519062654dc 100644 +index 2170715ed0e81a3055e4ab546c8b294c5ef7f142..beae4e2b9f61df83215de860d64c4ce2d3482004 100644 --- a/src/main/java/net/minecraft/world/item/DyeColor.java +++ b/src/main/java/net/minecraft/world/item/DyeColor.java -@@ -112,4 +112,10 @@ public enum DyeColor implements StringRepresentable { +@@ -103,4 +103,10 @@ public enum DyeColor implements StringRepresentable { public String getSerializedName() { return this.name; } + + // Purpur start + public static DyeColor random(net.minecraft.util.RandomSource random) { -+ return BY_ID[random.nextInt(BY_ID.length)]; ++ return values()[random.nextInt(values().length)]; + } + // Purpur end } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 8db81be1709fa766bec922b0e4e3c748539a4c1e..bb883af840de5117ee770f78df580eb972106c36 100644 +index 23213eb78d9f30101c3de2b7806e2898fe5c333e..931bba87be78463c21c79752caf4e2b274daa4de 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1903,6 +1903,11 @@ public class PurpurWorldConfig { +@@ -1908,6 +1908,11 @@ public class PurpurWorldConfig { public boolean shulkerControllable = true; public double shulkerMaxHealth = 30.0D; public boolean shulkerTakeDamageFromWater = false; @@ -76,7 +82,7 @@ index 8db81be1709fa766bec922b0e4e3c748539a4c1e..bb883af840de5117ee770f78df580eb9 private void shulkerSettings() { shulkerRidable = getBoolean("mobs.shulker.ridable", shulkerRidable); shulkerRidableInWater = getBoolean("mobs.shulker.ridable-in-water", shulkerRidableInWater); -@@ -1914,6 +1919,11 @@ public class PurpurWorldConfig { +@@ -1919,6 +1924,11 @@ public class PurpurWorldConfig { } shulkerMaxHealth = getDouble("mobs.shulker.attributes.max_health", shulkerMaxHealth); shulkerTakeDamageFromWater = getBoolean("mobs.shulker.takes-damage-from-water", shulkerTakeDamageFromWater); diff --git a/patches/server/0193-Eating-glow-berries-adds-glow-effect.patch b/patches/server/0188-Eating-glow-berries-adds-glow-effect.patch similarity index 84% rename from patches/server/0193-Eating-glow-berries-adds-glow-effect.patch rename to patches/server/0188-Eating-glow-berries-adds-glow-effect.patch index 84c4c9893..6bf2e8a58 100644 --- a/patches/server/0193-Eating-glow-berries-adds-glow-effect.patch +++ b/patches/server/0188-Eating-glow-berries-adds-glow-effect.patch @@ -5,20 +5,20 @@ Subject: [PATCH] Eating glow berries adds glow effect diff --git a/src/main/java/net/minecraft/world/item/Items.java b/src/main/java/net/minecraft/world/item/Items.java -index e0a635d647113bb363df2ddc293f2495c56e5d3c..fcdd30f38bc57cc382a47d99e3c31f9348ca12c3 100644 +index fd10ecc79b503b3a650bec1db656b86d58da81ac..306abbe878cb84cea0fd2d87d45594fc25285a93 100644 --- a/src/main/java/net/minecraft/world/item/Items.java +++ b/src/main/java/net/minecraft/world/item/Items.java -@@ -1117,7 +1117,7 @@ public class Items { - public static final Item LANTERN = registerBlock(Blocks.LANTERN, CreativeModeTab.TAB_DECORATIONS); - public static final Item SOUL_LANTERN = registerBlock(Blocks.SOUL_LANTERN, CreativeModeTab.TAB_DECORATIONS); - public static final Item SWEET_BERRIES = registerItem("sweet_berries", new ItemNameBlockItem(Blocks.SWEET_BERRY_BUSH, (new Item.Properties()).tab(CreativeModeTab.TAB_FOOD).food(Foods.SWEET_BERRIES))); -- public static final Item GLOW_BERRIES = registerItem("glow_berries", new ItemNameBlockItem(Blocks.CAVE_VINES, (new Item.Properties()).food(Foods.GLOW_BERRIES).tab(CreativeModeTab.TAB_FOOD))); -+ public static final Item GLOW_BERRIES = registerItem("glow_berries", new org.purpurmc.purpur.item.GlowBerryItem(Blocks.CAVE_VINES, (new Item.Properties()).food(Foods.GLOW_BERRIES).tab(CreativeModeTab.TAB_FOOD))); // Purpur - public static final Item CAMPFIRE = registerBlock(Blocks.CAMPFIRE, CreativeModeTab.TAB_DECORATIONS); - public static final Item SOUL_CAMPFIRE = registerBlock(Blocks.SOUL_CAMPFIRE, CreativeModeTab.TAB_DECORATIONS); - public static final Item SHROOMLIGHT = registerBlock(Blocks.SHROOMLIGHT, CreativeModeTab.TAB_DECORATIONS); +@@ -1153,7 +1153,7 @@ public class Items { + public static final Item LANTERN = registerBlock(Blocks.LANTERN); + public static final Item SOUL_LANTERN = registerBlock(Blocks.SOUL_LANTERN); + public static final Item SWEET_BERRIES = registerItem("sweet_berries", new ItemNameBlockItem(Blocks.SWEET_BERRY_BUSH, (new Item.Properties()).food(Foods.SWEET_BERRIES))); +- public static final Item GLOW_BERRIES = registerItem("glow_berries", new ItemNameBlockItem(Blocks.CAVE_VINES, (new Item.Properties()).food(Foods.GLOW_BERRIES))); ++ public static final Item GLOW_BERRIES = registerItem("glow_berries", new org.purpurmc.purpur.item.GlowBerryItem(Blocks.CAVE_VINES, (new Item.Properties()).food(Foods.GLOW_BERRIES))); // Purpur + public static final Item CAMPFIRE = registerBlock(Blocks.CAMPFIRE); + public static final Item SOUL_CAMPFIRE = registerBlock(Blocks.SOUL_CAMPFIRE); + public static final Item SHROOMLIGHT = registerBlock(Blocks.SHROOMLIGHT); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index bd2c7b4b21c6c9812be930162856d72696faad76..bab901d7240163d586d9c5f0f10107e680841ea3 100644 +index 47f1dfa01d2f005855a432d3235a47de53105830..2b7654043a90ff7b2d7535765ca4ce2b393d055e 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -221,6 +221,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0194-Option-to-make-drowned-break-doors.patch b/patches/server/0189-Option-to-make-drowned-break-doors.patch similarity index 94% rename from patches/server/0194-Option-to-make-drowned-break-doors.patch rename to patches/server/0189-Option-to-make-drowned-break-doors.patch index a638be7a2..2c18a5fd9 100644 --- a/patches/server/0194-Option-to-make-drowned-break-doors.patch +++ b/patches/server/0189-Option-to-make-drowned-break-doors.patch @@ -34,10 +34,10 @@ index 037d77b47d0be69dfeda01f4a0d52ad72aea2c8d..6e0a575a95ac0bcbc9e3909178ea566a @Override diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index bab901d7240163d586d9c5f0f10107e680841ea3..cb349aa767d20f9639b70f1e50002f91b2e6f0f0 100644 +index dd61c0f37205c22553004a185816f966f3ec859d..c23313f82064352244205709f5c792201cbb7629 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1049,6 +1049,7 @@ public class PurpurWorldConfig { +@@ -1054,6 +1054,7 @@ public class PurpurWorldConfig { public double drownedJockeyChance = 0.05D; public boolean drownedJockeyTryExistingChickens = true; public boolean drownedTakeDamageFromWater = false; @@ -45,7 +45,7 @@ index bab901d7240163d586d9c5f0f10107e680841ea3..cb349aa767d20f9639b70f1e50002f91 private void drownedSettings() { drownedRidable = getBoolean("mobs.drowned.ridable", drownedRidable); drownedRidableInWater = getBoolean("mobs.drowned.ridable-in-water", drownedRidableInWater); -@@ -1064,6 +1065,7 @@ public class PurpurWorldConfig { +@@ -1069,6 +1070,7 @@ public class PurpurWorldConfig { drownedJockeyChance = getDouble("mobs.drowned.jockey.chance", drownedJockeyChance); drownedJockeyTryExistingChickens = getBoolean("mobs.drowned.jockey.try-existing-chickens", drownedJockeyTryExistingChickens); drownedTakeDamageFromWater = getBoolean("mobs.drowned.takes-damage-from-water", drownedTakeDamageFromWater); diff --git a/patches/server/0195-Configurable-hunger-starvation-damage.patch b/patches/server/0190-Configurable-hunger-starvation-damage.patch similarity index 92% rename from patches/server/0195-Configurable-hunger-starvation-damage.patch rename to patches/server/0190-Configurable-hunger-starvation-damage.patch index f16bad9e8..71bcd0453 100644 --- a/patches/server/0195-Configurable-hunger-starvation-damage.patch +++ b/patches/server/0190-Configurable-hunger-starvation-damage.patch @@ -18,10 +18,10 @@ index 4c1e9b6f4a52d7b1506b9016cc4d30e583eeab04..0e753dd68d9506a2a4e5ad74e7f4d04c this.tickTimer = 0; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 8e00bdc92d2b9a79e47f3f7d530de63d977a043c..8e69c445d7aabe815b2349d1f413859ad7e11510 100644 +index 90a33d6b180a56ce46d6e755a28597a5e9768efd..f9b9c735cf280bd9e8d7a0ba6d56568eb579e044 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -2551,4 +2551,9 @@ public class PurpurWorldConfig { +@@ -2552,4 +2552,9 @@ 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); } diff --git a/patches/server/0196-Enhance-SysoutCatcher.patch b/patches/server/0191-Enhance-SysoutCatcher.patch similarity index 100% rename from patches/server/0196-Enhance-SysoutCatcher.patch rename to patches/server/0191-Enhance-SysoutCatcher.patch diff --git a/patches/server/0197-Armor-click-equip-options.patch b/patches/server/0192-Armor-click-equip-options.patch similarity index 96% rename from patches/server/0197-Armor-click-equip-options.patch rename to patches/server/0192-Armor-click-equip-options.patch index e5d5f16ea..f7e12fdb5 100644 --- a/patches/server/0197-Armor-click-equip-options.patch +++ b/patches/server/0192-Armor-click-equip-options.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Armor click equip options diff --git a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java -index 61a4219f286a81af3e108f83658838c2464fdec7..9f8995c559b500415ec8d214f7c164707046f6ac 100644 +index 88c8f2c53c024021e7bad1e4666e3438b53ab588..16f136dd8ed96a3eb7ae1cf9c6039b4f026fec25 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java @@ -482,7 +482,7 @@ public class ServerPlayerGameMode { @@ -58,7 +58,7 @@ index 42f79d418ec4e2dbeac9a217d9dc144cda2ef714..250c0e31825f772d3fee7a523f150cb2 return InteractionResultHolder.fail(itemStack); } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 81d9089d366a651062156eb73b57829ed397c8ed..a838a433646c7ba01e5861978319d85287441b78 100644 +index 77399157dcdb13d6c0b50c284884d34a7fb1929a..1623936910a399a8335f4541530fe84743aaebf4 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -393,6 +393,8 @@ public class PurpurWorldConfig { diff --git a/patches/server/0198-Add-uptime-command.patch b/patches/server/0193-Add-uptime-command.patch similarity index 96% rename from patches/server/0198-Add-uptime-command.patch rename to patches/server/0193-Add-uptime-command.patch index 569599c70..ed0731c91 100644 --- a/patches/server/0198-Add-uptime-command.patch +++ b/patches/server/0193-Add-uptime-command.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add uptime command diff --git a/src/main/java/net/minecraft/commands/Commands.java b/src/main/java/net/minecraft/commands/Commands.java -index 14b12cb6967c1c2735cf6a0eafdf6e23889a528c..6a044a9c97db9bba75f8dbbaa8515e3167841855 100644 +index 880eb2697c156a1bdf81582a8cc4862a6892f042..b779b4a7118fbcc24752369a5944536f5ecccaf1 100644 --- a/src/main/java/net/minecraft/commands/Commands.java +++ b/src/main/java/net/minecraft/commands/Commands.java -@@ -210,6 +210,7 @@ public class Commands { +@@ -218,6 +218,7 @@ public class Commands { org.purpurmc.purpur.command.CreditsCommand.register(this.dispatcher); // Purpur org.purpurmc.purpur.command.DemoCommand.register(this.dispatcher); // Purpur org.purpurmc.purpur.command.PingCommand.register(this.dispatcher); // Purpur @@ -17,10 +17,10 @@ index 14b12cb6967c1c2735cf6a0eafdf6e23889a528c..6a044a9c97db9bba75f8dbbaa8515e31 } diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index e03ce4bf00505f886e2b07c5b1e77214f7ba789d..a513f1aa4372ff9c484f9a782b73cf7078c6ce72 100644 +index 35e0499575e9567093c187728bc37273f602531e..ca52d7e8bc891819067d7809734136470ab56484 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -281,6 +281,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop())), + Map.entry("minecraft:crimson_hyphae", Map.of("into", "minecraft:stripped_crimson_hyphae", "drops", new HashMap()))) + ).forEach((blockId, obj) -> { -+ Block block = Registry.BLOCK.get(new ResourceLocation(blockId)); ++ Block block = BuiltInRegistries.BLOCK.get(new ResourceLocation(blockId)); + if (block == Blocks.AIR) { PurpurConfig.log(Level.SEVERE, "Invalid block for `tools.axe.strippables`: " + blockId); return; } + if (!(obj instanceof Map map)) { PurpurConfig.log(Level.SEVERE, "Invalid yaml for `tools.axe.strippables." + blockId + "`"); return; } + String intoId = (String) map.get("into"); -+ Block into = Registry.BLOCK.get(new ResourceLocation(intoId)); ++ Block into = BuiltInRegistries.BLOCK.get(new ResourceLocation(intoId)); + if (into == Blocks.AIR) { PurpurConfig.log(Level.SEVERE, "Invalid block for `tools.axe.strippables." + blockId + ".into`: " + intoId); return; } + Object dropsObj = map.get("drops"); + if (!(dropsObj instanceof Map dropsMap)) { PurpurConfig.log(Level.SEVERE, "Invalid yaml for `tools.axe.strippables." + blockId + ".drops`"); return; } + Map drops = new HashMap<>(); + dropsMap.forEach((itemId, chance) -> { -+ Item item = Registry.ITEM.get(new ResourceLocation(itemId.toString())); ++ Item item = BuiltInRegistries.ITEM.get(new ResourceLocation(itemId.toString())); + if (item == Items.AIR) { PurpurConfig.log(Level.SEVERE, "Invalid item for `tools.axe.strippables." + blockId + ".drops`: " + itemId); return; } + drops.put(item, (double) chance); + }); @@ -208,17 +208,17 @@ index a838a433646c7ba01e5861978319d85287441b78..fecd5ca0563c9195b5ca69872b66f90f + Map.entry("minecraft:waxed_weathered_cut_copper_stairs", Map.of("into", "minecraft:weathered_cut_copper_stairs", "drops", new HashMap())), + Map.entry("minecraft:waxed_oxidized_cut_copper_stairs", Map.of("into", "minecraft:oxidized_cut_copper_stairs", "drops", new HashMap()))) + ).forEach((blockId, obj) -> { -+ Block block = Registry.BLOCK.get(new ResourceLocation(blockId)); ++ Block block = BuiltInRegistries.BLOCK.get(new ResourceLocation(blockId)); + if (block == Blocks.AIR) { PurpurConfig.log(Level.SEVERE, "Invalid block for `tools.axe.waxables`: " + blockId); return; } + if (!(obj instanceof Map map)) { PurpurConfig.log(Level.SEVERE, "Invalid yaml for `tools.axe.waxables." + blockId + "`"); return; } + String intoId = (String) map.get("into"); -+ Block into = Registry.BLOCK.get(new ResourceLocation(intoId)); ++ Block into = BuiltInRegistries.BLOCK.get(new ResourceLocation(intoId)); + if (into == Blocks.AIR) { PurpurConfig.log(Level.SEVERE, "Invalid block for `tools.axe.waxables." + blockId + ".into`: " + intoId); return; } + Object dropsObj = map.get("drops"); + if (!(dropsObj instanceof Map dropsMap)) { PurpurConfig.log(Level.SEVERE, "Invalid yaml for `tools.axe.waxables." + blockId + ".drops`"); return; } + Map drops = new HashMap<>(); + dropsMap.forEach((itemId, chance) -> { -+ Item item = Registry.ITEM.get(new ResourceLocation(itemId.toString())); ++ Item item = BuiltInRegistries.ITEM.get(new ResourceLocation(itemId.toString())); + if (item == Items.AIR) { PurpurConfig.log(Level.SEVERE, "Invalid item for `tools.axe.waxables." + blockId + ".drops`: " + itemId); return; } + drops.put(item, (double) chance); + }); @@ -238,17 +238,17 @@ index a838a433646c7ba01e5861978319d85287441b78..fecd5ca0563c9195b5ca69872b66f90f + Map.entry("minecraft:weathered_cut_copper_stairs", Map.of("into", "minecraft:exposed_cut_copper_stairs", "drops", new HashMap())), + Map.entry("minecraft:oxidized_cut_copper_stairs", Map.of("into", "minecraft:weathered_cut_copper_stairs", "drops", new HashMap()))) + ).forEach((blockId, obj) -> { -+ Block block = Registry.BLOCK.get(new ResourceLocation(blockId)); ++ Block block = BuiltInRegistries.BLOCK.get(new ResourceLocation(blockId)); + if (block == Blocks.AIR) { PurpurConfig.log(Level.SEVERE, "Invalid block for `tools.axe.weatherables`: " + blockId); return; } + if (!(obj instanceof Map map)) { PurpurConfig.log(Level.SEVERE, "Invalid yaml for `tools.axe.weatherables." + blockId + "`"); return; } + String intoId = (String) map.get("into"); -+ Block into = Registry.BLOCK.get(new ResourceLocation(intoId)); ++ Block into = BuiltInRegistries.BLOCK.get(new ResourceLocation(intoId)); + if (into == Blocks.AIR) { PurpurConfig.log(Level.SEVERE, "Invalid block for `tools.axe.weatherables." + blockId + ".into`: " + intoId); return; } + Object dropsObj = map.get("drops"); + if (!(dropsObj instanceof Map dropsMap)) { PurpurConfig.log(Level.SEVERE, "Invalid yaml for `tools.axe.weatherables." + blockId + ".drops`"); return; } + Map drops = new HashMap<>(); + dropsMap.forEach((itemId, chance) -> { -+ Item item = Registry.ITEM.get(new ResourceLocation(itemId.toString())); ++ Item item = BuiltInRegistries.ITEM.get(new ResourceLocation(itemId.toString())); + if (item == Items.AIR) { PurpurConfig.log(Level.SEVERE, "Invalid item for `tools.axe.weatherables." + blockId + ".drops`: " + itemId); return; } + drops.put(item, (double) chance); + }); @@ -261,20 +261,20 @@ index a838a433646c7ba01e5861978319d85287441b78..fecd5ca0563c9195b5ca69872b66f90f + Map.entry("minecraft:coarse_dirt", Map.of("condition", "air_above", "into", "minecraft:dirt", "drops", new HashMap())), + Map.entry("minecraft:rooted_dirt", Map.of("condition", "always", "into", "minecraft:dirt", "drops", Map.of("minecraft:hanging_roots", 1.0D)))) + ).forEach((blockId, obj) -> { -+ Block block = Registry.BLOCK.get(new ResourceLocation(blockId)); ++ Block block = BuiltInRegistries.BLOCK.get(new ResourceLocation(blockId)); + if (block == Blocks.AIR) { PurpurConfig.log(Level.SEVERE, "Invalid block for `tools.hoe.tillables`: " + blockId); return; } + if (!(obj instanceof Map map)) { PurpurConfig.log(Level.SEVERE, "Invalid yaml for `tools.hoe.tillables." + blockId + "`"); return; } + String conditionId = (String) map.get("condition"); + Tillable.Condition condition = Tillable.Condition.get(conditionId); + if (condition == null) { PurpurConfig.log(Level.SEVERE, "Invalid condition for `tools.hoe.tillables." + blockId + ".condition`: " + conditionId); return; } + String intoId = (String) map.get("into"); -+ Block into = Registry.BLOCK.get(new ResourceLocation(intoId)); ++ Block into = BuiltInRegistries.BLOCK.get(new ResourceLocation(intoId)); + if (into == Blocks.AIR) { PurpurConfig.log(Level.SEVERE, "Invalid block for `tools.hoe.tillables." + blockId + ".into`: " + intoId); return; } + Object dropsObj = map.get("drops"); + if (!(dropsObj instanceof Map dropsMap)) { PurpurConfig.log(Level.SEVERE, "Invalid yaml for `tools.hoe.tillables." + blockId + ".drops`"); return; } + Map drops = new HashMap<>(); + dropsMap.forEach((itemId, chance) -> { -+ Item item = Registry.ITEM.get(new ResourceLocation(itemId.toString())); ++ Item item = BuiltInRegistries.ITEM.get(new ResourceLocation(itemId.toString())); + if (item == Items.AIR) { PurpurConfig.log(Level.SEVERE, "Invalid item for `tools.hoe.tillables." + blockId + ".drops`: " + itemId); return; } + drops.put(item, (double) chance); + }); diff --git a/patches/server/0201-Store-placer-on-Block-when-placed.patch b/patches/server/0196-Store-placer-on-Block-when-placed.patch similarity index 87% rename from patches/server/0201-Store-placer-on-Block-when-placed.patch rename to patches/server/0196-Store-placer-on-Block-when-placed.patch index 86f6cfdc6..1f2df1299 100644 --- a/patches/server/0201-Store-placer-on-Block-when-placed.patch +++ b/patches/server/0196-Store-placer-on-Block-when-placed.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Store placer on Block when placed diff --git a/src/main/java/net/minecraft/world/item/ItemStack.java b/src/main/java/net/minecraft/world/item/ItemStack.java -index f7017c330ee2d8e17ab2be294865d7e3fd796456..1626f86d8765509618b9ca59fb67b6b772802431 100644 +index 7fff7d366a7f75e2fdd7e5f739976bb0fd0ba725..ceac1de7dedf5702f2eb49e489790d24490722db 100644 --- a/src/main/java/net/minecraft/world/item/ItemStack.java +++ b/src/main/java/net/minecraft/world/item/ItemStack.java -@@ -404,6 +404,7 @@ public final class ItemStack { +@@ -412,6 +412,7 @@ public final class ItemStack { world.preventPoiUpdated = true; // CraftBukkit - SPIGOT-5710 for (BlockState blockstate : blocks) { blockstate.update(true, false); @@ -16,7 +16,7 @@ index f7017c330ee2d8e17ab2be294865d7e3fd796456..1626f86d8765509618b9ca59fb67b6b7 } world.preventPoiUpdated = false; -@@ -433,6 +434,7 @@ public final class ItemStack { +@@ -441,6 +442,7 @@ public final class ItemStack { if (!(block.getBlock() instanceof BaseEntityBlock)) { // Containers get placed automatically block.getBlock().onPlace(block, world, newblockposition, oldBlock, true, itemactioncontext); // Paper - pass itemactioncontext } @@ -25,10 +25,10 @@ index f7017c330ee2d8e17ab2be294865d7e3fd796456..1626f86d8765509618b9ca59fb67b6b7 world.notifyAndUpdatePhysics(newblockposition, null, oldBlock, block, world.getBlockState(newblockposition), updateFlag, 512); // send null chunk as chunk.k() returns false by this point } diff --git a/src/main/java/net/minecraft/world/level/block/Block.java b/src/main/java/net/minecraft/world/level/block/Block.java -index 2e65b44f10aeb44fd524a58e7eb815a566c1ad61..efed0ad72cfbea820bfb454ea4fb893007734908 100644 +index 7b71073027f4cf79736546500ededdfbb83d968e..9e439bf6b7418f884f045ad8158bce7d7e93079a 100644 --- a/src/main/java/net/minecraft/world/level/block/Block.java +++ b/src/main/java/net/minecraft/world/level/block/Block.java -@@ -440,7 +440,17 @@ public class Block extends BlockBehaviour implements ItemLike { +@@ -438,7 +438,17 @@ public class Block extends BlockBehaviour implements ItemLike { Block.dropResources(state, world, pos, blockEntity, player, stack); } diff --git a/patches/server/0202-Summoner-API.patch b/patches/server/0197-Summoner-API.patch similarity index 70% rename from patches/server/0202-Summoner-API.patch rename to patches/server/0197-Summoner-API.patch index 7daa9d0e1..807a71a1e 100644 --- a/patches/server/0202-Summoner-API.patch +++ b/patches/server/0197-Summoner-API.patch @@ -93,10 +93,10 @@ index 069f90f113aeaa61236c86a07463c4190fc36c4e..a407254b527b9d39c03d1ceb5f685868 } diff --git a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java -index 98825928e957cadd1c263bfbee09a13733a0b853..29e67a03097a21f3d49e1998dbb125e58fce4368 100644 +index 2ef066f01fe4dbebc147fb5ec2591bdbe72a41e5..97c5ffd383a02afecba035e65823ac12e03c7295 100644 --- a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java +++ b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java -@@ -85,6 +85,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob +@@ -84,6 +84,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob }; private static final TargetingConditions TARGETING_CONDITIONS = TargetingConditions.forCombat().range(20.0D).selector(WitherBoss.LIVING_ENTITY_SELECTOR); private int shootCooldown = 0; // Purpur @@ -104,7 +104,7 @@ index 98825928e957cadd1c263bfbee09a13733a0b853..29e67a03097a21f3d49e1998dbb125e5 // Paper start private boolean canPortal = false; -@@ -239,6 +240,15 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob +@@ -238,6 +239,15 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob public boolean isSensitiveToWater() { return this.level.purpurConfig.witherTakeDamageFromWater; } @@ -120,7 +120,7 @@ index 98825928e957cadd1c263bfbee09a13733a0b853..29e67a03097a21f3d49e1998dbb125e5 // Purpur end @Override -@@ -267,6 +277,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob +@@ -266,6 +276,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob public void addAdditionalSaveData(CompoundTag nbt) { super.addAdditionalSaveData(nbt); nbt.putInt("Invul", this.getInvulnerableTicks()); @@ -128,7 +128,7 @@ index 98825928e957cadd1c263bfbee09a13733a0b853..29e67a03097a21f3d49e1998dbb125e5 } @Override -@@ -276,6 +287,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob +@@ -275,6 +286,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob if (this.hasCustomName()) { this.bossEvent.setName(this.getDisplayName()); } @@ -137,37 +137,56 @@ index 98825928e957cadd1c263bfbee09a13733a0b853..29e67a03097a21f3d49e1998dbb125e5 } diff --git a/src/main/java/net/minecraft/world/level/block/CarvedPumpkinBlock.java b/src/main/java/net/minecraft/world/level/block/CarvedPumpkinBlock.java -index 7a700892a997aa595ac9c9f28d6b39a35c225053..872507fe50e50429bbaa3af16f8f9d94806c4010 100644 +index 3a6b84fab71d65be6215bde5bdabb303d418623e..1a8fcb57de6a5cc29d25c2fc909b4aff43d1eb25 100644 --- a/src/main/java/net/minecraft/world/level/block/CarvedPumpkinBlock.java +++ b/src/main/java/net/minecraft/world/level/block/CarvedPumpkinBlock.java -@@ -82,6 +82,7 @@ public class CarvedPumpkinBlock extends HorizontalDirectionalBlock implements We - BlockPos blockposition1 = shapedetector_shapedetectorcollection.getBlock(0, 2, 0).getPos(); +@@ -68,7 +68,7 @@ public class CarvedPumpkinBlock extends HorizontalDirectionalBlock implements We + SnowGolem entitysnowman = (SnowGolem) EntityType.SNOW_GOLEM.create(world); - entitysnowman.moveTo((double) blockposition1.getX() + 0.5D, (double) blockposition1.getY() + 0.05D, (double) blockposition1.getZ() + 0.5D, 0.0F, 0.0F); -+ entitysnowman.setSummoner(this.placer == null ? null : this.placer.getUUID()); // Purpur - // CraftBukkit start - if (!world.addFreshEntity(entitysnowman, SpawnReason.BUILD_SNOWMAN)) { - return; -@@ -120,6 +121,7 @@ public class CarvedPumpkinBlock extends HorizontalDirectionalBlock implements We + if (entitysnowman != null) { +- CarvedPumpkinBlock.spawnGolemInWorld(world, shapedetector_shapedetectorcollection, entitysnowman, shapedetector_shapedetectorcollection.getBlock(0, 2, 0).getPos()); ++ CarvedPumpkinBlock.spawnGolemInWorld(world, shapedetector_shapedetectorcollection, entitysnowman, shapedetector_shapedetectorcollection.getBlock(0, 2, 0).getPos(), this.placer); // Purpur + } + } else { + BlockPattern.BlockPatternMatch shapedetector_shapedetectorcollection1 = this.getOrCreateIronGolemFull().find(world, pos); +@@ -78,7 +78,7 @@ public class CarvedPumpkinBlock extends HorizontalDirectionalBlock implements We - entityirongolem.setPlayerCreated(true); - entityirongolem.moveTo((double) blockposition2.getX() + 0.5D, (double) blockposition2.getY() + 0.05D, (double) blockposition2.getZ() + 0.5D, 0.0F, 0.0F); -+ entityirongolem.setSummoner(this.placer == null ? null : this.placer.getUUID()); // Purpur - // CraftBukkit start - if (!world.addFreshEntity(entityirongolem, SpawnReason.BUILD_IRONGOLEM)) { - return; + if (entityirongolem != null) { + entityirongolem.setPlayerCreated(true); +- CarvedPumpkinBlock.spawnGolemInWorld(world, shapedetector_shapedetectorcollection1, entityirongolem, shapedetector_shapedetectorcollection1.getBlock(1, 2, 0).getPos()); ++ CarvedPumpkinBlock.spawnGolemInWorld(world, shapedetector_shapedetectorcollection1, entityirongolem, shapedetector_shapedetectorcollection1.getBlock(1, 2, 0).getPos(), this.placer); // Purpur + } + } + } +@@ -86,6 +86,16 @@ public class CarvedPumpkinBlock extends HorizontalDirectionalBlock implements We + } + + private static void spawnGolemInWorld(Level world, BlockPattern.BlockPatternMatch patternResult, Entity entity, BlockPos pos) { ++ // Purpur start ++ spawnGolemInWorld(world, patternResult, entity, pos, null); ++ } ++ private static void spawnGolemInWorld(Level world, BlockPattern.BlockPatternMatch patternResult, Entity entity, BlockPos pos, net.minecraft.world.entity.LivingEntity placer) { ++ if (entity instanceof SnowGolem snowGolem) { ++ snowGolem.setSummoner(placer == null ? null : placer.getUUID()); ++ } else if (entity instanceof IronGolem ironGolem) { ++ ironGolem.setSummoner(placer == null ? null : placer.getUUID()); ++ } ++ // Purpur end + // clearPatternBlocks(world, shapedetector_shapedetectorcollection); // CraftBukkit - moved down + entity.moveTo((double) pos.getX() + 0.5D, (double) pos.getY() + 0.05D, (double) pos.getZ() + 0.5D, 0.0F, 0.0F); + // CraftBukkit start diff --git a/src/main/java/net/minecraft/world/level/block/WitherSkullBlock.java b/src/main/java/net/minecraft/world/level/block/WitherSkullBlock.java -index 03b97e9ea6059fa09bbbed7fc9ae7212f3eaa70b..25daac2b7c1cb5f8194704aa36ba04b40a4f8d21 100644 +index b91effe91dad2e1aeea0ea31140f7432833b343f..bb628bd3fe8b185f356968697b17e1c4a442a6d2 100644 --- a/src/main/java/net/minecraft/world/level/block/WitherSkullBlock.java +++ b/src/main/java/net/minecraft/world/level/block/WitherSkullBlock.java -@@ -81,6 +81,7 @@ public class WitherSkullBlock extends SkullBlock { - entitywither.moveTo((double) blockposition1.getX() + 0.5D, (double) blockposition1.getY() + 0.55D, (double) blockposition1.getZ() + 0.5D, shapedetector_shapedetectorcollection.getForwards().getAxis() == Direction.Axis.X ? 0.0F : 90.0F, 0.0F); - entitywither.yBodyRot = shapedetector_shapedetectorcollection.getForwards().getAxis() == Direction.Axis.X ? 0.0F : 90.0F; - entitywither.makeInvulnerable(); -+ entitywither.setSummoner(iblockdata.getBlock().placer == null ? null : iblockdata.getBlock().placer.getUUID()); // Purpur - // CraftBukkit start - if (!world.addFreshEntity(entitywither, SpawnReason.BUILD_WITHER)) { - return; +@@ -71,6 +71,7 @@ public class WitherSkullBlock extends SkullBlock { + entitywither.moveTo((double) blockposition1.getX() + 0.5D, (double) blockposition1.getY() + 0.55D, (double) blockposition1.getZ() + 0.5D, shapedetector_shapedetectorcollection.getForwards().getAxis() == Direction.Axis.X ? 0.0F : 90.0F, 0.0F); + entitywither.yBodyRot = shapedetector_shapedetectorcollection.getForwards().getAxis() == Direction.Axis.X ? 0.0F : 90.0F; + entitywither.makeInvulnerable(); ++ entitywither.setSummoner(iblockdata.getBlock().placer == null ? null : iblockdata.getBlock().placer.getUUID()); // Purpur + // CraftBukkit start + if (!world.addFreshEntity(entitywither, SpawnReason.BUILD_WITHER)) { + return; diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftIronGolem.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftIronGolem.java index 2966d4d466f44751b2f02afda2273a708c12b251..55f19324f92f98e497da49d3022e0edfc2351461 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftIronGolem.java diff --git a/patches/server/0203-Customizable-sleeping-actionbar-messages.patch b/patches/server/0198-Customizable-sleeping-actionbar-messages.patch similarity index 96% rename from patches/server/0203-Customizable-sleeping-actionbar-messages.patch rename to patches/server/0198-Customizable-sleeping-actionbar-messages.patch index 4feeed142..cf33c6b02 100644 --- a/patches/server/0203-Customizable-sleeping-actionbar-messages.patch +++ b/patches/server/0198-Customizable-sleeping-actionbar-messages.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Customizable sleeping actionbar messages diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index 8567ab80b3eb9a450313862d2ff3832e64240d6f..f9ddff75288aa39e3d62422cca6ce536c20d47b2 100644 +index e9d220904d22523336ec699c678a4dcb5fec95f5..f4b24ebacede304bc192efa5115bfb758b8fa6da 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java -@@ -1024,11 +1024,27 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1030,11 +1030,27 @@ public class ServerLevel extends Level implements WorldGenLevel { if (this.canSleepThroughNights()) { if (!this.getServer().isSingleplayer() || this.getServer().isPublished()) { int i = this.getGameRules().getInt(GameRules.RULE_PLAYERS_SLEEPING_PERCENTAGE); diff --git a/patches/server/0204-option-to-disable-shulker-box-items-from-dropping-co.patch b/patches/server/0199-option-to-disable-shulker-box-items-from-dropping-co.patch similarity index 90% rename from patches/server/0204-option-to-disable-shulker-box-items-from-dropping-co.patch rename to patches/server/0199-option-to-disable-shulker-box-items-from-dropping-co.patch index aeb65611a..3d7873c3a 100644 --- a/patches/server/0204-option-to-disable-shulker-box-items-from-dropping-co.patch +++ b/patches/server/0199-option-to-disable-shulker-box-items-from-dropping-co.patch @@ -6,10 +6,10 @@ Subject: [PATCH] option to disable shulker box items from dropping contents diff --git a/src/main/java/net/minecraft/world/item/BlockItem.java b/src/main/java/net/minecraft/world/item/BlockItem.java -index 62d6c5b7590ff4faef5d8c7a8be03155b7338480..72d94c79db5a6d0d41220b34ba6a1787b66a6cfd 100644 +index b0204af850ee182773ad458208cccd946ad148d5..81eb7092e6172bf9685d4feb52dabb012979be70 100644 --- a/src/main/java/net/minecraft/world/item/BlockItem.java +++ b/src/main/java/net/minecraft/world/item/BlockItem.java -@@ -294,7 +294,7 @@ public class BlockItem extends Item { +@@ -288,7 +288,7 @@ public class BlockItem extends Item { @Override public void onDestroyed(ItemEntity entity) { @@ -19,7 +19,7 @@ index 62d6c5b7590ff4faef5d8c7a8be03155b7338480..72d94c79db5a6d0d41220b34ba6a1787 CompoundTag nbttagcompound = BlockItem.getBlockEntityData(itemstack); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index fecd5ca0563c9195b5ca69872b66f90fec80d43d..63926eb8a662677f08a11b391fdc197aa1fd0255 100644 +index 01f735d8a1f9dc5bd795557edf189e9d76de714e..7f9ac05e7cdc48bc4de0cc2ca6cb7e3b4b672a1b 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -222,6 +222,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0205-Silk-touchable-budding-amethyst.patch b/patches/server/0200-Silk-touchable-budding-amethyst.patch similarity index 94% rename from patches/server/0205-Silk-touchable-budding-amethyst.patch rename to patches/server/0200-Silk-touchable-budding-amethyst.patch index ff0af9dd6..4a3709d75 100644 --- a/patches/server/0205-Silk-touchable-budding-amethyst.patch +++ b/patches/server/0200-Silk-touchable-budding-amethyst.patch @@ -24,7 +24,7 @@ index bedccb8717d08d5a60058445b04ddff149e7d36c..5293ffca3da94c9c485a87d1232b6a90 + // Purpur end } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 914f4963f61ab707897739bb5075d4d611e357ff..a65143b9c4f32ee8cf8517a3a753c1d4c2b8ec1d 100644 +index cc16e72f6033d3fe3cf06186eb11fe9767bfa15c..233ef41ac3801807fa4508d466d892c298261cdf 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -714,6 +714,11 @@ public class PurpurWorldConfig { @@ -39,7 +39,7 @@ index 914f4963f61ab707897739bb5075d4d611e357ff..a65143b9c4f32ee8cf8517a3a753c1d4 public boolean chestOpenWithBlockOnTop = false; private void chestSettings() { chestOpenWithBlockOnTop = getBoolean("blocks.chest.open-with-solid-block-on-top", chestOpenWithBlockOnTop); -@@ -2716,3 +2721,4 @@ public class PurpurWorldConfig { +@@ -2717,3 +2722,4 @@ public class PurpurWorldConfig { hungerStarvationDamage = (float) getDouble("hunger.starvation-damage", hungerStarvationDamage); } } diff --git a/patches/server/0206-Big-dripleaf-tilt-delay.patch b/patches/server/0201-Big-dripleaf-tilt-delay.patch similarity index 93% rename from patches/server/0206-Big-dripleaf-tilt-delay.patch rename to patches/server/0201-Big-dripleaf-tilt-delay.patch index ac0e9cde0..f89f35de3 100644 --- a/patches/server/0206-Big-dripleaf-tilt-delay.patch +++ b/patches/server/0201-Big-dripleaf-tilt-delay.patch @@ -11,7 +11,7 @@ PARTIAL: big_dripleaf with PARTIAL tilt will change to FULL tilt after 10 ticks UNSTABLE: big_dripleaf with FULL tilt will change back to no tilt after 100 ticks diff --git a/src/main/java/net/minecraft/world/level/block/BigDripleafBlock.java b/src/main/java/net/minecraft/world/level/block/BigDripleafBlock.java -index 63aa6b82ba21ec8e8f362b390063e4e275a979a5..81ed6e69494337f402a6d9f854fb26fa1ac6acb2 100644 +index 8537581e7ca1f4efb492a2e734f46f947f36cffa..5f89229ff68d923c5cdee40e72e379ba7024f961 100644 --- a/src/main/java/net/minecraft/world/level/block/BigDripleafBlock.java +++ b/src/main/java/net/minecraft/world/level/block/BigDripleafBlock.java @@ -236,7 +236,7 @@ public class BigDripleafBlock extends HorizontalDirectionalBlock implements Bone @@ -24,7 +24,7 @@ index 63aa6b82ba21ec8e8f362b390063e4e275a979a5..81ed6e69494337f402a6d9f854fb26fa if (i != -1) { world.scheduleTick(blockposition, (Block) this, i); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index bec789c0d3209655ed2b2cfb7306d3042dc6d41b..3a29ae68b15005fdec1e1e5889e2dec1354b8844 100644 +index 40407828fbaab1989f6753ee04a6f2b86ee60c2b..31f7106acadb04a97bd5017039018a76d0aaa3c5 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -714,6 +714,22 @@ public class PurpurWorldConfig { diff --git a/patches/server/0207-Player-ridable-in-water-option.patch b/patches/server/0202-Player-ridable-in-water-option.patch similarity index 89% rename from patches/server/0207-Player-ridable-in-water-option.patch rename to patches/server/0202-Player-ridable-in-water-option.patch index 46871b5d7..9e7e8c7b5 100644 --- a/patches/server/0207-Player-ridable-in-water-option.patch +++ b/patches/server/0202-Player-ridable-in-water-option.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Player ridable in water option diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java -index f634735add2cd9467ac2d2dae1f8cf06eaa23d0a..f2677acf87e6cc279c902915617ef887799b5f2a 100644 +index 4255eb4ec520b07a9b32e967e31d0b58d359b29e..46258a0218614600a5405a6c251cbec58574decf 100644 --- a/src/main/java/net/minecraft/world/entity/player/Player.java +++ b/src/main/java/net/minecraft/world/entity/player/Player.java -@@ -2104,6 +2104,11 @@ public abstract class Player extends LivingEntity { +@@ -2076,6 +2076,11 @@ public abstract class Player extends LivingEntity { return this.inventory.armor; } @@ -21,7 +21,7 @@ index f634735add2cd9467ac2d2dae1f8cf06eaa23d0a..f2677acf87e6cc279c902915617ef887 if (!this.isPassenger() && this.onGround && !this.isInWater() && !this.isInPowderSnow) { if (this.getShoulderEntityLeft().isEmpty()) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 3a29ae68b15005fdec1e1e5889e2dec1354b8844..fa6cbac5936296336a53772f9d655b0b6fbbf2f4 100644 +index 31f7106acadb04a97bd5017039018a76d0aaa3c5..50e8f164d7083aef30dbdfbe911982a1ea20de06 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -397,6 +397,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0208-Config-to-disable-Enderman-teleport-on-projectile-hi.patch b/patches/server/0203-Config-to-disable-Enderman-teleport-on-projectile-hi.patch similarity index 87% rename from patches/server/0208-Config-to-disable-Enderman-teleport-on-projectile-hi.patch rename to patches/server/0203-Config-to-disable-Enderman-teleport-on-projectile-hi.patch index 744168256..cc2693ee4 100644 --- a/patches/server/0208-Config-to-disable-Enderman-teleport-on-projectile-hi.patch +++ b/patches/server/0203-Config-to-disable-Enderman-teleport-on-projectile-hi.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Config to disable Enderman teleport on projectile hit diff --git a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -index 6c1de46576c3cb65526de48400d268695ca53024..a8367e8086fb1c075102f414a5c30ccb49be0720 100644 +index b7ca9f5135cb65d7fdd69f258f2e84ee9e252d26..8b9462496ee60c44a1a28082563c573a6235b638 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -@@ -414,7 +414,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -424,7 +424,7 @@ public class EnderMan extends Monster implements NeutralMob { return false; } else if (getRider() != null && this.isControllable()) { return super.hurt(source, amount); // Purpur - no teleporting on damage } else if (org.purpurmc.purpur.PurpurConfig.endermanShortHeight && source == DamageSource.IN_WALL) { return false; // Purpur - no suffocation damage if short height @@ -18,10 +18,10 @@ index 6c1de46576c3cb65526de48400d268695ca53024..a8367e8086fb1c075102f414a5c30ccb boolean flag; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index fa6cbac5936296336a53772f9d655b0b6fbbf2f4..0fe874bb1eb3bd3eb644602416153b39a5dd5c0c 100644 +index c016c63feb293a84b4d7824f380cce03936598f9..e8a7237ed1594d0b61e197e6be1ba5c501ada927 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1308,6 +1308,7 @@ public class PurpurWorldConfig { +@@ -1313,6 +1313,7 @@ public class PurpurWorldConfig { public boolean endermanAggroEndermitesOnlyIfPlayerSpawned = false; public boolean endermanIgnorePlayerDragonHead = false; public boolean endermanDisableStareAggro = false; @@ -29,7 +29,7 @@ index fa6cbac5936296336a53772f9d655b0b6fbbf2f4..0fe874bb1eb3bd3eb644602416153b39 private void endermanSettings() { endermanRidable = getBoolean("mobs.enderman.ridable", endermanRidable); endermanRidableInWater = getBoolean("mobs.enderman.ridable-in-water", endermanRidableInWater); -@@ -1330,6 +1331,7 @@ public class PurpurWorldConfig { +@@ -1335,6 +1336,7 @@ public class PurpurWorldConfig { endermanAggroEndermitesOnlyIfPlayerSpawned = getBoolean("mobs.enderman.aggressive-towards-endermites-only-spawned-by-player-thrown-ender-pearls", endermanAggroEndermitesOnlyIfPlayerSpawned); endermanIgnorePlayerDragonHead = getBoolean("mobs.enderman.ignore-players-wearing-dragon-head", endermanIgnorePlayerDragonHead); endermanDisableStareAggro = getBoolean("mobs.enderman.disable-player-stare-aggression", endermanDisableStareAggro); diff --git a/patches/server/0209-Add-compass-command.patch b/patches/server/0204-Add-compass-command.patch similarity index 94% rename from patches/server/0209-Add-compass-command.patch rename to patches/server/0204-Add-compass-command.patch index 27ec074f7..4e0ccca41 100644 --- a/patches/server/0209-Add-compass-command.patch +++ b/patches/server/0204-Add-compass-command.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add compass command diff --git a/src/main/java/net/minecraft/commands/Commands.java b/src/main/java/net/minecraft/commands/Commands.java -index b91ea7354710052be29727e7f62442f316416506..674e2d926608cc4c98068bb83be077864726a515 100644 +index b779b4a7118fbcc24752369a5944536f5ecccaf1..244f5b5a7a7e781c27d21477d798f65ff77d4bc6 100644 --- a/src/main/java/net/minecraft/commands/Commands.java +++ b/src/main/java/net/minecraft/commands/Commands.java -@@ -212,6 +212,7 @@ public class Commands { +@@ -220,6 +220,7 @@ public class Commands { org.purpurmc.purpur.command.PingCommand.register(this.dispatcher); // Purpur org.purpurmc.purpur.command.UptimeCommand.register(this.dispatcher); // Purpur org.purpurmc.purpur.command.TPSBarCommand.register(this.dispatcher); // Purpur @@ -17,18 +17,18 @@ index b91ea7354710052be29727e7f62442f316416506..674e2d926608cc4c98068bb83be07786 if (environment.includeIntegrated) { diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index c8f429a7fcfc60783c3667e082b4c4d8a9fc645e..988223d4914a61a56843cdf4cf6dd3d3ace44a37 100644 +index f0923a7b1db1a77764dd13f1b2c86a5f4b76b555..db7bf36474ac0e0a95b11ab212d9c866368a161b 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java -@@ -264,6 +264,7 @@ public class ServerPlayer extends Player { +@@ -273,6 +273,7 @@ public class ServerPlayer extends Player { public boolean purpurClient = false; // Purpur public boolean acceptingResourcePack = false; // Purpur private boolean tpsBar = false; // Purpur + private boolean compassBar = false; // Purpur - public boolean isRealPlayer; // Paper - public double lastEntitySpawnRadiusSquared; // Paper - optimise isOutsideRange, this field is in blocks -@@ -498,6 +499,7 @@ public class ServerPlayer extends Player { + public ServerPlayer(MinecraftServer server, ServerLevel world, GameProfile profile) { + super(world, world.getSharedSpawnPos(), world.getSharedSpawnAngle(), profile); +@@ -513,6 +514,7 @@ public class ServerPlayer extends Player { } if (nbt.contains("Purpur.TPSBar")) { this.tpsBar = nbt.getBoolean("Purpur.TPSBar"); } // Purpur @@ -36,7 +36,7 @@ index c8f429a7fcfc60783c3667e082b4c4d8a9fc645e..988223d4914a61a56843cdf4cf6dd3d3 } @Override -@@ -559,6 +561,7 @@ public class ServerPlayer extends Player { +@@ -580,6 +582,7 @@ public class ServerPlayer extends Player { this.getBukkitEntity().setExtraData(nbt); // CraftBukkit nbt.putBoolean("Purpur.TPSBar", this.tpsBar); // Purpur @@ -44,7 +44,7 @@ index c8f429a7fcfc60783c3667e082b4c4d8a9fc645e..988223d4914a61a56843cdf4cf6dd3d3 } // CraftBukkit start - World fallback code, either respawn location or global spawn -@@ -2657,5 +2660,13 @@ public class ServerPlayer extends Player { +@@ -2697,5 +2700,13 @@ public class ServerPlayer extends Player { public void tpsBar(boolean tpsBar) { this.tpsBar = tpsBar; } @@ -89,7 +89,7 @@ index 695e6376fcf3306be49e593126576c1773b5792e..bf3bbe2d26f5ce6e6b00b36d9ea269df hideHiddenPlayersFromEntitySelector = getBoolean("settings.command.hide-hidden-players-from-entity-selector", hideHiddenPlayersFromEntitySelector); uptimeFormat = getString("settings.command.uptime.format", uptimeFormat); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 6aac1632f81aa06912efcb51822881905a13554f..1564055a9b829928cb9f32bd6fc04df41c6c25be 100644 +index 6a41a5bcabfc5e5010803666d01b646fb5ed6153..1cc3de5bf68c9f78017ccc9f3624caaff26f09aa 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -223,6 +223,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0211-Toggle-for-kinetic-damage.patch b/patches/server/0205-Toggle-for-kinetic-damage.patch similarity index 89% rename from patches/server/0211-Toggle-for-kinetic-damage.patch rename to patches/server/0205-Toggle-for-kinetic-damage.patch index b5198775d..b8d31cc42 100644 --- a/patches/server/0211-Toggle-for-kinetic-damage.patch +++ b/patches/server/0205-Toggle-for-kinetic-damage.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Toggle for kinetic damage diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 6c506c32814b9e068b92094aab54be7647178c89..7cc12e402e3b90a44bcd6d8c2a7607b7cf421bca 100644 +index c975f66f5f7f80547202c7cff7ad0c6f90f0cbc9..001dbb7427f963cb570fc593eaeb0d728ef028f3 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -2900,6 +2900,7 @@ public abstract class LivingEntity extends Entity { +@@ -2896,6 +2896,7 @@ public abstract class LivingEntity extends Entity { if (f3 > 0.0F) { this.playSound(this.getFallDamageSound((int) f3), 1.0F, 1.0F); @@ -17,7 +17,7 @@ index 6c506c32814b9e068b92094aab54be7647178c89..7cc12e402e3b90a44bcd6d8c2a7607b7 } } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 18e3d6d7af035dbf6af0417e7470e556d0fcffd2..62976858a7e588b932dd1bb317e428a96cd20423 100644 +index 1cc3de5bf68c9f78017ccc9f3624caaff26f09aa..bc8b89ea000b2d86d6c55ad7f96b6de50625f089 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -185,12 +185,14 @@ public class PurpurWorldConfig { diff --git a/patches/server/0212-Add-Option-for-disable-observer-clocks.patch b/patches/server/0206-Add-Option-for-disable-observer-clocks.patch similarity index 95% rename from patches/server/0212-Add-Option-for-disable-observer-clocks.patch rename to patches/server/0206-Add-Option-for-disable-observer-clocks.patch index 2ca399e71..9e983220c 100644 --- a/patches/server/0212-Add-Option-for-disable-observer-clocks.patch +++ b/patches/server/0206-Add-Option-for-disable-observer-clocks.patch @@ -18,7 +18,7 @@ index 7b45d6b9a005036ca5051d089a7be792eb87012f..8806c97ecc6bdd8a64c2d82bb2f58f46 } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 1f0c70c48472b64da299b79402b93ae9c57ba167..1e33464773cc3d4a82affb83400a80a99be77231 100644 +index bc8b89ea000b2d86d6c55ad7f96b6de50625f089..34c5286191941e95513f0f7457f3b1a8adc43c72 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -368,6 +368,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0213-Customizeable-Zombie-Villager-curing-times.patch b/patches/server/0207-Customizeable-Zombie-Villager-curing-times.patch similarity index 87% rename from patches/server/0213-Customizeable-Zombie-Villager-curing-times.patch rename to patches/server/0207-Customizeable-Zombie-Villager-curing-times.patch index 51d56c3fb..00b6edabf 100644 --- a/patches/server/0213-Customizeable-Zombie-Villager-curing-times.patch +++ b/patches/server/0207-Customizeable-Zombie-Villager-curing-times.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Customizeable Zombie Villager curing times diff --git a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java -index fd4e34549ff65d0ed82d3bc1e8b7067a53a33d4c..23f154095118de9894e089489aded6b7b7aa96e3 100644 +index cd1e454b1e178b5bb2c2a9b83bdab2b70206bde3..4ec10cf9613d03da66fb03bec3e9b06ec5b56c7a 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java -@@ -217,7 +217,7 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { +@@ -218,7 +218,7 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { } if (!this.level.isClientSide) { @@ -18,10 +18,10 @@ index fd4e34549ff65d0ed82d3bc1e8b7067a53a33d4c..23f154095118de9894e089489aded6b7 return InteractionResult.SUCCESS; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 55196d4ca677deb828f363c3c6e451c57df4fc50..ad20e33d8f972886c040afcd2a14724f87aa9bbf 100644 +index 09808785c382f9c78119b8f306cc73eef24ef471..117b17bc01e0df17bdc15269ac99a63330cbdab0 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -2702,6 +2702,8 @@ public class PurpurWorldConfig { +@@ -2701,6 +2701,8 @@ public class PurpurWorldConfig { public double zombieVillagerJockeyChance = 0.05D; public boolean zombieVillagerJockeyTryExistingChickens = true; public boolean zombieVillagerTakeDamageFromWater = false; @@ -30,7 +30,7 @@ index 55196d4ca677deb828f363c3c6e451c57df4fc50..ad20e33d8f972886c040afcd2a14724f private void zombieVillagerSettings() { zombieVillagerRidable = getBoolean("mobs.zombie_villager.ridable", zombieVillagerRidable); zombieVillagerRidableInWater = getBoolean("mobs.zombie_villager.ridable-in-water", zombieVillagerRidableInWater); -@@ -2717,6 +2719,8 @@ public class PurpurWorldConfig { +@@ -2716,6 +2718,8 @@ public class PurpurWorldConfig { zombieVillagerJockeyChance = getDouble("mobs.zombie_villager.jockey.chance", zombieVillagerJockeyChance); zombieVillagerJockeyTryExistingChickens = getBoolean("mobs.zombie_villager.jockey.try-existing-chickens", zombieVillagerJockeyTryExistingChickens); zombieVillagerTakeDamageFromWater = getBoolean("mobs.zombie_villager.takes-damage-from-water", zombieVillagerTakeDamageFromWater); diff --git a/patches/server/0214-Option-for-sponges-to-work-on-lava.patch b/patches/server/0208-Option-for-sponges-to-work-on-lava.patch similarity index 95% rename from patches/server/0214-Option-for-sponges-to-work-on-lava.patch rename to patches/server/0208-Option-for-sponges-to-work-on-lava.patch index 6624fcc1a..8a45eb3bf 100644 --- a/patches/server/0214-Option-for-sponges-to-work-on-lava.patch +++ b/patches/server/0208-Option-for-sponges-to-work-on-lava.patch @@ -18,7 +18,7 @@ index d96e3fbc0fd4275c29e7e6154ef66e9ed1a5d829..df04a571ebd3c04bc7b58c1ee5661a1f ++i; if (j < world.purpurConfig.spongeAbsorptionRadius) { // Purpur diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 4d2c01a8731d5e789672d5c82e04d996d1e0304f..a911475cb568abfa491b95abcee6da25cc9b57fc 100644 +index 9fe05daa2303ca44c9e50f5f30c1974e5fb49152..4977df6436cc889944c169dc2d173f0475a7a188 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -914,9 +914,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0215-Toggle-for-Wither-s-spawn-sound.patch b/patches/server/0209-Toggle-for-Wither-s-spawn-sound.patch similarity index 85% rename from patches/server/0215-Toggle-for-Wither-s-spawn-sound.patch rename to patches/server/0209-Toggle-for-Wither-s-spawn-sound.patch index 6fa746457..8e534aed0 100644 --- a/patches/server/0215-Toggle-for-Wither-s-spawn-sound.patch +++ b/patches/server/0209-Toggle-for-Wither-s-spawn-sound.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Toggle for Wither's spawn sound diff --git a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java -index 29e67a03097a21f3d49e1998dbb125e58fce4368..28da6b021eed7ab9042b03052b0f50d2d261f131 100644 +index 97c5ffd383a02afecba035e65823ac12e03c7295..e0c5a8afa5c394ab8bbd3e982632518c63b478b3 100644 --- a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java +++ b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java -@@ -430,7 +430,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob +@@ -428,7 +428,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob } // CraftBukkit end @@ -18,10 +18,10 @@ index 29e67a03097a21f3d49e1998dbb125e58fce4368..28da6b021eed7ab9042b03052b0f50d2 // this.world.globalLevelEvent(1023, new BlockPosition(this), 0); int viewDistance = ((ServerLevel) this.level).getCraftServer().getViewDistance() * 16; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index b8d54d07d3680e36d55f56e93ac530a8ed630004..0943e2174ac8fe7be2d2b00432b301b33873acd7 100644 +index cc0f3cf3fca3ea59caa914ecf568bc24fa85ad92..3116bee32f70357639666a5fc9ebad990b7a3cd0 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -2547,6 +2547,7 @@ public class PurpurWorldConfig { +@@ -2546,6 +2546,7 @@ public class PurpurWorldConfig { public boolean witherTakeDamageFromWater = false; public boolean witherCanRideVehicles = false; public float witherExplosionRadius = 1.0F; @@ -29,7 +29,7 @@ index b8d54d07d3680e36d55f56e93ac530a8ed630004..0943e2174ac8fe7be2d2b00432b301b3 private void witherSettings() { witherRidable = getBoolean("mobs.wither.ridable", witherRidable); witherRidableInWater = getBoolean("mobs.wither.ridable-in-water", witherRidableInWater); -@@ -2568,6 +2569,7 @@ public class PurpurWorldConfig { +@@ -2567,6 +2568,7 @@ public class PurpurWorldConfig { 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); diff --git a/patches/server/0216-Cactus-breaks-from-solid-neighbors-config.patch b/patches/server/0210-Cactus-breaks-from-solid-neighbors-config.patch similarity index 95% rename from patches/server/0216-Cactus-breaks-from-solid-neighbors-config.patch rename to patches/server/0210-Cactus-breaks-from-solid-neighbors-config.patch index 3471db27d..7e479939f 100644 --- a/patches/server/0216-Cactus-breaks-from-solid-neighbors-config.patch +++ b/patches/server/0210-Cactus-breaks-from-solid-neighbors-config.patch @@ -18,7 +18,7 @@ index 1ec242205b82a5a1f10deb2312795cc5dc157a76..2fd7e33a161bc89c91deca1f245d6dac return false; } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index e53a2c18b68d02f7eeb764198d074e639ec0bfa0..3bdf9d310c3ddf68689adb8e037a4d85fe134248 100644 +index 5c7fff668ed33f402eb73c0d99728e177cff5b01..5ff17517d11b79537fec4a581251649eca44ced2 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -746,6 +746,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0210-Config-to-prevent-horses-from-standing-with-riders.patch b/patches/server/0210-Config-to-prevent-horses-from-standing-with-riders.patch deleted file mode 100644 index 8ac815e85..000000000 --- a/patches/server/0210-Config-to-prevent-horses-from-standing-with-riders.patch +++ /dev/null @@ -1,41 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Encode42 -Date: Wed, 28 Jul 2021 15:52:32 -0400 -Subject: [PATCH] Config to prevent horses from standing with riders - -Horses have a chance to stand (rear) when their ambient noise is played. -This can happen while the horse is moving with a rider, which will cause the horse to suddenly stop for a moment. - -diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/AbstractHorse.java b/src/main/java/net/minecraft/world/entity/animal/horse/AbstractHorse.java -index a1ffa88c3796df2973a2fc0aeafda5f78208bf85..7466c437b2e996f16a08aaefc5c2b7cba216a14c 100644 ---- a/src/main/java/net/minecraft/world/entity/animal/horse/AbstractHorse.java -+++ b/src/main/java/net/minecraft/world/entity/animal/horse/AbstractHorse.java -@@ -398,7 +398,7 @@ public abstract class AbstractHorse extends Animal implements ContainerListener, - @Nullable - @Override - protected SoundEvent getAmbientSound() { -- if (this.random.nextInt(10) == 0 && !this.isImmobile()) { -+ if (this.random.nextInt(10) == 0 && !this.isImmobile() && !(!this.level.purpurConfig.horseStandWithRider && this.getControllingPassenger() != null)) { // Purpur - this.stand(); - } - -diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 700c40fd0ba469ba034153f422ad179ece61e330..209e92b0588ddfc820647710e443173b1e78887e 100644 ---- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1538,6 +1538,7 @@ public class PurpurWorldConfig { - public double horseMovementSpeedMax = 0.3375D; - public int horseBreedingTicks = 6000; - public boolean horseTakeDamageFromWater = false; -+ public boolean horseStandWithRider = true; - private void horseSettings() { - horseRidableInWater = getBoolean("mobs.horse.ridable-in-water", horseRidableInWater); - if (PurpurConfig.version < 10) { -@@ -1555,6 +1556,7 @@ public class PurpurWorldConfig { - horseMovementSpeedMax = getDouble("mobs.horse.attributes.movement_speed.max", horseMovementSpeedMax); - horseBreedingTicks = getInt("mobs.horse.breeding-delay-ticks", horseBreedingTicks); - horseTakeDamageFromWater = getBoolean("mobs.horse.takes-damage-from-water", horseTakeDamageFromWater); -+ horseStandWithRider = getBoolean("mobs.horse.stand-with-rider", horseStandWithRider); - } - - public boolean huskRidable = false; diff --git a/patches/server/0217-Config-to-remove-curse-of-binding-with-weakness.patch b/patches/server/0211-Config-to-remove-curse-of-binding-with-weakness.patch similarity index 94% rename from patches/server/0217-Config-to-remove-curse-of-binding-with-weakness.patch rename to patches/server/0211-Config-to-remove-curse-of-binding-with-weakness.patch index ebbc28835..c74edb9ce 100644 --- a/patches/server/0217-Config-to-remove-curse-of-binding-with-weakness.patch +++ b/patches/server/0211-Config-to-remove-curse-of-binding-with-weakness.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Config to remove curse of binding with weakness diff --git a/src/main/java/net/minecraft/world/inventory/InventoryMenu.java b/src/main/java/net/minecraft/world/inventory/InventoryMenu.java -index 12643d60f4bfa8e07901aa0a556a1a245b0a7fb4..96a4a9f9b673a07630493290f5d5315e461b6166 100644 +index 150701f965006f1c7dc9d801ca0ab0add927d143..4b8669f0b881e524c0cbf570c442ca8a1044d68e 100644 --- a/src/main/java/net/minecraft/world/inventory/InventoryMenu.java +++ b/src/main/java/net/minecraft/world/inventory/InventoryMenu.java @@ -4,6 +4,7 @@ import com.mojang.datafixers.util.Pair; @@ -26,7 +26,7 @@ index 12643d60f4bfa8e07901aa0a556a1a245b0a7fb4..96a4a9f9b673a07630493290f5d5315e @Override diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 3bdf9d310c3ddf68689adb8e037a4d85fe134248..73a0f0d287823871262d31419a135cf179361814 100644 +index 5ff17517d11b79537fec4a581251649eca44ced2..db01afa10d6ffae243e2e8bccd3cb8dc9e4d449a 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -407,6 +407,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0218-Conduit-behavior-configuration.patch b/patches/server/0212-Conduit-behavior-configuration.patch similarity index 96% rename from patches/server/0218-Conduit-behavior-configuration.patch rename to patches/server/0212-Conduit-behavior-configuration.patch index 74f22fbb3..338a7d90c 100644 --- a/patches/server/0218-Conduit-behavior-configuration.patch +++ b/patches/server/0212-Conduit-behavior-configuration.patch @@ -77,10 +77,10 @@ index 05eab04e4aec4151018f25b59f92ddbbb4c09f87..3b5c502fc211940dd908f1d276fa11e3 }); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 99a4353ffaf27210e6c18bf269b873db0e8850ca..8083f9dc08cd95b2dc0114a9f29be0ae9b5dfd4e 100644 +index e483a5d31202d52d7b2a7fead19e54176f28c6a3..c70427f27af63bfe543659dea4f939446d48c448 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -2766,5 +2766,28 @@ public class PurpurWorldConfig { +@@ -2765,5 +2765,28 @@ public class PurpurWorldConfig { private void hungerSettings() { hungerStarvationDamage = (float) getDouble("hunger.starvation-damage", hungerStarvationDamage); } @@ -100,7 +100,7 @@ index 99a4353ffaf27210e6c18bf269b873db0e8850ca..8083f9dc08cd95b2dc0114a9f29be0ae + add("minecraft:sea_lantern"); + add("minecraft:dark_prismarine"); + }}).forEach(key -> { -+ Block block = Registry.BLOCK.get(new ResourceLocation(key.toString())); ++ Block block = BuiltInRegistries.BLOCK.get(new ResourceLocation(key.toString())); + if (!block.defaultBlockState().isAir()) { + conduitBlockList.add(block); + } diff --git a/patches/server/0219-Cauldron-fill-chances.patch b/patches/server/0213-Cauldron-fill-chances.patch similarity index 94% rename from patches/server/0219-Cauldron-fill-chances.patch rename to patches/server/0213-Cauldron-fill-chances.patch index 06d1920c8..b5d3e9582 100644 --- a/patches/server/0219-Cauldron-fill-chances.patch +++ b/patches/server/0213-Cauldron-fill-chances.patch @@ -18,7 +18,7 @@ index 46846ac9981e447fc6886aecf82563378a4f5548..9122485755ce8aa6e6f4773a5fb1315c @Override diff --git a/src/main/java/net/minecraft/world/level/block/PointedDripstoneBlock.java b/src/main/java/net/minecraft/world/level/block/PointedDripstoneBlock.java -index ce4265a9cf01db335a6a88b91ae5e6ff4518ef92..f889729b3bbbe1c82fa8bc7e1ab1f7b0727f85b0 100644 +index e78fdd317d59cfca6a28deb6e0bd02aabe91e930..895fea12e9780521573bfe6f6a3d9c867ac9f4e0 100644 --- a/src/main/java/net/minecraft/world/level/block/PointedDripstoneBlock.java +++ b/src/main/java/net/minecraft/world/level/block/PointedDripstoneBlock.java @@ -188,7 +188,7 @@ public class PointedDripstoneBlock extends Block implements Fallable, SimpleWate @@ -47,10 +47,10 @@ index ce4265a9cf01db335a6a88b91ae5e6ff4518ef92..f889729b3bbbe1c82fa8bc7e1ab1f7b0 if (dripChance < f1) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 8083f9dc08cd95b2dc0114a9f29be0ae9b5dfd4e..97f2bcf02a09cd0f7b4aad1bca0bfe1b0b015c79 100644 +index c70427f27af63bfe543659dea4f939446d48c448..f458db54538a78731027469511d200ae5e6341a0 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -2789,5 +2789,16 @@ public class PurpurWorldConfig { +@@ -2788,5 +2788,16 @@ public class PurpurWorldConfig { }); conduitBlocks = conduitBlockList.toArray(Block[]::new); } diff --git a/patches/server/0220-Config-to-allow-mobs-to-pathfind-over-rails.patch b/patches/server/0214-Config-to-allow-mobs-to-pathfind-over-rails.patch similarity index 75% rename from patches/server/0220-Config-to-allow-mobs-to-pathfind-over-rails.patch rename to patches/server/0214-Config-to-allow-mobs-to-pathfind-over-rails.patch index 05de46481..d38f46693 100644 --- a/patches/server/0220-Config-to-allow-mobs-to-pathfind-over-rails.patch +++ b/patches/server/0214-Config-to-allow-mobs-to-pathfind-over-rails.patch @@ -5,20 +5,20 @@ Subject: [PATCH] Config to allow mobs to pathfind over rails diff --git a/src/main/java/net/minecraft/world/level/pathfinder/WalkNodeEvaluator.java b/src/main/java/net/minecraft/world/level/pathfinder/WalkNodeEvaluator.java -index ede91a2fbe67480d2b6bcdeb776f87da0b69bdae..444bec169c0cd5fe1a23f1d14fae1a10ca3d67c4 100644 +index 894881018c659d874f28f5744f0b8247cfecb1c1..6fbac97beacd0f806301c34de4ca6495b5aa705e 100644 --- a/src/main/java/net/minecraft/world/level/pathfinder/WalkNodeEvaluator.java +++ b/src/main/java/net/minecraft/world/level/pathfinder/WalkNodeEvaluator.java -@@ -249,7 +249,7 @@ public class WalkNodeEvaluator extends NodeEvaluator { +@@ -243,7 +243,7 @@ public class WalkNodeEvaluator extends NodeEvaluator { } if (blockPathTypes != BlockPathTypes.WALKABLE && (!this.isAmphibious() || blockPathTypes != BlockPathTypes.WATER)) { -- if ((node == null || node.costMalus < 0.0F) && maxYStep > 0 && blockPathTypes != BlockPathTypes.FENCE && blockPathTypes != BlockPathTypes.UNPASSABLE_RAIL && blockPathTypes != BlockPathTypes.TRAPDOOR && blockPathTypes != BlockPathTypes.POWDER_SNOW) { -+ if ((node == null || node.costMalus < 0.0F) && maxYStep > 0 && blockPathTypes != BlockPathTypes.FENCE && !(!this.mob.level.purpurConfig.mobsIgnoreRails && blockPathTypes == BlockPathTypes.UNPASSABLE_RAIL) && blockPathTypes != BlockPathTypes.TRAPDOOR && blockPathTypes != BlockPathTypes.POWDER_SNOW) { // Purpur +- if ((node == null || node.costMalus < 0.0F) && maxYStep > 0 && (blockPathTypes != BlockPathTypes.FENCE || this.canWalkOverFences()) && blockPathTypes != BlockPathTypes.UNPASSABLE_RAIL && blockPathTypes != BlockPathTypes.TRAPDOOR && blockPathTypes != BlockPathTypes.POWDER_SNOW) { ++ if ((node == null || node.costMalus < 0.0F) && maxYStep > 0 && (blockPathTypes != BlockPathTypes.FENCE || this.canWalkOverFences()) && (this.mob.level.purpurConfig.mobsIgnoreRails || blockPathTypes != BlockPathTypes.UNPASSABLE_RAIL) && blockPathTypes != BlockPathTypes.TRAPDOOR && blockPathTypes != BlockPathTypes.POWDER_SNOW) { // Purpur node = this.findAcceptedNode(x, y + 1, z, maxYStep - 1, prevFeetY, direction, nodeType); if (node != null && (node.type == BlockPathTypes.OPEN || node.type == BlockPathTypes.WALKABLE) && this.mob.getBbWidth() < 1.0F) { double g = (double)(x - direction.getStepX()) + 0.5D; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index c0656b4e2be7ece9061867fe7e35ab8a9d02d565..f20936ab60accfdb40c139c4e5c4d67d3e0f5679 100644 +index 841ffd64a9dcc24479847de1d1565de82c4d1a08..1e8525e267d95e406dcc21615820f00cfdbc34b4 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -141,6 +141,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0221-Shulker-change-color-with-dye.patch b/patches/server/0215-Shulker-change-color-with-dye.patch similarity index 83% rename from patches/server/0221-Shulker-change-color-with-dye.patch rename to patches/server/0215-Shulker-change-color-with-dye.patch index 65d679a91..4ecc40c6a 100644 --- a/patches/server/0221-Shulker-change-color-with-dye.patch +++ b/patches/server/0215-Shulker-change-color-with-dye.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Shulker change color with dye diff --git a/src/main/java/net/minecraft/world/entity/monster/Shulker.java b/src/main/java/net/minecraft/world/entity/monster/Shulker.java -index ada070d8e1a2d328c02455eb9e5ad056046bcd0a..691b59f784e34b061ea156a3236c09f24a2ea79b 100644 +index 70237d8891889818135ea024d0c8f31cbfe75524..3e6a8c541292a7ac7ca290e79bb14b70efad14d7 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Shulker.java +++ b/src/main/java/net/minecraft/world/entity/monster/Shulker.java -@@ -22,6 +22,8 @@ import net.minecraft.sounds.SoundSource; +@@ -21,6 +21,8 @@ import net.minecraft.sounds.SoundSource; import net.minecraft.util.Mth; import net.minecraft.world.Difficulty; import net.minecraft.world.DifficultyInstance; @@ -17,16 +17,16 @@ index ada070d8e1a2d328c02455eb9e5ad056046bcd0a..691b59f784e34b061ea156a3236c09f2 import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityDimensions; -@@ -48,6 +50,8 @@ import net.minecraft.world.entity.player.Player; - import net.minecraft.world.entity.projectile.AbstractArrow; +@@ -49,6 +51,8 @@ import net.minecraft.world.entity.projectile.AbstractArrow; import net.minecraft.world.entity.projectile.ShulkerBullet; + import net.minecraft.world.entity.vehicle.Boat; import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.DyeItem; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.level.block.Blocks; -@@ -117,6 +121,19 @@ public class Shulker extends AbstractGolem implements Enemy { +@@ -119,6 +123,19 @@ public class Shulker extends AbstractGolem implements VariantHolder { - } else if (index != 1 && index != 0) { + } else if (slot != 1 && slot != 0) { if (this.canSmelt(itemstack1)) { if (!this.moveItemStackTo(itemstack1, 0, 1, false)) { - return ItemStack.EMPTY; @@ -24,10 +24,10 @@ index 4adfc26062b322443828e94e6b0943884a18846b..0d9ecca25bff63f3428ccf93e2789fca } else if (this.isFuel(itemstack1)) { if (!this.moveItemStackTo(itemstack1, 1, 2, false)) { diff --git a/src/main/java/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java -index 36759f7905eea8c1a5b9d4cb32967ad04dd62e15..8bc29f442d855606f5367d8b7a1ed5a2361ea84f 100644 +index bbff7466cecf50285c97fadaf68682a6c6ea879f..5ae858b81e6f9903b7296077cf497f62bb8d6995 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java -@@ -213,6 +213,22 @@ public abstract class AbstractFurnaceBlockEntity extends BaseContainerBlockEntit +@@ -207,6 +207,22 @@ public abstract class AbstractFurnaceBlockEntity extends BaseContainerBlockEntit // Paper end } @@ -51,10 +51,10 @@ index 36759f7905eea8c1a5b9d4cb32967ad04dd62e15..8bc29f442d855606f5367d8b7a1ed5a2 private int maxStack = MAX_STACK; public List transaction = new java.util.ArrayList(); diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index e04f5101e22295088d972f51fbe51caa984401db..fd58d9e6a19fb04e1a93cd0aa0fa12a405abaee1 100644 +index 224d5acd50c5a1796340373f73bb44c38f841299..1e926f952f18128859604c866423639472c4d77b 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -1426,6 +1426,19 @@ public final class CraftServer implements Server { +@@ -1445,6 +1445,19 @@ public final class CraftServer implements Server { return true; } diff --git a/patches/server/0224-Option-for-if-rain-and-thunder-should-stop-on-sleep.patch b/patches/server/0218-Option-for-if-rain-and-thunder-should-stop-on-sleep.patch similarity index 90% rename from patches/server/0224-Option-for-if-rain-and-thunder-should-stop-on-sleep.patch rename to patches/server/0218-Option-for-if-rain-and-thunder-should-stop-on-sleep.patch index c12831944..b79a742ad 100644 --- a/patches/server/0224-Option-for-if-rain-and-thunder-should-stop-on-sleep.patch +++ b/patches/server/0218-Option-for-if-rain-and-thunder-should-stop-on-sleep.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Option for if rain and thunder should stop on sleep diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index f9ddff75288aa39e3d62422cca6ce536c20d47b2..6c206c92d24b6202cfb5740c44a942451d73345a 100644 +index f4b24ebacede304bc192efa5115bfb758b8fa6da..6450bf5fbad2df3165baede9852fe20197d7d50c 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java -@@ -1183,6 +1183,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1189,6 +1189,7 @@ public class ServerLevel extends Level implements WorldGenLevel { private void resetWeatherCycle() { // CraftBukkit start @@ -16,7 +16,7 @@ index f9ddff75288aa39e3d62422cca6ce536c20d47b2..6c206c92d24b6202cfb5740c44a94245 this.serverLevelData.setRaining(false, org.bukkit.event.weather.WeatherChangeEvent.Cause.SLEEP); // Paper - when passing the night // If we stop due to everyone sleeping we should reset the weather duration to some other random value. // Not that everyone ever manages to get the whole server to sleep at the same time.... -@@ -1190,6 +1191,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1196,6 +1197,7 @@ public class ServerLevel extends Level implements WorldGenLevel { this.serverLevelData.setRainTime(0); } // CraftBukkit end @@ -25,7 +25,7 @@ index f9ddff75288aa39e3d62422cca6ce536c20d47b2..6c206c92d24b6202cfb5740c44a94245 // CraftBukkit start // If we stop due to everyone sleeping we should reset the weather duration to some other random value. diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index ff7b3c7e08fd5cb2d0b81adb80934094ee66c9a0..adc279b93abb38d5f89b5411828626352a9a83b0 100644 +index 2bcea05572d25444b6390eadae258617e3071c90..08ef6efc26d3798a651b9fd1400d1b73d21b6b20 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -142,6 +142,8 @@ public class PurpurWorldConfig { diff --git a/patches/server/0225-Chance-for-azalea-blocks-to-grow-into-trees-naturall.patch b/patches/server/0219-Chance-for-azalea-blocks-to-grow-into-trees-naturall.patch similarity index 92% rename from patches/server/0225-Chance-for-azalea-blocks-to-grow-into-trees-naturall.patch rename to patches/server/0219-Chance-for-azalea-blocks-to-grow-into-trees-naturall.patch index f27d3c3c0..c7a3dd143 100644 --- a/patches/server/0225-Chance-for-azalea-blocks-to-grow-into-trees-naturall.patch +++ b/patches/server/0219-Chance-for-azalea-blocks-to-grow-into-trees-naturall.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Chance for azalea blocks to grow into trees naturally diff --git a/src/main/java/net/minecraft/world/level/block/AzaleaBlock.java b/src/main/java/net/minecraft/world/level/block/AzaleaBlock.java -index b04d224c23ed0039b86aa4169ce38c4f57cc1a7a..1daffadecee2b830b28377e2549d422922b0007b 100644 +index 023ed8441d629629828051b4098b09b06ce51a75..0123904a521be6b2f8d9056769e98982d9e14ffa 100644 --- a/src/main/java/net/minecraft/world/level/block/AzaleaBlock.java +++ b/src/main/java/net/minecraft/world/level/block/AzaleaBlock.java -@@ -42,6 +42,20 @@ public class AzaleaBlock extends BushBlock implements BonemealableBlock { +@@ -43,6 +43,20 @@ public class AzaleaBlock extends BushBlock implements BonemealableBlock { @Override public void performBonemeal(ServerLevel world, RandomSource random, BlockPos pos, BlockState state) { @@ -30,10 +30,10 @@ index b04d224c23ed0039b86aa4169ce38c4f57cc1a7a..1daffadecee2b830b28377e2549d4229 } } diff --git a/src/main/java/net/minecraft/world/level/block/Blocks.java b/src/main/java/net/minecraft/world/level/block/Blocks.java -index bcc1ce196c1dbf60cf6ae73d95766dc41ed22012..ad0ee0d333ffd862fe74ac3a097c51d5550803df 100644 +index fdd3aa81644087bff33a47c5f98e14ca0452f3ef..c75404ddcb36105b84ff8c21545549bee5b4cb8e 100644 --- a/src/main/java/net/minecraft/world/level/block/Blocks.java +++ b/src/main/java/net/minecraft/world/level/block/Blocks.java -@@ -1027,8 +1027,8 @@ public class Blocks { +@@ -1063,8 +1063,8 @@ public class Blocks { public static final Block CAVE_VINES = register("cave_vines", new CaveVinesBlock(BlockBehaviour.Properties.of(Material.PLANT).randomTicks().noCollission().lightLevel(CaveVines.emission(14)).instabreak().sound(SoundType.CAVE_VINES))); public static final Block CAVE_VINES_PLANT = register("cave_vines_plant", new CaveVinesPlantBlock(BlockBehaviour.Properties.of(Material.PLANT).noCollission().lightLevel(CaveVines.emission(14)).instabreak().sound(SoundType.CAVE_VINES))); public static final Block SPORE_BLOSSOM = register("spore_blossom", new SporeBlossomBlock(BlockBehaviour.Properties.of(Material.PLANT).instabreak().noCollission().sound(SoundType.SPORE_BLOSSOM))); @@ -45,7 +45,7 @@ index bcc1ce196c1dbf60cf6ae73d95766dc41ed22012..ad0ee0d333ffd862fe74ac3a097c51d5 public static final Block MOSS_BLOCK = register("moss_block", new MossBlock(BlockBehaviour.Properties.of(Material.MOSS, MaterialColor.COLOR_GREEN).strength(0.1F).sound(SoundType.MOSS))); public static final Block BIG_DRIPLEAF = register("big_dripleaf", new BigDripleafBlock(BlockBehaviour.Properties.of(Material.PLANT).strength(0.1F).sound(SoundType.BIG_DRIPLEAF))); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 38b1d1f16097676528ef93cdf7f4ab62807dc4c1..e198d3411b64918e63c18a79efb02b2f60c35200 100644 +index 08ef6efc26d3798a651b9fd1400d1b73d21b6b20..3acbb777269b1b117821383ed931dbe71bf0479b 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -706,6 +706,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0226-Shift-right-click-to-use-exp-for-mending.patch b/patches/server/0220-Shift-right-click-to-use-exp-for-mending.patch similarity index 91% rename from patches/server/0226-Shift-right-click-to-use-exp-for-mending.patch rename to patches/server/0220-Shift-right-click-to-use-exp-for-mending.patch index 4eaa2f01f..a73e086b9 100644 --- a/patches/server/0226-Shift-right-click-to-use-exp-for-mending.patch +++ b/patches/server/0220-Shift-right-click-to-use-exp-for-mending.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Shift right click to use exp for mending diff --git a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java -index 9f8995c559b500415ec8d214f7c164707046f6ac..4816b5bd54ae6e080af4c19df43d57e852e76146 100644 +index 16f136dd8ed96a3eb7ae1cf9c6039b4f026fec25..744c936c3aa9bd7bcf43ac3d78a08ece9cde87c3 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java @@ -509,6 +509,7 @@ public class ServerPlayerGameMode { @@ -16,7 +16,7 @@ index 9f8995c559b500415ec8d214f7c164707046f6ac..4816b5bd54ae6e080af4c19df43d57e8 BlockPos blockposition = hitResult.getBlockPos(); BlockState iblockdata = world.getBlockState(blockposition); InteractionResult enuminteractionresult = InteractionResult.PASS; -@@ -603,4 +604,18 @@ public class ServerPlayerGameMode { +@@ -605,4 +606,18 @@ public class ServerPlayerGameMode { public void setLevel(ServerLevel world) { this.level = world; } @@ -36,10 +36,10 @@ index 9f8995c559b500415ec8d214f7c164707046f6ac..4816b5bd54ae6e080af4c19df43d57e8 + // Purpur end } diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 7562e93a75183f09d227ea64b1bbddc59d10ce14..6e7b0d78a602e03c951bf14ed0b694b4b7ff203d 100644 +index 5c09d0bbe552af208cb0443699c20639d67db566..cbcaf80736ab50f781b65f7a8c813331238c74ec 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -2096,6 +2096,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -2089,6 +2089,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic boolean cancelled; if (movingobjectposition == null || movingobjectposition.getType() != HitResult.Type.BLOCK) { @@ -48,7 +48,7 @@ index 7562e93a75183f09d227ea64b1bbddc59d10ce14..6e7b0d78a602e03c951bf14ed0b694b4 cancelled = event.useItemInHand() == Event.Result.DENY; } else { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index e198d3411b64918e63c18a79efb02b2f60c35200..d0bece1866e14653cafee498178302ad94dc7fc9 100644 +index 3acbb777269b1b117821383ed931dbe71bf0479b..4e209a65d03f4c240d19d51cea3c9c2c4264a718 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -414,6 +414,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0227-Dolphins-naturally-aggressive-to-players-chance.patch b/patches/server/0221-Dolphins-naturally-aggressive-to-players-chance.patch similarity index 95% rename from patches/server/0227-Dolphins-naturally-aggressive-to-players-chance.patch rename to patches/server/0221-Dolphins-naturally-aggressive-to-players-chance.patch index 3f1076ad8..2f1cbc6c3 100644 --- a/patches/server/0227-Dolphins-naturally-aggressive-to-players-chance.patch +++ b/patches/server/0221-Dolphins-naturally-aggressive-to-players-chance.patch @@ -47,10 +47,10 @@ index b0c933644c1f4b5aa142c7c4d26a9b81cb4051f7..f8be4c96e7e7b8e6d8c538b1f425f01d public static AttributeSupplier.Builder createAttributes() { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index d0bece1866e14653cafee498178302ad94dc7fc9..cabd5dabc18f8e9f4dc52611bad1d949293e6947 100644 +index 40ee2cb4d1224cbc61676581acd483b8c84c5d76..46c414e51837bedd7f347a125925d1704750e0db 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1214,6 +1214,7 @@ public class PurpurWorldConfig { +@@ -1219,6 +1219,7 @@ public class PurpurWorldConfig { public double dolphinMaxHealth = 10.0D; public boolean dolphinDisableTreasureSearching = false; public boolean dolphinTakeDamageFromWater = false; @@ -58,7 +58,7 @@ index d0bece1866e14653cafee498178302ad94dc7fc9..cabd5dabc18f8e9f4dc52611bad1d949 private void dolphinSettings() { dolphinRidable = getBoolean("mobs.dolphin.ridable", dolphinRidable); dolphinControllable = getBoolean("mobs.dolphin.controllable", dolphinControllable); -@@ -1228,6 +1229,7 @@ public class PurpurWorldConfig { +@@ -1233,6 +1234,7 @@ public class PurpurWorldConfig { dolphinMaxHealth = getDouble("mobs.dolphin.attributes.max_health", dolphinMaxHealth); dolphinDisableTreasureSearching = getBoolean("mobs.dolphin.disable-treasure-searching", dolphinDisableTreasureSearching); dolphinTakeDamageFromWater = getBoolean("mobs.dolphin.takes-damage-from-water", dolphinTakeDamageFromWater); diff --git a/patches/server/0228-Cows-naturally-aggressive-to-players-chance.patch b/patches/server/0222-Cows-naturally-aggressive-to-players-chance.patch similarity index 90% rename from patches/server/0228-Cows-naturally-aggressive-to-players-chance.patch rename to patches/server/0222-Cows-naturally-aggressive-to-players-chance.patch index 757c7bdba..15385fc14 100644 --- a/patches/server/0228-Cows-naturally-aggressive-to-players-chance.patch +++ b/patches/server/0222-Cows-naturally-aggressive-to-players-chance.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Cows naturally aggressive to players chance diff --git a/src/main/java/net/minecraft/world/entity/animal/Cow.java b/src/main/java/net/minecraft/world/entity/animal/Cow.java -index 67a121269eccfcdb71d15e67eab567b488276d83..c7947a476a9986e3849c74f74b4b2135c6cf5984 100644 +index 48d20fcd481e76e180410c11040b2164315fce23..7bf4b399d68b04a43465e85061113249d7ecf0d3 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cow.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cow.java -@@ -37,6 +37,7 @@ import org.bukkit.craftbukkit.inventory.CraftItemStack; +@@ -38,6 +38,7 @@ import org.bukkit.craftbukkit.inventory.CraftItemStack; // CraftBukkit end public class Cow extends Animal { @@ -16,7 +16,7 @@ index 67a121269eccfcdb71d15e67eab567b488276d83..c7947a476a9986e3849c74f74b4b2135 public Cow(EntityType type, Level world) { super(type, world); -@@ -61,6 +62,7 @@ public class Cow extends Animal { +@@ -62,6 +63,7 @@ public class Cow extends Animal { @Override public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.cowMaxHealth); @@ -24,7 +24,7 @@ index 67a121269eccfcdb71d15e67eab567b488276d83..c7947a476a9986e3849c74f74b4b2135 } @Override -@@ -72,6 +74,12 @@ public class Cow extends Animal { +@@ -73,6 +75,12 @@ public class Cow extends Animal { public boolean isSensitiveToWater() { return this.level.purpurConfig.cowTakeDamageFromWater; } @@ -37,7 +37,7 @@ index 67a121269eccfcdb71d15e67eab567b488276d83..c7947a476a9986e3849c74f74b4b2135 // Purpur end @Override -@@ -79,6 +87,7 @@ public class Cow extends Animal { +@@ -80,6 +88,7 @@ public class Cow extends Animal { this.goalSelector.addGoal(0, new FloatGoal(this)); this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur this.goalSelector.addGoal(1, new PanicGoal(this, 2.0D)); @@ -45,7 +45,7 @@ index 67a121269eccfcdb71d15e67eab567b488276d83..c7947a476a9986e3849c74f74b4b2135 this.goalSelector.addGoal(2, new BreedGoal(this, 1.0D)); if (level.purpurConfig.cowFeedMushrooms > 0) this.goalSelector.addGoal(3, new TemptGoal(this, 1.25D, Ingredient.of(Items.WHEAT, Blocks.RED_MUSHROOM.asItem(), Blocks.BROWN_MUSHROOM.asItem()), false)); else // Purpur this.goalSelector.addGoal(3, new TemptGoal(this, 1.25D, Ingredient.of(Items.WHEAT), false)); -@@ -86,10 +95,11 @@ public class Cow extends Animal { +@@ -87,10 +96,11 @@ public class Cow extends Animal { this.goalSelector.addGoal(5, new WaterAvoidingRandomStrollGoal(this, 1.0D)); this.goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 6.0F)); this.goalSelector.addGoal(7, new RandomLookAroundGoal(this)); @@ -59,10 +59,10 @@ index 67a121269eccfcdb71d15e67eab567b488276d83..c7947a476a9986e3849c74f74b4b2135 @Override diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index cabd5dabc18f8e9f4dc52611bad1d949293e6947..58aa6ef663be2c1c5ad242553bb4ad703a94b71d 100644 +index 46c414e51837bedd7f347a125925d1704750e0db..d822f5f1fcbe0ff404fba384bdf52e10f20f0004 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1163,7 +1163,14 @@ public class PurpurWorldConfig { +@@ -1168,7 +1168,14 @@ public class PurpurWorldConfig { public int cowFeedMushrooms = 0; public int cowBreedingTicks = 6000; public boolean cowTakeDamageFromWater = false; @@ -77,7 +77,7 @@ index cabd5dabc18f8e9f4dc52611bad1d949293e6947..58aa6ef663be2c1c5ad242553bb4ad70 cowRidable = getBoolean("mobs.cow.ridable", cowRidable); cowRidableInWater = getBoolean("mobs.cow.ridable-in-water", cowRidableInWater); cowControllable = getBoolean("mobs.cow.controllable", cowControllable); -@@ -1176,6 +1183,8 @@ public class PurpurWorldConfig { +@@ -1181,6 +1188,8 @@ public class PurpurWorldConfig { cowFeedMushrooms = getInt("mobs.cow.feed-mushrooms-for-mooshroom", cowFeedMushrooms); cowBreedingTicks = getInt("mobs.cow.breeding-delay-ticks", cowBreedingTicks); cowTakeDamageFromWater = getBoolean("mobs.cow.takes-damage-from-water", cowTakeDamageFromWater); diff --git a/patches/server/0229-Option-for-beds-to-explode-on-villager-sleep.patch b/patches/server/0223-Option-for-beds-to-explode-on-villager-sleep.patch similarity index 75% rename from patches/server/0229-Option-for-beds-to-explode-on-villager-sleep.patch rename to patches/server/0223-Option-for-beds-to-explode-on-villager-sleep.patch index 26da9627a..58a469aa6 100644 --- a/patches/server/0229-Option-for-beds-to-explode-on-villager-sleep.patch +++ b/patches/server/0223-Option-for-beds-to-explode-on-villager-sleep.patch @@ -5,16 +5,16 @@ Subject: [PATCH] Option for beds to explode on villager sleep diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java -index 14834853354adb222f99c4a12169fd05e02477da..2df655ddf394149e32e00f3f2a352bff41091a1e 100644 +index 1db5d966c2ce26c2e5e2999ae8639a20e30d6fa8..a2cf362d84135ff39a427024f7df1d1b694b10cb 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java -@@ -1093,6 +1093,12 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -1083,6 +1083,12 @@ public class Villager extends AbstractVillager implements ReputationEventHandler @Override public void startSleeping(BlockPos pos) { + // Purpur start + if (level.purpurConfig.bedExplodeOnVillagerSleep && this.level.getBlockState(pos).getBlock() instanceof net.minecraft.world.level.block.BedBlock) { -+ this.level.explode(null, DamageSource.explosion(this), null, (double) pos.getX() + 0.5D, (double) pos.getY() + 0.5D, (double) pos.getZ() + 0.5D, (float) this.level.purpurConfig.bedExplosionPower, this.level.purpurConfig.bedExplosionFire, this.level.purpurConfig.bedExplosionEffect); ++ this.level.explode(null, DamageSource.explosion(this, null), null, (double) pos.getX() + 0.5D, (double) pos.getY() + 0.5D, (double) pos.getZ() + 0.5D, (float) this.level.purpurConfig.bedExplosionPower, this.level.purpurConfig.bedExplosionFire, this.level.purpurConfig.bedExplosionEffect); + return; + } + // Purpur end @@ -22,7 +22,7 @@ index 14834853354adb222f99c4a12169fd05e02477da..2df655ddf394149e32e00f3f2a352bff this.brain.setMemory(MemoryModuleType.LAST_SLEPT, this.level.getGameTime()); // CraftBukkit - decompile error this.brain.eraseMemory(MemoryModuleType.WALK_TARGET); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 132cc5a42b17640eddd098f883b9c56fa5cb8b92..fee5bdb822bac6934d0ab92a8e092494845fe7d3 100644 +index ccaf3309162fe4f916bcadbe665e09c151bc2241..ad7f3c58f2b7c5ba565914d34177d311b61182dc 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -725,11 +725,13 @@ public class PurpurWorldConfig { @@ -32,7 +32,7 @@ index 132cc5a42b17640eddd098f883b9c56fa5cb8b92..fee5bdb822bac6934d0ab92a8e092494 + public boolean bedExplodeOnVillagerSleep = false; public double bedExplosionPower = 5.0D; public boolean bedExplosionFire = true; - public Explosion.BlockInteraction bedExplosionEffect = Explosion.BlockInteraction.DESTROY; + public net.minecraft.world.level.Level.ExplosionInteraction bedExplosionEffect = net.minecraft.world.level.Level.ExplosionInteraction.BLOCK; private void bedSettings() { bedExplode = getBoolean("blocks.bed.explode", bedExplode); + bedExplodeOnVillagerSleep = getBoolean("blocks.bed.explode-on-villager-sleep", bedExplodeOnVillagerSleep); diff --git a/patches/server/0230-Halloween-options-and-optimizations.patch b/patches/server/0224-Halloween-options-and-optimizations.patch similarity index 85% rename from patches/server/0230-Halloween-options-and-optimizations.patch rename to patches/server/0224-Halloween-options-and-optimizations.patch index 3c19ad4d8..434c73a10 100644 --- a/patches/server/0230-Halloween-options-and-optimizations.patch +++ b/patches/server/0224-Halloween-options-and-optimizations.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Halloween options and optimizations diff --git a/src/main/java/net/minecraft/world/entity/ambient/Bat.java b/src/main/java/net/minecraft/world/entity/ambient/Bat.java -index 16ab6feea4af65bfe9b0c6e6c586a9abf8790c94..7da1becafd551fcf89b2a2eecd6e2cbe18af1fe8 100644 +index b2fff9079c7460681d9cbd3d3e57b42dfcece44b..8c83a47e68adc65c198544ad10d08acf83485ee9 100644 --- a/src/main/java/net/minecraft/world/entity/ambient/Bat.java +++ b/src/main/java/net/minecraft/world/entity/ambient/Bat.java -@@ -316,7 +316,7 @@ public class Bat extends AmbientCreature { +@@ -319,7 +319,7 @@ public class Bat extends AmbientCreature { int i = world.getMaxLocalRawBrightness(pos); byte b0 = 4; @@ -17,14 +17,14 @@ index 16ab6feea4af65bfe9b0c6e6c586a9abf8790c94..7da1becafd551fcf89b2a2eecd6e2cbe b0 = 7; } else if (random.nextBoolean()) { return false; -@@ -330,6 +330,7 @@ public class Bat extends AmbientCreature { - private static boolean isSpookySeason = false; - private static final int ONE_HOUR = 20 * 60 * 60; - private static int lastSpookyCheck = -ONE_HOUR; +@@ -329,6 +329,7 @@ public class Bat extends AmbientCreature { + } + } + + public static boolean isHalloweenSeason(Level level) { return level.purpurConfig.forceHalloweenSeason || isHalloween(); } // Purpur private static boolean isHalloween() { - if (net.minecraft.server.MinecraftServer.currentTick - lastSpookyCheck > ONE_HOUR) { LocalDate localdate = LocalDate.now(); + int i = localdate.get(ChronoField.DAY_OF_MONTH); diff --git a/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java b/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java index 4505b61f10c3aad3d0ab144cea5ef6efc6ad7357..e542407894f58fb8c0339a7a6d2e7b2cb5891eb4 100644 --- a/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java @@ -43,10 +43,10 @@ index 4505b61f10c3aad3d0ab144cea5ef6efc6ad7357..e542407894f58fb8c0339a7a6d2e7b2c this.armorDropChances[EquipmentSlot.HEAD.getIndex()] = 0.0F; } diff --git a/src/main/java/net/minecraft/world/entity/monster/Zombie.java b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -index b687f30720a92485d36faec8dcd865ee6cfc6ab9..505a179737ca80cc2d0e3e8e228cc46024061bc9 100644 +index d6093557894789eb20f79b83547620b47bb65ffb..dfa2806faedf70ca5ffe77087a67822a21e6aac2 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zombie.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -@@ -585,11 +585,7 @@ public class Zombie extends Monster { +@@ -593,11 +593,7 @@ public class Zombie extends Monster { } if (this.getItemBySlot(EquipmentSlot.HEAD).isEmpty()) { @@ -60,10 +60,10 @@ index b687f30720a92485d36faec8dcd865ee6cfc6ab9..505a179737ca80cc2d0e3e8e228cc460 this.armorDropChances[EquipmentSlot.HEAD.getIndex()] = 0.0F; } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 88189eeea2bae35fa0f396aae7fc3bcfce4cd611..9765d8b4c8f52b98bce6a3aeb0e8dc839541bf7d 100644 +index 334e2f78bdaf76118e2af9749e5c820a6c7e0ca2..73aa9d484d2fac2e1776b2b90fc261968e042b06 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1556,6 +1556,13 @@ public class PurpurWorldConfig { +@@ -1561,6 +1561,13 @@ public class PurpurWorldConfig { guardianTakeDamageFromWater = getBoolean("mobs.guardian.takes-damage-from-water", guardianTakeDamageFromWater); } diff --git a/patches/server/0231-Config-for-grindstones.patch b/patches/server/0225-Config-for-grindstones.patch similarity index 94% rename from patches/server/0231-Config-for-grindstones.patch rename to patches/server/0225-Config-for-grindstones.patch index cfaa87e11..8d63ee75d 100644 --- a/patches/server/0231-Config-for-grindstones.patch +++ b/patches/server/0225-Config-for-grindstones.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Config for grindstones diff --git a/src/main/java/net/minecraft/world/inventory/GrindstoneMenu.java b/src/main/java/net/minecraft/world/inventory/GrindstoneMenu.java -index 447f0f5f37e445a350d06deeac326feab2d66999..eb70286262fd8c3b4efb614cf62c5e3bf4b00640 100644 +index 08e9cc68fa88e4ca42fa26c1425f101e72c094cb..23019df46720290f3b50b58606de9d97661812ac 100644 --- a/src/main/java/net/minecraft/world/inventory/GrindstoneMenu.java +++ b/src/main/java/net/minecraft/world/inventory/GrindstoneMenu.java @@ -130,7 +130,7 @@ public class GrindstoneMenu extends AbstractContainerMenu { @@ -57,7 +57,7 @@ index 447f0f5f37e445a350d06deeac326feab2d66999..eb70286262fd8c3b4efb614cf62c5e3b } diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -index bf3bbe2d26f5ce6e6b00b36d9ea269df7d19e92d..8322e9135188877471f78c3310cdbc3df758b67f 100644 +index 46241ba295ac6575bec4dee0d99d31415eb6c77f..4fecd7e5882ef043ab9b0fa36fa1aa4ccd452440 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java @@ -322,6 +322,9 @@ public class PurpurConfig { @@ -82,7 +82,7 @@ index bf3bbe2d26f5ce6e6b00b36d9ea269df7d19e92d..8322e9135188877471f78c3310cdbc3d + defaultCurses.clear(); + } + getList("settings.blocks.grindstone.ignored-enchants", defaultCurses).forEach(key -> { -+ Enchantment enchantment = Registry.ENCHANTMENT.get(new ResourceLocation(key.toString())); ++ Enchantment enchantment = BuiltInRegistries.ENCHANTMENT.get(new ResourceLocation(key.toString())); + grindstoneIgnoredEnchants.add(enchantment); + }); + grindstoneRemoveAttributes = getBoolean("settings.blocks.grindstone.remove-attributes", grindstoneRemoveAttributes); diff --git a/patches/server/0232-UPnP-Port-Forwarding.patch b/patches/server/0226-UPnP-Port-Forwarding.patch similarity index 89% rename from patches/server/0232-UPnP-Port-Forwarding.patch rename to patches/server/0226-UPnP-Port-Forwarding.patch index 87f8488c6..cde3c7f62 100644 --- a/patches/server/0232-UPnP-Port-Forwarding.patch +++ b/patches/server/0226-UPnP-Port-Forwarding.patch @@ -5,10 +5,10 @@ Subject: [PATCH] UPnP Port Forwarding diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index a513f1aa4372ff9c484f9a782b73cf7078c6ce72..11bc98a1c9306f553c6034ed0c1ce7f586b6b21b 100644 +index ca52d7e8bc891819067d7809734136470ab56484..09add41216e85876517e4032523b60c08085da4c 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -296,6 +296,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop { @@ -63,7 +63,7 @@ index efed0ad72cfbea820bfb454ea4fb893007734908..ce4127f3701efa7d1c86bcdb4e7804fe }); state.spawnAfterBreak((ServerLevel) world, pos, ItemStack.EMPTY, true); } -@@ -343,7 +350,7 @@ public class Block extends BlockBehaviour implements ItemLike { +@@ -341,7 +348,7 @@ public class Block extends BlockBehaviour implements ItemLike { io.papermc.paper.event.block.BlockBreakBlockEvent event = new io.papermc.paper.event.block.BlockBreakBlockEvent(org.bukkit.craftbukkit.block.CraftBlock.at(world, pos), org.bukkit.craftbukkit.block.CraftBlock.at(world, source), items); event.callEvent(); for (var drop : event.getDrops()) { @@ -72,7 +72,7 @@ index efed0ad72cfbea820bfb454ea4fb893007734908..ce4127f3701efa7d1c86bcdb4e7804fe } state.spawnAfterBreak(world.getMinecraftWorld(), pos, ItemStack.EMPTY, true); } -@@ -354,13 +361,53 @@ public class Block extends BlockBehaviour implements ItemLike { +@@ -352,13 +359,53 @@ public class Block extends BlockBehaviour implements ItemLike { public static void dropResources(BlockState state, Level world, BlockPos pos, @Nullable BlockEntity blockEntity, Entity entity, ItemStack stack) { if (world instanceof ServerLevel) { Block.getDrops(state, (ServerLevel) world, pos, blockEntity, entity, stack).forEach((itemstack1) -> { @@ -128,12 +128,12 @@ index efed0ad72cfbea820bfb454ea4fb893007734908..ce4127f3701efa7d1c86bcdb4e7804fe float f = EntityType.ITEM.getHeight() / 2.0F; // Paper start - don't convert potentially massive numbers to floats diff --git a/src/main/java/net/minecraft/world/level/block/entity/BlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/BlockEntity.java -index b96d57b0bcf21508f8e03e96b7553eb486fdf212..d3de829a4ab5f5a127fb026a8cb4ef4ed6b9c394 100644 +index 58986bc0677c5ea1ad54d7d6d4efa5c2ea233aea..59d616137088af46d4494171fe96ba0129082496 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/BlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/BlockEntity.java @@ -6,6 +6,8 @@ import net.minecraft.CrashReportCategory; import net.minecraft.core.BlockPos; - import net.minecraft.core.Registry; + import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.StringTag; @@ -195,7 +195,7 @@ index b96d57b0bcf21508f8e03e96b7553eb486fdf212..d3de829a4ab5f5a127fb026a8cb4ef4e + // Purpur end } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 08116c757ee7a7ce6536ff196e3f3ee5fe57e37e..2d536be2e7ed910f5e9cad660086efdbf014ad9d 100644 +index 54a77c5b209aaf34890bfa92f422e5bb19519981..610279d349dad0c9f8e0d99f64b80425efad0933 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -133,6 +133,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0237-Signs-allow-color-codes.patch b/patches/server/0231-Signs-allow-color-codes.patch similarity index 89% rename from patches/server/0237-Signs-allow-color-codes.patch rename to patches/server/0231-Signs-allow-color-codes.patch index ef3c1800f..93bae8ba1 100644 --- a/patches/server/0237-Signs-allow-color-codes.patch +++ b/patches/server/0231-Signs-allow-color-codes.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Signs allow color codes diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index 988223d4914a61a56843cdf4cf6dd3d3ace44a37..cd1839aaa6ad47f6a129621b9cec9264f4415612 100644 +index db7bf36474ac0e0a95b11ab212d9c866368a161b..05c442041e11d7a87359857ad9d6fed3b8132dd6 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java -@@ -1529,6 +1529,7 @@ public class ServerPlayer extends Player { +@@ -1551,6 +1551,7 @@ public class ServerPlayer extends Player { @Override public void openTextEdit(SignBlockEntity sign) { @@ -17,10 +17,10 @@ index 988223d4914a61a56843cdf4cf6dd3d3ace44a37..cd1839aaa6ad47f6a129621b9cec9264 this.connection.send(new ClientboundBlockUpdatePacket(this.level, sign.getBlockPos())); this.connection.send(new ClientboundOpenSignEditorPacket(sign.getBlockPos())); diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 328507baabfefbe5de2b71a33822583af8676687..ec5a1d534ae6a4b41f56bd2a93e37b2fd64ee964 100644 +index cbcaf80736ab50f781b65f7a8c813331238c74ec..69011c01936eae6a8939b94acfaac56c2cf6cae6 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -3657,11 +3657,17 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -3513,11 +3513,17 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic for (int i = 0; i < signText.size(); ++i) { FilteredText filteredtext = (FilteredText) signText.get(i); @@ -42,10 +42,10 @@ index 328507baabfefbe5de2b71a33822583af8676687..ec5a1d534ae6a4b41f56bd2a93e37b2f SignChangeEvent event = new SignChangeEvent((org.bukkit.craftbukkit.block.CraftBlock) player.getWorld().getBlockAt(x, y, z), this.player.getBukkitEntity(), lines); this.cserver.getPluginManager().callEvent(event); diff --git a/src/main/java/net/minecraft/world/level/block/entity/SignBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/SignBlockEntity.java -index 58599ead28c25a76d9f41d2d29ee8024c9afdccd..375d449be2ada2b31dafb51cb79c034cf9fbc88c 100644 +index 4da4edae517a0efec6e03a719ec47b700509dab1..9e760a8e8244b15daaf0abdfc5f8a51d5c663e12 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/SignBlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/SignBlockEntity.java -@@ -184,6 +184,23 @@ public class SignBlockEntity extends BlockEntity implements CommandSource { // C +@@ -203,6 +203,23 @@ public class SignBlockEntity extends BlockEntity implements CommandSource { // C return ClientboundBlockEntityDataPacket.create(this); } @@ -70,7 +70,7 @@ index 58599ead28c25a76d9f41d2d29ee8024c9afdccd..375d449be2ada2b31dafb51cb79c034c public CompoundTag getUpdateTag() { return this.saveWithoutMetadata(); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 1991f6ba4bc282a856513bc304f80242fdbfedb8..2943a6d00d5cc5cbfac00fe7031a473db600606f 100644 +index 610279d349dad0c9f8e0d99f64b80425efad0933..bda122612dc1336baa2be0a01276a598312873aa 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -938,8 +938,10 @@ public class PurpurWorldConfig { diff --git a/patches/server/0238-Kelp-cave-weeping-and-twisting-vines-configurable-ma.patch b/patches/server/0232-Kelp-cave-weeping-and-twisting-vines-configurable-ma.patch similarity index 97% rename from patches/server/0238-Kelp-cave-weeping-and-twisting-vines-configurable-ma.patch rename to patches/server/0232-Kelp-cave-weeping-and-twisting-vines-configurable-ma.patch index 72fa97fa8..97c4de632 100644 --- a/patches/server/0238-Kelp-cave-weeping-and-twisting-vines-configurable-ma.patch +++ b/patches/server/0232-Kelp-cave-weeping-and-twisting-vines-configurable-ma.patch @@ -6,10 +6,10 @@ Subject: [PATCH] Kelp, cave, weeping, and twisting vines configurable max diff --git a/src/main/java/net/minecraft/world/level/block/CaveVinesBlock.java b/src/main/java/net/minecraft/world/level/block/CaveVinesBlock.java -index 4940e101250874111e9c55aeb5b87b28602246f0..45eeb8523b9923585d7738f5ad8f5e8c6c7cbe5d 100644 +index fc76cd43655e0f4b8a8d87f90f0a48a8678ef16c..a5b27c064096c9572a8fe0dc40e68d0982507103 100644 --- a/src/main/java/net/minecraft/world/level/block/CaveVinesBlock.java +++ b/src/main/java/net/minecraft/world/level/block/CaveVinesBlock.java -@@ -88,4 +88,11 @@ public class CaveVinesBlock extends GrowingPlantHeadBlock implements Bonemealabl +@@ -89,4 +89,11 @@ public class CaveVinesBlock extends GrowingPlantHeadBlock implements Bonemealabl public void performBonemeal(ServerLevel world, RandomSource random, BlockPos pos, BlockState state) { world.setBlock(pos, (BlockState) state.setValue(CaveVinesBlock.BERRIES, true), 2); } @@ -22,7 +22,7 @@ index 4940e101250874111e9c55aeb5b87b28602246f0..45eeb8523b9923585d7738f5ad8f5e8c + // Purpur end } diff --git a/src/main/java/net/minecraft/world/level/block/GrowingPlantHeadBlock.java b/src/main/java/net/minecraft/world/level/block/GrowingPlantHeadBlock.java -index b7517d1e8a5d5eb719de5eda424b7dd2449f1182..5af3e3e68b2e686609a5469036d0d3dfe57997b4 100644 +index 3a1aa4e2405090ccebefb7f5944f36462929e221..f3cf9f06de40054720d1847c1869a9d82592134d 100644 --- a/src/main/java/net/minecraft/world/level/block/GrowingPlantHeadBlock.java +++ b/src/main/java/net/minecraft/world/level/block/GrowingPlantHeadBlock.java @@ -30,12 +30,12 @@ public abstract class GrowingPlantHeadBlock extends GrowingPlantBlock implements diff --git a/patches/server/0239-Mobs-always-drop-experience.patch b/patches/server/0233-Mobs-always-drop-experience.patch similarity index 88% rename from patches/server/0239-Mobs-always-drop-experience.patch rename to patches/server/0233-Mobs-always-drop-experience.patch index 95c1b1089..0c01a4417 100644 --- a/patches/server/0239-Mobs-always-drop-experience.patch +++ b/patches/server/0233-Mobs-always-drop-experience.patch @@ -21,10 +21,10 @@ index 506632a6b5107f5ef08cd87808b8c4be1e96b49f..b7abcaa32341c292f9f884fa6319fd65 @Override diff --git a/src/main/java/net/minecraft/world/entity/ambient/Bat.java b/src/main/java/net/minecraft/world/entity/ambient/Bat.java -index 7da1becafd551fcf89b2a2eecd6e2cbe18af1fe8..80045af7e317336ce4f807edd59fb409ec2f1177 100644 +index 8c83a47e68adc65c198544ad10d08acf83485ee9..77c3cb07bde260ecb9c207924e64cd65f261b878 100644 --- a/src/main/java/net/minecraft/world/entity/ambient/Bat.java +++ b/src/main/java/net/minecraft/world/entity/ambient/Bat.java -@@ -107,6 +107,11 @@ public class Bat extends AmbientCreature { +@@ -110,6 +110,11 @@ public class Bat extends AmbientCreature { public boolean isSensitiveToWater() { return this.level.purpurConfig.batTakeDamageFromWater; } @@ -37,7 +37,7 @@ index 7da1becafd551fcf89b2a2eecd6e2cbe18af1fe8..80045af7e317336ce4f807edd59fb409 @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/Bee.java b/src/main/java/net/minecraft/world/entity/animal/Bee.java -index 0e5988fc636cbd7a76cf73ed91d65f0f9571987a..52b1c0eaed8a4509c0fbe78e3ead238c4426acdd 100644 +index 12c86e9227c21cef93ee9c00b505456a3a881d7c..251fc8c09d3856464b8f5c64f7840a65553ae16c 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Bee.java +++ b/src/main/java/net/minecraft/world/entity/animal/Bee.java @@ -229,6 +229,11 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { @@ -53,10 +53,10 @@ index 0e5988fc636cbd7a76cf73ed91d65f0f9571987a..52b1c0eaed8a4509c0fbe78e3ead238c @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/Cat.java b/src/main/java/net/minecraft/world/entity/animal/Cat.java -index 97b5b9f63fc01b6945a5c61406a394cba80c10ec..25d81c2b27be5a441f375d67686fa98a6c434ead 100644 +index 76c99eab479d762120fbb40144a5a3b201c4dd9e..fd7fc2d6a28110050b2050355897d551737939a7 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cat.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cat.java -@@ -133,6 +133,11 @@ public class Cat extends TamableAnimal { +@@ -134,6 +134,11 @@ public class Cat extends TamableAnimal implements VariantHolder { public boolean isSensitiveToWater() { return this.level.purpurConfig.catTakeDamageFromWater; } @@ -69,10 +69,10 @@ index 97b5b9f63fc01b6945a5c61406a394cba80c10ec..25d81c2b27be5a441f375d67686fa98a public ResourceLocation getResourceLocation() { diff --git a/src/main/java/net/minecraft/world/entity/animal/Chicken.java b/src/main/java/net/minecraft/world/entity/animal/Chicken.java -index 14b0160deab7895f0827d5dc75a48a98d906d7c8..67893824250ca0b1f441f116aefa555b68bb594e 100644 +index 47d2991ba08313fa50fde167020e03d8c2c29c37..3355a5b2e906c247ef7af4e1a2c74d49fb050616 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Chicken.java +++ b/src/main/java/net/minecraft/world/entity/animal/Chicken.java -@@ -86,6 +86,11 @@ public class Chicken extends Animal { +@@ -87,6 +87,11 @@ public class Chicken extends Animal { public boolean isSensitiveToWater() { return this.level.purpurConfig.chickenTakeDamageFromWater; } @@ -101,10 +101,10 @@ index 5b79d821e8b55c8876eadcbe811a2c0584e7e02b..de70208403ef6c6c9c82ca4c1fd3b641 @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/Cow.java b/src/main/java/net/minecraft/world/entity/animal/Cow.java -index 204b027e4dba081ac492416d4b13c5bf520fb9bc..c09952d2d5bd1240ed36cd5b03ec071d6a2b87ab 100644 +index 7bf4b399d68b04a43465e85061113249d7ecf0d3..35b97e48b19fad137cab03e3599e4c81101eb87a 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cow.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cow.java -@@ -80,6 +80,11 @@ public class Cow extends Animal { +@@ -81,6 +81,11 @@ public class Cow extends Animal { this.isNaturallyAggressiveToPlayers = world.getLevel().purpurConfig.cowNaturallyAggressiveToPlayersChance > 0.0D && random.nextDouble() <= world.getLevel().purpurConfig.cowNaturallyAggressiveToPlayersChance; return super.finalizeSpawn(world, difficulty, spawnReason, entityData, entityNbt); } @@ -133,10 +133,10 @@ index f8be4c96e7e7b8e6d8c538b1f425f01d866ce8f9..284c1342695aeb652f39c236d1453864 @Nullable diff --git a/src/main/java/net/minecraft/world/entity/animal/Fox.java b/src/main/java/net/minecraft/world/entity/animal/Fox.java -index 7fdaba9bd61cf7f9954aa326517b4d075ae78c84..5586e55216085687a7b0ea5d43ddb9c8a273ee46 100644 +index 6321466c58352f8ff6e42303a811868eaf26a8f8..31512fb943690ac82c995bcbb3ffd63225b2c46c 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Fox.java +++ b/src/main/java/net/minecraft/world/entity/animal/Fox.java -@@ -193,6 +193,11 @@ public class Fox extends Animal { +@@ -193,6 +193,11 @@ public class Fox extends Animal implements VariantHolder { public boolean isSensitiveToWater() { return this.level.purpurConfig.foxTakeDamageFromWater; } @@ -165,10 +165,10 @@ index 98a68e759d7b23da78dd2ec6bcb1aa12dab3ad2c..0292690b9c99f66210a03817e512c65c @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java -index b63569653cdee914f6ecf79f305efc6a2ca9fc89..5ae3d5620f94f2f7443c0b9ffbcd79293d096808 100644 +index 4973a0da1139bec25d4b9bf16a01934f276f4805..f517658a240a7c79889f9047e94e9afc884df78c 100644 --- a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java +++ b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java -@@ -94,6 +94,11 @@ public class MushroomCow extends Cow implements Shearable { +@@ -93,6 +93,11 @@ public class MushroomCow extends Cow implements Shearable, VariantHolder { public boolean isSensitiveToWater() { return this.level.purpurConfig.rabbitTakeDamageFromWater; } @@ -309,7 +309,7 @@ index 16171814bab7fbc0c177323cc5f8b026c8ebbcd4..bd1e964c7899a54a2c39afe0691a7573 @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/Sheep.java b/src/main/java/net/minecraft/world/entity/animal/Sheep.java -index fbe7d731df4284e2bd99da6bae8d146cf9587d35..63aeab7204ac954b2908207dc6e743d17aa27f2e 100644 +index 24d50a595a0a04f386961ad070c81cdb41b35e65..492316925f06d1bc7950c6b9d37615b2bd0138fd 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Sheep.java +++ b/src/main/java/net/minecraft/world/entity/animal/Sheep.java @@ -146,6 +146,11 @@ public class Sheep extends Animal implements Shearable { @@ -357,10 +357,10 @@ index 7a8f8be052dc3ee6dc56dd39017e11488af0a8ff..21f5304e01e0844f1bbf3e1b2f9d50c0 @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java b/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java -index 77237646232cf3b7975c7a0c1d2b83d688eaa8b8..62b891c752d225f00685c42c8228eb0537f41091 100644 +index 220a9ca9c78b14b4ca6f76192396db608db184b8..a3becf90c3309d52d2701c016d4c16970a318f9c 100644 --- a/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java +++ b/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java -@@ -74,6 +74,11 @@ public class TropicalFish extends AbstractSchoolingFish { +@@ -67,6 +67,11 @@ public class TropicalFish extends AbstractSchoolingFish implements VariantHolder public boolean isSensitiveToWater() { return this.level.purpurConfig.tropicalFishTakeDamageFromWater; } @@ -373,7 +373,7 @@ index 77237646232cf3b7975c7a0c1d2b83d688eaa8b8..62b891c752d225f00685c42c8228eb05 public static String getPredefinedName(int variant) { diff --git a/src/main/java/net/minecraft/world/entity/animal/Turtle.java b/src/main/java/net/minecraft/world/entity/animal/Turtle.java -index d5a029db2831ea817071830ba30d0f50fd001f8d..539e3d66bb3cf088799625a2b20ab87d3d9fdd41 100644 +index 95ea01f3ded049a65a68cb84db8fb24f52c8dc8d..4ae69019aa0656ec7281af6352042c1a28d9a81c 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Turtle.java +++ b/src/main/java/net/minecraft/world/entity/animal/Turtle.java @@ -112,6 +112,11 @@ public class Turtle extends Animal { @@ -389,7 +389,7 @@ index d5a029db2831ea817071830ba30d0f50fd001f8d..539e3d66bb3cf088799625a2b20ab87d public void setHomePos(BlockPos pos) { diff --git a/src/main/java/net/minecraft/world/entity/animal/Wolf.java b/src/main/java/net/minecraft/world/entity/animal/Wolf.java -index 60ec90b128a7a9f7862f4705b15dad142cc193f7..80f9788d11a5161c3020837befbebb06172e86e5 100644 +index 0656bb44c3ac8a346ebec203239954d980c010e7..006d5fc7c96a47bf57ab26f374143400138b8b17 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Wolf.java +++ b/src/main/java/net/minecraft/world/entity/animal/Wolf.java @@ -212,6 +212,11 @@ public class Wolf extends TamableAnimal implements NeutralMob { @@ -405,10 +405,10 @@ index 60ec90b128a7a9f7862f4705b15dad142cc193f7..80f9788d11a5161c3020837befbebb06 @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java b/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java -index 858a5beea8b038822789e6daec9561634c63447c..b543387da275a0b3675a968b6cebf05cc227af14 100644 +index 386eb27ba4c68d0a87ad5c0250b51987b62281e7..66371759b99371db21a910d2e4e5cb9219e70b9c 100644 --- a/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java +++ b/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java -@@ -132,6 +132,11 @@ public class Axolotl extends Animal implements LerpingModel, Bucketable { +@@ -133,6 +133,11 @@ public class Axolotl extends Animal implements LerpingModel, VariantHolder { public boolean isSensitiveToWater() { return this.level.purpurConfig.horseTakeDamageFromWater; } @@ -469,10 +469,10 @@ index 704e08b1ad0601e9b7f3b355214a820858a421ce..d0b477c01386ce25bf4a93bda8561c7e @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java -index eaf44b0d0c6ea1a137d12998b164def3272ad1a3..b432e99bd54f2656e08ce98a97184523877cd23a 100644 +index c8d3f2ffb0f4d5586921421cda8acf27f7afe4b8..beea0545a38b0f044409c2cdb5bbefaf8d783d45 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java -@@ -141,6 +141,11 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { +@@ -146,6 +146,11 @@ public class Llama extends AbstractChestedHorse implements VariantHolder type, ServerLevelAccessor world, MobSpawnType spawnReason, BlockPos pos, RandomSource random) { diff --git a/src/main/java/net/minecraft/world/entity/monster/Strider.java b/src/main/java/net/minecraft/world/entity/monster/Strider.java -index 0ac4a2b6ec9c88e8049a8a1cd0518e14e4b08ede..892979cf6c6f685034d6035d266afc9aab9337ce 100644 +index 209d6a6d3ddcb4c254974ba741dc87b0979eb26f..4aafc7d56eb669f6454e3c88189ec765f674e795 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Strider.java +++ b/src/main/java/net/minecraft/world/entity/monster/Strider.java @@ -121,6 +121,11 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { @@ -949,10 +949,10 @@ index 0ac4a2b6ec9c88e8049a8a1cd0518e14e4b08ede..892979cf6c6f685034d6035d266afc9a public static boolean checkStriderSpawnRules(EntityType type, LevelAccessor world, MobSpawnType spawnReason, BlockPos pos, RandomSource random) { diff --git a/src/main/java/net/minecraft/world/entity/monster/Vex.java b/src/main/java/net/minecraft/world/entity/monster/Vex.java -index 1e4f227ad895f2099d889c3b9317176449675af1..a30440eb53dc909c7c02137dc041df066b28844e 100644 +index b4a54cd0fda9abb174db2318d1e677d60deea927..b368d20b6ce18b5cb9af054e1cd518c2a413fbf1 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Vex.java +++ b/src/main/java/net/minecraft/world/entity/monster/Vex.java -@@ -111,6 +111,11 @@ public class Vex extends Monster { +@@ -114,6 +114,11 @@ public class Vex extends Monster { public boolean isSensitiveToWater() { return this.level.purpurConfig.vexTakeDamageFromWater; } @@ -1013,10 +1013,10 @@ index dd47abc25f71ad019025e11bdf9f5ca97c2c78f3..56f1c52afe32ce71edd44c7bc3ff1ac1 @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/Zoglin.java b/src/main/java/net/minecraft/world/entity/monster/Zoglin.java -index 0d8495a73df5b1b6cd2c7e5cf18cb3eb15bbb729..66b824ac3c24c46014d615b355a8a04e59f45e1b 100644 +index e120d5c054585f539bdc086eb33d5eb0b4b07e57..8b522186395d570bb14db94df8df2c4fa3705a7e 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zoglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zoglin.java -@@ -93,6 +93,11 @@ public class Zoglin extends Monster implements Enemy, HoglinBase { +@@ -92,6 +92,11 @@ public class Zoglin extends Monster implements Enemy, HoglinBase { public boolean isSensitiveToWater() { return this.level.purpurConfig.zoglinTakeDamageFromWater; } @@ -1029,10 +1029,10 @@ index 0d8495a73df5b1b6cd2c7e5cf18cb3eb15bbb729..66b824ac3c24c46014d615b355a8a04e @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/Zombie.java b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -index f86ff39a7b1890624c9bf731a07706307316366f..31b1715a5b62e4bd36d672ad21a3bdfbec8af7d1 100644 +index dfa2806faedf70ca5ffe77087a67822a21e6aac2..ef8cca70661cedecf08a787011342c402eb59a79 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zombie.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -@@ -143,6 +143,11 @@ public class Zombie extends Monster { +@@ -144,6 +144,11 @@ public class Zombie extends Monster { public boolean isSensitiveToWater() { return this.level.purpurConfig.zombieTakeDamageFromWater; } @@ -1045,10 +1045,10 @@ index f86ff39a7b1890624c9bf731a07706307316366f..31b1715a5b62e4bd36d672ad21a3bdfb @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java -index dd05c4770abe65069148fcccfd1b33e781c237ce..1d0bad8da3d48dce629bfab3cb536358d818a97e 100644 +index c51e04e90e6a5b5b549666fe739491c148d6268d..0fdfcb3a26698f26caf163828f2cf89e2a28054a 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java -@@ -123,6 +123,11 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { +@@ -124,6 +124,11 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { public boolean isSensitiveToWater() { return this.level.purpurConfig.zombieVillagerTakeDamageFromWater; } @@ -1061,10 +1061,10 @@ index dd05c4770abe65069148fcccfd1b33e781c237ce..1d0bad8da3d48dce629bfab3cb536358 @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java -index ad5197636e367f863ca3d044dd343ae5ae722cc2..dd1b5c84682ebfb2ec3c52c8831c4b83343c77f4 100644 +index 45ed7baaf5cbb3c368bc0051462bfba35c5d6726..ab33a30995d741898cd034fe0fad99eff3529707 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java -@@ -99,6 +99,11 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { +@@ -103,6 +103,11 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { public boolean isSensitiveToWater() { return this.level.purpurConfig.zombifiedPiglinTakeDamageFromWater; } @@ -1077,7 +1077,7 @@ index ad5197636e367f863ca3d044dd343ae5ae722cc2..dd1b5c84682ebfb2ec3c52c8831c4b83 @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java b/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java -index 68cb79ad43a11195eb2245f6d9081212c7adb0dd..9d65b412e30f528d378de9072b48632c56c3e5bb 100644 +index d33f1f3445c36a6c11691bf2d57a8eca074136b1..f7165eb68704b152fd4ead658e5504fa71f68e21 100644 --- a/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java @@ -97,6 +97,11 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { @@ -1093,10 +1093,10 @@ index 68cb79ad43a11195eb2245f6d9081212c7adb0dd..9d65b412e30f528d378de9072b48632c @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java b/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java -index 194e59074b72a56b2188a5ecacbc44d13c4a9021..be060e07938e6b0a6f480e0b7b047ed16302057e 100644 +index 79487fd9dae776231210b1116fd104c3e8b747ad..f478fec2f603fc4994b726e145c22108d9c717e0 100644 --- a/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java -@@ -120,6 +120,11 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento +@@ -122,6 +122,11 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento public boolean isSensitiveToWater() { return this.level.purpurConfig.piglinTakeDamageFromWater; } @@ -1125,10 +1125,10 @@ index a44f9a59fbec146df95d89c26df12efb79f6179a..760015f7a98e70b735707c77472c084d public static AttributeSupplier.Builder createAttributes() { diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java -index 2df655ddf394149e32e00f3f2a352bff41091a1e..1d3e10d7cd27257e8fd83c3e882b05b9d4374c56 100644 +index a2cf362d84135ff39a427024f7df1d1b694b10cb..1d03c14796ff2002ee5d17e41c9fe4e500a9a193 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java -@@ -193,6 +193,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -189,6 +189,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler public boolean isSensitiveToWater() { return this.level.purpurConfig.villagerTakeDamageFromWater; } @@ -1141,7 +1141,7 @@ index 2df655ddf394149e32e00f3f2a352bff41091a1e..1d3e10d7cd27257e8fd83c3e882b05b9 @Override diff --git a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java -index 8214506faf26bc973594f1bd8a19e0458be9b544..558884b68263f4fd89e5b7e6226faa2b268168da 100644 +index eed9fed34fde4d27e424507f2f05510d46f64601..da9e749cf775fc4e3ec6846dab1f92e64f088442 100644 --- a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java +++ b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java @@ -96,6 +96,11 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill @@ -1157,7 +1157,7 @@ index 8214506faf26bc973594f1bd8a19e0458be9b544..558884b68263f4fd89e5b7e6226faa2b @Override diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d885dcdb8fd 100644 +index 5223384a367e151572eb15370d8fc6108564ef6e..b914f7712765720f1fb375f639f9ce3913b03280 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -1004,12 +1004,14 @@ public class PurpurWorldConfig { @@ -1222,8 +1222,8 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 + blazeAlwaysDropExp = getBoolean("mobs.blaze.always-drop-exp", blazeAlwaysDropExp); } - public boolean catRidable = false; -@@ -1095,6 +1103,7 @@ public class PurpurWorldConfig { + public int camelBreedingTicks = 6000; +@@ -1100,6 +1108,7 @@ public class PurpurWorldConfig { public int catBreedingTicks = 6000; public DyeColor catDefaultCollarColor = DyeColor.RED; public boolean catTakeDamageFromWater = false; @@ -1231,7 +1231,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void catSettings() { catRidable = getBoolean("mobs.cat.ridable", catRidable); catRidableInWater = getBoolean("mobs.cat.ridable-in-water", catRidableInWater); -@@ -1115,6 +1124,7 @@ public class PurpurWorldConfig { +@@ -1120,6 +1129,7 @@ public class PurpurWorldConfig { catDefaultCollarColor = DyeColor.RED; } catTakeDamageFromWater = getBoolean("mobs.cat.takes-damage-from-water", catTakeDamageFromWater); @@ -1239,7 +1239,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean caveSpiderRidable = false; -@@ -1122,6 +1132,7 @@ public class PurpurWorldConfig { +@@ -1127,6 +1137,7 @@ public class PurpurWorldConfig { public boolean caveSpiderControllable = true; public double caveSpiderMaxHealth = 12.0D; public boolean caveSpiderTakeDamageFromWater = false; @@ -1247,7 +1247,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void caveSpiderSettings() { caveSpiderRidable = getBoolean("mobs.cave_spider.ridable", caveSpiderRidable); caveSpiderRidableInWater = getBoolean("mobs.cave_spider.ridable-in-water", caveSpiderRidableInWater); -@@ -1133,6 +1144,7 @@ public class PurpurWorldConfig { +@@ -1138,6 +1149,7 @@ public class PurpurWorldConfig { } caveSpiderMaxHealth = getDouble("mobs.cave_spider.attributes.max_health", caveSpiderMaxHealth); caveSpiderTakeDamageFromWater = getBoolean("mobs.cave_spider.takes-damage-from-water", caveSpiderTakeDamageFromWater); @@ -1255,7 +1255,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean chickenRidable = false; -@@ -1142,6 +1154,7 @@ public class PurpurWorldConfig { +@@ -1147,6 +1159,7 @@ public class PurpurWorldConfig { public boolean chickenRetaliate = false; public int chickenBreedingTicks = 6000; public boolean chickenTakeDamageFromWater = false; @@ -1263,7 +1263,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void chickenSettings() { chickenRidable = getBoolean("mobs.chicken.ridable", chickenRidable); chickenRidableInWater = getBoolean("mobs.chicken.ridable-in-water", chickenRidableInWater); -@@ -1155,12 +1168,14 @@ public class PurpurWorldConfig { +@@ -1160,12 +1173,14 @@ public class PurpurWorldConfig { chickenRetaliate = getBoolean("mobs.chicken.retaliate", chickenRetaliate); chickenBreedingTicks = getInt("mobs.chicken.breeding-delay-ticks", chickenBreedingTicks); chickenTakeDamageFromWater = getBoolean("mobs.chicken.takes-damage-from-water", chickenTakeDamageFromWater); @@ -1278,7 +1278,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void codSettings() { codRidable = getBoolean("mobs.cod.ridable", codRidable); codControllable = getBoolean("mobs.cod.controllable", codControllable); -@@ -1171,6 +1186,7 @@ public class PurpurWorldConfig { +@@ -1176,6 +1191,7 @@ public class PurpurWorldConfig { } codMaxHealth = getDouble("mobs.cod.attributes.max_health", codMaxHealth); codTakeDamageFromWater = getBoolean("mobs.cod.takes-damage-from-water", codTakeDamageFromWater); @@ -1286,7 +1286,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean cowRidable = false; -@@ -1182,6 +1198,7 @@ public class PurpurWorldConfig { +@@ -1187,6 +1203,7 @@ public class PurpurWorldConfig { public boolean cowTakeDamageFromWater = false; public double cowNaturallyAggressiveToPlayersChance = 0.0D; public double cowNaturallyAggressiveToPlayersDamage = 2.0D; @@ -1294,7 +1294,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void cowSettings() { if (PurpurConfig.version < 22) { double oldValue = getDouble("mobs.cow.naturally-aggressive-to-players-chance", cowNaturallyAggressiveToPlayersChance); -@@ -1202,6 +1219,7 @@ public class PurpurWorldConfig { +@@ -1207,6 +1224,7 @@ public class PurpurWorldConfig { cowTakeDamageFromWater = getBoolean("mobs.cow.takes-damage-from-water", cowTakeDamageFromWater); cowNaturallyAggressiveToPlayersChance = getDouble("mobs.cow.naturally-aggressive-to-players.chance", cowNaturallyAggressiveToPlayersChance); cowNaturallyAggressiveToPlayersDamage = getDouble("mobs.cow.naturally-aggressive-to-players.damage", cowNaturallyAggressiveToPlayersDamage); @@ -1302,7 +1302,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean creeperRidable = false; -@@ -1214,6 +1232,7 @@ public class PurpurWorldConfig { +@@ -1219,6 +1237,7 @@ public class PurpurWorldConfig { public boolean creeperTakeDamageFromWater = false; public boolean creeperExplodeWhenKilled = false; public boolean creeperHealthRadius = false; @@ -1310,7 +1310,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void creeperSettings() { creeperRidable = getBoolean("mobs.creeper.ridable", creeperRidable); creeperRidableInWater = getBoolean("mobs.creeper.ridable-in-water", creeperRidableInWater); -@@ -1230,6 +1249,7 @@ public class PurpurWorldConfig { +@@ -1235,6 +1254,7 @@ public class PurpurWorldConfig { 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); @@ -1318,7 +1318,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean dolphinRidable = false; -@@ -1241,6 +1261,7 @@ public class PurpurWorldConfig { +@@ -1246,6 +1266,7 @@ public class PurpurWorldConfig { public boolean dolphinDisableTreasureSearching = false; public boolean dolphinTakeDamageFromWater = false; public double dolphinNaturallyAggressiveToPlayersChance = 0.0D; @@ -1326,7 +1326,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void dolphinSettings() { dolphinRidable = getBoolean("mobs.dolphin.ridable", dolphinRidable); dolphinControllable = getBoolean("mobs.dolphin.controllable", dolphinControllable); -@@ -1256,6 +1277,7 @@ public class PurpurWorldConfig { +@@ -1261,6 +1282,7 @@ public class PurpurWorldConfig { dolphinDisableTreasureSearching = getBoolean("mobs.dolphin.disable-treasure-searching", dolphinDisableTreasureSearching); dolphinTakeDamageFromWater = getBoolean("mobs.dolphin.takes-damage-from-water", dolphinTakeDamageFromWater); dolphinNaturallyAggressiveToPlayersChance = getDouble("mobs.dolphin.naturally-aggressive-to-players-chance", dolphinNaturallyAggressiveToPlayersChance); @@ -1334,7 +1334,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean donkeyRidableInWater = false; -@@ -1267,6 +1289,7 @@ public class PurpurWorldConfig { +@@ -1272,6 +1294,7 @@ public class PurpurWorldConfig { public double donkeyMovementSpeedMax = 0.175D; public int donkeyBreedingTicks = 6000; public boolean donkeyTakeDamageFromWater = false; @@ -1342,7 +1342,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void donkeySettings() { donkeyRidableInWater = getBoolean("mobs.donkey.ridable-in-water", donkeyRidableInWater); if (PurpurConfig.version < 10) { -@@ -1284,6 +1307,7 @@ public class PurpurWorldConfig { +@@ -1289,6 +1312,7 @@ public class PurpurWorldConfig { donkeyMovementSpeedMax = getDouble("mobs.donkey.attributes.movement_speed.max", donkeyMovementSpeedMax); donkeyBreedingTicks = getInt("mobs.donkey.breeding-delay-ticks", donkeyBreedingTicks); donkeyTakeDamageFromWater = getBoolean("mobs.donkey.takes-damage-from-water", donkeyTakeDamageFromWater); @@ -1350,7 +1350,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean drownedRidable = false; -@@ -1296,6 +1320,7 @@ public class PurpurWorldConfig { +@@ -1301,6 +1325,7 @@ public class PurpurWorldConfig { public boolean drownedJockeyTryExistingChickens = true; public boolean drownedTakeDamageFromWater = false; public boolean drownedBreakDoors = false; @@ -1358,7 +1358,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void drownedSettings() { drownedRidable = getBoolean("mobs.drowned.ridable", drownedRidable); drownedRidableInWater = getBoolean("mobs.drowned.ridable-in-water", drownedRidableInWater); -@@ -1312,12 +1337,14 @@ public class PurpurWorldConfig { +@@ -1317,12 +1342,14 @@ public class PurpurWorldConfig { drownedJockeyTryExistingChickens = getBoolean("mobs.drowned.jockey.try-existing-chickens", drownedJockeyTryExistingChickens); drownedTakeDamageFromWater = getBoolean("mobs.drowned.takes-damage-from-water", drownedTakeDamageFromWater); drownedBreakDoors = getBoolean("mobs.drowned.can-break-doors", drownedBreakDoors); @@ -1373,7 +1373,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void elderGuardianSettings() { elderGuardianRidable = getBoolean("mobs.elder_guardian.ridable", elderGuardianRidable); elderGuardianControllable = getBoolean("mobs.elder_guardian.controllable", elderGuardianControllable); -@@ -1328,6 +1355,7 @@ public class PurpurWorldConfig { +@@ -1333,6 +1360,7 @@ public class PurpurWorldConfig { } elderGuardianMaxHealth = getDouble("mobs.elder_guardian.attributes.max_health", elderGuardianMaxHealth); elderGuardianTakeDamageFromWater = getBoolean("mobs.elder_guardian.takes-damage-from-water", elderGuardianTakeDamageFromWater); @@ -1381,7 +1381,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean enderDragonRidable = false; -@@ -1373,6 +1401,7 @@ public class PurpurWorldConfig { +@@ -1378,6 +1406,7 @@ public class PurpurWorldConfig { public boolean endermanIgnorePlayerDragonHead = false; public boolean endermanDisableStareAggro = false; public boolean endermanIgnoreProjectiles = false; @@ -1389,7 +1389,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void endermanSettings() { endermanRidable = getBoolean("mobs.enderman.ridable", endermanRidable); endermanRidableInWater = getBoolean("mobs.enderman.ridable-in-water", endermanRidableInWater); -@@ -1396,6 +1425,7 @@ public class PurpurWorldConfig { +@@ -1401,6 +1430,7 @@ public class PurpurWorldConfig { endermanIgnorePlayerDragonHead = getBoolean("mobs.enderman.ignore-players-wearing-dragon-head", endermanIgnorePlayerDragonHead); endermanDisableStareAggro = getBoolean("mobs.enderman.disable-player-stare-aggression", endermanDisableStareAggro); endermanIgnoreProjectiles = getBoolean("mobs.enderman.ignore-projectiles", endermanIgnoreProjectiles); @@ -1397,7 +1397,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean endermiteRidable = false; -@@ -1403,6 +1433,7 @@ public class PurpurWorldConfig { +@@ -1408,6 +1438,7 @@ public class PurpurWorldConfig { public boolean endermiteControllable = true; public double endermiteMaxHealth = 8.0D; public boolean endermiteTakeDamageFromWater = false; @@ -1405,7 +1405,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void endermiteSettings() { endermiteRidable = getBoolean("mobs.endermite.ridable", endermiteRidable); endermiteRidableInWater = getBoolean("mobs.endermite.ridable-in-water", endermiteRidableInWater); -@@ -1414,6 +1445,7 @@ public class PurpurWorldConfig { +@@ -1419,6 +1450,7 @@ public class PurpurWorldConfig { } endermiteMaxHealth = getDouble("mobs.endermite.attributes.max_health", endermiteMaxHealth); endermiteTakeDamageFromWater = getBoolean("mobs.endermite.takes-damage-from-water", endermiteTakeDamageFromWater); @@ -1413,7 +1413,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean evokerRidable = false; -@@ -1422,6 +1454,7 @@ public class PurpurWorldConfig { +@@ -1427,6 +1459,7 @@ public class PurpurWorldConfig { public double evokerMaxHealth = 24.0D; public boolean evokerBypassMobGriefing = false; public boolean evokerTakeDamageFromWater = false; @@ -1421,7 +1421,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void evokerSettings() { evokerRidable = getBoolean("mobs.evoker.ridable", evokerRidable); evokerRidableInWater = getBoolean("mobs.evoker.ridable-in-water", evokerRidableInWater); -@@ -1434,6 +1467,7 @@ public class PurpurWorldConfig { +@@ -1439,6 +1472,7 @@ public class PurpurWorldConfig { evokerMaxHealth = getDouble("mobs.evoker.attributes.max_health", evokerMaxHealth); evokerBypassMobGriefing = getBoolean("mobs.evoker.bypass-mob-griefing", evokerBypassMobGriefing); evokerTakeDamageFromWater = getBoolean("mobs.evoker.takes-damage-from-water", evokerTakeDamageFromWater); @@ -1429,7 +1429,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean foxRidable = false; -@@ -1444,6 +1478,7 @@ public class PurpurWorldConfig { +@@ -1449,6 +1483,7 @@ public class PurpurWorldConfig { public int foxBreedingTicks = 6000; public boolean foxBypassMobGriefing = false; public boolean foxTakeDamageFromWater = false; @@ -1437,7 +1437,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void foxSettings() { foxRidable = getBoolean("mobs.fox.ridable", foxRidable); foxRidableInWater = getBoolean("mobs.fox.ridable-in-water", foxRidableInWater); -@@ -1458,6 +1493,7 @@ public class PurpurWorldConfig { +@@ -1463,6 +1498,7 @@ public class PurpurWorldConfig { foxBreedingTicks = getInt("mobs.fox.breeding-delay-ticks", foxBreedingTicks); foxBypassMobGriefing = getBoolean("mobs.fox.bypass-mob-griefing", foxBypassMobGriefing); foxTakeDamageFromWater = getBoolean("mobs.fox.takes-damage-from-water", foxTakeDamageFromWater); @@ -1445,7 +1445,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean frogRidable = false; -@@ -1479,6 +1515,7 @@ public class PurpurWorldConfig { +@@ -1484,6 +1520,7 @@ public class PurpurWorldConfig { public double ghastMaxY = 320D; public double ghastMaxHealth = 10.0D; public boolean ghastTakeDamageFromWater = false; @@ -1453,7 +1453,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void ghastSettings() { ghastRidable = getBoolean("mobs.ghast.ridable", ghastRidable); ghastRidableInWater = getBoolean("mobs.ghast.ridable-in-water", ghastRidableInWater); -@@ -1491,6 +1528,7 @@ public class PurpurWorldConfig { +@@ -1496,6 +1533,7 @@ public class PurpurWorldConfig { } ghastMaxHealth = getDouble("mobs.ghast.attributes.max_health", ghastMaxHealth); ghastTakeDamageFromWater = getBoolean("mobs.ghast.takes-damage-from-water", ghastTakeDamageFromWater); @@ -1461,7 +1461,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean giantRidable = false; -@@ -1504,6 +1542,7 @@ public class PurpurWorldConfig { +@@ -1509,6 +1547,7 @@ public class PurpurWorldConfig { public boolean giantHaveAI = false; public boolean giantHaveHostileAI = false; public boolean giantTakeDamageFromWater = false; @@ -1469,7 +1469,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void giantSettings() { giantRidable = getBoolean("mobs.giant.ridable", giantRidable); giantRidableInWater = getBoolean("mobs.giant.ridable-in-water", giantRidableInWater); -@@ -1525,6 +1564,7 @@ public class PurpurWorldConfig { +@@ -1530,6 +1569,7 @@ public class PurpurWorldConfig { giantHaveAI = getBoolean("mobs.giant.have-ai", giantHaveAI); giantHaveHostileAI = getBoolean("mobs.giant.have-hostile-ai", giantHaveHostileAI); giantTakeDamageFromWater = getBoolean("mobs.giant.takes-damage-from-water", giantTakeDamageFromWater); @@ -1477,7 +1477,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean glowSquidRidable = false; -@@ -1532,12 +1572,14 @@ public class PurpurWorldConfig { +@@ -1537,12 +1577,14 @@ public class PurpurWorldConfig { public double glowSquidMaxHealth = 10.0D; public boolean glowSquidsCanFly = false; public boolean glowSquidTakeDamageFromWater = false; @@ -1492,7 +1492,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean goatRidable = false; -@@ -1546,6 +1588,7 @@ public class PurpurWorldConfig { +@@ -1551,6 +1593,7 @@ public class PurpurWorldConfig { public double goatMaxHealth = 10.0D; public int goatBreedingTicks = 6000; public boolean goatTakeDamageFromWater = false; @@ -1500,7 +1500,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void goatSettings() { goatRidable = getBoolean("mobs.goat.ridable", goatRidable); goatRidableInWater = getBoolean("mobs.goat.ridable-in-water", goatRidableInWater); -@@ -1553,12 +1596,14 @@ public class PurpurWorldConfig { +@@ -1558,12 +1601,14 @@ public class PurpurWorldConfig { goatMaxHealth = getDouble("mobs.goat.attributes.max_health", goatMaxHealth); goatBreedingTicks = getInt("mobs.goat.breeding-delay-ticks", goatBreedingTicks); goatTakeDamageFromWater = getBoolean("mobs.goat.takes-damage-from-water", goatTakeDamageFromWater); @@ -1515,7 +1515,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void guardianSettings() { guardianRidable = getBoolean("mobs.guardian.ridable", guardianRidable); guardianControllable = getBoolean("mobs.guardian.controllable", guardianControllable); -@@ -1569,6 +1614,7 @@ public class PurpurWorldConfig { +@@ -1574,6 +1619,7 @@ public class PurpurWorldConfig { } guardianMaxHealth = getDouble("mobs.guardian.attributes.max_health", guardianMaxHealth); guardianTakeDamageFromWater = getBoolean("mobs.guardian.takes-damage-from-water", guardianTakeDamageFromWater); @@ -1523,7 +1523,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean forceHalloweenSeason = false; -@@ -1584,6 +1630,7 @@ public class PurpurWorldConfig { +@@ -1589,6 +1635,7 @@ public class PurpurWorldConfig { public double hoglinMaxHealth = 40.0D; public int hoglinBreedingTicks = 6000; public boolean hoglinTakeDamageFromWater = false; @@ -1531,7 +1531,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void hoglinSettings() { hoglinRidable = getBoolean("mobs.hoglin.ridable", hoglinRidable); hoglinRidableInWater = getBoolean("mobs.hoglin.ridable-in-water", hoglinRidableInWater); -@@ -1596,6 +1643,7 @@ public class PurpurWorldConfig { +@@ -1601,6 +1648,7 @@ public class PurpurWorldConfig { hoglinMaxHealth = getDouble("mobs.hoglin.attributes.max_health", hoglinMaxHealth); hoglinBreedingTicks = getInt("mobs.hoglin.breeding-delay-ticks", hoglinBreedingTicks); hoglinTakeDamageFromWater = getBoolean("mobs.hoglin.takes-damage-from-water", hoglinTakeDamageFromWater); @@ -1539,23 +1539,23 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean horseRidableInWater = false; -@@ -1608,6 +1656,7 @@ public class PurpurWorldConfig { +@@ -1612,6 +1660,7 @@ public class PurpurWorldConfig { + public double horseMovementSpeedMax = 0.3375D; public int horseBreedingTicks = 6000; public boolean horseTakeDamageFromWater = false; - public boolean horseStandWithRider = true; + public boolean horseAlwaysDropExp = false; private void horseSettings() { horseRidableInWater = getBoolean("mobs.horse.ridable-in-water", horseRidableInWater); if (PurpurConfig.version < 10) { -@@ -1626,6 +1675,7 @@ public class PurpurWorldConfig { +@@ -1629,6 +1678,7 @@ public class PurpurWorldConfig { + horseMovementSpeedMax = getDouble("mobs.horse.attributes.movement_speed.max", horseMovementSpeedMax); horseBreedingTicks = getInt("mobs.horse.breeding-delay-ticks", horseBreedingTicks); horseTakeDamageFromWater = getBoolean("mobs.horse.takes-damage-from-water", horseTakeDamageFromWater); - horseStandWithRider = getBoolean("mobs.horse.stand-with-rider", horseStandWithRider); + horseAlwaysDropExp = getBoolean("mobs.horse.always-drop-exp", horseAlwaysDropExp); } public boolean huskRidable = false; -@@ -1637,6 +1687,7 @@ public class PurpurWorldConfig { +@@ -1640,6 +1690,7 @@ public class PurpurWorldConfig { public double huskJockeyChance = 0.05D; public boolean huskJockeyTryExistingChickens = true; public boolean huskTakeDamageFromWater = false; @@ -1563,7 +1563,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void huskSettings() { huskRidable = getBoolean("mobs.husk.ridable", huskRidable); huskRidableInWater = getBoolean("mobs.husk.ridable-in-water", huskRidableInWater); -@@ -1652,6 +1703,7 @@ public class PurpurWorldConfig { +@@ -1655,6 +1706,7 @@ public class PurpurWorldConfig { huskJockeyChance = getDouble("mobs.husk.jockey.chance", huskJockeyChance); huskJockeyTryExistingChickens = getBoolean("mobs.husk.jockey.try-existing-chickens", huskJockeyTryExistingChickens); huskTakeDamageFromWater = getBoolean("mobs.husk.takes-damage-from-water", huskTakeDamageFromWater); @@ -1571,7 +1571,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean illusionerRidable = false; -@@ -1661,6 +1713,7 @@ public class PurpurWorldConfig { +@@ -1664,6 +1716,7 @@ public class PurpurWorldConfig { public double illusionerFollowRange = 18.0D; public double illusionerMaxHealth = 32.0D; public boolean illusionerTakeDamageFromWater = false; @@ -1579,7 +1579,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void illusionerSettings() { illusionerRidable = getBoolean("mobs.illusioner.ridable", illusionerRidable); illusionerRidableInWater = getBoolean("mobs.illusioner.ridable-in-water", illusionerRidableInWater); -@@ -1678,6 +1731,7 @@ public class PurpurWorldConfig { +@@ -1681,6 +1734,7 @@ public class PurpurWorldConfig { } illusionerMaxHealth = getDouble("mobs.illusioner.attributes.max_health", illusionerMaxHealth); illusionerTakeDamageFromWater = getBoolean("mobs.illusioner.takes-damage-from-water", illusionerTakeDamageFromWater); @@ -1587,7 +1587,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean ironGolemRidable = false; -@@ -1688,6 +1742,7 @@ public class PurpurWorldConfig { +@@ -1691,6 +1745,7 @@ public class PurpurWorldConfig { public boolean ironGolemTakeDamageFromWater = false; public boolean ironGolemPoppyCalm = false; public boolean ironGolemHealCalm = false; @@ -1595,7 +1595,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void ironGolemSettings() { ironGolemRidable = getBoolean("mobs.iron_golem.ridable", ironGolemRidable); ironGolemRidableInWater = getBoolean("mobs.iron_golem.ridable-in-water", ironGolemRidableInWater); -@@ -1702,6 +1757,7 @@ public class PurpurWorldConfig { +@@ -1705,6 +1760,7 @@ public class PurpurWorldConfig { ironGolemTakeDamageFromWater = getBoolean("mobs.iron_golem.takes-damage-from-water", ironGolemTakeDamageFromWater); ironGolemPoppyCalm = getBoolean("mobs.iron_golem.poppy-calms-anger", ironGolemPoppyCalm); ironGolemHealCalm = getBoolean("mobs.iron_golem.healing-calms-anger", ironGolemHealCalm); @@ -1603,7 +1603,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean llamaRidable = false; -@@ -1716,6 +1772,7 @@ public class PurpurWorldConfig { +@@ -1719,6 +1775,7 @@ public class PurpurWorldConfig { public int llamaBreedingTicks = 6000; public boolean llamaTakeDamageFromWater = false; public boolean llamaJoinCaravans = true; @@ -1611,7 +1611,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void llamaSettings() { llamaRidable = getBoolean("mobs.llama.ridable", llamaRidable); llamaRidableInWater = getBoolean("mobs.llama.ridable-in-water", llamaRidableInWater); -@@ -1736,6 +1793,7 @@ public class PurpurWorldConfig { +@@ -1739,6 +1796,7 @@ public class PurpurWorldConfig { llamaBreedingTicks = getInt("mobs.llama.breeding-delay-ticks", llamaBreedingTicks); llamaTakeDamageFromWater = getBoolean("mobs.llama.takes-damage-from-water", llamaTakeDamageFromWater); llamaJoinCaravans = getBoolean("mobs.llama.join-caravans", llamaJoinCaravans); @@ -1619,7 +1619,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean magmaCubeRidable = false; -@@ -1746,6 +1804,7 @@ public class PurpurWorldConfig { +@@ -1749,6 +1807,7 @@ public class PurpurWorldConfig { public Map magmaCubeMaxHealthCache = new HashMap<>(); public Map magmaCubeAttackDamageCache = new HashMap<>(); public boolean magmaCubeTakeDamageFromWater = false; @@ -1627,7 +1627,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void magmaCubeSettings() { magmaCubeRidable = getBoolean("mobs.magma_cube.ridable", magmaCubeRidable); magmaCubeRidableInWater = getBoolean("mobs.magma_cube.ridable-in-water", magmaCubeRidableInWater); -@@ -1760,6 +1819,7 @@ public class PurpurWorldConfig { +@@ -1763,6 +1822,7 @@ public class PurpurWorldConfig { magmaCubeMaxHealthCache.clear(); magmaCubeAttackDamageCache.clear(); magmaCubeTakeDamageFromWater = getBoolean("mobs.magma_cube.takes-damage-from-water", magmaCubeTakeDamageFromWater); @@ -1635,7 +1635,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean mooshroomRidable = false; -@@ -1768,6 +1828,7 @@ public class PurpurWorldConfig { +@@ -1771,6 +1831,7 @@ public class PurpurWorldConfig { public double mooshroomMaxHealth = 10.0D; public int mooshroomBreedingTicks = 6000; public boolean mooshroomTakeDamageFromWater = false; @@ -1643,7 +1643,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void mooshroomSettings() { mooshroomRidable = getBoolean("mobs.mooshroom.ridable", mooshroomRidable); mooshroomRidableInWater = getBoolean("mobs.mooshroom.ridable-in-water", mooshroomRidableInWater); -@@ -1780,6 +1841,7 @@ public class PurpurWorldConfig { +@@ -1783,6 +1844,7 @@ public class PurpurWorldConfig { mooshroomMaxHealth = getDouble("mobs.mooshroom.attributes.max_health", mooshroomMaxHealth); mooshroomBreedingTicks = getInt("mobs.mooshroom.breeding-delay-ticks", mooshroomBreedingTicks); mooshroomTakeDamageFromWater = getBoolean("mobs.mooshroom.takes-damage-from-water", mooshroomTakeDamageFromWater); @@ -1651,7 +1651,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean muleRidableInWater = false; -@@ -1791,6 +1853,7 @@ public class PurpurWorldConfig { +@@ -1794,6 +1856,7 @@ public class PurpurWorldConfig { public double muleMovementSpeedMax = 0.175D; public int muleBreedingTicks = 6000; public boolean muleTakeDamageFromWater = false; @@ -1659,7 +1659,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void muleSettings() { muleRidableInWater = getBoolean("mobs.mule.ridable-in-water", muleRidableInWater); if (PurpurConfig.version < 10) { -@@ -1808,6 +1871,7 @@ public class PurpurWorldConfig { +@@ -1811,6 +1874,7 @@ public class PurpurWorldConfig { muleMovementSpeedMax = getDouble("mobs.mule.attributes.movement_speed.max", muleMovementSpeedMax); muleBreedingTicks = getInt("mobs.mule.breeding-delay-ticks", muleBreedingTicks); muleTakeDamageFromWater = getBoolean("mobs.mule.takes-damage-from-water", muleTakeDamageFromWater); @@ -1667,7 +1667,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean ocelotRidable = false; -@@ -1816,6 +1880,7 @@ public class PurpurWorldConfig { +@@ -1819,6 +1883,7 @@ public class PurpurWorldConfig { public double ocelotMaxHealth = 10.0D; public int ocelotBreedingTicks = 6000; public boolean ocelotTakeDamageFromWater = false; @@ -1675,7 +1675,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void ocelotSettings() { ocelotRidable = getBoolean("mobs.ocelot.ridable", ocelotRidable); ocelotRidableInWater = getBoolean("mobs.ocelot.ridable-in-water", ocelotRidableInWater); -@@ -1828,6 +1893,7 @@ public class PurpurWorldConfig { +@@ -1831,6 +1896,7 @@ public class PurpurWorldConfig { ocelotMaxHealth = getDouble("mobs.ocelot.attributes.max_health", ocelotMaxHealth); ocelotBreedingTicks = getInt("mobs.ocelot.breeding-delay-ticks", ocelotBreedingTicks); ocelotTakeDamageFromWater = getBoolean("mobs.ocelot.takes-damage-from-water", ocelotTakeDamageFromWater); @@ -1683,7 +1683,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean pandaRidable = false; -@@ -1836,6 +1902,7 @@ public class PurpurWorldConfig { +@@ -1839,6 +1905,7 @@ public class PurpurWorldConfig { public double pandaMaxHealth = 20.0D; public int pandaBreedingTicks = 6000; public boolean pandaTakeDamageFromWater = false; @@ -1691,7 +1691,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void pandaSettings() { pandaRidable = getBoolean("mobs.panda.ridable", pandaRidable); pandaRidableInWater = getBoolean("mobs.panda.ridable-in-water", pandaRidableInWater); -@@ -1848,6 +1915,7 @@ public class PurpurWorldConfig { +@@ -1851,6 +1918,7 @@ public class PurpurWorldConfig { pandaMaxHealth = getDouble("mobs.panda.attributes.max_health", pandaMaxHealth); pandaBreedingTicks = getInt("mobs.panda.breeding-delay-ticks", pandaBreedingTicks); pandaTakeDamageFromWater = getBoolean("mobs.panda.takes-damage-from-water", pandaTakeDamageFromWater); @@ -1699,7 +1699,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean parrotRidable = false; -@@ -1857,6 +1925,7 @@ public class PurpurWorldConfig { +@@ -1860,6 +1928,7 @@ public class PurpurWorldConfig { public double parrotMaxHealth = 6.0D; public boolean parrotTakeDamageFromWater = false; public boolean parrotBreedable = false; @@ -1707,7 +1707,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void parrotSettings() { parrotRidable = getBoolean("mobs.parrot.ridable", parrotRidable); parrotRidableInWater = getBoolean("mobs.parrot.ridable-in-water", parrotRidableInWater); -@@ -1870,6 +1939,7 @@ public class PurpurWorldConfig { +@@ -1873,6 +1942,7 @@ public class PurpurWorldConfig { parrotMaxHealth = getDouble("mobs.parrot.attributes.max_health", parrotMaxHealth); parrotTakeDamageFromWater = getBoolean("mobs.parrot.takes-damage-from-water", parrotTakeDamageFromWater); parrotBreedable = getBoolean("mobs.parrot.can-breed", parrotBreedable); @@ -1715,7 +1715,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean phantomRidable = false; -@@ -1897,6 +1967,7 @@ public class PurpurWorldConfig { +@@ -1900,6 +1970,7 @@ public class PurpurWorldConfig { public boolean phantomBurnInDaylight = true; public boolean phantomFlamesOnSwoop = false; public boolean phantomTakeDamageFromWater = false; @@ -1723,7 +1723,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void phantomSettings() { phantomRidable = getBoolean("mobs.phantom.ridable", phantomRidable); phantomRidableInWater = getBoolean("mobs.phantom.ridable-in-water", phantomRidableInWater); -@@ -1932,6 +2003,7 @@ public class PurpurWorldConfig { +@@ -1935,6 +2006,7 @@ public class PurpurWorldConfig { phantomIgnorePlayersWithTorch = getBoolean("mobs.phantom.ignore-players-with-torch", phantomIgnorePlayersWithTorch); phantomFlamesOnSwoop = getBoolean("mobs.phantom.flames-on-swoop", phantomFlamesOnSwoop); phantomTakeDamageFromWater = getBoolean("mobs.phantom.takes-damage-from-water", phantomTakeDamageFromWater); @@ -1731,7 +1731,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean pigRidable = false; -@@ -1941,6 +2013,7 @@ public class PurpurWorldConfig { +@@ -1944,6 +2016,7 @@ public class PurpurWorldConfig { public boolean pigGiveSaddleBack = false; public int pigBreedingTicks = 6000; public boolean pigTakeDamageFromWater = false; @@ -1739,7 +1739,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void pigSettings() { pigRidable = getBoolean("mobs.pig.ridable", pigRidable); pigRidableInWater = getBoolean("mobs.pig.ridable-in-water", pigRidableInWater); -@@ -1954,6 +2027,7 @@ public class PurpurWorldConfig { +@@ -1957,6 +2030,7 @@ public class PurpurWorldConfig { pigGiveSaddleBack = getBoolean("mobs.pig.give-saddle-back", pigGiveSaddleBack); pigBreedingTicks = getInt("mobs.pig.breeding-delay-ticks", pigBreedingTicks); pigTakeDamageFromWater = getBoolean("mobs.pig.takes-damage-from-water", pigTakeDamageFromWater); @@ -1747,7 +1747,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean piglinRidable = false; -@@ -1963,6 +2037,7 @@ public class PurpurWorldConfig { +@@ -1966,6 +2040,7 @@ public class PurpurWorldConfig { public boolean piglinBypassMobGriefing = false; public boolean piglinTakeDamageFromWater = false; public int piglinPortalSpawnModifier = 2000; @@ -1755,7 +1755,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void piglinSettings() { piglinRidable = getBoolean("mobs.piglin.ridable", piglinRidable); piglinRidableInWater = getBoolean("mobs.piglin.ridable-in-water", piglinRidableInWater); -@@ -1976,6 +2051,7 @@ public class PurpurWorldConfig { +@@ -1979,6 +2054,7 @@ public class PurpurWorldConfig { piglinBypassMobGriefing = getBoolean("mobs.piglin.bypass-mob-griefing", piglinBypassMobGriefing); piglinTakeDamageFromWater = getBoolean("mobs.piglin.takes-damage-from-water", piglinTakeDamageFromWater); piglinPortalSpawnModifier = getInt("mobs.piglin.portal-spawn-modifier", piglinPortalSpawnModifier); @@ -1763,7 +1763,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean piglinBruteRidable = false; -@@ -1983,6 +2059,7 @@ public class PurpurWorldConfig { +@@ -1986,6 +2062,7 @@ public class PurpurWorldConfig { public boolean piglinBruteControllable = true; public double piglinBruteMaxHealth = 50.0D; public boolean piglinBruteTakeDamageFromWater = false; @@ -1771,7 +1771,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void piglinBruteSettings() { piglinBruteRidable = getBoolean("mobs.piglin_brute.ridable", piglinBruteRidable); piglinBruteRidableInWater = getBoolean("mobs.piglin_brute.ridable-in-water", piglinBruteRidableInWater); -@@ -1994,6 +2071,7 @@ public class PurpurWorldConfig { +@@ -1997,6 +2074,7 @@ public class PurpurWorldConfig { } piglinBruteMaxHealth = getDouble("mobs.piglin_brute.attributes.max_health", piglinBruteMaxHealth); piglinBruteTakeDamageFromWater = getBoolean("mobs.piglin_brute.takes-damage-from-water", piglinBruteTakeDamageFromWater); @@ -1779,7 +1779,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean pillagerRidable = false; -@@ -2002,6 +2080,7 @@ public class PurpurWorldConfig { +@@ -2005,6 +2083,7 @@ public class PurpurWorldConfig { public double pillagerMaxHealth = 24.0D; public boolean pillagerBypassMobGriefing = false; public boolean pillagerTakeDamageFromWater = false; @@ -1787,7 +1787,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void pillagerSettings() { pillagerRidable = getBoolean("mobs.pillager.ridable", pillagerRidable); pillagerRidableInWater = getBoolean("mobs.pillager.ridable-in-water", pillagerRidableInWater); -@@ -2014,6 +2093,7 @@ public class PurpurWorldConfig { +@@ -2017,6 +2096,7 @@ public class PurpurWorldConfig { pillagerMaxHealth = getDouble("mobs.pillager.attributes.max_health", pillagerMaxHealth); pillagerBypassMobGriefing = getBoolean("mobs.pillager.bypass-mob-griefing", pillagerBypassMobGriefing); pillagerTakeDamageFromWater = getBoolean("mobs.pillager.takes-damage-from-water", pillagerTakeDamageFromWater); @@ -1795,7 +1795,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean polarBearRidable = false; -@@ -2024,6 +2104,7 @@ public class PurpurWorldConfig { +@@ -2027,6 +2107,7 @@ public class PurpurWorldConfig { public Item polarBearBreedableItem = null; public int polarBearBreedingTicks = 6000; public boolean polarBearTakeDamageFromWater = false; @@ -1803,7 +1803,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void polarBearSettings() { polarBearRidable = getBoolean("mobs.polar_bear.ridable", polarBearRidable); polarBearRidableInWater = getBoolean("mobs.polar_bear.ridable-in-water", polarBearRidableInWater); -@@ -2039,12 +2120,14 @@ public class PurpurWorldConfig { +@@ -2042,12 +2123,14 @@ public class PurpurWorldConfig { if (item != Items.AIR) polarBearBreedableItem = item; polarBearBreedingTicks = getInt("mobs.polar_bear.breeding-delay-ticks", polarBearBreedingTicks); polarBearTakeDamageFromWater = getBoolean("mobs.polar_bear.takes-damage-from-water", polarBearTakeDamageFromWater); @@ -1818,7 +1818,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void pufferfishSettings() { pufferfishRidable = getBoolean("mobs.pufferfish.ridable", pufferfishRidable); pufferfishControllable = getBoolean("mobs.pufferfish.controllable", pufferfishControllable); -@@ -2055,6 +2138,7 @@ public class PurpurWorldConfig { +@@ -2058,6 +2141,7 @@ public class PurpurWorldConfig { } pufferfishMaxHealth = getDouble("mobs.pufferfish.attributes.max_health", pufferfishMaxHealth); pufferfishTakeDamageFromWater = getBoolean("mobs.pufferfish.takes-damage-from-water", pufferfishTakeDamageFromWater); @@ -1826,7 +1826,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean rabbitRidable = false; -@@ -2066,6 +2150,7 @@ public class PurpurWorldConfig { +@@ -2069,6 +2153,7 @@ public class PurpurWorldConfig { public int rabbitBreedingTicks = 6000; public boolean rabbitBypassMobGriefing = false; public boolean rabbitTakeDamageFromWater = false; @@ -1834,7 +1834,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void rabbitSettings() { rabbitRidable = getBoolean("mobs.rabbit.ridable", rabbitRidable); rabbitRidableInWater = getBoolean("mobs.rabbit.ridable-in-water", rabbitRidableInWater); -@@ -2081,6 +2166,7 @@ public class PurpurWorldConfig { +@@ -2084,6 +2169,7 @@ public class PurpurWorldConfig { rabbitBreedingTicks = getInt("mobs.rabbit.breeding-delay-ticks", rabbitBreedingTicks); rabbitBypassMobGriefing = getBoolean("mobs.rabbit.bypass-mob-griefing", rabbitBypassMobGriefing); rabbitTakeDamageFromWater = getBoolean("mobs.rabbit.takes-damage-from-water", rabbitTakeDamageFromWater); @@ -1842,7 +1842,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean ravagerRidable = false; -@@ -2090,6 +2176,7 @@ public class PurpurWorldConfig { +@@ -2093,6 +2179,7 @@ public class PurpurWorldConfig { public boolean ravagerBypassMobGriefing = false; public boolean ravagerTakeDamageFromWater = false; public List ravagerGriefableBlocks = new ArrayList<>(); @@ -1850,7 +1850,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void ravagerSettings() { ravagerRidable = getBoolean("mobs.ravager.ridable", ravagerRidable); ravagerRidableInWater = getBoolean("mobs.ravager.ridable-in-water", ravagerRidableInWater); -@@ -2119,12 +2206,14 @@ public class PurpurWorldConfig { +@@ -2122,12 +2209,14 @@ public class PurpurWorldConfig { ravagerGriefableBlocks.add(block); } }); @@ -1865,7 +1865,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void salmonSettings() { salmonRidable = getBoolean("mobs.salmon.ridable", salmonRidable); salmonControllable = getBoolean("mobs.salmon.controllable", salmonControllable); -@@ -2135,6 +2224,7 @@ public class PurpurWorldConfig { +@@ -2138,6 +2227,7 @@ public class PurpurWorldConfig { } salmonMaxHealth = getDouble("mobs.salmon.attributes.max_health", salmonMaxHealth); salmonTakeDamageFromWater = getBoolean("mobs.salmon.takes-damage-from-water", salmonTakeDamageFromWater); @@ -1873,7 +1873,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean sheepRidable = false; -@@ -2144,6 +2234,7 @@ public class PurpurWorldConfig { +@@ -2147,6 +2237,7 @@ public class PurpurWorldConfig { public int sheepBreedingTicks = 6000; public boolean sheepBypassMobGriefing = false; public boolean sheepTakeDamageFromWater = false; @@ -1881,7 +1881,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void sheepSettings() { sheepRidable = getBoolean("mobs.sheep.ridable", sheepRidable); sheepRidableInWater = getBoolean("mobs.sheep.ridable-in-water", sheepRidableInWater); -@@ -2157,6 +2248,7 @@ public class PurpurWorldConfig { +@@ -2160,6 +2251,7 @@ public class PurpurWorldConfig { sheepBreedingTicks = getInt("mobs.sheep.breeding-delay-ticks", sheepBreedingTicks); sheepBypassMobGriefing = getBoolean("mobs.sheep.bypass-mob-griefing", sheepBypassMobGriefing); sheepTakeDamageFromWater = getBoolean("mobs.sheep.takes-damage-from-water", sheepTakeDamageFromWater); @@ -1889,7 +1889,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean shulkerRidable = false; -@@ -2170,6 +2262,7 @@ public class PurpurWorldConfig { +@@ -2173,6 +2265,7 @@ public class PurpurWorldConfig { public String shulkerSpawnFromBulletNearbyEquation = "(nearby - 1) / 5.0"; public boolean shulkerSpawnFromBulletRandomColor = false; public boolean shulkerChangeColorWithDye = false; @@ -1897,7 +1897,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void shulkerSettings() { shulkerRidable = getBoolean("mobs.shulker.ridable", shulkerRidable); shulkerRidableInWater = getBoolean("mobs.shulker.ridable-in-water", shulkerRidableInWater); -@@ -2187,6 +2280,7 @@ public class PurpurWorldConfig { +@@ -2190,6 +2283,7 @@ public class PurpurWorldConfig { shulkerSpawnFromBulletNearbyEquation = getString("mobs.shulker.spawn-from-bullet.nearby-equation", shulkerSpawnFromBulletNearbyEquation); shulkerSpawnFromBulletRandomColor = getBoolean("mobs.shulker.spawn-from-bullet.random-color", shulkerSpawnFromBulletRandomColor); shulkerChangeColorWithDye = getBoolean("mobs.shulker.change-color-with-dye", shulkerChangeColorWithDye); @@ -1905,7 +1905,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean silverfishRidable = false; -@@ -2195,6 +2289,7 @@ public class PurpurWorldConfig { +@@ -2198,6 +2292,7 @@ public class PurpurWorldConfig { public double silverfishMaxHealth = 8.0D; public boolean silverfishBypassMobGriefing = false; public boolean silverfishTakeDamageFromWater = false; @@ -1913,7 +1913,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void silverfishSettings() { silverfishRidable = getBoolean("mobs.silverfish.ridable", silverfishRidable); silverfishRidableInWater = getBoolean("mobs.silverfish.ridable-in-water", silverfishRidableInWater); -@@ -2207,6 +2302,7 @@ public class PurpurWorldConfig { +@@ -2210,6 +2305,7 @@ public class PurpurWorldConfig { silverfishMaxHealth = getDouble("mobs.silverfish.attributes.max_health", silverfishMaxHealth); silverfishBypassMobGriefing = getBoolean("mobs.silverfish.bypass-mob-griefing", silverfishBypassMobGriefing); silverfishTakeDamageFromWater = getBoolean("mobs.silverfish.takes-damage-from-water", silverfishTakeDamageFromWater); @@ -1921,7 +1921,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean skeletonRidable = false; -@@ -2214,6 +2310,7 @@ public class PurpurWorldConfig { +@@ -2217,6 +2313,7 @@ public class PurpurWorldConfig { public boolean skeletonControllable = true; public double skeletonMaxHealth = 20.0D; public boolean skeletonTakeDamageFromWater = false; @@ -1929,7 +1929,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void skeletonSettings() { skeletonRidable = getBoolean("mobs.skeleton.ridable", skeletonRidable); skeletonRidableInWater = getBoolean("mobs.skeleton.ridable-in-water", skeletonRidableInWater); -@@ -2225,6 +2322,7 @@ public class PurpurWorldConfig { +@@ -2228,6 +2325,7 @@ public class PurpurWorldConfig { } skeletonMaxHealth = getDouble("mobs.skeleton.attributes.max_health", skeletonMaxHealth); skeletonTakeDamageFromWater = getBoolean("mobs.skeleton.takes-damage-from-water", skeletonTakeDamageFromWater); @@ -1937,7 +1937,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean skeletonHorseRidableInWater = true; -@@ -2236,6 +2334,7 @@ public class PurpurWorldConfig { +@@ -2239,6 +2337,7 @@ public class PurpurWorldConfig { public double skeletonHorseMovementSpeedMin = 0.2D; public double skeletonHorseMovementSpeedMax = 0.2D; public boolean skeletonHorseTakeDamageFromWater = false; @@ -1945,7 +1945,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void skeletonHorseSettings() { skeletonHorseRidableInWater = getBoolean("mobs.skeleton_horse.ridable-in-water", skeletonHorseRidableInWater); skeletonHorseCanSwim = getBoolean("mobs.skeleton_horse.can-swim", skeletonHorseCanSwim); -@@ -2252,6 +2351,7 @@ public class PurpurWorldConfig { +@@ -2255,6 +2354,7 @@ public class PurpurWorldConfig { skeletonHorseMovementSpeedMin = getDouble("mobs.skeleton_horse.attributes.movement_speed.min", skeletonHorseMovementSpeedMin); skeletonHorseMovementSpeedMax = getDouble("mobs.skeleton_horse.attributes.movement_speed.max", skeletonHorseMovementSpeedMax); skeletonHorseTakeDamageFromWater = getBoolean("mobs.skeleton_horse.takes-damage-from-water", skeletonHorseTakeDamageFromWater); @@ -1953,7 +1953,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean slimeRidable = false; -@@ -2262,6 +2362,7 @@ public class PurpurWorldConfig { +@@ -2265,6 +2365,7 @@ public class PurpurWorldConfig { public Map slimeMaxHealthCache = new HashMap<>(); public Map slimeAttackDamageCache = new HashMap<>(); public boolean slimeTakeDamageFromWater = false; @@ -1961,7 +1961,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void slimeSettings() { slimeRidable = getBoolean("mobs.slime.ridable", slimeRidable); slimeRidableInWater = getBoolean("mobs.slime.ridable-in-water", slimeRidableInWater); -@@ -2276,6 +2377,7 @@ public class PurpurWorldConfig { +@@ -2279,6 +2380,7 @@ public class PurpurWorldConfig { slimeMaxHealthCache.clear(); slimeAttackDamageCache.clear(); slimeTakeDamageFromWater = getBoolean("mobs.slime.takes-damage-from-water", slimeTakeDamageFromWater); @@ -1969,7 +1969,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean snowGolemRidable = false; -@@ -2291,6 +2393,7 @@ public class PurpurWorldConfig { +@@ -2294,6 +2396,7 @@ public class PurpurWorldConfig { public double snowGolemAttackDistance = 1.25D; public boolean snowGolemBypassMobGriefing = false; public boolean snowGolemTakeDamageFromWater = true; @@ -1977,7 +1977,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void snowGolemSettings() { snowGolemRidable = getBoolean("mobs.snow_golem.ridable", snowGolemRidable); snowGolemRidableInWater = getBoolean("mobs.snow_golem.ridable-in-water", snowGolemRidableInWater); -@@ -2310,6 +2413,7 @@ public class PurpurWorldConfig { +@@ -2313,6 +2416,7 @@ public class PurpurWorldConfig { snowGolemAttackDistance = getDouble("mobs.snow_golem.attack-distance", snowGolemAttackDistance); snowGolemBypassMobGriefing = getBoolean("mobs.snow_golem.bypass-mob-griefing", snowGolemBypassMobGriefing); snowGolemTakeDamageFromWater = getBoolean("mobs.snow_golem.takes-damage-from-water", snowGolemTakeDamageFromWater); @@ -1985,7 +1985,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean squidRidable = false; -@@ -2319,6 +2423,7 @@ public class PurpurWorldConfig { +@@ -2322,6 +2426,7 @@ public class PurpurWorldConfig { public double squidOffsetWaterCheck = 0.0D; public boolean squidsCanFly = false; public boolean squidTakeDamageFromWater = false; @@ -1993,7 +1993,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void squidSettings() { squidRidable = getBoolean("mobs.squid.ridable", squidRidable); squidControllable = getBoolean("mobs.squid.controllable", squidControllable); -@@ -2332,6 +2437,7 @@ public class PurpurWorldConfig { +@@ -2335,6 +2440,7 @@ public class PurpurWorldConfig { squidOffsetWaterCheck = getDouble("mobs.squid.water-offset-check", squidOffsetWaterCheck); squidsCanFly = getBoolean("mobs.squid.can-fly", squidsCanFly); squidTakeDamageFromWater = getBoolean("mobs.squid.takes-damage-from-water", squidTakeDamageFromWater); @@ -2001,7 +2001,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean spiderRidable = false; -@@ -2339,6 +2445,7 @@ public class PurpurWorldConfig { +@@ -2342,6 +2448,7 @@ public class PurpurWorldConfig { public boolean spiderControllable = true; public double spiderMaxHealth = 16.0D; public boolean spiderTakeDamageFromWater = false; @@ -2009,7 +2009,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void spiderSettings() { spiderRidable = getBoolean("mobs.spider.ridable", spiderRidable); spiderRidableInWater = getBoolean("mobs.spider.ridable-in-water", spiderRidableInWater); -@@ -2350,6 +2457,7 @@ public class PurpurWorldConfig { +@@ -2353,6 +2460,7 @@ public class PurpurWorldConfig { } spiderMaxHealth = getDouble("mobs.spider.attributes.max_health", spiderMaxHealth); spiderTakeDamageFromWater = getBoolean("mobs.spider.takes-damage-from-water", spiderTakeDamageFromWater); @@ -2017,7 +2017,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean strayRidable = false; -@@ -2357,6 +2465,7 @@ public class PurpurWorldConfig { +@@ -2360,6 +2468,7 @@ public class PurpurWorldConfig { public boolean strayControllable = true; public double strayMaxHealth = 20.0D; public boolean strayTakeDamageFromWater = false; @@ -2025,7 +2025,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void straySettings() { strayRidable = getBoolean("mobs.stray.ridable", strayRidable); strayRidableInWater = getBoolean("mobs.stray.ridable-in-water", strayRidableInWater); -@@ -2368,6 +2477,7 @@ public class PurpurWorldConfig { +@@ -2371,6 +2480,7 @@ public class PurpurWorldConfig { } strayMaxHealth = getDouble("mobs.stray.attributes.max_health", strayMaxHealth); strayTakeDamageFromWater = getBoolean("mobs.stray.takes-damage-from-water", strayTakeDamageFromWater); @@ -2033,7 +2033,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean striderRidable = false; -@@ -2377,6 +2487,7 @@ public class PurpurWorldConfig { +@@ -2380,6 +2490,7 @@ public class PurpurWorldConfig { public int striderBreedingTicks = 6000; public boolean striderGiveSaddleBack = false; public boolean striderTakeDamageFromWater = true; @@ -2041,7 +2041,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void striderSettings() { striderRidable = getBoolean("mobs.strider.ridable", striderRidable); striderRidableInWater = getBoolean("mobs.strider.ridable-in-water", striderRidableInWater); -@@ -2390,6 +2501,7 @@ public class PurpurWorldConfig { +@@ -2393,6 +2504,7 @@ public class PurpurWorldConfig { striderBreedingTicks = getInt("mobs.strider.breeding-delay-ticks", striderBreedingTicks); striderGiveSaddleBack = getBoolean("mobs.strider.give-saddle-back", striderGiveSaddleBack); striderTakeDamageFromWater = getBoolean("mobs.strider.takes-damage-from-water", striderTakeDamageFromWater); @@ -2049,7 +2049,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean tadpoleRidable = false; -@@ -2412,6 +2524,7 @@ public class PurpurWorldConfig { +@@ -2415,6 +2527,7 @@ public class PurpurWorldConfig { public double traderLlamaMovementSpeedMax = 0.175D; public int traderLlamaBreedingTicks = 6000; public boolean traderLlamaTakeDamageFromWater = false; @@ -2057,7 +2057,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void traderLlamaSettings() { traderLlamaRidable = getBoolean("mobs.trader_llama.ridable", traderLlamaRidable); traderLlamaRidableInWater = getBoolean("mobs.trader_llama.ridable-in-water", traderLlamaRidableInWater); -@@ -2431,12 +2544,14 @@ public class PurpurWorldConfig { +@@ -2434,12 +2547,14 @@ public class PurpurWorldConfig { traderLlamaMovementSpeedMax = getDouble("mobs.trader_llama.attributes.movement_speed.max", traderLlamaMovementSpeedMax); traderLlamaBreedingTicks = getInt("mobs.trader_llama.breeding-delay-ticks", traderLlamaBreedingTicks); traderLlamaTakeDamageFromWater = getBoolean("mobs.trader_llama.takes-damage-from-water", traderLlamaTakeDamageFromWater); @@ -2072,7 +2072,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void tropicalFishSettings() { tropicalFishRidable = getBoolean("mobs.tropical_fish.ridable", tropicalFishRidable); tropicalFishControllable = getBoolean("mobs.tropical_fish.controllable", tropicalFishControllable); -@@ -2447,6 +2562,7 @@ public class PurpurWorldConfig { +@@ -2450,6 +2565,7 @@ public class PurpurWorldConfig { } tropicalFishMaxHealth = getDouble("mobs.tropical_fish.attributes.max_health", tropicalFishMaxHealth); tropicalFishTakeDamageFromWater = getBoolean("mobs.tropical_fish.takes-damage-from-water", tropicalFishTakeDamageFromWater); @@ -2080,7 +2080,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean turtleRidable = false; -@@ -2455,6 +2571,7 @@ public class PurpurWorldConfig { +@@ -2458,6 +2574,7 @@ public class PurpurWorldConfig { public double turtleMaxHealth = 30.0D; public int turtleBreedingTicks = 6000; public boolean turtleTakeDamageFromWater = false; @@ -2088,7 +2088,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void turtleSettings() { turtleRidable = getBoolean("mobs.turtle.ridable", turtleRidable); turtleRidableInWater = getBoolean("mobs.turtle.ridable-in-water", turtleRidableInWater); -@@ -2467,6 +2584,7 @@ public class PurpurWorldConfig { +@@ -2470,6 +2587,7 @@ public class PurpurWorldConfig { turtleMaxHealth = getDouble("mobs.turtle.attributes.max_health", turtleMaxHealth); turtleBreedingTicks = getInt("mobs.turtle.breeding-delay-ticks", turtleBreedingTicks); turtleTakeDamageFromWater = getBoolean("mobs.turtle.takes-damage-from-water", turtleTakeDamageFromWater); @@ -2096,7 +2096,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean vexRidable = false; -@@ -2475,6 +2593,7 @@ public class PurpurWorldConfig { +@@ -2478,6 +2596,7 @@ public class PurpurWorldConfig { public double vexMaxY = 320D; public double vexMaxHealth = 14.0D; public boolean vexTakeDamageFromWater = false; @@ -2104,7 +2104,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void vexSettings() { vexRidable = getBoolean("mobs.vex.ridable", vexRidable); vexRidableInWater = getBoolean("mobs.vex.ridable-in-water", vexRidableInWater); -@@ -2487,6 +2606,7 @@ public class PurpurWorldConfig { +@@ -2490,6 +2609,7 @@ public class PurpurWorldConfig { } vexMaxHealth = getDouble("mobs.vex.attributes.max_health", vexMaxHealth); vexTakeDamageFromWater = getBoolean("mobs.vex.takes-damage-from-water", vexTakeDamageFromWater); @@ -2112,7 +2112,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean villagerRidable = false; -@@ -2504,6 +2624,7 @@ public class PurpurWorldConfig { +@@ -2505,6 +2625,7 @@ public class PurpurWorldConfig { public boolean villagerBypassMobGriefing = false; public boolean villagerTakeDamageFromWater = false; public boolean villagerAllowTrading = true; @@ -2120,7 +2120,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void villagerSettings() { villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); -@@ -2525,6 +2646,7 @@ public class PurpurWorldConfig { +@@ -2524,6 +2645,7 @@ public class PurpurWorldConfig { villagerBypassMobGriefing = getBoolean("mobs.villager.bypass-mob-griefing", villagerBypassMobGriefing); villagerTakeDamageFromWater = getBoolean("mobs.villager.takes-damage-from-water", villagerTakeDamageFromWater); villagerAllowTrading = getBoolean("mobs.villager.allow-trading", villagerAllowTrading); @@ -2128,7 +2128,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean vindicatorRidable = false; -@@ -2533,6 +2655,7 @@ public class PurpurWorldConfig { +@@ -2532,6 +2654,7 @@ public class PurpurWorldConfig { public double vindicatorMaxHealth = 24.0D; public double vindicatorJohnnySpawnChance = 0D; public boolean vindicatorTakeDamageFromWater = false; @@ -2136,7 +2136,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void vindicatorSettings() { vindicatorRidable = getBoolean("mobs.vindicator.ridable", vindicatorRidable); vindicatorRidableInWater = getBoolean("mobs.vindicator.ridable-in-water", vindicatorRidableInWater); -@@ -2545,6 +2668,7 @@ public class PurpurWorldConfig { +@@ -2544,6 +2667,7 @@ public class PurpurWorldConfig { vindicatorMaxHealth = getDouble("mobs.vindicator.attributes.max_health", vindicatorMaxHealth); vindicatorJohnnySpawnChance = getDouble("mobs.vindicator.johnny.spawn-chance", vindicatorJohnnySpawnChance); vindicatorTakeDamageFromWater = getBoolean("mobs.vindicator.takes-damage-from-water", vindicatorTakeDamageFromWater); @@ -2144,7 +2144,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean wanderingTraderRidable = false; -@@ -2555,6 +2679,7 @@ public class PurpurWorldConfig { +@@ -2554,6 +2678,7 @@ public class PurpurWorldConfig { public boolean wanderingTraderCanBeLeashed = false; public boolean wanderingTraderTakeDamageFromWater = false; public boolean wanderingTraderAllowTrading = true; @@ -2152,7 +2152,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void wanderingTraderSettings() { wanderingTraderRidable = getBoolean("mobs.wandering_trader.ridable", wanderingTraderRidable); wanderingTraderRidableInWater = getBoolean("mobs.wandering_trader.ridable-in-water", wanderingTraderRidableInWater); -@@ -2569,6 +2694,7 @@ public class PurpurWorldConfig { +@@ -2568,6 +2693,7 @@ public class PurpurWorldConfig { wanderingTraderCanBeLeashed = getBoolean("mobs.wandering_trader.can-be-leashed", wanderingTraderCanBeLeashed); wanderingTraderTakeDamageFromWater = getBoolean("mobs.wandering_trader.takes-damage-from-water", wanderingTraderTakeDamageFromWater); wanderingTraderAllowTrading = getBoolean("mobs.wandering_trader.allow-trading", wanderingTraderAllowTrading); @@ -2160,7 +2160,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean wardenRidable = false; -@@ -2585,6 +2711,7 @@ public class PurpurWorldConfig { +@@ -2584,6 +2710,7 @@ public class PurpurWorldConfig { public boolean witchControllable = true; public double witchMaxHealth = 26.0D; public boolean witchTakeDamageFromWater = false; @@ -2168,7 +2168,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void witchSettings() { witchRidable = getBoolean("mobs.witch.ridable", witchRidable); witchRidableInWater = getBoolean("mobs.witch.ridable-in-water", witchRidableInWater); -@@ -2596,6 +2723,7 @@ public class PurpurWorldConfig { +@@ -2595,6 +2722,7 @@ public class PurpurWorldConfig { } witchMaxHealth = getDouble("mobs.witch.attributes.max_health", witchMaxHealth); witchTakeDamageFromWater = getBoolean("mobs.witch.takes-damage-from-water", witchTakeDamageFromWater); @@ -2176,7 +2176,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean witherRidable = false; -@@ -2610,6 +2738,7 @@ public class PurpurWorldConfig { +@@ -2609,6 +2737,7 @@ public class PurpurWorldConfig { public boolean witherCanRideVehicles = false; public float witherExplosionRadius = 1.0F; public boolean witherPlaySpawnSound = true; @@ -2184,7 +2184,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void witherSettings() { witherRidable = getBoolean("mobs.wither.ridable", witherRidable); witherRidableInWater = getBoolean("mobs.wither.ridable-in-water", witherRidableInWater); -@@ -2632,6 +2761,7 @@ public class PurpurWorldConfig { +@@ -2631,6 +2760,7 @@ public class PurpurWorldConfig { witherCanRideVehicles = getBoolean("mobs.wither.can-ride-vehicles", witherCanRideVehicles); witherExplosionRadius = (float) getDouble("mobs.wither.explosion-radius", witherExplosionRadius); witherPlaySpawnSound = getBoolean("mobs.wither.play-spawn-sound", witherPlaySpawnSound); @@ -2192,7 +2192,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean witherSkeletonRidable = false; -@@ -2639,6 +2769,7 @@ public class PurpurWorldConfig { +@@ -2638,6 +2768,7 @@ public class PurpurWorldConfig { public boolean witherSkeletonControllable = true; public double witherSkeletonMaxHealth = 20.0D; public boolean witherSkeletonTakeDamageFromWater = false; @@ -2200,7 +2200,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void witherSkeletonSettings() { witherSkeletonRidable = getBoolean("mobs.wither_skeleton.ridable", witherSkeletonRidable); witherSkeletonRidableInWater = getBoolean("mobs.wither_skeleton.ridable-in-water", witherSkeletonRidableInWater); -@@ -2650,6 +2781,7 @@ public class PurpurWorldConfig { +@@ -2649,6 +2780,7 @@ public class PurpurWorldConfig { } witherSkeletonMaxHealth = getDouble("mobs.wither_skeleton.attributes.max_health", witherSkeletonMaxHealth); witherSkeletonTakeDamageFromWater = getBoolean("mobs.wither_skeleton.takes-damage-from-water", witherSkeletonTakeDamageFromWater); @@ -2208,7 +2208,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean wolfRidable = false; -@@ -2661,6 +2793,7 @@ public class PurpurWorldConfig { +@@ -2660,6 +2792,7 @@ public class PurpurWorldConfig { public double wolfNaturalRabid = 0.0D; public int wolfBreedingTicks = 6000; public boolean wolfTakeDamageFromWater = false; @@ -2216,7 +2216,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void wolfSettings() { wolfRidable = getBoolean("mobs.wolf.ridable", wolfRidable); wolfRidableInWater = getBoolean("mobs.wolf.ridable-in-water", wolfRidableInWater); -@@ -2680,6 +2813,7 @@ public class PurpurWorldConfig { +@@ -2679,6 +2812,7 @@ public class PurpurWorldConfig { wolfNaturalRabid = getDouble("mobs.wolf.spawn-rabid-chance", wolfNaturalRabid); wolfBreedingTicks = getInt("mobs.wolf.breeding-delay-ticks", wolfBreedingTicks); wolfTakeDamageFromWater = getBoolean("mobs.wolf.takes-damage-from-water", wolfTakeDamageFromWater); @@ -2224,7 +2224,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean zoglinRidable = false; -@@ -2687,6 +2821,7 @@ public class PurpurWorldConfig { +@@ -2686,6 +2820,7 @@ public class PurpurWorldConfig { public boolean zoglinControllable = true; public double zoglinMaxHealth = 40.0D; public boolean zoglinTakeDamageFromWater = false; @@ -2232,7 +2232,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void zoglinSettings() { zoglinRidable = getBoolean("mobs.zoglin.ridable", zoglinRidable); zoglinRidableInWater = getBoolean("mobs.zoglin.ridable-in-water", zoglinRidableInWater); -@@ -2698,6 +2833,7 @@ public class PurpurWorldConfig { +@@ -2697,6 +2832,7 @@ public class PurpurWorldConfig { } zoglinMaxHealth = getDouble("mobs.zoglin.attributes.max_health", zoglinMaxHealth); zoglinTakeDamageFromWater = getBoolean("mobs.zoglin.takes-damage-from-water", zoglinTakeDamageFromWater); @@ -2240,7 +2240,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean zombieRidable = false; -@@ -2711,6 +2847,7 @@ public class PurpurWorldConfig { +@@ -2710,6 +2846,7 @@ public class PurpurWorldConfig { public boolean zombieAggressiveTowardsVillagerWhenLagging = true; public boolean zombieBypassMobGriefing = false; public boolean zombieTakeDamageFromWater = false; @@ -2248,7 +2248,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void zombieSettings() { zombieRidable = getBoolean("mobs.zombie.ridable", zombieRidable); zombieRidableInWater = getBoolean("mobs.zombie.ridable-in-water", zombieRidableInWater); -@@ -2728,6 +2865,7 @@ public class PurpurWorldConfig { +@@ -2727,6 +2864,7 @@ public class PurpurWorldConfig { zombieAggressiveTowardsVillagerWhenLagging = getBoolean("mobs.zombie.aggressive-towards-villager-when-lagging", zombieAggressiveTowardsVillagerWhenLagging); zombieBypassMobGriefing = getBoolean("mobs.zombie.bypass-mob-griefing", zombieBypassMobGriefing); zombieTakeDamageFromWater = getBoolean("mobs.zombie.takes-damage-from-water", zombieTakeDamageFromWater); @@ -2256,7 +2256,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean zombieHorseRidableInWater = false; -@@ -2740,6 +2878,7 @@ public class PurpurWorldConfig { +@@ -2739,6 +2877,7 @@ public class PurpurWorldConfig { public double zombieHorseMovementSpeedMax = 0.2D; public double zombieHorseSpawnChance = 0.0D; public boolean zombieHorseTakeDamageFromWater = false; @@ -2264,7 +2264,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void zombieHorseSettings() { zombieHorseRidableInWater = getBoolean("mobs.zombie_horse.ridable-in-water", zombieHorseRidableInWater); zombieHorseCanSwim = getBoolean("mobs.zombie_horse.can-swim", zombieHorseCanSwim); -@@ -2757,6 +2896,7 @@ public class PurpurWorldConfig { +@@ -2756,6 +2895,7 @@ public class PurpurWorldConfig { zombieHorseMovementSpeedMax = getDouble("mobs.zombie_horse.attributes.movement_speed.max", zombieHorseMovementSpeedMax); zombieHorseSpawnChance = getDouble("mobs.zombie_horse.spawn-chance", zombieHorseSpawnChance); zombieHorseTakeDamageFromWater = getBoolean("mobs.zombie_horse.takes-damage-from-water", zombieHorseTakeDamageFromWater); @@ -2272,7 +2272,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean zombieVillagerRidable = false; -@@ -2771,6 +2911,7 @@ public class PurpurWorldConfig { +@@ -2770,6 +2910,7 @@ public class PurpurWorldConfig { public int zombieVillagerCuringTimeMin = 3600; public int zombieVillagerCuringTimeMax = 6000; public boolean zombieVillagerCureEnabled = true; @@ -2280,7 +2280,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void zombieVillagerSettings() { zombieVillagerRidable = getBoolean("mobs.zombie_villager.ridable", zombieVillagerRidable); zombieVillagerRidableInWater = getBoolean("mobs.zombie_villager.ridable-in-water", zombieVillagerRidableInWater); -@@ -2789,6 +2930,7 @@ public class PurpurWorldConfig { +@@ -2788,6 +2929,7 @@ public class PurpurWorldConfig { zombieVillagerCuringTimeMin = getInt("mobs.zombie_villager.curing_time.min", zombieVillagerCuringTimeMin); zombieVillagerCuringTimeMax = getInt("mobs.zombie_villager.curing_time.max", zombieVillagerCuringTimeMax); zombieVillagerCureEnabled = getBoolean("mobs.zombie_villager.cure.enabled", zombieVillagerCureEnabled); @@ -2288,7 +2288,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 } public boolean zombifiedPiglinRidable = false; -@@ -2801,6 +2943,7 @@ public class PurpurWorldConfig { +@@ -2800,6 +2942,7 @@ public class PurpurWorldConfig { public boolean zombifiedPiglinJockeyTryExistingChickens = true; public boolean zombifiedPiglinCountAsPlayerKillWhenAngry = true; public boolean zombifiedPiglinTakeDamageFromWater = false; @@ -2296,7 +2296,7 @@ index 2943a6d00d5cc5cbfac00fe7031a473db600606f..22ba2f2c8a83e4372867c251256a4d88 private void zombifiedPiglinSettings() { zombifiedPiglinRidable = getBoolean("mobs.zombified_piglin.ridable", zombifiedPiglinRidable); zombifiedPiglinRidableInWater = getBoolean("mobs.zombified_piglin.ridable-in-water", zombifiedPiglinRidableInWater); -@@ -2817,6 +2960,7 @@ public class PurpurWorldConfig { +@@ -2816,6 +2959,7 @@ public class PurpurWorldConfig { zombifiedPiglinJockeyTryExistingChickens = getBoolean("mobs.zombified_piglin.jockey.try-existing-chickens", zombifiedPiglinJockeyTryExistingChickens); zombifiedPiglinCountAsPlayerKillWhenAngry = getBoolean("mobs.zombified_piglin.count-as-player-kill-when-angry", zombifiedPiglinCountAsPlayerKillWhenAngry); zombifiedPiglinTakeDamageFromWater = getBoolean("mobs.zombified_piglin.takes-damage-from-water", zombifiedPiglinTakeDamageFromWater); diff --git a/patches/server/0240-Potion-NamespacedKey.patch b/patches/server/0234-Potion-NamespacedKey.patch similarity index 93% rename from patches/server/0240-Potion-NamespacedKey.patch rename to patches/server/0234-Potion-NamespacedKey.patch index af62899da..efbdaee42 100644 --- a/patches/server/0240-Potion-NamespacedKey.patch +++ b/patches/server/0234-Potion-NamespacedKey.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Potion NamespacedKey diff --git a/src/main/java/net/minecraft/world/effect/MobEffectInstance.java b/src/main/java/net/minecraft/world/effect/MobEffectInstance.java -index f5c9be3fde2654bd5a6b3ee737afe96a9393e836..3aecf016ce182391e20c8d31b9399a9855ceb3e6 100644 +index 038ba61e4845a4a71bb78ba388ed249d19529b78..6d5080ba244daf3b93d61d28ee0b88eb56bac723 100644 --- a/src/main/java/net/minecraft/world/effect/MobEffectInstance.java +++ b/src/main/java/net/minecraft/world/effect/MobEffectInstance.java @@ -13,6 +13,7 @@ import net.minecraft.util.ExtraCodecs; @@ -16,15 +16,15 @@ index f5c9be3fde2654bd5a6b3ee737afe96a9393e836..3aecf016ce182391e20c8d31b9399a98 public class MobEffectInstance implements Comparable { private static final Logger LOGGER = LogUtils.getLogger(); -@@ -24,6 +25,7 @@ public class MobEffectInstance implements Comparable { +@@ -23,6 +24,7 @@ public class MobEffectInstance implements Comparable { private boolean visible; private boolean showIcon; @Nullable + private NamespacedKey key; // Purpur - add key private MobEffectInstance hiddenEffect; - private Optional factorData; + private final Optional factorData; -@@ -43,17 +45,36 @@ public class MobEffectInstance implements Comparable { +@@ -42,17 +44,36 @@ public class MobEffectInstance implements Comparable { this(type, duration, amplifier, ambient, visible, visible); } @@ -62,7 +62,7 @@ index f5c9be3fde2654bd5a6b3ee737afe96a9393e836..3aecf016ce182391e20c8d31b9399a98 this.hiddenEffect = hiddenEffect; this.factorData = factorCalculationData; } -@@ -74,6 +95,7 @@ public class MobEffectInstance implements Comparable { +@@ -73,6 +94,7 @@ public class MobEffectInstance implements Comparable { this.ambient = that.ambient; this.visible = that.visible; this.showIcon = that.showIcon; @@ -70,7 +70,7 @@ index f5c9be3fde2654bd5a6b3ee737afe96a9393e836..3aecf016ce182391e20c8d31b9399a98 } public boolean update(MobEffectInstance that) { -@@ -126,6 +148,13 @@ public class MobEffectInstance implements Comparable { +@@ -125,6 +147,13 @@ public class MobEffectInstance implements Comparable { bl = true; } @@ -84,7 +84,7 @@ index f5c9be3fde2654bd5a6b3ee737afe96a9393e836..3aecf016ce182391e20c8d31b9399a98 return bl; } -@@ -153,6 +182,17 @@ public class MobEffectInstance implements Comparable { +@@ -152,6 +181,17 @@ public class MobEffectInstance implements Comparable { return this.showIcon; } @@ -102,7 +102,7 @@ index f5c9be3fde2654bd5a6b3ee737afe96a9393e836..3aecf016ce182391e20c8d31b9399a98 public boolean tick(LivingEntity entity, Runnable overwriteCallback) { if (this.duration > 0) { if (this.effect.isDurationEffectTick(this.duration, this.amplifier)) { -@@ -209,6 +249,12 @@ public class MobEffectInstance implements Comparable { +@@ -208,6 +248,12 @@ public class MobEffectInstance implements Comparable { string = string + ", Show Icon: false"; } @@ -115,7 +115,7 @@ index f5c9be3fde2654bd5a6b3ee737afe96a9393e836..3aecf016ce182391e20c8d31b9399a98 return string; } -@@ -220,7 +266,7 @@ public class MobEffectInstance implements Comparable { +@@ -219,7 +265,7 @@ public class MobEffectInstance implements Comparable { return false; } else { MobEffectInstance mobEffectInstance = (MobEffectInstance)object; @@ -124,7 +124,7 @@ index f5c9be3fde2654bd5a6b3ee737afe96a9393e836..3aecf016ce182391e20c8d31b9399a98 } } -@@ -244,6 +290,11 @@ public class MobEffectInstance implements Comparable { +@@ -243,6 +289,11 @@ public class MobEffectInstance implements Comparable { nbt.putBoolean("Ambient", this.isAmbient()); nbt.putBoolean("ShowParticles", this.isVisible()); nbt.putBoolean("ShowIcon", this.showIcon()); @@ -136,7 +136,7 @@ index f5c9be3fde2654bd5a6b3ee737afe96a9393e836..3aecf016ce182391e20c8d31b9399a98 if (this.hiddenEffect != null) { CompoundTag compoundTag = new CompoundTag(); this.hiddenEffect.save(compoundTag); -@@ -278,6 +329,13 @@ public class MobEffectInstance implements Comparable { +@@ -277,6 +328,13 @@ public class MobEffectInstance implements Comparable { bl3 = nbt.getBoolean("ShowIcon"); } @@ -150,7 +150,7 @@ index f5c9be3fde2654bd5a6b3ee737afe96a9393e836..3aecf016ce182391e20c8d31b9399a98 MobEffectInstance mobEffectInstance = null; if (nbt.contains("HiddenEffect", 10)) { mobEffectInstance = loadSpecifiedEffect(type, nbt.getCompound("HiddenEffect")); -@@ -290,7 +348,7 @@ public class MobEffectInstance implements Comparable { +@@ -289,7 +347,7 @@ public class MobEffectInstance implements Comparable { optional = Optional.empty(); } @@ -158,9 +158,9 @@ index f5c9be3fde2654bd5a6b3ee737afe96a9393e836..3aecf016ce182391e20c8d31b9399a98 + return new MobEffectInstance(type, j, Math.max(i, 0), bl, bl2, bl3, mobEffectInstance, optional, key); // Purpur - add key } - public void setNoCounter(boolean permanent) { + @Override diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java -index f2d17cb06fbcd7370ab8465c5c4830f8ba31169a..3a3476000ee8c13e1c1a565b0ef38a5ac69bdfb3 100644 +index 32d4960fbee976004d5d1a3a5c29c2e963a8d577..ea327baa5368afc27402d5863a6e238cea5be732 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java @@ -438,7 +438,7 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { @@ -269,7 +269,7 @@ index acb69821a99aa69bce6d127e10976089c85be223..c5abd73981c5f4b41605eba0d44e6573 public static boolean equals(MobEffect mobEffect, PotionEffectType type) { diff --git a/src/test/java/org/bukkit/potion/PotionTest.java b/src/test/java/org/bukkit/potion/PotionTest.java -index 7ea3cc4f8e35b61b3eba717ed58ee98cf835168c..48aa077ab2e2b708fb3d3287e636b4dc1c969925 100644 +index 83226ec2fa977819e12a499eb3765232543c17b3..a742774dabaee0629f4e6adabee5f3ec4b3be41c 100644 --- a/src/test/java/org/bukkit/potion/PotionTest.java +++ b/src/test/java/org/bukkit/potion/PotionTest.java @@ -9,6 +9,7 @@ import net.minecraft.resources.ResourceLocation; diff --git a/patches/server/0241-Grindstone-API.patch b/patches/server/0235-Grindstone-API.patch similarity index 93% rename from patches/server/0241-Grindstone-API.patch rename to patches/server/0235-Grindstone-API.patch index e08fb8898..1c97380d7 100644 --- a/patches/server/0241-Grindstone-API.patch +++ b/patches/server/0235-Grindstone-API.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Grindstone API diff --git a/src/main/java/net/minecraft/world/inventory/GrindstoneMenu.java b/src/main/java/net/minecraft/world/inventory/GrindstoneMenu.java -index eb70286262fd8c3b4efb614cf62c5e3bf4b00640..2b5a742414c8029fd745eb00d4e802bfea2c17c7 100644 +index 23019df46720290f3b50b58606de9d97661812ac..ea143f3ec178360e190acff1120ea152a72e426d 100644 --- a/src/main/java/net/minecraft/world/inventory/GrindstoneMenu.java +++ b/src/main/java/net/minecraft/world/inventory/GrindstoneMenu.java @@ -95,9 +95,11 @@ public class GrindstoneMenu extends AbstractContainerMenu { @@ -26,7 +26,7 @@ index eb70286262fd8c3b4efb614cf62c5e3bf4b00640..2b5a742414c8029fd745eb00d4e802bf } + this.activeQuickItem = itemstack; // Purpur - slot.onTake(player, itemstack1); + slot1.onTake(player, itemstack1); + this.activeQuickItem = null; // Purpur } diff --git a/patches/server/0242-Option-to-prevent-spiders-from-climbing-world-border.patch b/patches/server/0236-Option-to-prevent-spiders-from-climbing-world-border.patch similarity index 87% rename from patches/server/0242-Option-to-prevent-spiders-from-climbing-world-border.patch rename to patches/server/0236-Option-to-prevent-spiders-from-climbing-world-border.patch index 966a2f3e2..f38749787 100644 --- a/patches/server/0242-Option-to-prevent-spiders-from-climbing-world-border.patch +++ b/patches/server/0236-Option-to-prevent-spiders-from-climbing-world-border.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Option to prevent spiders from climbing world border diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index c18ec8ea889eda26498ec7a31c631cafdaf53432..9ec8bb25f4b6101e0fe2f99ca6e15da2c000e6e7 100644 +index eb9c8f025c35402b0d07475c9cf0ca58334be2f9..542f527231ae1fc1e079752eeb64d9a93d077c35 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -304,6 +304,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { @@ -16,7 +16,7 @@ index c18ec8ea889eda26498ec7a31c631cafdaf53432..9ec8bb25f4b6101e0fe2f99ca6e15da2 public boolean hurtMarked; protected Vec3 stuckSpeedMultiplier; @Nullable -@@ -1417,7 +1418,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -1391,7 +1392,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { io.papermc.paper.util.CollisionUtil.getCollisions(world, this, collisionBox, potentialCollisions, false, this.level.paperConfig().chunks.preventMovingIntoUnloadedChunks, false, false, null, null); @@ -26,7 +26,7 @@ index c18ec8ea889eda26498ec7a31c631cafdaf53432..9ec8bb25f4b6101e0fe2f99ca6e15da2 } diff --git a/src/main/java/net/minecraft/world/entity/monster/Spider.java b/src/main/java/net/minecraft/world/entity/monster/Spider.java -index bdd4fc3072f7a5ea504ba35f6a08ae971e83b69f..b9ac8cefefe1f47548166330b7c889dfbc05e583 100644 +index b1f23e67f7f21cb9a85301a819e8079d9000c0f6..62996f5e65cc04744852897ecca0c83a8a2e13f2 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Spider.java +++ b/src/main/java/net/minecraft/world/entity/monster/Spider.java @@ -118,7 +118,7 @@ public class Spider extends Monster { @@ -39,10 +39,10 @@ index bdd4fc3072f7a5ea504ba35f6a08ae971e83b69f..b9ac8cefefe1f47548166330b7c889df } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 22ba2f2c8a83e4372867c251256a4d885dcdb8fd..4aa533741c8deb1cde5b8603832878ac8580d326 100644 +index b914f7712765720f1fb375f639f9ce3913b03280..8b7738f48e287370f46d11110fa27a03e6cfece6 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -2446,6 +2446,7 @@ public class PurpurWorldConfig { +@@ -2449,6 +2449,7 @@ public class PurpurWorldConfig { public double spiderMaxHealth = 16.0D; public boolean spiderTakeDamageFromWater = false; public boolean spiderAlwaysDropExp = false; @@ -50,7 +50,7 @@ index 22ba2f2c8a83e4372867c251256a4d885dcdb8fd..4aa533741c8deb1cde5b8603832878ac private void spiderSettings() { spiderRidable = getBoolean("mobs.spider.ridable", spiderRidable); spiderRidableInWater = getBoolean("mobs.spider.ridable-in-water", spiderRidableInWater); -@@ -2458,6 +2459,7 @@ public class PurpurWorldConfig { +@@ -2461,6 +2462,7 @@ public class PurpurWorldConfig { spiderMaxHealth = getDouble("mobs.spider.attributes.max_health", spiderMaxHealth); spiderTakeDamageFromWater = getBoolean("mobs.spider.takes-damage-from-water", spiderTakeDamageFromWater); spiderAlwaysDropExp = getBoolean("mobs.spider.always-drop-exp", spiderAlwaysDropExp); diff --git a/patches/server/0243-Ability-for-hoe-to-replant-crops-and-nether-warts.patch b/patches/server/0237-Ability-for-hoe-to-replant-crops-and-nether-warts.patch similarity index 96% rename from patches/server/0243-Ability-for-hoe-to-replant-crops-and-nether-warts.patch rename to patches/server/0237-Ability-for-hoe-to-replant-crops-and-nether-warts.patch index 9c5b43d77..37d0de431 100644 --- a/patches/server/0243-Ability-for-hoe-to-replant-crops-and-nether-warts.patch +++ b/patches/server/0237-Ability-for-hoe-to-replant-crops-and-nether-warts.patch @@ -34,7 +34,7 @@ index 03fde6e47c4a347c62fe9b4a3351769aedf874f6..ca906b0250e5332f7ececf1419ca6d2c + // Purpur end } diff --git a/src/main/java/net/minecraft/world/level/block/CropBlock.java b/src/main/java/net/minecraft/world/level/block/CropBlock.java -index a6e03d12ecd85992215e1128cd6afd280e91b249..ad065a3b3e7248354aafd9e715a6a90666eb2c03 100644 +index c0c3bba1555e356c0af7e79e1ecb2aa0de578306..74620e6aee75334498d903c616c090caa615f0b4 100644 --- a/src/main/java/net/minecraft/world/level/block/CropBlock.java +++ b/src/main/java/net/minecraft/world/level/block/CropBlock.java @@ -199,4 +199,15 @@ public class CropBlock extends BushBlock implements BonemealableBlock { @@ -74,7 +74,7 @@ index e55720c4d2fbdf6aae526910e87a67c29cf906fd..0e4026e9d39735b840f12e59f84469b9 + // Purpur end } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 026dcf93405f70e5249bff9bd574aa195903e706..f0f06e8e4a7a4aac071bff48230ab20f2795f7d2 100644 +index 768201b2e7a785f75ef8d24013f674e6a37cd4f4..afa9e2a18bd6e4bec3d37b7d69b0f107a3ae9454 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -560,6 +560,8 @@ public class PurpurWorldConfig { diff --git a/patches/server/0244-Shearing-jeb-produces-random-color-wool.patch b/patches/server/0238-Shearing-jeb-produces-random-color-wool.patch similarity index 85% rename from patches/server/0244-Shearing-jeb-produces-random-color-wool.patch rename to patches/server/0238-Shearing-jeb-produces-random-color-wool.patch index 8112beaab..10d546c2f 100644 --- a/patches/server/0244-Shearing-jeb-produces-random-color-wool.patch +++ b/patches/server/0238-Shearing-jeb-produces-random-color-wool.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Shearing jeb produces random color wool diff --git a/src/main/java/net/minecraft/world/entity/animal/Sheep.java b/src/main/java/net/minecraft/world/entity/animal/Sheep.java -index 63aeab7204ac954b2908207dc6e743d17aa27f2e..aa6f6e252f6f2933825b97bf1b9679fe206d6050 100644 +index 492316925f06d1bc7950c6b9d37615b2bd0138fd..99dbbe59116ae4fbdfb506a72959e3a6a0d00548 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Sheep.java +++ b/src/main/java/net/minecraft/world/entity/animal/Sheep.java -@@ -293,7 +293,7 @@ public class Sheep extends Animal implements Shearable { +@@ -314,7 +314,7 @@ public class Sheep extends Animal implements Shearable { for (int j = 0; j < i; ++j) { this.forceDrops = true; // CraftBukkit @@ -18,10 +18,10 @@ index 63aeab7204ac954b2908207dc6e743d17aa27f2e..aa6f6e252f6f2933825b97bf1b9679fe if (entityitem != null) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index ddca8e220f7624ca09243bd67084420302d098ab..0f0974e00c9878ea476a3689a86772b215dcb2e3 100644 +index 158db79b4db5e768371aef45ec36f7ac4b96c051..4ba424ca8d0daf0cd01bafbaf21f65c1776813d7 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -2239,6 +2239,7 @@ public class PurpurWorldConfig { +@@ -2242,6 +2242,7 @@ public class PurpurWorldConfig { public boolean sheepBypassMobGriefing = false; public boolean sheepTakeDamageFromWater = false; public boolean sheepAlwaysDropExp = false; @@ -29,7 +29,7 @@ index ddca8e220f7624ca09243bd67084420302d098ab..0f0974e00c9878ea476a3689a86772b2 private void sheepSettings() { sheepRidable = getBoolean("mobs.sheep.ridable", sheepRidable); sheepRidableInWater = getBoolean("mobs.sheep.ridable-in-water", sheepRidableInWater); -@@ -2253,6 +2254,7 @@ public class PurpurWorldConfig { +@@ -2256,6 +2257,7 @@ public class PurpurWorldConfig { sheepBypassMobGriefing = getBoolean("mobs.sheep.bypass-mob-griefing", sheepBypassMobGriefing); sheepTakeDamageFromWater = getBoolean("mobs.sheep.takes-damage-from-water", sheepTakeDamageFromWater); sheepAlwaysDropExp = getBoolean("mobs.sheep.always-drop-exp", sheepAlwaysDropExp); diff --git a/patches/server/0245-Turtle-eggs-random-tick-crack-chance.patch b/patches/server/0239-Turtle-eggs-random-tick-crack-chance.patch similarity index 91% rename from patches/server/0245-Turtle-eggs-random-tick-crack-chance.patch rename to patches/server/0239-Turtle-eggs-random-tick-crack-chance.patch index 7fc1a9604..69524b2a6 100644 --- a/patches/server/0245-Turtle-eggs-random-tick-crack-chance.patch +++ b/patches/server/0239-Turtle-eggs-random-tick-crack-chance.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Turtle eggs random tick crack chance diff --git a/src/main/java/net/minecraft/world/level/block/TurtleEggBlock.java b/src/main/java/net/minecraft/world/level/block/TurtleEggBlock.java -index 4907e0acb7d01b7f57b75579e58ce743e3e000bb..5e6df1d6cbaecb986d1b8d382fe673a2cbb76115 100644 +index 4eeb777a49556c54a3f31c1b9d755b110a3e8fab..d4896c4d1eca6a1494571a40024422ada41d1e78 100644 --- a/src/main/java/net/minecraft/world/level/block/TurtleEggBlock.java +++ b/src/main/java/net/minecraft/world/level/block/TurtleEggBlock.java @@ -11,13 +11,11 @@ import net.minecraft.world.entity.Entity; @@ -22,7 +22,7 @@ index 4907e0acb7d01b7f57b75579e58ce743e3e000bb..5e6df1d6cbaecb986d1b8d382fe673a2 import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; -@@ -162,7 +160,7 @@ public class TurtleEggBlock extends Block { +@@ -164,7 +162,7 @@ public class TurtleEggBlock extends Block { private boolean shouldUpdateHatchLevel(Level world) { float f = world.getTimeOfDay(1.0F); @@ -32,7 +32,7 @@ index 4907e0acb7d01b7f57b75579e58ce743e3e000bb..5e6df1d6cbaecb986d1b8d382fe673a2 @Override diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 3fd933c9d8db9ed3ecdc4e7f4d630235603895ce..86cdae20b7d5355d7757668defafe45462cf1d26 100644 +index 90a43499dcd3c1b6f8582eaadc766c35a3a5b591..4ad75e8fc73639a1b53ee2e654d8766b84ff37f6 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -971,11 +971,13 @@ public class PurpurWorldConfig { diff --git a/patches/server/0246-Mob-head-visibility-percent.patch b/patches/server/0240-Mob-head-visibility-percent.patch similarity index 68% rename from patches/server/0246-Mob-head-visibility-percent.patch rename to patches/server/0240-Mob-head-visibility-percent.patch index 581e1f9d1..29546cd3d 100644 --- a/patches/server/0246-Mob-head-visibility-percent.patch +++ b/patches/server/0240-Mob-head-visibility-percent.patch @@ -5,14 +5,14 @@ Subject: [PATCH] Mob head visibility percent diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 7cc12e402e3b90a44bcd6d8c2a7607b7cf421bca..d9d4a12555d0d791c551944ecdd7beb20aa8d2c6 100644 +index 001dbb7427f963cb570fc593eaeb0d728ef028f3..3328dfb1790d66de36b92d0ef82ec6cabfde0968 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -1029,9 +1029,17 @@ public abstract class LivingEntity extends Entity { +@@ -1030,9 +1030,20 @@ public abstract class LivingEntity extends Entity { ItemStack itemstack = this.getItemBySlot(EquipmentSlot.HEAD); EntityType entitytypes = entity.getType(); -- if (entitytypes == EntityType.SKELETON && itemstack.is(Items.SKELETON_SKULL) || entitytypes == EntityType.ZOMBIE && itemstack.is(Items.ZOMBIE_HEAD) || entitytypes == EntityType.CREEPER && itemstack.is(Items.CREEPER_HEAD)) { +- if (entitytypes == EntityType.SKELETON && itemstack.is(Items.SKELETON_SKULL) || entitytypes == EntityType.ZOMBIE && itemstack.is(Items.ZOMBIE_HEAD) || entitytypes == EntityType.PIGLIN && itemstack.is(Items.PIGLIN_HEAD) || entitytypes == EntityType.PIGLIN_BRUTE && itemstack.is(Items.PIGLIN_HEAD) || entitytypes == EntityType.CREEPER && itemstack.is(Items.CREEPER_HEAD)) { - d0 *= 0.5D; + // Purpur start + if (entitytypes == EntityType.SKELETON && itemstack.is(Items.SKELETON_SKULL)) { @@ -20,19 +20,22 @@ index 7cc12e402e3b90a44bcd6d8c2a7607b7cf421bca..d9d4a12555d0d791c551944ecdd7beb2 + } + else if (entitytypes == EntityType.ZOMBIE && itemstack.is(Items.ZOMBIE_HEAD)) { + d0 *= entity.level.purpurConfig.zombieHeadVisibilityPercent; - } ++ } + else if (entitytypes == EntityType.CREEPER && itemstack.is(Items.CREEPER_HEAD)) { + d0 *= entity.level.purpurConfig.creeperHeadVisibilityPercent; + } ++ else if ((entitytypes == EntityType.PIGLIN || entitytypes == EntityType.PIGLIN_BRUTE) && itemstack.is(Items.PIGLIN_HEAD)) { ++ d0 *= entity.level.purpurConfig.piglinHeadVisibilityPercent; + } + // Purpur end // Purpur start if (entity instanceof LivingEntity entityliving) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 3d63043d7d25b52ab57059e3777d9c66af013d42..1daafc12b18e6554972b3457afaa05be33e92734 100644 +index 5ceae41cdaa99c5ce8e1746f317403a2dcd844c7..f84f1d2027845fc371e17d48bb4df4f8ed6f554b 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1239,6 +1239,7 @@ public class PurpurWorldConfig { +@@ -1244,6 +1244,7 @@ public class PurpurWorldConfig { public boolean creeperExplodeWhenKilled = false; public boolean creeperHealthRadius = false; public boolean creeperAlwaysDropExp = false; @@ -40,7 +43,7 @@ index 3d63043d7d25b52ab57059e3777d9c66af013d42..1daafc12b18e6554972b3457afaa05be private void creeperSettings() { creeperRidable = getBoolean("mobs.creeper.ridable", creeperRidable); creeperRidableInWater = getBoolean("mobs.creeper.ridable-in-water", creeperRidableInWater); -@@ -1256,6 +1257,7 @@ public class PurpurWorldConfig { +@@ -1261,6 +1262,7 @@ public class PurpurWorldConfig { creeperExplodeWhenKilled = getBoolean("mobs.creeper.explode-when-killed", creeperExplodeWhenKilled); creeperHealthRadius = getBoolean("mobs.creeper.health-impacts-explosion", creeperHealthRadius); creeperAlwaysDropExp = getBoolean("mobs.creeper.always-drop-exp", creeperAlwaysDropExp); @@ -48,7 +51,23 @@ index 3d63043d7d25b52ab57059e3777d9c66af013d42..1daafc12b18e6554972b3457afaa05be } public boolean dolphinRidable = false; -@@ -2319,6 +2321,7 @@ public class PurpurWorldConfig { +@@ -2047,6 +2049,7 @@ public class PurpurWorldConfig { + public boolean piglinTakeDamageFromWater = false; + public int piglinPortalSpawnModifier = 2000; + public boolean piglinAlwaysDropExp = false; ++ public double piglinHeadVisibilityPercent = 0.5D; + private void piglinSettings() { + piglinRidable = getBoolean("mobs.piglin.ridable", piglinRidable); + piglinRidableInWater = getBoolean("mobs.piglin.ridable-in-water", piglinRidableInWater); +@@ -2061,6 +2064,7 @@ public class PurpurWorldConfig { + 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); ++ piglinHeadVisibilityPercent = getDouble("mobs.piglin.head-visibility-percent", piglinHeadVisibilityPercent); + } + + public boolean piglinBruteRidable = false; +@@ -2322,6 +2326,7 @@ public class PurpurWorldConfig { public double skeletonMaxHealth = 20.0D; public boolean skeletonTakeDamageFromWater = false; public boolean skeletonAlwaysDropExp = false; @@ -56,7 +75,7 @@ index 3d63043d7d25b52ab57059e3777d9c66af013d42..1daafc12b18e6554972b3457afaa05be private void skeletonSettings() { skeletonRidable = getBoolean("mobs.skeleton.ridable", skeletonRidable); skeletonRidableInWater = getBoolean("mobs.skeleton.ridable-in-water", skeletonRidableInWater); -@@ -2331,6 +2334,7 @@ public class PurpurWorldConfig { +@@ -2334,6 +2339,7 @@ public class PurpurWorldConfig { skeletonMaxHealth = getDouble("mobs.skeleton.attributes.max_health", skeletonMaxHealth); skeletonTakeDamageFromWater = getBoolean("mobs.skeleton.takes-damage-from-water", skeletonTakeDamageFromWater); skeletonAlwaysDropExp = getBoolean("mobs.skeleton.always-drop-exp", skeletonAlwaysDropExp); @@ -64,7 +83,7 @@ index 3d63043d7d25b52ab57059e3777d9c66af013d42..1daafc12b18e6554972b3457afaa05be } public boolean skeletonHorseRidableInWater = true; -@@ -2858,6 +2862,7 @@ public class PurpurWorldConfig { +@@ -2857,6 +2863,7 @@ public class PurpurWorldConfig { public boolean zombieBypassMobGriefing = false; public boolean zombieTakeDamageFromWater = false; public boolean zombieAlwaysDropExp = false; @@ -72,7 +91,7 @@ index 3d63043d7d25b52ab57059e3777d9c66af013d42..1daafc12b18e6554972b3457afaa05be private void zombieSettings() { zombieRidable = getBoolean("mobs.zombie.ridable", zombieRidable); zombieRidableInWater = getBoolean("mobs.zombie.ridable-in-water", zombieRidableInWater); -@@ -2876,6 +2881,7 @@ public class PurpurWorldConfig { +@@ -2875,6 +2882,7 @@ public class PurpurWorldConfig { zombieBypassMobGriefing = getBoolean("mobs.zombie.bypass-mob-griefing", zombieBypassMobGriefing); zombieTakeDamageFromWater = getBoolean("mobs.zombie.takes-damage-from-water", zombieTakeDamageFromWater); zombieAlwaysDropExp = getBoolean("mobs.zombie.always-drop-exp", zombieAlwaysDropExp); diff --git a/patches/server/0247-Configurable-valid-characters-for-usernames.patch b/patches/server/0241-Configurable-valid-characters-for-usernames.patch similarity index 90% rename from patches/server/0247-Configurable-valid-characters-for-usernames.patch rename to patches/server/0241-Configurable-valid-characters-for-usernames.patch index 850619c5b..b93d49564 100644 --- a/patches/server/0247-Configurable-valid-characters-for-usernames.patch +++ b/patches/server/0241-Configurable-valid-characters-for-usernames.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Configurable valid characters for usernames diff --git a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java -index 5fc79bc0b053465a59c08ec0e6716fab20979a3d..3a62b456e1f8ab68e3c34b9d73b822e379afd570 100644 +index 4ab0a893677acbbcf939f28799b2df8bba8b5567..ed0b120b286c017a15c66193ef8c43a4fc97a0db 100644 --- a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java -@@ -252,6 +252,8 @@ public class ServerLoginPacketListenerImpl implements TickablePacketListener, Se +@@ -220,6 +220,8 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener, return false; } diff --git a/patches/server/0248-Shears-can-have-looting-enchantment.patch b/patches/server/0242-Shears-can-have-looting-enchantment.patch similarity index 88% rename from patches/server/0248-Shears-can-have-looting-enchantment.patch rename to patches/server/0242-Shears-can-have-looting-enchantment.patch index 782256514..1e52017c3 100644 --- a/patches/server/0248-Shears-can-have-looting-enchantment.patch +++ b/patches/server/0242-Shears-can-have-looting-enchantment.patch @@ -37,10 +37,10 @@ index 5e8cc5cfac8888628c6d513148f41be09ca65a2c..a089fc61ec09be6b7490375489178dc6 boolean readyForShearing(); } diff --git a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java -index 5ae3d5620f94f2f7443c0b9ffbcd79293d096808..a3a321397fbacfdde241fb0d930cf9fc25838c61 100644 +index f517658a240a7c79889f9047e94e9afc884df78c..046e851a5c49e58fa4e84d398ffbe11baa9c4072 100644 --- a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java +++ b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java -@@ -165,7 +165,7 @@ public class MushroomCow extends Cow implements Shearable { +@@ -164,7 +164,7 @@ public class MushroomCow extends Cow implements Shearable, VariantHolder { -@@ -208,7 +208,7 @@ public class MushroomCow extends Cow implements Shearable { +@@ -207,7 +207,7 @@ public class MushroomCow extends Cow implements Shearable, VariantHolder { entityhuman1.broadcastBreakEvent(hand); -@@ -286,10 +286,11 @@ public class Sheep extends Animal implements Shearable { +@@ -307,10 +307,11 @@ public class Sheep extends Animal implements Shearable { } @Override diff --git a/patches/server/0249-Stop-bees-from-dying-after-stinging.patch b/patches/server/0243-Stop-bees-from-dying-after-stinging.patch similarity index 91% rename from patches/server/0249-Stop-bees-from-dying-after-stinging.patch rename to patches/server/0243-Stop-bees-from-dying-after-stinging.patch index 92233f23f..86d0bd47a 100644 --- a/patches/server/0249-Stop-bees-from-dying-after-stinging.patch +++ b/patches/server/0243-Stop-bees-from-dying-after-stinging.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Stop bees from dying after stinging diff --git a/src/main/java/net/minecraft/world/entity/animal/Bee.java b/src/main/java/net/minecraft/world/entity/animal/Bee.java -index 52b1c0eaed8a4509c0fbe78e3ead238c4426acdd..a2637285440e047e2b318c2c915ea2ccc4f72711 100644 +index 251fc8c09d3856464b8f5c64f7840a65553ae16c..7d8ab3c5d5277b81157d56b408293cc3ae511c78 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Bee.java +++ b/src/main/java/net/minecraft/world/entity/animal/Bee.java @@ -455,6 +455,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { @@ -17,7 +17,7 @@ index 52b1c0eaed8a4509c0fbe78e3ead238c4426acdd..a2637285440e047e2b318c2c915ea2cc ++this.timeSinceSting; if (this.timeSinceSting % 5 == 0 && this.random.nextInt(Mth.clamp(1200 - this.timeSinceSting, (int) 1, (int) 1200)) == 0) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index b75311013718fad79e07cb19dab32a83a560d377..b0497ab9990277b1a746a25b4c45d654b99abb56 100644 +index d4a25e677f2c40e53a881beca434ff1c5c5ab420..82ac1fbdd5f3d859902bdfa621837ea1977772ef 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -1059,6 +1059,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0250-Give-bee-counts-in-beehives-to-Purpur-clients.patch b/patches/server/0244-Give-bee-counts-in-beehives-to-Purpur-clients.patch similarity index 90% rename from patches/server/0250-Give-bee-counts-in-beehives-to-Purpur-clients.patch rename to patches/server/0244-Give-bee-counts-in-beehives-to-Purpur-clients.patch index 4603aec28..859779558 100644 --- a/patches/server/0250-Give-bee-counts-in-beehives-to-Purpur-clients.patch +++ b/patches/server/0244-Give-bee-counts-in-beehives-to-Purpur-clients.patch @@ -5,24 +5,24 @@ Subject: [PATCH] Give bee counts in beehives to Purpur clients diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 11bc98a1c9306f553c6034ed0c1ce7f586b6b21b..274ee228669973d3e0667a09ed05316006b01ad1 100644 +index 09add41216e85876517e4032523b60c08085da4c..732b2e703d25dde4af9808e940aca2f21b7ca71e 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1033,6 +1033,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop playersInRange = reducedRange ? playerchunk.playersInMobSpawnRange : playerchunk.playersInChunkTickRange; diff --git a/src/main/java/net/minecraft/world/entity/ai/goal/EatBlockGoal.java b/src/main/java/net/minecraft/world/entity/ai/goal/EatBlockGoal.java -index 3a633f369af8005de3c06cfa715a42e3b248b2f0..a7b878f97128e530c5b47873dd226490d471406b 100644 +index 3a633f369af8005de3c06cfa715a42e3b248b2f0..c55118a4d2237a33039b63dc797ccdb86b63344f 100644 --- a/src/main/java/net/minecraft/world/entity/ai/goal/EatBlockGoal.java +++ b/src/main/java/net/minecraft/world/entity/ai/goal/EatBlockGoal.java @@ -31,6 +31,12 @@ public class EatBlockGoal extends Goal { @@ -26,7 +26,7 @@ index 3a633f369af8005de3c06cfa715a42e3b248b2f0..a7b878f97128e530c5b47873dd226490 @Override public boolean canUse() { + // Purpur start -+ net.minecraft.world.level.chunk.LevelChunk chunk = this.mob.level.getChunkIfLoaded(this.mob.blockPosition); ++ net.minecraft.world.level.chunk.LevelChunk chunk = this.mob.level.getChunkIfLoaded(this.mob.blockPosition()); + if (chunk == null || chunk.playerChunk == null || !((net.minecraft.server.level.ServerLevel) this.mob.level).getChunkSource().chunkMap.anyPlayerCloseEnoughForSpawning(chunk.playerChunk, this.mob.chunkPosition(), false)) { + return false; + } diff --git a/patches/server/0255-Configurable-phantom-size.patch b/patches/server/0249-Configurable-phantom-size.patch similarity index 93% rename from patches/server/0255-Configurable-phantom-size.patch rename to patches/server/0249-Configurable-phantom-size.patch index 56717c1e2..a6b5d905d 100644 --- a/patches/server/0255-Configurable-phantom-size.patch +++ b/patches/server/0249-Configurable-phantom-size.patch @@ -22,10 +22,10 @@ index 35da78d79ee90acc69600adb78bc81ff75cee752..cf6f7c6c5754ab712e06a7bfb8c1ef8e } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index f52e6f16607c9f5a15896a0a32a2e49e50e91820..6d576d08dc39f09e2d941dd6e715199154337786 100644 +index ec6c0fb48ed2f8005bc53ef9a4efbb911f3eddd5..7fd1e5567a37d2434fd54042773211e21604a58a 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1984,6 +1984,8 @@ public class PurpurWorldConfig { +@@ -1987,6 +1987,8 @@ public class PurpurWorldConfig { public boolean phantomFlamesOnSwoop = false; public boolean phantomTakeDamageFromWater = false; public boolean phantomAlwaysDropExp = false; @@ -34,7 +34,7 @@ index f52e6f16607c9f5a15896a0a32a2e49e50e91820..6d576d08dc39f09e2d941dd6e7151991 private void phantomSettings() { phantomRidable = getBoolean("mobs.phantom.ridable", phantomRidable); phantomRidableInWater = getBoolean("mobs.phantom.ridable-in-water", phantomRidableInWater); -@@ -2020,6 +2022,13 @@ public class PurpurWorldConfig { +@@ -2023,6 +2025,13 @@ public class PurpurWorldConfig { phantomFlamesOnSwoop = getBoolean("mobs.phantom.flames-on-swoop", phantomFlamesOnSwoop); phantomTakeDamageFromWater = getBoolean("mobs.phantom.takes-damage-from-water", phantomTakeDamageFromWater); phantomAlwaysDropExp = getBoolean("mobs.phantom.always-drop-exp", phantomAlwaysDropExp); diff --git a/patches/server/0256-Configurable-food-attributes.patch b/patches/server/0250-Configurable-food-attributes.patch similarity index 94% rename from patches/server/0256-Configurable-food-attributes.patch rename to patches/server/0250-Configurable-food-attributes.patch index 9b66de319..8e6ce533c 100644 --- a/patches/server/0256-Configurable-food-attributes.patch +++ b/patches/server/0250-Configurable-food-attributes.patch @@ -51,10 +51,10 @@ index b16d9e2eaa589f19c563ee70b1a56d67dbcdecb0..71beab673f04cd051c46ea37f8c84731 public static final FoodProperties BAKED_POTATO = (new FoodProperties.Builder()).nutrition(5).saturationMod(0.6F).build(); public static final FoodProperties BEEF = (new FoodProperties.Builder()).nutrition(3).saturationMod(0.3F).meat().build(); diff --git a/src/main/java/net/minecraft/world/item/Items.java b/src/main/java/net/minecraft/world/item/Items.java -index fcdd30f38bc57cc382a47d99e3c31f9348ca12c3..e0b5af2d83a0ee5a04e10dd54936a173ed77e730 100644 +index 306abbe878cb84cea0fd2d87d45594fc25285a93..803bb632c2fb525b32e9bddc01f1c9112ee0bfba 100644 --- a/src/main/java/net/minecraft/world/item/Items.java +++ b/src/main/java/net/minecraft/world/item/Items.java -@@ -1216,6 +1216,13 @@ public class Items { +@@ -1236,6 +1236,13 @@ public class Items { ((BlockItem)item).registerBlocks(Item.BY_BLOCK, item); } @@ -65,11 +65,11 @@ index fcdd30f38bc57cc382a47d99e3c31f9348ca12c3..e0b5af2d83a0ee5a04e10dd54936a173 + } + // Purpur end + - return Registry.register(Registry.ITEM, id, item); + return Registry.register(BuiltInRegistries.ITEM, id, item); } } diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -index 73c2ae25ec8b556a1fdac9a30a3863d6ebaccac8..44d710e0710afbd99bb9569e40e21e1ffe3d2ece 100644 +index 1ffc3194cbf17932d7aee3e60348b3e439f09143..b13f4ec961651221704eba755791f5fd11eef366 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java @@ -481,4 +481,56 @@ public class PurpurConfig { @@ -108,7 +108,7 @@ index 73c2ae25ec8b556a1fdac9a30a3863d6ebaccac8..44d710e0710afbd99bb9569e40e21e1f + effectDefaults.put("show-icon", effect.showIcon()); + }); + effects.getKeys(false).forEach(effectKey -> { -+ MobEffect effect = Registry.MOB_EFFECT.get(new ResourceLocation(effectKey)); ++ MobEffect effect = BuiltInRegistries.MOB_EFFECT.get(new ResourceLocation(effectKey)); + if (effect == null) { + PurpurConfig.log(Level.SEVERE, "Invalid food property effect for " + foodKey + ": " + effectKey); + return; diff --git a/patches/server/0257-Max-joins-per-second.patch b/patches/server/0251-Max-joins-per-second.patch similarity index 93% rename from patches/server/0257-Max-joins-per-second.patch rename to patches/server/0251-Max-joins-per-second.patch index a8b593428..3245ab183 100644 --- a/patches/server/0257-Max-joins-per-second.patch +++ b/patches/server/0251-Max-joins-per-second.patch @@ -6,10 +6,10 @@ Subject: [PATCH] Max joins per second When this option is set to true the `max-joins-per-tick` setting in paper.yml will be used per second instead of per tick diff --git a/src/main/java/net/minecraft/network/Connection.java b/src/main/java/net/minecraft/network/Connection.java -index f1e1a4a48349c0e431b31327fdf217989db027b3..2b0ec158ff789b94fcc89ea3b4e8ece6d7185c57 100644 +index 507e98438f6d13de1bcf063db673a8e483dbea47..c5f497df73e7ff8ec41c24cc684eed36da77ccb7 100644 --- a/src/main/java/net/minecraft/network/Connection.java +++ b/src/main/java/net/minecraft/network/Connection.java -@@ -563,11 +563,20 @@ public class Connection extends SimpleChannelInboundHandler> { +@@ -562,11 +562,20 @@ public class Connection extends SimpleChannelInboundHandler> { private static final int MAX_PER_TICK = io.papermc.paper.configuration.GlobalConfiguration.get().misc.maxJoinsPerTick; // Paper private static int joinAttemptsThisTick; // Paper private static int currTick; // Paper diff --git a/patches/server/0258-Configurable-minimum-demand-for-trades.patch b/patches/server/0252-Configurable-minimum-demand-for-trades.patch similarity index 89% rename from patches/server/0258-Configurable-minimum-demand-for-trades.patch rename to patches/server/0252-Configurable-minimum-demand-for-trades.patch index 50bebef90..b54dae98d 100644 --- a/patches/server/0258-Configurable-minimum-demand-for-trades.patch +++ b/patches/server/0252-Configurable-minimum-demand-for-trades.patch @@ -9,10 +9,10 @@ This patch adds a config option to allow the minimum demand to instead be configurable. diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java -index 1d3e10d7cd27257e8fd83c3e882b05b9d4374c56..302c9b2c063013d8cbd01103e305f16d12f87d51 100644 +index 1d03c14796ff2002ee5d17e41c9fe4e500a9a193..4871ead905efe3c848a7a7321d7be3c3aade1593 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java -@@ -534,7 +534,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -520,7 +520,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler while (iterator.hasNext()) { MerchantOffer merchantrecipe = (MerchantOffer) iterator.next(); @@ -40,10 +40,10 @@ index 8a9a701baabdaf066cd9b28c05430f673fcafb4e..17cc3237c7fc8ceda136b2371fabf6f0 public ItemStack assemble() { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 6d576d08dc39f09e2d941dd6e715199154337786..07e61dbb279740711ac0ba624865a207c55118f0 100644 +index 67111ebca413fff823ec5dc4a46ab7216709f0a4..b16666f2490416c9e93d8c1cd75536eba02f5385 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -2656,6 +2656,7 @@ public class PurpurWorldConfig { +@@ -2659,6 +2659,7 @@ public class PurpurWorldConfig { public boolean villagerTakeDamageFromWater = false; public boolean villagerAllowTrading = true; public boolean villagerAlwaysDropExp = false; @@ -51,7 +51,7 @@ index 6d576d08dc39f09e2d941dd6e715199154337786..07e61dbb279740711ac0ba624865a207 private void villagerSettings() { villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); -@@ -2678,6 +2679,7 @@ public class PurpurWorldConfig { +@@ -2679,6 +2680,7 @@ public class PurpurWorldConfig { villagerTakeDamageFromWater = getBoolean("mobs.villager.takes-damage-from-water", villagerTakeDamageFromWater); villagerAllowTrading = getBoolean("mobs.villager.allow-trading", villagerAllowTrading); villagerAlwaysDropExp = getBoolean("mobs.villager.always-drop-exp", villagerAlwaysDropExp); diff --git a/patches/server/0259-Lobotomize-stuck-villagers.patch b/patches/server/0253-Lobotomize-stuck-villagers.patch similarity index 84% rename from patches/server/0259-Lobotomize-stuck-villagers.patch rename to patches/server/0253-Lobotomize-stuck-villagers.patch index f4971b80c..aceded783 100644 --- a/patches/server/0259-Lobotomize-stuck-villagers.patch +++ b/patches/server/0253-Lobotomize-stuck-villagers.patch @@ -5,19 +5,19 @@ Subject: [PATCH] Lobotomize stuck villagers diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java -index 302c9b2c063013d8cbd01103e305f16d12f87d51..c230faeece73b010ad3738e629a7adbc52a06df1 100644 +index 4871ead905efe3c848a7a7321d7be3c3aade1593..f8c78da70ad8b36c07c02259227a43444642e926 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java -@@ -140,6 +140,8 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -139,6 +139,8 @@ public class Villager extends AbstractVillager implements ReputationEventHandler + }, MemoryModuleType.MEETING_POINT, (entityvillager, holder) -> { return holder.is(PoiTypes.MEETING); }); - private final int brainTickOffset; // Purpur + private boolean isLobotomized = false; public boolean isLobotomized() { return this.isLobotomized; } // Purpur + private int notLobotomizedCount = 0; // Purpur - public long nextGolemPanic = -1; // Pufferfish - -@@ -198,6 +200,47 @@ public class Villager extends AbstractVillager implements ReputationEventHandler + public Villager(EntityType entityType, Level world) { + this(entityType, world, VillagerType.PLAINS); +@@ -194,6 +196,47 @@ public class Villager extends AbstractVillager implements ReputationEventHandler protected boolean isAlwaysExperienceDropper() { return this.level.purpurConfig.villagerAlwaysDropExp; } @@ -28,7 +28,7 @@ index 302c9b2c063013d8cbd01103e305f16d12f87d51..c230faeece73b010ad3738e629a7adbc + // check half as often if not lobotomized for the last 3+ consecutive checks + interval *= 2; + } -+ if ((this.level.getGameTime() + brainTickOffset) % interval == 0) { ++ if (this.level.getGameTime() % interval == 0) { + // offset Y for short blocks like dirt_path/farmland + this.isLobotomized = !canTravelFrom(new BlockPos(getX(), getY() + 0.0625D, getZ())); + @@ -65,7 +65,7 @@ index 302c9b2c063013d8cbd01103e305f16d12f87d51..c230faeece73b010ad3738e629a7adbc // Purpur end @Override -@@ -295,6 +338,15 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -290,7 +333,22 @@ public class Villager extends AbstractVillager implements ReputationEventHandler protected void customServerAiStep() { mobTick(false); } protected void mobTick(boolean inactive) { this.level.getProfiler().push("villagerBrain"); @@ -78,13 +78,7 @@ index 302c9b2c063013d8cbd01103e305f16d12f87d51..c230faeece73b010ad3738e629a7adbc + this.isLobotomized = false; + } + // Purpur end - // Pufferfish start - if (!inactive) { - // Purpur start -@@ -305,6 +357,12 @@ public class Villager extends AbstractVillager implements ReputationEventHandler - this.getBrain().tick((ServerLevel) this.level, this); // Paper - } - // Pufferfish end + if (!inactive && (getRider() == null || !this.isControllable())) this.getBrain().tick((ServerLevel) this.level, this); // Paper // Purpur - only use brain if no rider + // Purpur start + else if (this.isLobotomized && shouldRestock()) { + // make sure we restock if needed when lobotomized @@ -95,11 +89,11 @@ index 302c9b2c063013d8cbd01103e305f16d12f87d51..c230faeece73b010ad3738e629a7adbc if (this.assignProfessionWhenSpawned) { this.assignProfessionWhenSpawned = false; diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java -index 9220b1a7aa30ba59ac8dc6196859923b0675d8ec..3e820092c2b48c37b822a7afbb3f342340eed5c7 100644 +index a1a8ac55e572156671e47317ba061855be79e5ac..ec3fb8865211bd7625103c37af7b96df37163a07 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java @@ -222,4 +222,11 @@ public class CraftVillager extends CraftAbstractVillager implements Villager { - getHandle().getGossips().getReputations().clear(); + getHandle().getGossips().gossips.clear(); } // Paper end + @@ -111,10 +105,10 @@ index 9220b1a7aa30ba59ac8dc6196859923b0675d8ec..3e820092c2b48c37b822a7afbb3f3423 + // Purpur end } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 07e61dbb279740711ac0ba624865a207c55118f0..9368139cf5e5638c386a3c17bfad56f32f89029c 100644 +index b16666f2490416c9e93d8c1cd75536eba02f5385..31fb28fb38cdf7684ad2d6535a602fa7a8b83c5d 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -2657,6 +2657,8 @@ public class PurpurWorldConfig { +@@ -2660,6 +2660,8 @@ public class PurpurWorldConfig { public boolean villagerAllowTrading = true; public boolean villagerAlwaysDropExp = false; public int villagerMinimumDemand = 0; @@ -123,7 +117,7 @@ index 07e61dbb279740711ac0ba624865a207c55118f0..9368139cf5e5638c386a3c17bfad56f3 private void villagerSettings() { villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); -@@ -2680,6 +2682,17 @@ public class PurpurWorldConfig { +@@ -2681,6 +2683,17 @@ public class PurpurWorldConfig { villagerAllowTrading = getBoolean("mobs.villager.allow-trading", villagerAllowTrading); villagerAlwaysDropExp = getBoolean("mobs.villager.always-drop-exp", villagerAlwaysDropExp); villagerMinimumDemand = getInt("mobs.villager.minimum-demand", villagerMinimumDemand); diff --git a/patches/server/0260-Option-for-villager-display-trade-item.patch b/patches/server/0254-Option-for-villager-display-trade-item.patch similarity index 72% rename from patches/server/0260-Option-for-villager-display-trade-item.patch rename to patches/server/0254-Option-for-villager-display-trade-item.patch index 9a262c130..a94a8e552 100644 --- a/patches/server/0260-Option-for-villager-display-trade-item.patch +++ b/patches/server/0254-Option-for-villager-display-trade-item.patch @@ -5,22 +5,22 @@ Subject: [PATCH] Option for villager display trade item diff --git a/src/main/java/net/minecraft/world/entity/ai/behavior/ShowTradesToPlayer.java b/src/main/java/net/minecraft/world/entity/ai/behavior/ShowTradesToPlayer.java -index 385f3df7044e3f03f17c3ec7484b268004a3def9..90ba6a3abf62e4b272fada96b554ca31f72921ae 100644 +index 98373e013748817209b811d4adbb40a8787242a6..567b501f4de7556e55e2418d2f5700b4e4265235 100644 --- a/src/main/java/net/minecraft/world/entity/ai/behavior/ShowTradesToPlayer.java +++ b/src/main/java/net/minecraft/world/entity/ai/behavior/ShowTradesToPlayer.java @@ -42,6 +42,7 @@ public class ShowTradesToPlayer extends Behavior { @Override - public boolean canStillUse(ServerLevel serverLevel, Villager villager, long l) { -+ if (!villager.level.purpurConfig.villagerDisplayTradeItem) return false; // Purpur - return this.checkExtraStartConditions(serverLevel, villager) && this.lookTime > 0 && villager.getBrain().getMemory(MemoryModuleType.INTERACTION_TARGET).isPresent(); + public boolean canStillUse(ServerLevel world, Villager entity, long time) { ++ if (!entity.level.purpurConfig.villagerDisplayTradeItem) return false; // Purpur + return this.checkExtraStartConditions(world, entity) && this.lookTime > 0 && entity.getBrain().getMemory(MemoryModuleType.INTERACTION_TARGET).isPresent(); } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 9368139cf5e5638c386a3c17bfad56f32f89029c..96e3a42d67db41460c024527fd00aa043c372451 100644 +index 31fb28fb38cdf7684ad2d6535a602fa7a8b83c5d..3181045cbd3836e45c276699081feec8b5d15c48 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -2659,6 +2659,7 @@ public class PurpurWorldConfig { +@@ -2662,6 +2662,7 @@ public class PurpurWorldConfig { public int villagerMinimumDemand = 0; public boolean villagerLobotomizeEnabled = false; public int villagerLobotomizeCheckInterval = 100; @@ -28,7 +28,7 @@ index 9368139cf5e5638c386a3c17bfad56f32f89029c..96e3a42d67db41460c024527fd00aa04 private void villagerSettings() { villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); -@@ -2693,6 +2694,7 @@ public class PurpurWorldConfig { +@@ -2694,6 +2695,7 @@ public class PurpurWorldConfig { } villagerLobotomizeEnabled = getBoolean("mobs.villager.lobotomize.enabled", villagerLobotomizeEnabled); villagerLobotomizeCheckInterval = getInt("mobs.villager.lobotomize.check-interval", villagerLobotomizeCheckInterval); diff --git a/patches/server/0261-Fill-command-max-area-option.patch b/patches/server/0255-Fill-command-max-area-option.patch similarity index 100% rename from patches/server/0261-Fill-command-max-area-option.patch rename to patches/server/0255-Fill-command-max-area-option.patch diff --git a/patches/server/0262-MC-238526-Fix-spawner-not-spawning-water-animals-cor.patch b/patches/server/0256-MC-238526-Fix-spawner-not-spawning-water-animals-cor.patch similarity index 95% rename from patches/server/0262-MC-238526-Fix-spawner-not-spawning-water-animals-cor.patch rename to patches/server/0256-MC-238526-Fix-spawner-not-spawning-water-animals-cor.patch index 0b7acaf16..d27eee963 100644 --- a/patches/server/0262-MC-238526-Fix-spawner-not-spawning-water-animals-cor.patch +++ b/patches/server/0256-MC-238526-Fix-spawner-not-spawning-water-animals-cor.patch @@ -17,7 +17,7 @@ index 18389f46902bb9879ac6d734723e9a720724dc48..b2b8663a9cff08bacdab91c7bb014ba6 } } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 542b4164df5069ef2e19a321af4a8c789a624e40..485233cfa2a6414812ce7b67e761de6996beb589 100644 +index b2077af824453927f5c70f7d45977d4f53d71fe7..8bbfa9cfa17a3d654c4267b3a36335530e87c430 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -960,8 +960,10 @@ public class PurpurWorldConfig { diff --git a/patches/server/0263-Config-for-mob-last-hurt-by-player-time.patch b/patches/server/0257-Config-for-mob-last-hurt-by-player-time.patch similarity index 89% rename from patches/server/0263-Config-for-mob-last-hurt-by-player-time.patch rename to patches/server/0257-Config-for-mob-last-hurt-by-player-time.patch index 1d8e47925..5d319501d 100644 --- a/patches/server/0263-Config-for-mob-last-hurt-by-player-time.patch +++ b/patches/server/0257-Config-for-mob-last-hurt-by-player-time.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Config for mob last hurt by player time diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index d9d4a12555d0d791c551944ecdd7beb20aa8d2c6..0717f59c94f9579e05ed2938e14567be495ad1b0 100644 +index 3328dfb1790d66de36b92d0ef82ec6cabfde0968..cbee6924e6c26fafe51d996491ed89434ce1e0e5 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -1455,13 +1455,13 @@ public abstract class LivingEntity extends Entity { +@@ -1452,13 +1452,13 @@ public abstract class LivingEntity extends Entity { } if (entity1 instanceof net.minecraft.world.entity.player.Player) { @@ -21,9 +21,9 @@ index d9d4a12555d0d791c551944ecdd7beb20aa8d2c6..0717f59c94f9579e05ed2938e14567be if (entitywolf.isTame()) { - this.lastHurtByPlayerTime = 100; + this.lastHurtByPlayerTime = this.level.purpurConfig.mobLastHurtByPlayerTime; // Purpur - LivingEntity entityliving = entitywolf.getOwner(); + LivingEntity entityliving1 = entitywolf.getOwner(); - if (entityliving != null && entityliving.getType() == EntityType.PLAYER) { + if (entityliving1 != null && entityliving1.getType() == EntityType.PLAYER) { diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java index ea327baa5368afc27402d5863a6e238cea5be732..c56ea02591cae25834de4ca6045437ed59d95073 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java @@ -38,7 +38,7 @@ index ea327baa5368afc27402d5863a6e238cea5be732..c56ea02591cae25834de4ca6045437ed // Paper end diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index b43bd45d81773e5eefc492d0ec19b22b9a37c82a..636c6187c7bfca7546e0f385f89ab12222b3343f 100644 +index 8bbfa9cfa17a3d654c4267b3a36335530e87c430..b7bd5475d5f099515381cfc4e51f2b84af3aca6c 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -145,6 +145,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0264-Anvil-repair-damage-options.patch b/patches/server/0258-Anvil-repair-damage-options.patch similarity index 95% rename from patches/server/0264-Anvil-repair-damage-options.patch rename to patches/server/0258-Anvil-repair-damage-options.patch index cc49f501d..3ae1d2b64 100644 --- a/patches/server/0264-Anvil-repair-damage-options.patch +++ b/patches/server/0258-Anvil-repair-damage-options.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Anvil repair/damage options diff --git a/src/main/java/net/minecraft/world/level/block/AnvilBlock.java b/src/main/java/net/minecraft/world/level/block/AnvilBlock.java -index 1b23352a9deae37f9c947fef1b1f8a2875507cfa..ad5aad3682926e2e8965bb87ad8d5381905ea666 100644 +index 2aac479ce9886cfef99823a41205eb52b7996d26..ff9945a04ffbda5766bc794fced24f14d8efcdeb 100644 --- a/src/main/java/net/minecraft/world/level/block/AnvilBlock.java +++ b/src/main/java/net/minecraft/world/level/block/AnvilBlock.java -@@ -54,6 +54,54 @@ public class AnvilBlock extends FallingBlock { +@@ -55,6 +55,54 @@ public class AnvilBlock extends FallingBlock { @Override public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { @@ -64,7 +64,7 @@ index 1b23352a9deae37f9c947fef1b1f8a2875507cfa..ad5aad3682926e2e8965bb87ad8d5381 return InteractionResult.SUCCESS; } else { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index bb8d288074da9a0316815cf9af862b2c52936549..4d8257dea984aaaa98ca440d8e7a97dae2b3c66d 100644 +index b7bd5475d5f099515381cfc4e51f2b84af3aca6c..d1f0e4ebecc7ddd9c6728334d6e784113a657a10 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -721,9 +721,13 @@ public class PurpurWorldConfig { diff --git a/patches/server/0265-Fix-legacy-colors-in-console.patch b/patches/server/0259-Fix-legacy-colors-in-console.patch similarity index 100% rename from patches/server/0265-Fix-legacy-colors-in-console.patch rename to patches/server/0259-Fix-legacy-colors-in-console.patch diff --git a/patches/server/0266-Option-to-disable-turtle-egg-trampling-with-feather-.patch b/patches/server/0260-Option-to-disable-turtle-egg-trampling-with-feather-.patch similarity index 90% rename from patches/server/0266-Option-to-disable-turtle-egg-trampling-with-feather-.patch rename to patches/server/0260-Option-to-disable-turtle-egg-trampling-with-feather-.patch index deb7dde1d..99893ba5d 100644 --- a/patches/server/0266-Option-to-disable-turtle-egg-trampling-with-feather-.patch +++ b/patches/server/0260-Option-to-disable-turtle-egg-trampling-with-feather-.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Option to disable turtle egg trampling with feather falling diff --git a/src/main/java/net/minecraft/world/level/block/TurtleEggBlock.java b/src/main/java/net/minecraft/world/level/block/TurtleEggBlock.java -index 5e6df1d6cbaecb986d1b8d382fe673a2cbb76115..6151226a88a9ca44955821521641e7884e724731 100644 +index d4896c4d1eca6a1494571a40024422ada41d1e78..9f56496fd327f5baaf6b12f40d75646a0be5a6d4 100644 --- a/src/main/java/net/minecraft/world/level/block/TurtleEggBlock.java +++ b/src/main/java/net/minecraft/world/level/block/TurtleEggBlock.java -@@ -209,6 +209,10 @@ public class TurtleEggBlock extends Block { +@@ -211,6 +211,10 @@ public class TurtleEggBlock extends Block { if (entity instanceof LivingEntity && !(entity instanceof Player)) { return world.purpurConfig.turtleEggsBypassMobGriefing || world.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); } @@ -20,7 +20,7 @@ index 5e6df1d6cbaecb986d1b8d382fe673a2cbb76115..6151226a88a9ca44955821521641e788 // Purpur end } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 4d8257dea984aaaa98ca440d8e7a97dae2b3c66d..8a3b8bed4058336625cc3dcbe9449416dc666476 100644 +index d1f0e4ebecc7ddd9c6728334d6e784113a657a10..ccbaf28b720ec1e61272e16eecf7dc26a1195584 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -986,12 +986,14 @@ public class PurpurWorldConfig { diff --git a/patches/server/0267-Add-toggle-for-enchant-level-clamping.patch b/patches/server/0261-Add-toggle-for-enchant-level-clamping.patch similarity index 92% rename from patches/server/0267-Add-toggle-for-enchant-level-clamping.patch rename to patches/server/0261-Add-toggle-for-enchant-level-clamping.patch index 8642ffb8f..7e61cbf15 100644 --- a/patches/server/0267-Add-toggle-for-enchant-level-clamping.patch +++ b/patches/server/0261-Add-toggle-for-enchant-level-clamping.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add toggle for enchant level clamping diff --git a/src/main/java/net/minecraft/world/item/ItemStack.java b/src/main/java/net/minecraft/world/item/ItemStack.java -index 1626f86d8765509618b9ca59fb67b6b772802431..fd052e28de7ccee0cfd1a06e77156f023fa775a8 100644 +index ceac1de7dedf5702f2eb49e489790d24490722db..dd61a3971d9cd77fc31aadce7dfeceec68b2a157 100644 --- a/src/main/java/net/minecraft/world/item/ItemStack.java +++ b/src/main/java/net/minecraft/world/item/ItemStack.java -@@ -1147,7 +1147,7 @@ public final class ItemStack { +@@ -1158,7 +1158,7 @@ public final class ItemStack { ListTag nbttaglist = this.tag.getList("Enchantments", 10); @@ -18,7 +18,7 @@ index 1626f86d8765509618b9ca59fb67b6b772802431..fd052e28de7ccee0cfd1a06e77156f02 } diff --git a/src/main/java/net/minecraft/world/item/enchantment/EnchantmentHelper.java b/src/main/java/net/minecraft/world/item/enchantment/EnchantmentHelper.java -index 4afa30753a90d9bbd3c71b21cb4a8deadf9ccb3b..1d79da7f8405f7dff3b2e10022a564a9cf2609eb 100644 +index 659cd2d43d3cabc9bcc50857d6de858f417b7c31..b96b1e4efa35b796a985bf1eb4a7158c1706a34c 100644 --- a/src/main/java/net/minecraft/world/item/enchantment/EnchantmentHelper.java +++ b/src/main/java/net/minecraft/world/item/enchantment/EnchantmentHelper.java @@ -46,7 +46,7 @@ public class EnchantmentHelper { diff --git a/patches/server/0262-Skip-junit-tests-for-purpur-commands.patch b/patches/server/0262-Skip-junit-tests-for-purpur-commands.patch new file mode 100644 index 000000000..04d1c42f4 --- /dev/null +++ b/patches/server/0262-Skip-junit-tests-for-purpur-commands.patch @@ -0,0 +1,44 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: BillyGalbreath +Date: Thu, 8 Dec 2022 19:13:26 -0600 +Subject: [PATCH] Skip junit tests for purpur commands + + +diff --git a/src/test/java/io/papermc/paper/permissions/MinecraftCommandPermissionsTest.java b/src/test/java/io/papermc/paper/permissions/MinecraftCommandPermissionsTest.java +index 8665e2740aedcc2895b0e2c44ebaba53d2a40568..918b5a8f40e489e4d9d6406161878d6277c9ebc9 100644 +--- a/src/test/java/io/papermc/paper/permissions/MinecraftCommandPermissionsTest.java ++++ b/src/test/java/io/papermc/paper/permissions/MinecraftCommandPermissionsTest.java +@@ -45,6 +45,7 @@ public class MinecraftCommandPermissionsTest extends AbstractTestingBase { + Set foundPerms = new HashSet<>(); + for (CommandNode child : root.getChildren()) { + final String vanillaPerm = VanillaCommandWrapper.getPermission(child); ++ if (TO_SKIP.contains(vanillaPerm)) continue; // Purpur + if (!perms.contains(vanillaPerm)) { + missing.add("Missing permission for " + child.getName() + " (" + vanillaPerm + ") command"); + } else { +@@ -57,6 +58,25 @@ public class MinecraftCommandPermissionsTest extends AbstractTestingBase { + } + + private static final List TO_SKIP = List.of( ++ // Purpur start ++ "bukkit.command.compass", ++ "bukkit.command.credits", ++ "bukkit.command.demo", ++ "bukkit.command.ping", ++ "bukkit.command.ram", ++ "bukkit.command.rambar", ++ "bukkit.command.tpsbar", ++ "bukkit.command.uptime", ++ "minecraft.command.debug", ++ "minecraft.command.gamemode.adventure", ++ "minecraft.command.gamemode.adventure.other", ++ "minecraft.command.gamemode.creative", ++ "minecraft.command.gamemode.creative.other", ++ "minecraft.command.gamemode.spectator", ++ "minecraft.command.gamemode.spectator.other", ++ "minecraft.command.gamemode.survival", ++ "minecraft.command.gamemode.survival.other", ++ // Purpur end + "minecraft.command.selector" + ); + diff --git a/patches/server/0270-Implement-configurable-search-radius-for-villagers-t.patch b/patches/server/0263-Implement-configurable-search-radius-for-villagers-t.patch similarity index 87% rename from patches/server/0270-Implement-configurable-search-radius-for-villagers-t.patch rename to patches/server/0263-Implement-configurable-search-radius-for-villagers-t.patch index 08ad90ea4..0a737cc29 100644 --- a/patches/server/0270-Implement-configurable-search-radius-for-villagers-t.patch +++ b/patches/server/0263-Implement-configurable-search-radius-for-villagers-t.patch @@ -6,10 +6,10 @@ Subject: [PATCH] Implement configurable search radius for villagers to spawn diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java -index c230faeece73b010ad3738e629a7adbc52a06df1..36dedae44ae743e1a5bc170c420e0a847bcb3a50 100644 +index f8c78da70ad8b36c07c02259227a43444642e926..dd724eccd08c60f482f74dfadea21ef6087856a4 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java -@@ -1083,6 +1083,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -1073,6 +1073,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler } public void spawnGolemIfNeeded(ServerLevel world, long time, int requiredCount) { @@ -18,10 +18,10 @@ index c230faeece73b010ad3738e629a7adbc52a06df1..36dedae44ae743e1a5bc170c420e0a84 AABB axisalignedbb = this.getBoundingBox().inflate(10.0D, 10.0D, 10.0D); List list = world.getEntitiesOfClass(Villager.class, axisalignedbb); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 22bd65554e9bed262b4ca8bbe9afb1aab1c84bc8..a6fa2dc85de9db000cf462a3cff572cadac44a79 100644 +index 60ed1b3caed82256686fe75447f6d5cd4a2b14aa..51347d45266cfaf0bc662271ed19deae5ab98fdb 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -2672,6 +2672,8 @@ public class PurpurWorldConfig { +@@ -2673,6 +2673,8 @@ public class PurpurWorldConfig { public boolean villagerLobotomizeEnabled = false; public int villagerLobotomizeCheckInterval = 100; public boolean villagerDisplayTradeItem = true; @@ -30,7 +30,7 @@ index 22bd65554e9bed262b4ca8bbe9afb1aab1c84bc8..a6fa2dc85de9db000cf462a3cff572ca private void villagerSettings() { villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); -@@ -2707,6 +2709,8 @@ public class PurpurWorldConfig { +@@ -2706,6 +2708,8 @@ public class PurpurWorldConfig { villagerLobotomizeEnabled = getBoolean("mobs.villager.lobotomize.enabled", villagerLobotomizeEnabled); villagerLobotomizeCheckInterval = getInt("mobs.villager.lobotomize.check-interval", villagerLobotomizeCheckInterval); villagerDisplayTradeItem = getBoolean("mobs.villager.display-trade-item", villagerDisplayTradeItem); diff --git a/patches/server/0271-Stonecutter-damage.patch b/patches/server/0264-Stonecutter-damage.patch similarity index 91% rename from patches/server/0271-Stonecutter-damage.patch rename to patches/server/0264-Stonecutter-damage.patch index ebe8809fa..386179854 100644 --- a/patches/server/0271-Stonecutter-damage.patch +++ b/patches/server/0264-Stonecutter-damage.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Stonecutter damage diff --git a/src/main/java/net/minecraft/world/damagesource/DamageSource.java b/src/main/java/net/minecraft/world/damagesource/DamageSource.java -index 8b03b8e58e16ab9b677ba14cf1d09b417cf369f5..b87867b0cd507b969f398399684c597e99e26753 100644 +index f3a682fdc1c9ba24a9532c6c17ea3c4e733ae6ef..eac1351ef29d4c05d665e7bceea4cc72ce10e943 100644 --- a/src/main/java/net/minecraft/world/damagesource/DamageSource.java +++ b/src/main/java/net/minecraft/world/damagesource/DamageSource.java -@@ -45,6 +45,12 @@ public class DamageSource { +@@ -42,6 +42,12 @@ public class DamageSource { return getLocalizedDeathMessage(org.purpurmc.purpur.PurpurConfig.deathMsgRunWithScissors, entity); } }).bypassArmor(); @@ -43,10 +43,10 @@ index 0a95842c53a9d0286c57bcb42db97e468e30fb7d..b6742a1efcceb0fb950d995101b6be16 + // Purpur end } diff --git a/src/main/java/net/minecraft/world/level/pathfinder/WalkNodeEvaluator.java b/src/main/java/net/minecraft/world/level/pathfinder/WalkNodeEvaluator.java -index 444bec169c0cd5fe1a23f1d14fae1a10ca3d67c4..6b6093608e3fe97e72a1db5ad2a95b2818664cf1 100644 +index 6fbac97beacd0f806301c34de4ca6495b5aa705e..365c3d01a59d117ee9f238b1c1ded645d6b758d3 100644 --- a/src/main/java/net/minecraft/world/level/pathfinder/WalkNodeEvaluator.java +++ b/src/main/java/net/minecraft/world/level/pathfinder/WalkNodeEvaluator.java -@@ -487,7 +487,7 @@ public class WalkNodeEvaluator extends NodeEvaluator { +@@ -475,7 +475,7 @@ public class WalkNodeEvaluator extends NodeEvaluator { return BlockPathTypes.DANGER_CACTUS; } @@ -55,7 +55,7 @@ index 444bec169c0cd5fe1a23f1d14fae1a10ca3d67c4..6b6093608e3fe97e72a1db5ad2a95b28 return BlockPathTypes.DANGER_OTHER; } -@@ -519,7 +519,7 @@ public class WalkNodeEvaluator extends NodeEvaluator { +@@ -507,7 +507,7 @@ public class WalkNodeEvaluator extends NodeEvaluator { return BlockPathTypes.POWDER_SNOW; } else if (blockState.is(Blocks.CACTUS)) { return BlockPathTypes.DAMAGE_CACTUS; @@ -65,7 +65,7 @@ index 444bec169c0cd5fe1a23f1d14fae1a10ca3d67c4..6b6093608e3fe97e72a1db5ad2a95b28 } else if (blockState.is(Blocks.HONEY_BLOCK)) { return BlockPathTypes.STICKY_HONEY; diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java -index 49cd0e6f2eae6a182ea9ef43e734751da28bab4a..c47f6434d8c52d0524b0ce065ace5c45d589867f 100644 +index 07ecccf5eddb0088e5409b3bb8a6b3c1883189d2..8378c458b03bf0fe71dbc7452dce40f665f1ab10 100644 --- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java @@ -1056,6 +1056,10 @@ public class CraftEventFactory { @@ -95,7 +95,7 @@ index 6ae12d6684620a0e524294b28a5abcbc53392089..fec6308aeb99826040fdf5424362b99e public static boolean advancementOnlyBroadcastToAffectedPlayer = false; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index a3185ebf22677b829f966ddfb6f0bab43b0c9196..cfe0ed72615eb3c3b01a0e787d0151578bbbbdec 100644 +index 9d3418e5e13e7750d22ea26c2a448daf1b05573a..4267a4ef91b7bed9a8d145ade36f7f6bd461053e 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -981,6 +981,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0272-Configurable-damage-settings-for-magma-blocks.patch b/patches/server/0265-Configurable-damage-settings-for-magma-blocks.patch similarity index 96% rename from patches/server/0272-Configurable-damage-settings-for-magma-blocks.patch rename to patches/server/0265-Configurable-damage-settings-for-magma-blocks.patch index 4dff78b39..fc43d5f00 100644 --- a/patches/server/0272-Configurable-damage-settings-for-magma-blocks.patch +++ b/patches/server/0265-Configurable-damage-settings-for-magma-blocks.patch @@ -18,7 +18,7 @@ index d3540a4daaa8021ae009bfd4d9ef4f1172ab4c56..2b250439f263f64db7920536ed6eaf64 entity.hurt(DamageSource.HOT_FLOOR, 1.0F); org.bukkit.craftbukkit.event.CraftEventFactory.blockDamage = null; // CraftBukkit diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index cfe0ed72615eb3c3b01a0e787d0151578bbbbdec..4fc15a74ba952ff36468155bba1e6cf6ca6cd4d6 100644 +index 4267a4ef91b7bed9a8d145ade36f7f6bd461053e..d7aa5e5119c085ad806e3207b260e612bb27f806 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -917,6 +917,13 @@ public class PurpurWorldConfig { diff --git a/patches/server/0273-Add-config-for-snow-on-blue-ice.patch b/patches/server/0266-Add-config-for-snow-on-blue-ice.patch similarity index 95% rename from patches/server/0273-Add-config-for-snow-on-blue-ice.patch rename to patches/server/0266-Add-config-for-snow-on-blue-ice.patch index abf7cd1a6..4b5edb3a7 100644 --- a/patches/server/0273-Add-config-for-snow-on-blue-ice.patch +++ b/patches/server/0266-Add-config-for-snow-on-blue-ice.patch @@ -22,7 +22,7 @@ index 14e00c7feb1c051d56a3d27cd00dcef072dd771a..4952fb1aaaafb55baa0fddb389f966a1 } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 4fc15a74ba952ff36468155bba1e6cf6ca6cd4d6..867df5dba42a37589ec563fa0c6945e3b39151c9 100644 +index d7aa5e5119c085ad806e3207b260e612bb27f806..e790112855f67f2fd19dfa3fa6b49cadcf7e10a4 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -896,9 +896,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0275-Skeletons-eat-wither-roses.patch b/patches/server/0267-Skeletons-eat-wither-roses.patch similarity index 90% rename from patches/server/0275-Skeletons-eat-wither-roses.patch rename to patches/server/0267-Skeletons-eat-wither-roses.patch index 4e46594ba..e9f95e023 100644 --- a/patches/server/0275-Skeletons-eat-wither-roses.patch +++ b/patches/server/0267-Skeletons-eat-wither-roses.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Skeletons eat wither roses diff --git a/src/main/java/net/minecraft/world/entity/monster/Skeleton.java b/src/main/java/net/minecraft/world/entity/monster/Skeleton.java -index 51c548cd84bd83624fbff3f853a8050dc1e71ecd..2c85d71cfb486d30cb58b3378ebcdf55e18423fd 100644 +index f5e8fbccd819f6fb66918bceb93d000da038d7ef..e0352f073c95f8caf47d6789c0bd10e5a8c329c8 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Skeleton.java +++ b/src/main/java/net/minecraft/world/entity/monster/Skeleton.java @@ -14,6 +14,16 @@ import net.minecraft.world.item.Items; @@ -24,8 +24,8 @@ index 51c548cd84bd83624fbff3f853a8050dc1e71ecd..2c85d71cfb486d30cb58b3378ebcdf55 + public class Skeleton extends AbstractSkeleton { - public static final EntityDataAccessor DATA_STRAY_CONVERSION_ID = SynchedEntityData.defineId(Skeleton.class, EntityDataSerializers.BOOLEAN); -@@ -170,4 +180,67 @@ public class Skeleton extends AbstractSkeleton { + private static final int TOTAL_CONVERSION_TIME = 300; +@@ -174,4 +184,67 @@ public class Skeleton extends AbstractSkeleton { } } @@ -94,10 +94,10 @@ index 51c548cd84bd83624fbff3f853a8050dc1e71ecd..2c85d71cfb486d30cb58b3378ebcdf55 + // Purpur end } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index e937e689a46ffedfc54400fade9750aa737f0ce9..f90f561b112e35579be997b387492890b1cdf80e 100644 +index 8b6a50794b65e8dadf74a4be0f86d40f26d1d63a..edc51e44e219d1adf9428074086f53b54f2e5ad8 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -2365,6 +2365,7 @@ public class PurpurWorldConfig { +@@ -2368,6 +2368,7 @@ public class PurpurWorldConfig { public boolean skeletonTakeDamageFromWater = false; public boolean skeletonAlwaysDropExp = false; public double skeletonHeadVisibilityPercent = 0.5D; @@ -105,7 +105,7 @@ index e937e689a46ffedfc54400fade9750aa737f0ce9..f90f561b112e35579be997b387492890 private void skeletonSettings() { skeletonRidable = getBoolean("mobs.skeleton.ridable", skeletonRidable); skeletonRidableInWater = getBoolean("mobs.skeleton.ridable-in-water", skeletonRidableInWater); -@@ -2378,6 +2379,7 @@ public class PurpurWorldConfig { +@@ -2381,6 +2382,7 @@ public class PurpurWorldConfig { skeletonTakeDamageFromWater = getBoolean("mobs.skeleton.takes-damage-from-water", skeletonTakeDamageFromWater); skeletonAlwaysDropExp = getBoolean("mobs.skeleton.always-drop-exp", skeletonAlwaysDropExp); skeletonHeadVisibilityPercent = getDouble("mobs.skeleton.head-visibility-percent", skeletonHeadVisibilityPercent); diff --git a/patches/server/0268-Config-to-prevent-horses-from-standing-when-hurt.patch b/patches/server/0268-Config-to-prevent-horses-from-standing-when-hurt.patch deleted file mode 100644 index 0f8601ab5..000000000 --- a/patches/server/0268-Config-to-prevent-horses-from-standing-when-hurt.patch +++ /dev/null @@ -1,42 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: galacticwarrior9 -Date: Thu, 14 Apr 2022 17:48:07 +0100 -Subject: [PATCH] Config to prevent horses from standing when hurt - -Horses have a chance to stand when their hurt noise plays (i.e. when taking damage). - -This patch adds an option to toggle this behaviour ('stand-when-hurt'). - -diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/AbstractHorse.java b/src/main/java/net/minecraft/world/entity/animal/horse/AbstractHorse.java -index 7466c437b2e996f16a08aaefc5c2b7cba216a14c..205ce2bd91a98a0c67d3c5dd640eb88c052f9425 100644 ---- a/src/main/java/net/minecraft/world/entity/animal/horse/AbstractHorse.java -+++ b/src/main/java/net/minecraft/world/entity/animal/horse/AbstractHorse.java -@@ -388,7 +388,7 @@ public abstract class AbstractHorse extends Animal implements ContainerListener, - @Nullable - @Override - protected SoundEvent getHurtSound(DamageSource source) { -- if (this.random.nextInt(3) == 0) { -+ if (this.level.purpurConfig.horseStandWhenHurt && this.random.nextInt(3) == 0) { // Purpur - this.stand(); - } - -diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 8a3b8bed4058336625cc3dcbe9449416dc666476..d9f6345190d6efa330a680bc4d46962e47ad50f2 100644 ---- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1682,6 +1682,7 @@ public class PurpurWorldConfig { - public int horseBreedingTicks = 6000; - public boolean horseTakeDamageFromWater = false; - public boolean horseStandWithRider = true; -+ public boolean horseStandWhenHurt = true; - public boolean horseAlwaysDropExp = false; - private void horseSettings() { - horseRidableInWater = getBoolean("mobs.horse.ridable-in-water", horseRidableInWater); -@@ -1701,6 +1702,7 @@ public class PurpurWorldConfig { - horseBreedingTicks = getInt("mobs.horse.breeding-delay-ticks", horseBreedingTicks); - horseTakeDamageFromWater = getBoolean("mobs.horse.takes-damage-from-water", horseTakeDamageFromWater); - horseStandWithRider = getBoolean("mobs.horse.stand-with-rider", horseStandWithRider); -+ horseStandWhenHurt = getBoolean("mobs.horse.stand-when-hurt", horseStandWhenHurt); - horseAlwaysDropExp = getBoolean("mobs.horse.always-drop-exp", horseAlwaysDropExp); - } - diff --git a/patches/server/0276-Enchantment-Table-Persists-Lapis.patch b/patches/server/0268-Enchantment-Table-Persists-Lapis.patch similarity index 96% rename from patches/server/0276-Enchantment-Table-Persists-Lapis.patch rename to patches/server/0268-Enchantment-Table-Persists-Lapis.patch index 8894c1685..b7277cbc2 100644 --- a/patches/server/0276-Enchantment-Table-Persists-Lapis.patch +++ b/patches/server/0268-Enchantment-Table-Persists-Lapis.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Enchantment Table Persists Lapis diff --git a/src/main/java/net/minecraft/world/inventory/EnchantmentMenu.java b/src/main/java/net/minecraft/world/inventory/EnchantmentMenu.java -index f7404f41c2df202a428711e7e09a9a6eb11bf527..d0baf170d0b535b4b1a8c48944a91de333127dc1 100644 +index 0d464958c63d4bb460bb65cfa5c227b21101a069..02f5dd214cdb59685cb4129bf143904d4cb83011 100644 --- a/src/main/java/net/minecraft/world/inventory/EnchantmentMenu.java +++ b/src/main/java/net/minecraft/world/inventory/EnchantmentMenu.java @@ -38,6 +38,12 @@ import org.bukkit.event.enchantment.PrepareItemEnchantEvent; @@ -146,10 +146,10 @@ index 65e1381bb2d10bd212463feb602c60f8fdb9ade1..b7370e64fd0d50e8725d7d5afc30af2e + // Purpur } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 9b90d6faa404e14265f189a594bbcea18de70e37..8bf1e1a51794374a9c7cc7bb29a8a790aa8753bc 100644 +index cb23007b6424eb76dcdb61d615f2dd6fc11ad5ca..e91d40e861ec5aa1f04ab73a16e8facae72d556f 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1398,6 +1398,11 @@ public class PurpurWorldConfig { +@@ -1403,6 +1403,11 @@ public class PurpurWorldConfig { elderGuardianAlwaysDropExp = getBoolean("mobs.elder_guardian.always-drop-exp", elderGuardianAlwaysDropExp); } diff --git a/patches/server/0269-Drop-incompatible-tests.patch b/patches/server/0269-Drop-incompatible-tests.patch deleted file mode 100644 index 1f19a5568..000000000 --- a/patches/server/0269-Drop-incompatible-tests.patch +++ /dev/null @@ -1,98 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Ben Kerllenevich -Date: Wed, 8 Jun 2022 13:49:49 -0400 -Subject: [PATCH] Drop incompatible tests - - -diff --git a/src/test/java/io/papermc/paper/permissions/MinecraftCommandPermissionsTest.java b/src/test/java/io/papermc/paper/permissions/MinecraftCommandPermissionsTest.java -deleted file mode 100644 -index da2eb57ea64403657744ea00eff40243ef51df58..0000000000000000000000000000000000000000 ---- a/src/test/java/io/papermc/paper/permissions/MinecraftCommandPermissionsTest.java -+++ /dev/null -@@ -1,86 +0,0 @@ --package io.papermc.paper.permissions; -- --import com.mojang.brigadier.tree.CommandNode; --import com.mojang.brigadier.tree.RootCommandNode; --import net.minecraft.commands.CommandBuildContext; --import net.minecraft.commands.CommandSourceStack; --import net.minecraft.commands.Commands; --import net.minecraft.core.RegistryAccess; --import net.minecraft.server.Bootstrap; --import org.bukkit.Bukkit; --import org.bukkit.craftbukkit.command.VanillaCommandWrapper; --import org.bukkit.craftbukkit.util.permissions.CraftDefaultPermissions; --import org.bukkit.permissions.Permission; --import org.bukkit.support.AbstractTestingBase; --import org.junit.AfterClass; --import org.junit.BeforeClass; --import org.junit.Test; -- --import java.io.PrintStream; --import java.util.HashSet; --import java.util.LinkedHashSet; --import java.util.List; --import java.util.Set; --import java.util.TreeSet; -- --import static org.junit.Assert.assertTrue; -- --public class MinecraftCommandPermissionsTest extends AbstractTestingBase { -- -- private static PrintStream old; -- @BeforeClass -- public static void before() { -- old = System.out; -- System.setOut(Bootstrap.STDOUT); -- } -- -- @Test -- public void test() { -- CraftDefaultPermissions.registerCorePermissions(); -- Set perms = collectMinecraftCommandPerms(); -- -- Commands commands = new Commands(Commands.CommandSelection.DEDICATED, new CommandBuildContext(RegistryAccess.BUILTIN.get())); -- RootCommandNode root = commands.getDispatcher().getRoot(); -- Set missing = new LinkedHashSet<>(); -- Set foundPerms = new HashSet<>(); -- for (CommandNode child : root.getChildren()) { -- final String vanillaPerm = VanillaCommandWrapper.getPermission(child); -- if (!perms.contains(vanillaPerm)) { -- missing.add("Missing permission for " + child.getName() + " (" + vanillaPerm + ") command"); -- } else { -- foundPerms.add(vanillaPerm); -- } -- } -- assertTrue("Commands missing permissions: \n" + String.join("\n", missing), missing.isEmpty()); -- perms.removeAll(foundPerms); -- assertTrue("Extra permissions not associated with a command: \n" + String.join("\n", perms), perms.isEmpty()); -- } -- -- private static final List TO_SKIP = List.of( -- "minecraft.command.selector" -- ); -- -- private static Set collectMinecraftCommandPerms() { -- Set perms = new TreeSet<>(); -- for (Permission perm : Bukkit.getPluginManager().getPermissions()) { -- if (perm.getName().startsWith("minecraft.command.")) { -- if (TO_SKIP.contains(perm.getName())) { -- continue; -- } -- if (perm.getName().endsWith(".xp")) { -- perms.add("minecraft.command.experience"); // for the "experience" command, craftbukkit perm is "minecraft.command.xp" -- continue; -- } -- perms.add(perm.getName()); -- } -- } -- return perms; -- } -- -- @AfterClass -- public static void after() { -- if (old != null) { -- System.setOut(old); -- } -- } --} diff --git a/patches/server/0277-Spark-Profiler.patch b/patches/server/0269-Spark-Profiler.patch similarity index 93% rename from patches/server/0277-Spark-Profiler.patch rename to patches/server/0269-Spark-Profiler.patch index 807d8f66b..01ea58478 100644 --- a/patches/server/0277-Spark-Profiler.patch +++ b/patches/server/0269-Spark-Profiler.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Spark Profiler diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index fd58d9e6a19fb04e1a93cd0aa0fa12a405abaee1..39126cfe915c5e5777813b14ceab6427205b2a76 100644 +index 1e926f952f18128859604c866423639472c4d77b..c77f76d3b346d25aa48233ad8516a85118f26a9f 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -420,7 +420,38 @@ public final class CraftServer implements Server { +@@ -433,7 +433,38 @@ public final class CraftServer implements Server { if (!pluginFolder.exists()) { pluginFolder.mkdirs(); } diff --git a/patches/server/0278-Option-to-disable-kick-for-out-of-order-chat.patch b/patches/server/0270-Option-to-disable-kick-for-out-of-order-chat.patch similarity index 85% rename from patches/server/0278-Option-to-disable-kick-for-out-of-order-chat.patch rename to patches/server/0270-Option-to-disable-kick-for-out-of-order-chat.patch index 45af52c99..ed8f97f35 100644 --- a/patches/server/0278-Option-to-disable-kick-for-out-of-order-chat.patch +++ b/patches/server/0270-Option-to-disable-kick-for-out-of-order-chat.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Option to disable kick for out of order chat diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 32c0c403f44ccfe215a0003c060b131edae72a7c..799c279e63f23227cb473f7828aeaf7afb0de355 100644 +index 69011c01936eae6a8939b94acfaac56c2cf6cae6..cf948e263d33d0b6f7f3ab498c5afbad2325d893 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -2453,7 +2453,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -2440,7 +2440,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic do { instant1 = (Instant) this.lastChatTimeStamp.get(); if (timestamp.isBefore(instant1)) { @@ -18,10 +18,10 @@ index 32c0c403f44ccfe215a0003c060b131edae72a7c..799c279e63f23227cb473f7828aeaf7a } while (!this.lastChatTimeStamp.compareAndSet(instant1, timestamp)); diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -index a0ea28386a12973fcff0c7c2462205ff9e451b35..d75604b369b44e493da22a5408530b644c6dc1d6 100644 +index fec6308aeb99826040fdf5424362b99e07b42838..986f4daaf054b0807deab5066c6734b18ddaa7a1 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -@@ -480,9 +480,11 @@ public class PurpurConfig { +@@ -478,9 +478,11 @@ public class PurpurConfig { public static boolean useUPnP = false; public static boolean maxJoinsPerSecond = false; diff --git a/patches/server/0279-Config-for-sculk-shrieker-can_summon-state.patch b/patches/server/0271-Config-for-sculk-shrieker-can_summon-state.patch similarity index 95% rename from patches/server/0279-Config-for-sculk-shrieker-can_summon-state.patch rename to patches/server/0271-Config-for-sculk-shrieker-can_summon-state.patch index e4e31a516..9d391739b 100644 --- a/patches/server/0279-Config-for-sculk-shrieker-can_summon-state.patch +++ b/patches/server/0271-Config-for-sculk-shrieker-can_summon-state.patch @@ -18,7 +18,7 @@ index e0998215841e500e5982a242e9f4e646402e1521..11038ba560439dab04c54c31a32d63be @Override diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 8bf1e1a51794374a9c7cc7bb29a8a790aa8753bc..da5fef5c29c9c2c0cad67ea6868266c1417ca067 100644 +index 4a141f9278eb31998f2bdac890274630374b929c..38c8ed48427ba1862bc3ab2219d3f162d76dbe3c 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -957,6 +957,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0280-Config-to-not-let-coral-die.patch b/patches/server/0272-Config-to-not-let-coral-die.patch similarity index 96% rename from patches/server/0280-Config-to-not-let-coral-die.patch rename to patches/server/0272-Config-to-not-let-coral-die.patch index ebdaff890..e6ea6f509 100644 --- a/patches/server/0280-Config-to-not-let-coral-die.patch +++ b/patches/server/0272-Config-to-not-let-coral-die.patch @@ -29,7 +29,7 @@ index 88faea00be60a519f56f975a5311df5e1eb3e6b8..cbb726ac367be81e27d3a86643baf7c4 int i = aenumdirection.length; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index da5fef5c29c9c2c0cad67ea6868266c1417ca067..1c0d12579bcb375698ce40804279094d03d7133b 100644 +index 38c8ed48427ba1862bc3ab2219d3f162d76dbe3c..d8067822ee9b94a070773950bc893032b10e7c3a 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -805,6 +805,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0281-Add-local-difficulty-api.patch b/patches/server/0273-Add-local-difficulty-api.patch similarity index 85% rename from patches/server/0281-Add-local-difficulty-api.patch rename to patches/server/0273-Add-local-difficulty-api.patch index 8eb14ef58..90fd5d4da 100644 --- a/patches/server/0281-Add-local-difficulty-api.patch +++ b/patches/server/0273-Add-local-difficulty-api.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add local difficulty api diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -index 81ab184cb5235913ef43ae4d7f1ac82bce927519..0462ed0da625b3d1ee6f5fb6c219a593309f4f9e 100644 +index c5eb25b191cbb496be2a761d0b6eec9776319687..8e2e58ae379379808f347d503ddcfbb961c98763 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -@@ -2234,6 +2234,12 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -2233,6 +2233,12 @@ public class CraftWorld extends CraftRegionAccessor implements World { return (this.getHandle().dragonFight() == null) ? null : new CraftDragonBattle(this.getHandle().dragonFight()); } diff --git a/patches/server/0274-Add-log-suppression-for-sent-expired-chat.patch b/patches/server/0274-Add-log-suppression-for-sent-expired-chat.patch deleted file mode 100644 index ecfdc1936..000000000 --- a/patches/server/0274-Add-log-suppression-for-sent-expired-chat.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: BillyGalbreath -Date: Sat, 11 Jun 2022 08:18:40 -0500 -Subject: [PATCH] Add log suppression for sent expired chat - - -diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index f4d769b3fc2e514308c14805d9cfb297b7b3f912..0d0f45160cb5e65ea6b3a8eae953935b45863ec8 100644 ---- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -2692,7 +2692,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic - } - } - -- if (message.hasExpiredServer(Instant.now())) { -+ if (!org.purpurmc.purpur.PurpurConfig.loggerSuppressSentExpiredChat && message.hasExpiredServer(Instant.now())) { // Purpur - ServerGamePacketListenerImpl.LOGGER.warn("{} sent expired chat: '{}'. Is the client/server system time unsynchronized? c: {} s: {}", this.player.getName().getString(), message.signedContent().plain(), message.timeStamp().getEpochSecond(), Instant.now().getEpochSecond()); // Paper - } - -diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -index fec6308aeb99826040fdf5424362b99e07b42838..a0ea28386a12973fcff0c7c2462205ff9e451b35 100644 ---- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java -+++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -@@ -464,11 +464,13 @@ public class PurpurConfig { - public static boolean loggerSuppressIgnoredAdvancementWarnings = false; - public static boolean loggerSuppressUnrecognizedRecipeErrors = false; - public static boolean loggerSuppressSetBlockFarChunk = false; -+ public static boolean loggerSuppressSentExpiredChat = false; - private static void loggerSettings() { - loggerSuppressInitLegacyMaterialError = getBoolean("settings.logger.suppress-init-legacy-material-errors", loggerSuppressInitLegacyMaterialError); - loggerSuppressIgnoredAdvancementWarnings = getBoolean("settings.logger.suppress-ignored-advancement-warnings", loggerSuppressIgnoredAdvancementWarnings); - loggerSuppressUnrecognizedRecipeErrors = getBoolean("settings.logger.suppress-unrecognized-recipe-errors", loggerSuppressUnrecognizedRecipeErrors); - loggerSuppressSetBlockFarChunk = getBoolean("settings.logger.suppress-setblock-in-far-chunk-errors", loggerSuppressSetBlockFarChunk); -+ loggerSuppressSentExpiredChat = getBoolean("settings.logger.suppress-sent-expired-chat", loggerSuppressSentExpiredChat); - } - - public static boolean tpsCatchup = true; diff --git a/patches/server/0282-Add-toggle-for-RNG-manipulation.patch b/patches/server/0274-Add-toggle-for-RNG-manipulation.patch similarity index 91% rename from patches/server/0282-Add-toggle-for-RNG-manipulation.patch rename to patches/server/0274-Add-toggle-for-RNG-manipulation.patch index 0526b8221..4174974b6 100644 --- a/patches/server/0282-Add-toggle-for-RNG-manipulation.patch +++ b/patches/server/0274-Add-toggle-for-RNG-manipulation.patch @@ -7,10 +7,10 @@ Paper patches RNG maniplulation by using a shared (and locked) random source. This comes with a performance gain, but technical players may prefer the ability to manipulate RNG. diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 9ec8bb25f4b6101e0fe2f99ca6e15da2c000e6e7..bf55ce8f12650037fab0a2133cc1c047a891b5bb 100644 +index 542f527231ae1fc1e079752eeb64d9a93d077c35..742a4aff9d43c03d9a311641b0d4f93571a6bcf0 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -577,7 +577,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -549,7 +549,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { this.bb = Entity.INITIAL_AABB; this.stuckSpeedMultiplier = Vec3.ZERO; this.nextStep = 1.0F; @@ -33,7 +33,7 @@ index 21f5304e01e0844f1bbf3e1b2f9d50c01f8bf8fd..8afdb5d4fecbb45bad2ed801fc0e526d } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 1c0d12579bcb375698ce40804279094d03d7133b..f4c1698a7e8a929313bbc5aec6df197237cc2680 100644 +index d8067822ee9b94a070773950bc893032b10e7c3a..189d409e83529740221df7565c343bb108ca1203 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -207,9 +207,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0283-Send-client-custom-name-of-BE.patch b/patches/server/0275-Send-client-custom-name-of-BE.patch similarity index 93% rename from patches/server/0283-Send-client-custom-name-of-BE.patch rename to patches/server/0275-Send-client-custom-name-of-BE.patch index 711ca1d72..05b975138 100644 --- a/patches/server/0283-Send-client-custom-name-of-BE.patch +++ b/patches/server/0275-Send-client-custom-name-of-BE.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Send client custom name of BE diff --git a/src/main/java/net/minecraft/world/level/block/entity/BlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/BlockEntity.java -index d3de829a4ab5f5a127fb026a8cb4ef4ed6b9c394..cb81086c8fe78321b157aa7d107f215c0d8fc410 100644 +index 59d616137088af46d4494171fe96ba0129082496..efc1bdcaf141a2c2152173439d707f50feaaf91a 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/BlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/BlockEntity.java @@ -206,10 +206,24 @@ public abstract class BlockEntity { diff --git a/patches/server/0284-PaperPR-Fix-exact-choice-recipe-book-clicks.patch b/patches/server/0276-PaperPR-Fix-exact-choice-recipe-book-clicks.patch similarity index 86% rename from patches/server/0284-PaperPR-Fix-exact-choice-recipe-book-clicks.patch rename to patches/server/0276-PaperPR-Fix-exact-choice-recipe-book-clicks.patch index b15040cb5..f6477a7f4 100644 --- a/patches/server/0284-PaperPR-Fix-exact-choice-recipe-book-clicks.patch +++ b/patches/server/0276-PaperPR-Fix-exact-choice-recipe-book-clicks.patch @@ -5,7 +5,7 @@ Subject: [PATCH] PaperPR Fix exact choice recipe book clicks diff --git a/src/main/java/net/minecraft/world/entity/player/StackedContents.java b/src/main/java/net/minecraft/world/entity/player/StackedContents.java -index efee1a8e0e3ad566cd550e51d3e559c5a495889a..0331830815f14779e578e3fe94c400e4ab55c6a0 100644 +index 574ebb3a2fcd0e4e426a8a7ee88d722ed3b9c3f5..842b921799111789b37a34b76644c9217bc85794 100644 --- a/src/main/java/net/minecraft/world/entity/player/StackedContents.java +++ b/src/main/java/net/minecraft/world/entity/player/StackedContents.java @@ -37,8 +37,62 @@ public class StackedContents { @@ -20,7 +20,7 @@ index efee1a8e0e3ad566cd550e51d3e559c5a495889a..0331830815f14779e578e3fe94c400e4 + + } + private static final net.minecraft.core.IdMap EXACT_MATCHES_ID_MAP = new net.minecraft.core.IdMap<>() { -+ private final java.util.concurrent.atomic.AtomicInteger idCounter = new java.util.concurrent.atomic.AtomicInteger(Registry.ITEM.size()); ++ private final java.util.concurrent.atomic.AtomicInteger idCounter = new java.util.concurrent.atomic.AtomicInteger(BuiltInRegistries.ITEM.size()); + private final it.unimi.dsi.fastutil.objects.Object2IntMap itemstackToId = new it.unimi.dsi.fastutil.objects.Object2IntOpenCustomHashMap<>(new it.unimi.dsi.fastutil.Hash.Strategy<>() { + @Override + public int hashCode(ItemStack o) { @@ -76,7 +76,7 @@ index efee1a8e0e3ad566cd550e51d3e559c5a495889a..0331830815f14779e578e3fe94c400e4 public static ItemStack fromStackingIndex(int itemId) { + // PaperPR start -+ if (itemId > Registry.ITEM.size()) { ++ if (itemId > BuiltInRegistries.ITEM.size()) { + final ItemStack stack = EXACT_MATCHES_ID_MAP.byId(itemId); + return stack == null ? ItemStack.EMPTY : stack.copy(); + } @@ -85,22 +85,22 @@ index efee1a8e0e3ad566cd550e51d3e559c5a495889a..0331830815f14779e578e3fe94c400e4 } diff --git a/src/main/java/net/minecraft/world/item/ItemStack.java b/src/main/java/net/minecraft/world/item/ItemStack.java -index fd052e28de7ccee0cfd1a06e77156f023fa775a8..3a90c9609d27f68335c85d0b27f915bad30a66e9 100644 +index dd61a3971d9cd77fc31aadce7dfeceec68b2a157..7222ff43de1b570458f2513fe1a44d97a09d0799 100644 --- a/src/main/java/net/minecraft/world/item/ItemStack.java +++ b/src/main/java/net/minecraft/world/item/ItemStack.java -@@ -105,6 +105,7 @@ import org.bukkit.event.world.StructureGrowEvent; +@@ -108,6 +108,7 @@ import org.bukkit.event.world.StructureGrowEvent; public final class ItemStack { + public boolean isExactRecipeIngredient = false; // PaperPR public static final Codec CODEC = RecordCodecBuilder.create((instance) -> { - return instance.group(Registry.ITEM.byNameCodec().fieldOf("id").forGetter((itemstack) -> { + return instance.group(BuiltInRegistries.ITEM.byNameCodec().fieldOf("id").forGetter((itemstack) -> { return itemstack.item; diff --git a/src/main/java/net/minecraft/world/item/crafting/Ingredient.java b/src/main/java/net/minecraft/world/item/crafting/Ingredient.java -index 4f7e02c8a99ec9012a09baac52717df7504a5049..809c6531d056cc9538e9bec9cdc5ca6e4c9f4792 100644 +index dbc3040bc087a6016a491caf76019663c1cd1b4c..e24034d1ce4bb529de084aab69a531227e0c2f79 100644 --- a/src/main/java/net/minecraft/world/item/crafting/Ingredient.java +++ b/src/main/java/net/minecraft/world/item/crafting/Ingredient.java -@@ -55,7 +55,11 @@ public final class Ingredient implements Predicate { +@@ -51,7 +51,11 @@ public final class Ingredient implements Predicate { if (this.itemStacks == null) { this.itemStacks = (ItemStack[]) Arrays.stream(this.values).flatMap((recipeitemstack_provider) -> { return recipeitemstack_provider.getItems().stream(); @@ -113,9 +113,9 @@ index 4f7e02c8a99ec9012a09baac52717df7504a5049..809c6531d056cc9538e9bec9cdc5ca6e return new ItemStack[i]; }); } -@@ -111,7 +115,13 @@ public final class Ingredient implements Predicate { +@@ -106,7 +110,13 @@ public final class Ingredient implements Predicate { for (int j = 0; j < i; ++j) { - ItemStack itemstack = aitemstack[j]; + ItemStack itemstack = aitemstack1[j]; + // PaperPR start + if (itemstack.isExactRecipeIngredient) { diff --git a/patches/server/0285-Allow-custom-ChatDecorators.patch b/patches/server/0277-Allow-custom-ChatDecorators.patch similarity index 85% rename from patches/server/0285-Allow-custom-ChatDecorators.patch rename to patches/server/0277-Allow-custom-ChatDecorators.patch index 8eea51778..44ec40a2c 100644 --- a/patches/server/0285-Allow-custom-ChatDecorators.patch +++ b/patches/server/0277-Allow-custom-ChatDecorators.patch @@ -6,10 +6,10 @@ Subject: [PATCH] Allow custom ChatDecorators Requires NMS to utilize. I'll write an API for this once our upstreams calm down with the changes. diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 274ee228669973d3e0667a09ed05316006b01ad1..57ec5a9eda9c539f2b50dc4a7894b5352a63b6d4 100644 +index 732b2e703d25dde4af9808e940aca2f21b7ca71e..65ca6866465c4c427735652901be112273a3e1ba 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -2627,6 +2627,15 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop { - final io.papermc.paper.adventure.ChatDecorationProcessor processor = new io.papermc.paper.adventure.ChatDecorationProcessor(this, sender, commandSourceStack, message, isPreview); + return ChatDecorator.create((sender, commandSourceStack, message) -> { + final io.papermc.paper.adventure.ChatDecorationProcessor processor = new io.papermc.paper.adventure.ChatDecorationProcessor(this, sender, commandSourceStack, message); diff --git a/patches/server/0286-Cache-server-motd.patch b/patches/server/0278-Cache-server-motd.patch similarity index 87% rename from patches/server/0286-Cache-server-motd.patch rename to patches/server/0278-Cache-server-motd.patch index 222793d35..a0d3ba05f 100644 --- a/patches/server/0286-Cache-server-motd.patch +++ b/patches/server/0278-Cache-server-motd.patch @@ -6,10 +6,10 @@ Subject: [PATCH] Cache server motd Paper ported my patch in an odd way. Keeping my patch around to reduce logic on the motd getter diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 57ec5a9eda9c539f2b50dc4a7894b5352a63b6d4..13d86c1fba2377808a5ef1e2820db445383af156 100644 +index 65ca6866465c4c427735652901be112273a3e1ba..029f4bf955e690621e3862e078f7474b6c2fb750 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -234,7 +234,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop list = Lists.newArrayList(); List list1 = this.level.players(); ObjectIterator objectiterator = this.entityMap.values().iterator(); @@ -332,7 +323,7 @@ index 5b714df6faca6424e7c7d89e56a4e0425bd1b1c6..fac291c9a48b2563d33fe7250e57556a ChunkMap.TrackedEntity playerchunkmap_entitytracker; -@@ -1295,17 +1295,17 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider +@@ -1307,17 +1307,17 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider playerchunkmap_entitytracker.serverEntity.sendChanges(); } } @@ -354,10 +345,10 @@ index 5b714df6faca6424e7c7d89e56a4e0425bd1b1c6..fac291c9a48b2563d33fe7250e57556a } diff --git a/src/main/java/net/minecraft/server/level/ServerChunkCache.java b/src/main/java/net/minecraft/server/level/ServerChunkCache.java -index 014255019ce3f22e0c8cf8f0a775669f909d18f4..6a11e522c5bd9042dcf89e2538d354448e501fbe 100644 +index ca84eddbdb1e198b899750e5f6b3eafd25ce970f..2338be893b15eeecda336aea12803b7d2636f4be 100644 --- a/src/main/java/net/minecraft/server/level/ServerChunkCache.java +++ b/src/main/java/net/minecraft/server/level/ServerChunkCache.java -@@ -449,10 +449,10 @@ public class ServerChunkCache extends ChunkSource { +@@ -447,10 +447,10 @@ public class ServerChunkCache extends ChunkSource { io.papermc.paper.chunk.system.scheduling.ChunkTaskScheduler.pushChunkWait(this.level, x1, z1); // Paper - rewrite chunk system // Paper end com.destroystokyo.paper.io.SyncLoadFinder.logSyncLoad(this.level, x1, z1); // Paper - sync load info @@ -370,7 +361,7 @@ index 014255019ce3f22e0c8cf8f0a775669f909d18f4..6a11e522c5bd9042dcf89e2538d35444 } // Paper ichunkaccess = (ChunkAccess) ((Either) completablefuture.join()).map((ichunkaccess1) -> { return ichunkaccess1; -@@ -600,17 +600,17 @@ public class ServerChunkCache extends ChunkSource { +@@ -598,17 +598,17 @@ public class ServerChunkCache extends ChunkSource { public void save(boolean flush) { this.runDistanceManagerUpdates(); @@ -392,7 +383,7 @@ index 014255019ce3f22e0c8cf8f0a775669f909d18f4..6a11e522c5bd9042dcf89e2538d35444 } // Paper end -@@ -640,22 +640,22 @@ public class ServerChunkCache extends ChunkSource { +@@ -638,22 +638,22 @@ public class ServerChunkCache extends ChunkSource { @Override public void tick(BooleanSupplier shouldKeepTicking, boolean tickChunks) { this.level.getProfiler().push("purge"); @@ -421,7 +412,7 @@ index 014255019ce3f22e0c8cf8f0a775669f909d18f4..6a11e522c5bd9042dcf89e2538d35444 this.level.getProfiler().pop(); this.clearCache(); } -@@ -710,7 +710,7 @@ public class ServerChunkCache extends ChunkSource { +@@ -707,7 +707,7 @@ public class ServerChunkCache extends ChunkSource { boolean flag1 = level.ticksPerSpawnCategory.getLong(org.bukkit.entity.SpawnCategory.ANIMAL) != 0L && worlddata.getGameTime() % level.ticksPerSpawnCategory.getLong(org.bukkit.entity.SpawnCategory.ANIMAL) == 0L; // CraftBukkit gameprofilerfiller.push("naturalSpawnCount"); @@ -430,14 +421,14 @@ index 014255019ce3f22e0c8cf8f0a775669f909d18f4..6a11e522c5bd9042dcf89e2538d35444 int l = this.distanceManager.getNaturalSpawnChunkCount(); // Paper start - per player mob spawning NaturalSpawner.SpawnState spawnercreature_d; // moved down -@@ -731,12 +731,12 @@ public class ServerChunkCache extends ChunkSource { - // Pufferfish end +@@ -721,12 +721,12 @@ public class ServerChunkCache extends ChunkSource { + spawnercreature_d = NaturalSpawner.createState(l, this.level.getAllEntities(), this::getFullChunk, this.chunkMap.playerMobDistanceMap == null ? new LocalMobCapCalculator(this.chunkMap) : null, false); } // Paper end - this.level.timings.countNaturalMobs.stopTiming(); // Paper - timings + //this.level.timings.countNaturalMobs.stopTiming(); // Paper - timings // Purpur - //this.lastSpawnState = spawnercreature_d; // Pufferfish - this is managed asynchronously + this.lastSpawnState = spawnercreature_d; gameprofilerfiller.popPush("filteringLoadedChunks"); // Paper - moved down - this.level.timings.chunkTicks.startTiming(); // Paper @@ -445,7 +436,7 @@ index 014255019ce3f22e0c8cf8f0a775669f909d18f4..6a11e522c5bd9042dcf89e2538d35444 // Paper - moved down -@@ -790,17 +790,17 @@ public class ServerChunkCache extends ChunkSource { +@@ -780,17 +780,17 @@ public class ServerChunkCache extends ChunkSource { } } // Paper end - optimise chunk tick iteration @@ -467,7 +458,7 @@ index 014255019ce3f22e0c8cf8f0a775669f909d18f4..6a11e522c5bd9042dcf89e2538d35444 if (!this.chunkMap.needsChangeBroadcasting.isEmpty()) { ReferenceOpenHashSet copy = this.chunkMap.needsChangeBroadcasting.clone(); this.chunkMap.needsChangeBroadcasting.clear(); -@@ -812,7 +812,7 @@ public class ServerChunkCache extends ChunkSource { +@@ -802,7 +802,7 @@ public class ServerChunkCache extends ChunkSource { } } } @@ -477,10 +468,10 @@ index 014255019ce3f22e0c8cf8f0a775669f909d18f4..6a11e522c5bd9042dcf89e2538d35444 // Paper end - use set of chunks requiring updates, rather than iterating every single one loaded // Paper start - controlled flush for entity tracker packets diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index 029d8782ad1371dc95ba244d56b20a4801b004b7..7af1b6036fa05533c2e9801988dcf07b51c18f6f 100644 +index 8fd3511d484cfd2b56238530aea95c84effcd1f1..747b8571ae8b324b0bd2f6eee1391948d6ab66b8 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java -@@ -687,7 +687,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -689,7 +689,7 @@ public class ServerLevel extends Level implements WorldGenLevel { this.updateSkyBrightness(); this.tickTime(); gameprofilerfiller.popPush("tickPending"); @@ -489,7 +480,7 @@ index 029d8782ad1371dc95ba244d56b20a4801b004b7..7af1b6036fa05533c2e9801988dcf07b if (!this.isDebug()) { j = this.getGameTime(); gameprofilerfiller.push("blockTicks"); -@@ -696,20 +696,20 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -698,20 +698,20 @@ public class ServerLevel extends Level implements WorldGenLevel { this.fluidTicks.tick(j, 65536, this::tickFluid); gameprofilerfiller.pop(); } @@ -517,7 +508,7 @@ index 029d8782ad1371dc95ba244d56b20a4801b004b7..7af1b6036fa05533c2e9801988dcf07b this.handlingTick = false; gameprofilerfiller.pop(); boolean flag = true || !this.players.isEmpty() || !this.getForcedChunks().isEmpty(); // CraftBukkit - this prevents entity cleanup, other issues on servers with no players -@@ -720,7 +720,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -722,7 +722,7 @@ public class ServerLevel extends Level implements WorldGenLevel { if (flag || this.emptyTime++ < 300) { gameprofilerfiller.push("entities"); @@ -526,16 +517,16 @@ index 029d8782ad1371dc95ba244d56b20a4801b004b7..7af1b6036fa05533c2e9801988dcf07b if (this.dragonFight != null) { gameprofilerfiller.push("dragonFight"); this.dragonFight.tick(); -@@ -728,7 +728,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -730,7 +730,7 @@ public class ServerLevel extends Level implements WorldGenLevel { } org.spigotmc.ActivationRange.activateEntities(this); // Spigot - timings.entityTick.startTiming(); // Spigot + //timings.entityTick.startTiming(); // Spigot // Purpur this.entityTickList.forEach((entity) -> { - entity.activatedPriorityReset = false; // Pufferfish - DAB if (!entity.isRemoved()) { -@@ -769,8 +769,8 @@ public class ServerLevel extends Level implements WorldGenLevel { + if (false && this.shouldDiscardEntity(entity)) { // CraftBukkit - We prevent spawning in general, so this butchering is not needed +@@ -757,8 +757,8 @@ public class ServerLevel extends Level implements WorldGenLevel { } } }); @@ -546,7 +537,7 @@ index 029d8782ad1371dc95ba244d56b20a4801b004b7..7af1b6036fa05533c2e9801988dcf07b gameprofilerfiller.pop(); this.tickBlockEntities(); } -@@ -932,7 +932,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -938,7 +938,7 @@ public class ServerLevel extends Level implements WorldGenLevel { // Paper start - optimise random block ticking gameprofilerfiller.popPush("randomTick"); @@ -555,7 +546,7 @@ index 029d8782ad1371dc95ba244d56b20a4801b004b7..7af1b6036fa05533c2e9801988dcf07b if (randomTickSpeed > 0) { LevelChunkSection[] sections = chunk.getSections(); int minSection = io.papermc.paper.util.WorldUtil.getMinSection(this); -@@ -966,7 +966,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -972,7 +972,7 @@ public class ServerLevel extends Level implements WorldGenLevel { } } // Paper end - optimise random block ticking @@ -564,7 +555,7 @@ index 029d8782ad1371dc95ba244d56b20a4801b004b7..7af1b6036fa05533c2e9801988dcf07b gameprofilerfiller.pop(); } -@@ -1259,8 +1259,8 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1265,8 +1265,8 @@ public class ServerLevel extends Level implements WorldGenLevel { // Spigot end // Paper start- timings final boolean isActive = org.spigotmc.ActivationRange.checkIfActive(entity); @@ -575,7 +566,7 @@ index 029d8782ad1371dc95ba244d56b20a4801b004b7..7af1b6036fa05533c2e9801988dcf07b // Paper end - timings entity.setOldPosAndRot(); ProfilerFiller gameprofilerfiller = this.getProfiler(); -@@ -1276,7 +1276,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1282,7 +1282,7 @@ public class ServerLevel extends Level implements WorldGenLevel { entity.postTick(); // CraftBukkit } else { entity.inactiveTick(); } // Paper - EAR 2 this.getProfiler().pop(); @@ -584,7 +575,7 @@ index 029d8782ad1371dc95ba244d56b20a4801b004b7..7af1b6036fa05533c2e9801988dcf07b Iterator iterator = entity.getPassengers().iterator(); while (iterator.hasNext()) { -@@ -1299,8 +1299,8 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1305,8 +1305,8 @@ public class ServerLevel extends Level implements WorldGenLevel { if (passenger instanceof Player || this.entityTickList.contains(passenger)) { // Paper - EAR 2 final boolean isActive = org.spigotmc.ActivationRange.checkIfActive(passenger); @@ -595,7 +586,7 @@ index 029d8782ad1371dc95ba244d56b20a4801b004b7..7af1b6036fa05533c2e9801988dcf07b // Paper end passenger.setOldPosAndRot(); ++passenger.tickCount; -@@ -1330,7 +1330,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1336,7 +1336,7 @@ public class ServerLevel extends Level implements WorldGenLevel { this.tickPassenger(passenger, entity2); } @@ -604,7 +595,7 @@ index 029d8782ad1371dc95ba244d56b20a4801b004b7..7af1b6036fa05533c2e9801988dcf07b } } else { passenger.stopRiding(); -@@ -1350,14 +1350,14 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1356,14 +1356,14 @@ public class ServerLevel extends Level implements WorldGenLevel { org.bukkit.Bukkit.getPluginManager().callEvent(new org.bukkit.event.world.WorldSaveEvent(getWorld())); } @@ -622,8 +613,8 @@ index 029d8782ad1371dc95ba244d56b20a4801b004b7..7af1b6036fa05533c2e9801988dcf07b // Copied from save() // CraftBukkit start - moved from MinecraftServer.saveChunks -@@ -1369,7 +1369,7 @@ public class ServerLevel extends Level implements WorldGenLevel { - this.convertable.saveDataTag(this.server.registryHolder, this.serverLevelData, this.server.getPlayerList().getSingleplayerData()); +@@ -1375,7 +1375,7 @@ public class ServerLevel extends Level implements WorldGenLevel { + this.convertable.saveDataTag(this.server.registryAccess(), this.serverLevelData, this.server.getPlayerList().getSingleplayerData()); } // CraftBukkit end - } @@ -631,7 +622,7 @@ index 029d8782ad1371dc95ba244d56b20a4801b004b7..7af1b6036fa05533c2e9801988dcf07b } // Paper end -@@ -1383,7 +1383,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1389,7 +1389,7 @@ public class ServerLevel extends Level implements WorldGenLevel { if (!savingDisabled) { org.bukkit.Bukkit.getPluginManager().callEvent(new org.bukkit.event.world.WorldSaveEvent(getWorld())); // CraftBukkit @@ -640,7 +631,7 @@ index 029d8782ad1371dc95ba244d56b20a4801b004b7..7af1b6036fa05533c2e9801988dcf07b if (progressListener != null) { progressListener.progressStartNoAbort(Component.translatable("menu.savingLevel")); } -@@ -1393,11 +1393,11 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1399,11 +1399,11 @@ public class ServerLevel extends Level implements WorldGenLevel { progressListener.progressStage(Component.translatable("menu.savingChunks")); } @@ -656,10 +647,10 @@ index 029d8782ad1371dc95ba244d56b20a4801b004b7..7af1b6036fa05533c2e9801988dcf07b } else if (close) { chunkproviderserver.close(false); } // Paper - rewrite chunk system diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 20314fae0222f42849eb02d4b3ce4058f0b532d1..66c89b3c3668cfc0d427bca85918dbd7fc7089af 100644 +index cf948e263d33d0b6f7f3ab498c5afbad2325d893..524f513a9f2571f71eb01a1e9935b8176c18409b 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -2603,7 +2603,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -2577,7 +2577,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic } } // Paper End @@ -668,7 +659,7 @@ index 20314fae0222f42849eb02d4b3ce4058f0b532d1..66c89b3c3668cfc0d427bca85918dbd7 if ( org.spigotmc.SpigotConfig.logCommands ) // Spigot this.LOGGER.info(this.player.getScoreboardName() + " issued server command: " + s); -@@ -2613,7 +2613,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -2587,7 +2587,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic this.cserver.getPluginManager().callEvent(event); if (event.isCancelled()) { @@ -677,7 +668,7 @@ index 20314fae0222f42849eb02d4b3ce4058f0b532d1..66c89b3c3668cfc0d427bca85918dbd7 return; } -@@ -2626,7 +2626,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -2600,7 +2600,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic java.util.logging.Logger.getLogger(ServerGamePacketListenerImpl.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); return; } finally { @@ -687,10 +678,10 @@ index 20314fae0222f42849eb02d4b3ce4058f0b532d1..66c89b3c3668cfc0d427bca85918dbd7 } // CraftBukkit end diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index 637099bcf299d56aeb9ef12b1a2ff69c8a2246a4..82634bd0ab2792f637573c2ee7d9d00ba1104900 100644 +index 23cea7dd67dd1890a8fd34c294d140b30e89f59c..9cfe4f2ab57f6d17a64eda2c48fb59ab7aa14367 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java -@@ -1287,7 +1287,7 @@ public abstract class PlayerList { +@@ -1297,7 +1297,7 @@ public abstract class PlayerList { public void saveAll(int interval) { io.papermc.paper.util.MCUtil.ensureMain("Save Players" , () -> { // Paper - Ensure main @@ -699,7 +690,7 @@ index 637099bcf299d56aeb9ef12b1a2ff69c8a2246a4..82634bd0ab2792f637573c2ee7d9d00b int numSaved = 0; long now = MinecraftServer.currentTick; for (int i = 0; i < this.players.size(); ++i) { -@@ -1298,7 +1298,7 @@ public abstract class PlayerList { +@@ -1308,7 +1308,7 @@ public abstract class PlayerList { } // Paper end } @@ -709,10 +700,10 @@ index 637099bcf299d56aeb9ef12b1a2ff69c8a2246a4..82634bd0ab2792f637573c2ee7d9d00b } diff --git a/src/main/java/net/minecraft/world/entity/ai/behavior/Behavior.java b/src/main/java/net/minecraft/world/entity/ai/behavior/Behavior.java -index eb5a332f0705dd2e5568749a22f2f318d68010d1..8e3b06e1512ea4ee7b0de8294cfd624f47e260ee 100644 +index 57ef7fbba3028c28231abf7b7ae78aa019323536..651c156dc8a5aad04d461add02e22147af657d07 100644 --- a/src/main/java/net/minecraft/world/entity/ai/behavior/Behavior.java +++ b/src/main/java/net/minecraft/world/entity/ai/behavior/Behavior.java -@@ -56,9 +56,9 @@ public abstract class Behavior { +@@ -58,9 +58,9 @@ public abstract class Behavior implements BehaviorContro this.status = Behavior.Status.RUNNING; int i = this.minDuration + world.getRandom().nextInt(this.maxDuration + 1 - this.minDuration); this.endTimestamp = time + (long)i; @@ -724,9 +715,9 @@ index eb5a332f0705dd2e5568749a22f2f318d68010d1..8e3b06e1512ea4ee7b0de8294cfd624f return true; } else { return false; -@@ -69,13 +69,13 @@ public abstract class Behavior { - } +@@ -72,13 +72,13 @@ public abstract class Behavior implements BehaviorContro + @Override public final void tickOrStop(ServerLevel world, E entity, long time) { - this.timing.startTiming(); // Paper - behavior timings + //this.timing.startTiming(); // Paper - behavior timings // Purpur @@ -758,10 +749,10 @@ index fcdb9bde8e1605e30dde3e580491522d4b62cdc0..7094701d213c73ba47ace806962244c1 } diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index 09ae98db728bade8121587e9ded6f3ab98f3bb30..5e3acd365d9aca4271a590564e3eaad0d268bf11 100644 +index 730a6e8bac4436a62c4ef5a122f55fc92432ae6a..d677e51e82d51a5b1a2387d5aa5d236e76e717e1 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java -@@ -994,15 +994,15 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -912,15 +912,15 @@ public abstract class Level implements LevelAccessor, AutoCloseable { ProfilerFiller gameprofilerfiller = this.getProfiler(); gameprofilerfiller.push("blockEntities"); @@ -780,7 +771,7 @@ index 09ae98db728bade8121587e9ded6f3ab98f3bb30..5e3acd365d9aca4271a590564e3eaad0 // Spigot start // Iterator iterator = this.blockEntityTickers.iterator(); int tilesThisCycle = 0; -@@ -1035,7 +1035,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -953,7 +953,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { } this.blockEntityTickers.removeAll(toRemove); @@ -790,10 +781,10 @@ index 09ae98db728bade8121587e9ded6f3ab98f3bb30..5e3acd365d9aca4271a590564e3eaad0 co.aikar.timings.TimingHistory.tileEntityTicks += this.blockEntityTickers.size(); // Paper gameprofilerfiller.pop(); diff --git a/src/main/java/net/minecraft/world/level/NaturalSpawner.java b/src/main/java/net/minecraft/world/level/NaturalSpawner.java -index a182b3c804cf56855e15290f826fdebdc289a552..2d19db940d4f1624631cec29547e88842a4cfb98 100644 +index 01b21f520ef1c834b9bafc3de85c1fa4fcf539d6..940e324efa81981a17cd5d6e5e09aa3379b66afc 100644 --- a/src/main/java/net/minecraft/world/level/NaturalSpawner.java +++ b/src/main/java/net/minecraft/world/level/NaturalSpawner.java -@@ -132,7 +132,7 @@ public final class NaturalSpawner { +@@ -133,7 +133,7 @@ public final class NaturalSpawner { public static void spawnForChunk(ServerLevel world, LevelChunk chunk, NaturalSpawner.SpawnState info, boolean spawnAnimals, boolean spawnMonsters, boolean rareSpawn) { world.getProfiler().push("spawner"); @@ -802,7 +793,7 @@ index a182b3c804cf56855e15290f826fdebdc289a552..2d19db940d4f1624631cec29547e8884 MobCategory[] aenumcreaturetype = NaturalSpawner.SPAWNING_CATEGORIES; int i = aenumcreaturetype.length; -@@ -187,7 +187,7 @@ public final class NaturalSpawner { +@@ -188,7 +188,7 @@ public final class NaturalSpawner { } } @@ -812,10 +803,10 @@ index a182b3c804cf56855e15290f826fdebdc289a552..2d19db940d4f1624631cec29547e8884 } diff --git a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java -index e0e4a924e926b086699998095a1abddd01d8c002..772a2dc21071a3f687b51fbddf9f12a90d41ce79 100644 +index 28e4b302284f955a73e75d0f4276d55fb51826f5..fda4c4f03983d31f04047fe6d277e2cf06189965 100644 --- a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java +++ b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java -@@ -930,7 +930,7 @@ public class LevelChunk extends ChunkAccess { +@@ -917,7 +917,7 @@ public class LevelChunk extends ChunkAccess { this.chunkHolder.getEntityChunk().callEntitiesLoadEvent(); // Paper - rewrite chunk system if (this.needsDecoration) { @@ -824,7 +815,7 @@ index e0e4a924e926b086699998095a1abddd01d8c002..772a2dc21071a3f687b51fbddf9f12a9 this.needsDecoration = false; java.util.Random random = new java.util.Random(); random.setSeed(this.level.getSeed()); -@@ -950,7 +950,7 @@ public class LevelChunk extends ChunkAccess { +@@ -937,7 +937,7 @@ public class LevelChunk extends ChunkAccess { } } server.getPluginManager().callEvent(new org.bukkit.event.world.ChunkPopulateEvent(this.bukkitChunk)); @@ -833,7 +824,7 @@ index e0e4a924e926b086699998095a1abddd01d8c002..772a2dc21071a3f687b51fbddf9f12a9 } } } -@@ -1312,7 +1312,7 @@ public class LevelChunk extends ChunkAccess { +@@ -1297,7 +1297,7 @@ public class LevelChunk extends ChunkAccess { ProfilerFiller gameprofilerfiller = LevelChunk.this.level.getProfiler(); gameprofilerfiller.push(this::getType); @@ -842,7 +833,7 @@ index e0e4a924e926b086699998095a1abddd01d8c002..772a2dc21071a3f687b51fbddf9f12a9 BlockState iblockdata = LevelChunk.this.getBlockState(blockposition); if (this.blockEntity.getType().isValid(iblockdata)) { -@@ -1334,7 +1334,7 @@ public class LevelChunk extends ChunkAccess { +@@ -1319,7 +1319,7 @@ public class LevelChunk extends ChunkAccess { // Paper end // Spigot start } finally { @@ -929,10 +920,10 @@ index 138407c2d4b0bc55ddb9aac5d2aa3edadda090fb..a6e9e503a496c18e2501b03ec84f4600 // Paper end - add timings for scoreboard search } diff --git a/src/main/java/org/spigotmc/ActivationRange.java b/src/main/java/org/spigotmc/ActivationRange.java -index 383a13a26ee9445fa6201770bb9bef274d72283a..fe830a419c81811f0a72add63a3f09a94392e4a7 100644 +index 3783186d0c3f2f7b241d38f8ee011e8a5c172980..43d962f634c25da159c4935a3c5c8994a3a4930e 100644 --- a/src/main/java/org/spigotmc/ActivationRange.java +++ b/src/main/java/org/spigotmc/ActivationRange.java -@@ -170,7 +170,7 @@ public class ActivationRange +@@ -166,7 +166,7 @@ public class ActivationRange */ public static void activateEntities(Level world) { @@ -941,7 +932,7 @@ index 383a13a26ee9445fa6201770bb9bef274d72283a..fe830a419c81811f0a72add63a3f09a9 final int miscActivationRange = world.spigotConfig.miscActivationRange; final int raiderActivationRange = world.spigotConfig.raiderActivationRange; final int animalActivationRange = world.spigotConfig.animalActivationRange; -@@ -244,7 +244,7 @@ public class ActivationRange +@@ -221,7 +221,7 @@ public class ActivationRange } // Paper end } diff --git a/patches/server/0288-Remove-Mojang-Profiler.patch b/patches/server/0280-Remove-Mojang-Profiler.patch similarity index 86% rename from patches/server/0288-Remove-Mojang-Profiler.patch rename to patches/server/0280-Remove-Mojang-Profiler.patch index 036f798d8..b5bab8c8b 100644 --- a/patches/server/0288-Remove-Mojang-Profiler.patch +++ b/patches/server/0280-Remove-Mojang-Profiler.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Remove Mojang Profiler diff --git a/src/main/java/net/minecraft/commands/Commands.java b/src/main/java/net/minecraft/commands/Commands.java -index 674e2d926608cc4c98068bb83be077864726a515..e2a90eed64717ef24b4e1c3dd0b6d90da3ac5eed 100644 +index 244f5b5a7a7e781c27d21477d798f65ff77d4bc6..a6996259f9fcb2d6520ca45fa42b11c42824ef9d 100644 --- a/src/main/java/net/minecraft/commands/Commands.java +++ b/src/main/java/net/minecraft/commands/Commands.java -@@ -137,7 +137,7 @@ public class Commands { +@@ -144,7 +144,7 @@ public class Commands { CloneCommands.register(this.dispatcher, commandRegistryAccess); DataCommands.register(this.dispatcher); DataPackCommand.register(this.dispatcher); @@ -16,8 +16,8 @@ index 674e2d926608cc4c98068bb83be077864726a515..e2a90eed64717ef24b4e1c3dd0b6d90d + //DebugCommand.register(this.dispatcher); // Purpur DefaultGameModeCommands.register(this.dispatcher); DifficultyCommand.register(this.dispatcher); - EffectCommands.register(this.dispatcher); -@@ -298,9 +298,9 @@ public class Commands { + EffectCommands.register(this.dispatcher, commandRegistryAccess); +@@ -306,9 +306,9 @@ public class Commands { public int performCommand(ParseResults parseresults, String s, String label) { // CraftBukkit CommandSourceStack commandlistenerwrapper = (CommandSourceStack) parseresults.getContext().getSource(); @@ -29,7 +29,7 @@ index 674e2d926608cc4c98068bb83be077864726a515..e2a90eed64717ef24b4e1c3dd0b6d90d byte b0; -@@ -363,7 +363,7 @@ public class Commands { +@@ -371,7 +371,7 @@ public class Commands { b0 = 0; } } finally { @@ -39,11 +39,11 @@ index 674e2d926608cc4c98068bb83be077864726a515..e2a90eed64717ef24b4e1c3dd0b6d90d return b0; diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 72ac77dd27840c834cbf368ffe5173ba5f21cc30..2c6461491881da9f878bd5aa245272ea49dd5fd8 100644 +index 48b0390b5c19b6e8ac598c2622784d271edf5048..99727dd2ee576c8c2fe2be1e6dcf9b1f6be0c894 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -328,13 +328,13 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop registryreadops, Thread thread, LevelStorageSource.LevelStorageAccess convertable_conversionsession, PackRepository resourcepackrepository, WorldStem worldstem, Proxy proxy, DataFixer datafixer, Services services, ChunkProgressListenerFactory worldloadlistenerfactory) { +@@ -337,13 +337,13 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0 && this.tickCount % autosavePeriod == 0; try { this.isSaving = true; -@@ -1464,7 +1464,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0; // Purpur net.minecraft.world.level.block.entity.HopperBlockEntity.skipHopperEvents = worldserver.paperConfig().hopper.disableMoveEvent || org.bukkit.event.inventory.InventoryMoveItemEvent.getHandlerList().getRegisteredListeners().length == 0; // Paper @@ -192,7 +192,7 @@ index 72ac77dd27840c834cbf368ffe5173ba5f21cc30..2c6461491881da9f878bd5aa245272ea try { //worldserver.timings.doTick.startTiming(); // Spigot // Purpur -@@ -1582,17 +1582,17 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop { this.executeBlocking(() -> { this.saveDebugReport(path.resolve("server")); -@@ -2506,40 +2506,40 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop> completablefuture = this.getChunkFutureMainThread(x, z, leastStatus, create, true); // Paper ServerChunkCache.MainThreadExecutor chunkproviderserver_b = this.mainThreadProcessor; -@@ -627,24 +627,24 @@ public class ServerChunkCache extends ChunkSource { +@@ -625,24 +625,24 @@ public class ServerChunkCache extends ChunkSource { // CraftBukkit start - modelled on below public void purgeUnload() { if (true) return; // Paper - tickets will be removed later, this behavior isn't really well accounted for by the chunk system @@ -453,7 +452,7 @@ index 6a11e522c5bd9042dcf89e2538d354448e501fbe..3bee0bfc481ffe3ea1860c5b23ad2efb if (tickChunks) { //this.level.timings.chunks.startTiming(); // Paper - timings // Purpur this.chunkMap.playerChunkManager.tick(); // Paper - this is mostly is to account for view distance changes -@@ -653,10 +653,10 @@ public class ServerChunkCache extends ChunkSource { +@@ -651,10 +651,10 @@ public class ServerChunkCache extends ChunkSource { } //this.level.timings.doChunkUnload.startTiming(); // Spigot // Purpur @@ -466,7 +465,7 @@ index 6a11e522c5bd9042dcf89e2538d354448e501fbe..3bee0bfc481ffe3ea1860c5b23ad2efb this.clearCache(); } -@@ -702,14 +702,14 @@ public class ServerChunkCache extends ChunkSource { +@@ -700,13 +700,13 @@ public class ServerChunkCache extends ChunkSource { } // Paper end - optimize isOutisdeRange LevelData worlddata = this.level.getLevelData(); @@ -475,7 +474,6 @@ index 6a11e522c5bd9042dcf89e2538d354448e501fbe..3bee0bfc481ffe3ea1860c5b23ad2efb - gameprofilerfiller.push("pollingChunks"); + //gameprofilerfiller.push("pollingChunks"); // Purpur - this.level.resetIceAndSnowTick(); // Pufferfish - reset ice & snow tick random int k = this.level.getGameRules().getInt(GameRules.RULE_RANDOMTICKING); boolean flag1 = level.ticksPerSpawnCategory.getLong(org.bukkit.entity.SpawnCategory.ANIMAL) != 0L && worlddata.getGameTime() % level.ticksPerSpawnCategory.getLong(org.bukkit.entity.SpawnCategory.ANIMAL) == 0L; // CraftBukkit @@ -484,10 +482,10 @@ index 6a11e522c5bd9042dcf89e2538d354448e501fbe..3bee0bfc481ffe3ea1860c5b23ad2efb //this.level.timings.countNaturalMobs.startTiming(); // Paper - timings // Purpur int l = this.distanceManager.getNaturalSpawnChunkCount(); // Paper start - per player mob spawning -@@ -734,13 +734,13 @@ public class ServerChunkCache extends ChunkSource { +@@ -724,13 +724,13 @@ public class ServerChunkCache extends ChunkSource { //this.level.timings.countNaturalMobs.stopTiming(); // Paper - timings // Purpur - //this.lastSpawnState = spawnercreature_d; // Pufferfish - this is managed asynchronously + this.lastSpawnState = spawnercreature_d; - gameprofilerfiller.popPush("filteringLoadedChunks"); + //gameprofilerfiller.popPush("filteringLoadedChunks"); // Purpur // Paper - moved down @@ -500,7 +498,7 @@ index 6a11e522c5bd9042dcf89e2538d354448e501fbe..3bee0bfc481ffe3ea1860c5b23ad2efb boolean flag2 = this.level.getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING) && !this.level.players().isEmpty(); // CraftBukkit // Paper - only shuffle if per-player mob spawning is disabled -@@ -791,15 +791,15 @@ public class ServerChunkCache extends ChunkSource { +@@ -781,15 +781,15 @@ public class ServerChunkCache extends ChunkSource { } // Paper end - optimise chunk tick iteration //this.level.timings.chunkTicks.stopTiming(); // Paper // Purpur @@ -519,7 +517,7 @@ index 6a11e522c5bd9042dcf89e2538d354448e501fbe..3bee0bfc481ffe3ea1860c5b23ad2efb //this.level.timings.broadcastChunkUpdates.startTiming(); // Paper - timing // Purpur if (!this.chunkMap.needsChangeBroadcasting.isEmpty()) { ReferenceOpenHashSet copy = this.chunkMap.needsChangeBroadcasting.clone(); -@@ -813,7 +813,7 @@ public class ServerChunkCache extends ChunkSource { +@@ -803,7 +803,7 @@ public class ServerChunkCache extends ChunkSource { } } //this.level.timings.broadcastChunkUpdates.stopTiming(); // Paper - timing // Purpur @@ -528,7 +526,7 @@ index 6a11e522c5bd9042dcf89e2538d354448e501fbe..3bee0bfc481ffe3ea1860c5b23ad2efb // Paper end - use set of chunks requiring updates, rather than iterating every single one loaded // Paper start - controlled flush for entity tracker packets List disabledFlushes = new java.util.ArrayList<>(this.level.players.size()); -@@ -1024,7 +1024,7 @@ public class ServerChunkCache extends ChunkSource { +@@ -994,7 +994,7 @@ public class ServerChunkCache extends ChunkSource { @Override protected void doRunTask(Runnable task) { @@ -538,10 +536,10 @@ index 6a11e522c5bd9042dcf89e2538d354448e501fbe..3bee0bfc481ffe3ea1860c5b23ad2efb } diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index 7af1b6036fa05533c2e9801988dcf07b51c18f6f..4921c791c7900210e6dd96e03256ea529fd1d03d 100644 +index 747b8571ae8b324b0bd2f6eee1391948d6ab66b8..e21559ebc4d5ffcf10fc50f5bcc31ccff3b8394f 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java -@@ -654,12 +654,12 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -656,12 +656,12 @@ public class ServerLevel extends Level implements WorldGenLevel { } } // Paper end - optimise checkDespawn @@ -557,7 +555,7 @@ index 7af1b6036fa05533c2e9801988dcf07b51c18f6f..4921c791c7900210e6dd96e03256ea52 this.advanceWeatherCycle(); int i = this.getGameRules().getInt(GameRules.RULE_PLAYERS_SLEEPING_PERCENTAGE); long j; -@@ -686,32 +686,32 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -688,32 +688,32 @@ public class ServerLevel extends Level implements WorldGenLevel { this.updateSkyBrightness(); this.tickTime(); @@ -598,7 +596,7 @@ index 7af1b6036fa05533c2e9801988dcf07b51c18f6f..4921c791c7900210e6dd96e03256ea52 boolean flag = true || !this.players.isEmpty() || !this.getForcedChunks().isEmpty(); // CraftBukkit - this prevents entity cleanup, other issues on servers with no players if (flag) { -@@ -719,12 +719,12 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -721,12 +721,12 @@ public class ServerLevel extends Level implements WorldGenLevel { } if (flag || this.emptyTime++ < 300) { @@ -614,7 +612,7 @@ index 7af1b6036fa05533c2e9801988dcf07b51c18f6f..4921c791c7900210e6dd96e03256ea52 } org.spigotmc.ActivationRange.activateEntities(this); // Spigot -@@ -735,9 +735,9 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -736,9 +736,9 @@ public class ServerLevel extends Level implements WorldGenLevel { if (false && this.shouldDiscardEntity(entity)) { // CraftBukkit - We prevent spawning in general, so this butchering is not needed entity.discard(); } else { @@ -626,19 +624,13 @@ index 7af1b6036fa05533c2e9801988dcf07b51c18f6f..4921c791c7900210e6dd96e03256ea52 if (true || this.chunkSource.chunkMap.getDistanceManager().inEntityTickingRange(entity.chunkPosition().toLong())) { // Paper - now always true if in the ticking list Entity entity1 = entity.getVehicle(); -@@ -749,7 +749,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -750,22 +750,21 @@ public class ServerLevel extends Level implements WorldGenLevel { entity.stopRiding(); } - gameprofilerfiller.push("tick"); + //gameprofilerfiller.push("tick"); // Purpur - // Pufferfish start - copied from this.guardEntityTick - try { - this.tickNonPassenger(entity); // Pufferfish - changed -@@ -764,22 +764,22 @@ public class ServerLevel extends Level implements WorldGenLevel { - // Paper end - } - // Pufferfish end + this.guardEntityTick(this::tickNonPassenger, entity); - gameprofilerfiller.pop(); + //gameprofilerfiller.pop(); // Purpur } @@ -655,15 +647,11 @@ index 7af1b6036fa05533c2e9801988dcf07b51c18f6f..4921c791c7900210e6dd96e03256ea52 - gameprofilerfiller.push("entityManagement"); + //gameprofilerfiller.push("entityManagement"); // Purpur //this.entityManager.tick(); // Paper - rewrite chunk system -- gameprofilerfiller.popPush("gameEvents"); -+ //gameprofilerfiller.popPush("gameEvents"); // Purpur - this.sendGameEvents(); - gameprofilerfiller.pop(); -+ //gameprofilerfiller.pop(); // Purpur } @Override -@@ -861,9 +861,9 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -845,9 +844,9 @@ public class ServerLevel extends Level implements WorldGenLevel { boolean flag = this.isRaining(); int j = chunkcoordintpair.getMinBlockX(); int k = chunkcoordintpair.getMinBlockZ(); @@ -674,17 +662,17 @@ index 7af1b6036fa05533c2e9801988dcf07b51c18f6f..4921c791c7900210e6dd96e03256ea52 + //gameprofilerfiller.push("thunder"); // Purpur final BlockPos.MutableBlockPos blockposition = this.chunkTickMutablePosition; // Paper - use mutable to reduce allocation rate, final to force compile fail on change - if (!this.paperConfig().environment.disableThunder && flag && this.isThundering() && this.spigotConfig.thunderChance > 0 && /*this.random.nextInt(this.spigotConfig.thunderChance) == 0 &&*/ chunk.shouldDoLightning(this.random)) { // Spigot // Paper - disable thunder // Pufferfish - replace random with shouldDoLightning -@@ -895,7 +895,7 @@ public class ServerLevel extends Level implements WorldGenLevel { + if (!this.paperConfig().environment.disableThunder && flag && this.isThundering() && this.spigotConfig.thunderChance > 0 && this.random.nextInt(this.spigotConfig.thunderChance) == 0) { // Spigot // Paper - disable thunder +@@ -885,7 +884,7 @@ public class ServerLevel extends Level implements WorldGenLevel { } } - gameprofilerfiller.popPush("iceandsnow"); + //gameprofilerfiller.popPush("iceandsnow"); // Purpur - if (!this.paperConfig().environment.disableIceAndSnow && (this.currentIceAndSnowTick++ & 15) == 0) { // Paper - Disable ice and snow // Paper - optimise random ticking // Pufferfish - optimize further random ticking - // Paper start - optimise chunk ticking - this.getRandomBlockPosition(j, 0, k, 15, blockposition); -@@ -931,7 +931,7 @@ public class ServerLevel extends Level implements WorldGenLevel { + int l; + + if (!this.paperConfig().environment.disableIceAndSnow && this.random.nextInt(16) == 0) { // Paper - Disable ice and snow +@@ -937,7 +936,7 @@ public class ServerLevel extends Level implements WorldGenLevel { } // Paper start - optimise random block ticking @@ -693,7 +681,7 @@ index 7af1b6036fa05533c2e9801988dcf07b51c18f6f..4921c791c7900210e6dd96e03256ea52 //timings.chunkTicksBlocks.startTiming(); // Paper // Purpur if (randomTickSpeed > 0) { LevelChunkSection[] sections = chunk.getSections(); -@@ -967,7 +967,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -973,7 +972,7 @@ public class ServerLevel extends Level implements WorldGenLevel { } // Paper end - optimise random block ticking //timings.chunkTicksBlocks.stopTiming(); // Paper // Purpur @@ -702,7 +690,7 @@ index 7af1b6036fa05533c2e9801988dcf07b51c18f6f..4921c791c7900210e6dd96e03256ea52 } public Optional findLightningRod(BlockPos pos) { -@@ -1263,19 +1263,19 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1269,19 +1268,19 @@ public class ServerLevel extends Level implements WorldGenLevel { //try { // Purpur // Paper end - timings entity.setOldPosAndRot(); @@ -712,7 +700,7 @@ index 7af1b6036fa05533c2e9801988dcf07b51c18f6f..4921c791c7900210e6dd96e03256ea52 ++entity.tickCount; - this.getProfiler().push(() -> { + /*this.getProfiler().push(() -> { // Purpur - return Registry.ENTITY_TYPE.getKey(entity.getType()).toString(); + return BuiltInRegistries.ENTITY_TYPE.getKey(entity.getType()).toString(); - }); - gameprofilerfiller.incrementCounter("tickNonPassenger"); + });*/ // Purpur @@ -727,7 +715,7 @@ index 7af1b6036fa05533c2e9801988dcf07b51c18f6f..4921c791c7900210e6dd96e03256ea52 //} finally { timer.stopTiming(); } // Paper - timings // Purpur Iterator iterator = entity.getPassengers().iterator(); -@@ -1304,12 +1304,12 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1310,12 +1309,12 @@ public class ServerLevel extends Level implements WorldGenLevel { // Paper end passenger.setOldPosAndRot(); ++passenger.tickCount; @@ -736,7 +724,7 @@ index 7af1b6036fa05533c2e9801988dcf07b51c18f6f..4921c791c7900210e6dd96e03256ea52 - gameprofilerfiller.push(() -> { + /*gameprofilerfiller.push(() -> { // Purpur - return Registry.ENTITY_TYPE.getKey(passenger.getType()).toString(); + return BuiltInRegistries.ENTITY_TYPE.getKey(passenger.getType()).toString(); - }); - gameprofilerfiller.incrementCounter("tickPassenger"); + });*/ // Purpur @@ -744,7 +732,7 @@ index 7af1b6036fa05533c2e9801988dcf07b51c18f6f..4921c791c7900210e6dd96e03256ea52 // Paper start - EAR 2 if (isActive) { passenger.rideTick(); -@@ -1321,7 +1321,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1327,7 +1326,7 @@ public class ServerLevel extends Level implements WorldGenLevel { vehicle.positionRider(passenger); } // Paper end - EAR 2 @@ -754,10 +742,10 @@ index 7af1b6036fa05533c2e9801988dcf07b51c18f6f..4921c791c7900210e6dd96e03256ea52 while (iterator.hasNext()) { diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index cd1839aaa6ad47f6a129621b9cec9264f4415612..5cfed037cda553f4d752770890ae0c9b3f42cbfd 100644 +index 05c442041e11d7a87359857ad9d6fed3b8132dd6..5e495c427abaae7476149c19a2131d5804aecab2 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java -@@ -1164,7 +1164,7 @@ public class ServerPlayer extends Player { +@@ -1186,7 +1186,7 @@ public class ServerPlayer extends Player { PortalInfo shapedetectorshape = this.findDimensionEntryPoint(worldserver); if (shapedetectorshape != null) { @@ -766,7 +754,7 @@ index cd1839aaa6ad47f6a129621b9cec9264f4415612..5cfed037cda553f4d752770890ae0c9b worldserver = shapedetectorshape.world; // CraftBukkit if (worldserver == null) { } else // CraftBukkit - empty to fall through to null to event if (resourcekey == LevelStem.OVERWORLD && worldserver.getTypeKey() == LevelStem.NETHER) { // CraftBukkit -@@ -1187,8 +1187,8 @@ public class ServerPlayer extends Player { +@@ -1209,8 +1209,8 @@ public class ServerPlayer extends Player { worldserver = ((CraftWorld) exit.getWorld()).getHandle(); // CraftBukkit end @@ -777,20 +765,20 @@ index cd1839aaa6ad47f6a129621b9cec9264f4415612..5cfed037cda553f4d752770890ae0c9b if (true) { // CraftBukkit this.isChangingDimension = true; // CraftBukkit - Set teleport invulnerability only if player changing worlds -@@ -1207,7 +1207,7 @@ public class ServerPlayer extends Player { - worldserver.addDuringPortalTeleport(this); +@@ -1229,7 +1229,7 @@ public class ServerPlayer extends Player { this.connection.teleport(exit); // CraftBukkit - use internal teleport without event - this.connection.resetPosition(); // CraftBukkit - sync position after changing it (from PortalTravelAgent#findAndteleport) + this.connection.resetPosition(); + worldserver.addDuringPortalTeleport(this); - worldserver1.getProfiler().pop(); + //worldserver1.getProfiler().pop(); // Purpur this.triggerDimensionChangeTriggers(worldserver1); this.connection.send(new ClientboundPlayerAbilitiesPacket(this.getAbilities())); playerlist.sendLevelInfo(this, worldserver); diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 8ec7b5c63b4e5f9ae7cbcfa9a61f9c804f22defc..0c22215733ba8ab12671393301017a40994f1506 100644 +index 367d1455a015884a74f2c36a87ce6e3c266babfe..54ea94ee62309371b575835a8e87509974f40702 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -416,7 +416,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -409,7 +409,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic this.aboveGroundVehicleTickCount = 0; }} // Paper - end if (valid) @@ -799,7 +787,7 @@ index 8ec7b5c63b4e5f9ae7cbcfa9a61f9c804f22defc..0c22215733ba8ab12671393301017a40 // Paper Start - give clients a longer time to respond to pings as per pre 1.12.2 timings // This should effectively place the keepalive handling back to "as it was" before 1.12.2 long currentTime = Util.getMillis(); -@@ -452,7 +452,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -445,7 +445,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic } // Paper end @@ -1013,19 +1001,19 @@ index 5725c6593480fada65facc29664a00a8cc073512..ccb1f998ae3122d1856d77149ff7e7df }; } diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index b1e609c863ec23d1102d8a032a5cac57664bc2af..de32077569b0f960ac86f6297c8a4a4f6655b707 100644 +index 742a4aff9d43c03d9a311641b0d4f93571a6bcf0..4759b7e70792003769a79880e2c04cf7ed3ec50a 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -822,7 +822,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { - return; - } - // Pufferfish end - entity TTL +@@ -788,7 +788,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { + // CraftBukkit end + + public void baseTick() { - this.level.getProfiler().push("entityBaseTick"); + //this.level.getProfiler().push("entityBaseTick"); // Purpur if (firstTick && this instanceof net.minecraft.world.entity.NeutralMob neutralMob) neutralMob.tickInitialPersistentAnger(level); // Paper - Update last hurt when ticking this.feetBlockState = null; if (this.isPassenger() && this.getVehicle().isRemoved()) { -@@ -883,7 +883,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -849,7 +849,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { } this.firstTick = false; @@ -1034,7 +1022,7 @@ index b1e609c863ec23d1102d8a032a5cac57664bc2af..de32077569b0f960ac86f6297c8a4a4f } public void setSharedFlagOnFire(boolean onFire) { -@@ -1057,7 +1057,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -1023,7 +1023,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { } } @@ -1043,7 +1031,7 @@ index b1e609c863ec23d1102d8a032a5cac57664bc2af..de32077569b0f960ac86f6297c8a4a4f if (this.stuckSpeedMultiplier.lengthSqr() > 1.0E-7D) { movement = movement.multiply(this.stuckSpeedMultiplier); this.stuckSpeedMultiplier = Vec3.ZERO; -@@ -1066,7 +1066,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -1032,7 +1032,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { // Paper start - ignore movement changes while inactive. if (isTemporarilyActive && !(this instanceof ItemEntity || this instanceof net.minecraft.world.entity.vehicle.AbstractMinecart) && movement == getDeltaMovement() && movementType == MoverType.SELF) { setDeltaMovement(Vec3.ZERO); @@ -1052,7 +1040,7 @@ index b1e609c863ec23d1102d8a032a5cac57664bc2af..de32077569b0f960ac86f6297c8a4a4f return; } // Paper end -@@ -1087,8 +1087,8 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -1053,8 +1053,8 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { this.setPos(this.getX() + vec3d1.x, this.getY() + vec3d1.y, this.getZ() + vec3d1.z); } @@ -1063,7 +1051,7 @@ index b1e609c863ec23d1102d8a032a5cac57664bc2af..de32077569b0f960ac86f6297c8a4a4f boolean flag = !Mth.equal(movement.x, vec3d1.x); boolean flag1 = !Mth.equal(movement.z, vec3d1.z); -@@ -1107,7 +1107,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -1073,7 +1073,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { this.checkFallDamage(vec3d1.y, this.onGround, iblockdata, blockposition); if (this.isRemoved()) { @@ -1072,7 +1060,7 @@ index b1e609c863ec23d1102d8a032a5cac57664bc2af..de32077569b0f960ac86f6297c8a4a4f } else { if (this.horizontalCollision) { Vec3 vec3d2 = this.getDeltaMovement(); -@@ -1248,7 +1248,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -1214,7 +1214,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { this.setRemainingFireTicks(-this.getFireImmuneTicks()); } @@ -1081,7 +1069,7 @@ index b1e609c863ec23d1102d8a032a5cac57664bc2af..de32077569b0f960ac86f6297c8a4a4f } } // Paper start - detailed watchdog information -@@ -2917,7 +2917,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -2902,7 +2902,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { ServerLevel worldserver1 = minecraftserver.getLevel(resourcekey); if (true && !this.isPassenger() && this.portalTime++ >= i) { // CraftBukkit @@ -1090,7 +1078,7 @@ index b1e609c863ec23d1102d8a032a5cac57664bc2af..de32077569b0f960ac86f6297c8a4a4f this.portalTime = i; // Paper start io.papermc.paper.event.entity.EntityPortalReadyEvent event = new io.papermc.paper.event.entity.EntityPortalReadyEvent(this.getBukkitEntity(), worldserver1 == null ? null : worldserver1.getWorld(), org.bukkit.PortalType.NETHER); -@@ -2935,7 +2935,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -2920,7 +2920,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { } } // Paper // CraftBukkit end @@ -1099,7 +1087,7 @@ index b1e609c863ec23d1102d8a032a5cac57664bc2af..de32077569b0f960ac86f6297c8a4a4f } this.isInsidePortal = false; -@@ -3393,14 +3393,14 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -3385,14 +3385,14 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { } // Paper end if (this.level instanceof ServerLevel && !this.isRemoved()) { @@ -1116,7 +1104,7 @@ index b1e609c863ec23d1102d8a032a5cac57664bc2af..de32077569b0f960ac86f6297c8a4a4f PortalInfo shapedetectorshape = (location == null) ? this.findDimensionEntryPoint(worldserver) : new PortalInfo(new Vec3(location.x(), location.y(), location.z()), Vec3.ZERO, this.yRot, this.xRot, worldserver, null); // CraftBukkit if (shapedetectorshape == null) { -@@ -3434,7 +3434,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -3426,7 +3426,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { this.unRide(); // CraftBukkit end @@ -1125,7 +1113,7 @@ index b1e609c863ec23d1102d8a032a5cac57664bc2af..de32077569b0f960ac86f6297c8a4a4f // Paper start - Change lead drop timing to prevent dupe if (this instanceof Mob) { ((Mob) this).dropLeash(true, true); // Paper drop lead -@@ -3457,10 +3457,10 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -3449,10 +3449,10 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { } this.removeAfterChangingDimensions(); @@ -1139,10 +1127,10 @@ index b1e609c863ec23d1102d8a032a5cac57664bc2af..de32077569b0f960ac86f6297c8a4a4f } } else { diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 0717f59c94f9579e05ed2938e14567be495ad1b0..45f11b6ae25a2f509b788c185dcf9cf33ef2271e 100644 +index cbee6924e6c26fafe51d996491ed89434ce1e0e5..8916d51bb543cce1b7b52ba14d01ecfbee77e6e3 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -397,7 +397,7 @@ public abstract class LivingEntity extends Entity { +@@ -399,7 +399,7 @@ public abstract class LivingEntity extends Entity { } super.baseTick(); @@ -1151,7 +1139,7 @@ index 0717f59c94f9579e05ed2938e14567be495ad1b0..45f11b6ae25a2f509b788c185dcf9cf3 if (this.fireImmune() || this.level.isClientSide) { this.clearFire(); } -@@ -501,7 +501,7 @@ public abstract class LivingEntity extends Entity { +@@ -502,7 +502,7 @@ public abstract class LivingEntity extends Entity { this.yHeadRotO = this.yHeadRot; this.yRotO = this.getYRot(); this.xRotO = this.getXRot(); @@ -1160,7 +1148,7 @@ index 0717f59c94f9579e05ed2938e14567be495ad1b0..45f11b6ae25a2f509b788c185dcf9cf3 } public boolean canSpawnSoulSpeedParticle() { -@@ -3105,10 +3105,10 @@ public abstract class LivingEntity extends Entity { +@@ -3104,10 +3104,10 @@ public abstract class LivingEntity extends Entity { } this.run += (f3 - this.run) * 0.3F; @@ -1174,7 +1162,7 @@ index 0717f59c94f9579e05ed2938e14567be495ad1b0..45f11b6ae25a2f509b788c185dcf9cf3 // Paper start - stop large pitch and yaw changes from crashing the server this.yRotO += Math.round((this.getYRot() - this.yRotO) / 360.0F) * 360.0F; -@@ -3120,7 +3120,7 @@ public abstract class LivingEntity extends Entity { +@@ -3119,7 +3119,7 @@ public abstract class LivingEntity extends Entity { this.yHeadRotO += Math.round((this.yHeadRot - this.yHeadRotO) / 360.0F) * 360.0F; // Paper end @@ -1183,7 +1171,7 @@ index 0717f59c94f9579e05ed2938e14567be495ad1b0..45f11b6ae25a2f509b788c185dcf9cf3 this.animStep += f2; if (this.isFallFlying()) { ++this.fallFlyTicks; -@@ -3413,19 +3413,19 @@ public abstract class LivingEntity extends Entity { +@@ -3416,19 +3416,19 @@ public abstract class LivingEntity extends Entity { } this.setDeltaMovement(d4, d5, d6); @@ -1208,7 +1196,7 @@ index 0717f59c94f9579e05ed2938e14567be495ad1b0..45f11b6ae25a2f509b788c185dcf9cf3 if (this.jumping && this.isAffectedByFluids()) { double d7; -@@ -3452,8 +3452,8 @@ public abstract class LivingEntity extends Entity { +@@ -3455,8 +3455,8 @@ public abstract class LivingEntity extends Entity { this.noJumpDelay = 0; } @@ -1219,7 +1207,7 @@ index 0717f59c94f9579e05ed2938e14567be495ad1b0..45f11b6ae25a2f509b788c185dcf9cf3 this.xxa *= 0.98F; this.zza *= 0.98F; this.updateFallFlying(); -@@ -3462,8 +3462,8 @@ public abstract class LivingEntity extends Entity { +@@ -3465,8 +3465,8 @@ public abstract class LivingEntity extends Entity { // SpigotTimings.timerEntityAIMove.startTiming(); // Spigot // Paper this.travel(new Vec3((double) this.xxa, (double) this.yya, (double) this.zza)); // SpigotTimings.timerEntityAIMove.stopTiming(); // Spigot // Paper @@ -1230,7 +1218,7 @@ index 0717f59c94f9579e05ed2938e14567be495ad1b0..45f11b6ae25a2f509b788c185dcf9cf3 boolean flag1 = this.getType().is(EntityTypeTags.FREEZE_HURTS_EXTRA_TYPES); int i; -@@ -3483,15 +3483,15 @@ public abstract class LivingEntity extends Entity { +@@ -3486,15 +3486,15 @@ public abstract class LivingEntity extends Entity { this.hurt(DamageSource.FREEZE, (float) i); } @@ -1250,10 +1238,10 @@ index 0717f59c94f9579e05ed2938e14567be495ad1b0..45f11b6ae25a2f509b788c185dcf9cf3 // Purpur start if (this.xo != this.getX() || this.yo != this.getY() || this.zo != this.getZ() || this.yRotO != this.getYRot() || this.xRotO != this.getXRot()) { diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java -index 8c534ea4b461550c14c6d5ee131e5650784c2e0f..bc18c166ca776b0ef6e816eb034e410c391258b6 100644 +index 8df6af3a4ceea5ed6209df489a0f728d384bef89..db23506c44de328c74eb509caf6cc4d8d91cbc52 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java -@@ -332,14 +332,14 @@ public abstract class Mob extends LivingEntity { +@@ -330,14 +330,14 @@ public abstract class Mob extends LivingEntity { @Override public void baseTick() { super.baseTick(); @@ -1270,7 +1258,7 @@ index 8c534ea4b461550c14c6d5ee131e5650784c2e0f..bc18c166ca776b0ef6e816eb034e410c } // Purpur start -@@ -669,7 +669,7 @@ public abstract class Mob extends LivingEntity { +@@ -667,7 +667,7 @@ public abstract class Mob extends LivingEntity { @Override public void aiStep() { super.aiStep(); @@ -1279,7 +1267,7 @@ index 8c534ea4b461550c14c6d5ee131e5650784c2e0f..bc18c166ca776b0ef6e816eb034e410c if (!this.level.isClientSide && this.canPickUpLoot() && this.isAlive() && !this.dead && (this.level.purpurConfig.entitiesPickUpLootBypassMobGriefing || this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING))) { Vec3i baseblockposition = this.getPickupReach(); List list = this.level.getEntitiesOfClass(ItemEntity.class, this.getBoundingBox().inflate((double) baseblockposition.getX(), (double) baseblockposition.getY(), (double) baseblockposition.getZ())); -@@ -689,7 +689,7 @@ public abstract class Mob extends LivingEntity { +@@ -687,7 +687,7 @@ public abstract class Mob extends LivingEntity { } } @@ -1288,7 +1276,7 @@ index 8c534ea4b461550c14c6d5ee131e5650784c2e0f..bc18c166ca776b0ef6e816eb034e410c } protected Vec3i getPickupReach() { -@@ -884,46 +884,46 @@ public abstract class Mob extends LivingEntity { +@@ -900,42 +900,42 @@ public abstract class Mob extends LivingEntity { return; } // Paper end @@ -1302,26 +1290,22 @@ index 8c534ea4b461550c14c6d5ee131e5650784c2e0f..bc18c166ca776b0ef6e816eb034e410c if (i % 2 != 0 && this.tickCount > 1) { - this.level.getProfiler().push("targetSelector"); + //this.level.getProfiler().push("targetSelector"); // Purpur - if (this.targetSelector.inactiveTick(this.activatedPriority, false)) // Pufferfish - use this to alternate ticking this.targetSelector.tickRunningGoals(false); - this.level.getProfiler().pop(); - this.level.getProfiler().push("goalSelector"); + //this.level.getProfiler().pop(); // Purpur + //this.level.getProfiler().push("goalSelector"); // Purpur - if (this.goalSelector.inactiveTick(this.activatedPriority, false)) // Pufferfish - use this to alternate ticking this.goalSelector.tickRunningGoals(false); - this.level.getProfiler().pop(); + //this.level.getProfiler().pop(); // Purpur } else { - this.level.getProfiler().push("targetSelector"); + //this.level.getProfiler().push("targetSelector"); // Purpur - if (this.targetSelector.inactiveTick(this.activatedPriority, false)) // Pufferfish - use this to alternate ticking this.targetSelector.tick(); - this.level.getProfiler().pop(); - this.level.getProfiler().push("goalSelector"); + //this.level.getProfiler().pop(); // Purpur + //this.level.getProfiler().push("goalSelector"); // Purpur - if (this.goalSelector.inactiveTick(this.activatedPriority, false)) // Pufferfish - use this to alternate ticking this.goalSelector.tick(); - this.level.getProfiler().pop(); + //this.level.getProfiler().pop(); // Purpur @@ -1356,7 +1340,7 @@ index 8c534ea4b461550c14c6d5ee131e5650784c2e0f..bc18c166ca776b0ef6e816eb034e410c } diff --git a/src/main/java/net/minecraft/world/entity/ai/goal/GoalSelector.java b/src/main/java/net/minecraft/world/entity/ai/goal/GoalSelector.java -index bc3defa2c2ca0971ce3d9642a38380973a82de46..cbe957013d958d10ed6707a3785893f6856b9c3f 100644 +index b738ee2d3801fadfd09313f05ae24593e56b0ec6..8a70bc63e12838f45fa3eade74f2899438715886 100644 --- a/src/main/java/net/minecraft/world/entity/ai/goal/GoalSelector.java +++ b/src/main/java/net/minecraft/world/entity/ai/goal/GoalSelector.java @@ -102,8 +102,8 @@ public class GoalSelector { @@ -1408,10 +1392,10 @@ index bc3defa2c2ca0971ce3d9642a38380973a82de46..cbe957013d958d10ed6707a3785893f6 public Set getAvailableGoals() { diff --git a/src/main/java/net/minecraft/world/entity/ai/navigation/PathNavigation.java b/src/main/java/net/minecraft/world/entity/ai/navigation/PathNavigation.java -index 1d9d502e071324f50c8b7655790091c0c55263ba..2289ebc669078e8db054a0ecf7092b736bb99f12 100644 +index 97257b450e848f53fdb9b5b7affa57b03ea5f459..2f2d9bb31194618ef5bba39cd1cbe7c4919e82c5 100644 --- a/src/main/java/net/minecraft/world/entity/ai/navigation/PathNavigation.java +++ b/src/main/java/net/minecraft/world/entity/ai/navigation/PathNavigation.java -@@ -170,12 +170,12 @@ public abstract class PathNavigation { +@@ -171,12 +171,12 @@ public abstract class PathNavigation { } } // Paper end @@ -1443,16 +1427,15 @@ index 288c6627906d07c0d223eacd84ae4eb31a349998..9babe636176da3c40598eb5bdac0919a this.seen.add(i); } else { diff --git a/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java b/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java -index 28633838cb314ba59b4ff3bbdb99343d98ee66ae..499a6b84f0db4a7ad881224f445558feae4f893f 100644 +index 3c60ad2c26c46f900e537ea39d74a97068f44561..c03eca3f9e5ca87e7607aeca86ff62638d294ff9 100644 --- a/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java +++ b/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java -@@ -266,13 +266,13 @@ public class Allay extends PathfinderMob implements InventoryCarrier { - private int behaviorTick = 0; // Pufferfish +@@ -265,12 +265,12 @@ public class Allay extends PathfinderMob implements InventoryCarrier { + @Override protected void customServerAiStep() { - this.level.getProfiler().push("allayBrain"); + //this.level.getProfiler().push("allayBrain"); // Purpur - if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish this.getBrain().tick((ServerLevel) this.level, this); - this.level.getProfiler().pop(); - this.level.getProfiler().push("allayActivityUpdate"); @@ -1465,16 +1448,15 @@ index 28633838cb314ba59b4ff3bbdb99343d98ee66ae..499a6b84f0db4a7ad881224f445558fe } diff --git a/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java b/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java -index b543387da275a0b3675a968b6cebf05cc227af14..2e0f340f9b339b1d772c0676e97c12f389827848 100644 +index 66371759b99371db21a910d2e4e5cb9219e70b9c..3ec9d0b60b695efd1ea3bf17784004ca835b0361 100644 --- a/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java +++ b/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java -@@ -328,13 +328,13 @@ public class Axolotl extends Animal implements LerpingModel, Bucketable { - private int behaviorTick = 0; // Pufferfish +@@ -329,12 +329,12 @@ public class Axolotl extends Animal implements LerpingModel, VariantHolder optional = this.getBrain().getMemory(MemoryModuleType.PLAY_DEAD_TICKS); +diff --git a/src/main/java/net/minecraft/world/entity/animal/camel/Camel.java b/src/main/java/net/minecraft/world/entity/animal/camel/Camel.java +index 4026333d47bc919a37f120ea8ca16ae2c90048f4..5cea7fd17a6fc79ed2a9c2ff6097519a66491662 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/camel/Camel.java ++++ b/src/main/java/net/minecraft/world/entity/animal/camel/Camel.java +@@ -153,13 +153,13 @@ public class Camel extends AbstractHorse implements PlayerRideableJumping, Rider + + @Override + protected void customServerAiStep() { +- this.level.getProfiler().push("camelBrain"); ++ //this.level.getProfiler().push("camelBrain"); // Purpur + Brain brain = (Brain) this.getBrain(); // Paper - decompile fix + brain.tick((ServerLevel)this.level, this); +- this.level.getProfiler().pop(); +- this.level.getProfiler().push("camelActivityUpdate"); ++ //this.level.getProfiler().pop(); // Purpur ++ //this.level.getProfiler().push("camelActivityUpdate"); // Purpur + CamelAi.updateActivity(this); +- this.level.getProfiler().pop(); ++ //this.level.getProfiler().pop(); // Purpur + super.customServerAiStep(); + } + diff --git a/src/main/java/net/minecraft/world/entity/animal/frog/Frog.java b/src/main/java/net/minecraft/world/entity/animal/frog/Frog.java -index e739416fa58b182d7bd311be094d6aab2a7f7133..22f8db91f31be6a6d981c70e2ab94d031723ac9c 100644 +index 8aaf0fb4a7444fad23c46404d33b4a96d3740185..5afb3b788e68efe39f298a0d93454b99b18e35cb 100644 --- a/src/main/java/net/minecraft/world/entity/animal/frog/Frog.java +++ b/src/main/java/net/minecraft/world/entity/animal/frog/Frog.java -@@ -230,13 +230,13 @@ public class Frog extends Animal { - private int behaviorTick = 0; // Pufferfish +@@ -232,12 +232,12 @@ public class Frog extends Animal implements VariantHolder { + @Override protected void customServerAiStep() { - this.level.getProfiler().push("frogBrain"); + //this.level.getProfiler().push("frogBrain"); // Purpur - if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish this.getBrain().tick((ServerLevel)this.level, this); - this.level.getProfiler().pop(); - this.level.getProfiler().push("frogActivityUpdate"); @@ -1509,16 +1512,15 @@ index e739416fa58b182d7bd311be094d6aab2a7f7133..22f8db91f31be6a6d981c70e2ab94d03 } diff --git a/src/main/java/net/minecraft/world/entity/animal/frog/Tadpole.java b/src/main/java/net/minecraft/world/entity/animal/frog/Tadpole.java -index 8561d1994cb8c42e69ef77fad16d037c205dad33..5268a56a7967275df63f5a5ddb59219904f9a3c4 100644 +index b33b3714f18f5bcd1f7d9d4974a8c1e254d83f5b..b65dde04fdbeb6f4c7b3856b83209dff4a737167 100644 --- a/src/main/java/net/minecraft/world/entity/animal/frog/Tadpole.java +++ b/src/main/java/net/minecraft/world/entity/animal/frog/Tadpole.java -@@ -116,13 +116,13 @@ public class Tadpole extends AbstractFish { - private int behaviorTick = 0; // Pufferfish +@@ -115,12 +115,12 @@ public class Tadpole extends AbstractFish { + @Override protected void customServerAiStep() { - this.level.getProfiler().push("tadpoleBrain"); + //this.level.getProfiler().push("tadpoleBrain"); // Purpur - if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish this.getBrain().tick((ServerLevel) this.level, this); - this.level.getProfiler().pop(); - this.level.getProfiler().push("tadpoleActivityUpdate"); @@ -1531,16 +1533,16 @@ index 8561d1994cb8c42e69ef77fad16d037c205dad33..5268a56a7967275df63f5a5ddb592199 } diff --git a/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java b/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java -index fcbee79d3d872fe6ccf81b7ff932b86b1f9c93b4..6df25a181567021ee60ea72847459e25b9ee5b99 100644 +index 7f69d4b76f8cb7bbef105a7685f98803ae2cc0ca..dee2c9b1b1ed9e03170123e6b13eea2ed70c374e 100644 --- a/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java +++ b/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java -@@ -203,13 +203,13 @@ public class Goat extends Animal { - private int behaviorTick = 0; // Pufferfish +@@ -227,13 +227,13 @@ public class Goat extends Animal { + @Override protected void customServerAiStep() { - this.level.getProfiler().push("goatBrain"); + //this.level.getProfiler().push("goatBrain"); // Purpur - if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider + if (getRider() == null || !this.isControllable()) // Purpur - only use brain if no rider this.getBrain().tick((ServerLevel) this.level, this); - this.level.getProfiler().pop(); - this.level.getProfiler().push("goatActivityUpdate"); @@ -1553,10 +1555,10 @@ index fcbee79d3d872fe6ccf81b7ff932b86b1f9c93b4..6df25a181567021ee60ea72847459e25 } diff --git a/src/main/java/net/minecraft/world/entity/monster/Zoglin.java b/src/main/java/net/minecraft/world/entity/monster/Zoglin.java -index 66b824ac3c24c46014d615b355a8a04e59f45e1b..cc6e65d8fd760e46f20a7bcc6aff1cc08d7ca6a9 100644 +index 8b522186395d570bb14db94df8df2c4fa3705a7e..70d891d85748039b517a87b2438b04a9010d8af4 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zoglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zoglin.java -@@ -231,10 +231,10 @@ public class Zoglin extends Monster implements Enemy, HoglinBase { +@@ -230,10 +230,10 @@ public class Zoglin extends Monster implements Enemy, HoglinBase { @Override protected void customServerAiStep() { @@ -1570,16 +1572,16 @@ index 66b824ac3c24c46014d615b355a8a04e59f45e1b..cc6e65d8fd760e46f20a7bcc6aff1cc0 } diff --git a/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java b/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java -index 9d65b412e30f528d378de9072b48632c56c3e5bb..9ff882352b3fb69d8a8ecaf1908709761b3e9658 100644 +index f7165eb68704b152fd4ead658e5504fa71f68e21..7bcbcc2122f355601b6b096458ae91b639f8a4ef 100644 --- a/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java -@@ -166,10 +166,10 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { - private int behaviorTick; // Pufferfish +@@ -165,10 +165,10 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { + @Override protected void customServerAiStep() { - this.level.getProfiler().push("hoglinBrain"); + //this.level.getProfiler().push("hoglinBrain"); // Purpur - if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider + if (getRider() == null || !this.isControllable()) // Purpur - only use brain if no rider this.getBrain().tick((ServerLevel)this.level, this); - this.level.getProfiler().pop(); + //this.level.getProfiler().pop(); // Purpur @@ -1587,16 +1589,16 @@ index 9d65b412e30f528d378de9072b48632c56c3e5bb..9ff882352b3fb69d8a8ecaf190870976 if (this.isConverting()) { ++this.timeInOverworld; diff --git a/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java b/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java -index be060e07938e6b0a6f480e0b7b047ed16302057e..11fa67a167493bf15d85b68a0ceac36c0626e1dc 100644 +index f478fec2f603fc4994b726e145c22108d9c717e0..4f8602bfe1b54ccd7c144bfcfb7633600e2c5a73 100644 --- a/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java -@@ -324,10 +324,10 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento - private int behaviorTick; // Pufferfish +@@ -342,10 +342,10 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento + @Override protected void customServerAiStep() { - this.level.getProfiler().push("piglinBrain"); + //this.level.getProfiler().push("piglinBrain"); // Purpur - if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider + if (getRider() == null || !this.isControllable()) // Purpur - only use brain if no rider this.getBrain().tick((ServerLevel) this.level, this); - this.level.getProfiler().pop(); + //this.level.getProfiler().pop(); // Purpur @@ -1621,16 +1623,15 @@ index 760015f7a98e70b735707c77472c084d8bd052bb..bc6572b1025d74a7590d7e1cc49132f9 PiglinBruteAi.maybePlayActivitySound(this); super.customServerAiStep(); diff --git a/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java b/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java -index df55f9a9f684b474a3bff0977069471727b242f4..5dab2eea9e9c50e41c7971daefc3bbe819583207 100644 +index 98176fde2760ab1d85d0b5afc1fd776487eef5e0..8d02b93e96a5a16288f7ca7d9470eb0373c8c2da 100644 --- a/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java +++ b/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java -@@ -299,10 +299,10 @@ public class Warden extends Monster implements VibrationListener.VibrationListen +@@ -298,9 +298,9 @@ public class Warden extends Monster implements VibrationListener.VibrationListen protected void customServerAiStep() { ServerLevel worldserver = (ServerLevel) this.level; - worldserver.getProfiler().push("wardenBrain"); + //worldserver.getProfiler().push("wardenBrain"); // Purpur - if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish this.getBrain().tick(worldserver, this); - this.level.getProfiler().pop(); + //this.level.getProfiler().pop(); // Purpur @@ -1638,10 +1639,10 @@ index df55f9a9f684b474a3bff0977069471727b242f4..5dab2eea9e9c50e41c7971daefc3bbe8 if ((this.tickCount + this.getId()) % 120 == 0) { Warden.applyDarknessAround(worldserver, this.position(), this, 20); diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java -index 36dedae44ae743e1a5bc170c420e0a847bcb3a50..4c98f1dc73bdce5c87f77f27507f1ed1f710243d 100644 +index dd724eccd08c60f482f74dfadea21ef6087856a4..cb4c86179f2e908927ce20fc7b9f84bed55088fc 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java -@@ -337,7 +337,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -332,7 +332,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler @Override protected void customServerAiStep() { mobTick(false); } protected void mobTick(boolean inactive) { @@ -1650,7 +1651,7 @@ index 36dedae44ae743e1a5bc170c420e0a847bcb3a50..4c98f1dc73bdce5c87f77f27507f1ed1 // Purpur start if (this.level.purpurConfig.villagerLobotomizeEnabled) { // treat as inactive if lobotomized -@@ -363,7 +363,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -349,7 +349,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler restock(); } // Purpur end @@ -1660,10 +1661,10 @@ index 36dedae44ae743e1a5bc170c420e0a847bcb3a50..4c98f1dc73bdce5c87f77f27507f1ed1 this.assignProfessionWhenSpawned = false; } diff --git a/src/main/java/net/minecraft/world/level/Explosion.java b/src/main/java/net/minecraft/world/level/Explosion.java -index 31708d1e94b557896d42199aa0bc6ed26a4c6d8a..e9245a476936590f165a1e5c42515218d7572906 100644 +index e7ce14ab0732034107e735787354a6fb0ec90f54..a89e5b7a9e8733cb34a2bd59c8fbddc7e46a3b5c 100644 --- a/src/main/java/net/minecraft/world/level/Explosion.java +++ b/src/main/java/net/minecraft/world/level/Explosion.java -@@ -366,7 +366,7 @@ public class Explosion { +@@ -362,7 +362,7 @@ public class Explosion { if (!iblockdata.isAir() && iblockdata.isDestroyable()) { // Paper BlockPos blockposition1 = blockposition.immutable(); @@ -1672,7 +1673,7 @@ index 31708d1e94b557896d42199aa0bc6ed26a4c6d8a..e9245a476936590f165a1e5c42515218 if (block.dropFromExplosion(this)) { Level world = this.level; -@@ -388,7 +388,7 @@ public class Explosion { +@@ -384,7 +384,7 @@ public class Explosion { this.level.setBlock(blockposition, Blocks.AIR.defaultBlockState(), 3); block.wasExploded(this.level, blockposition, this); @@ -1682,10 +1683,10 @@ index 31708d1e94b557896d42199aa0bc6ed26a4c6d8a..e9245a476936590f165a1e5c42515218 } diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index 5e3acd365d9aca4271a590564e3eaad0d268bf11..0bb14272d024af90e7aef40f2f694e184af607d3 100644 +index d677e51e82d51a5b1a2387d5aa5d236e76e717e1..3778ad438b3a5f6cdbc465c7356bf9e11340753e 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java -@@ -712,9 +712,9 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -608,9 +608,9 @@ public abstract class Level implements LevelAccessor, AutoCloseable { BlockState iblockdata2 = this.getBlockState(pos); if ((flags & 128) == 0 && iblockdata2 != iblockdata1 && (iblockdata2.getLightBlock(this, pos) != iblockdata1.getLightBlock(this, pos) || iblockdata2.getLightEmission() != iblockdata1.getLightEmission() || iblockdata2.useShapeForLightOcclusion() || iblockdata1.useShapeForLightOcclusion())) { @@ -1697,7 +1698,7 @@ index 5e3acd365d9aca4271a590564e3eaad0d268bf11..0bb14272d024af90e7aef40f2f694e18 } /* -@@ -991,9 +991,9 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -909,9 +909,9 @@ public abstract class Level implements LevelAccessor, AutoCloseable { } protected void tickBlockEntities() { @@ -1709,7 +1710,7 @@ index 5e3acd365d9aca4271a590564e3eaad0d268bf11..0bb14272d024af90e7aef40f2f694e18 //timings.tileEntityPending.startTiming(); // Spigot // Purpur this.tickingBlockEntities = true; if (!this.pendingBlockEntityTickers.isEmpty()) { -@@ -1038,7 +1038,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -956,7 +956,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { //timings.tileEntityTick.stopTiming(); // Spigot // Purpur this.tickingBlockEntities = false; co.aikar.timings.TimingHistory.tileEntityTicks += this.blockEntityTickers.size(); // Paper @@ -1718,7 +1719,7 @@ index 5e3acd365d9aca4271a590564e3eaad0d268bf11..0bb14272d024af90e7aef40f2f694e18 spigotConfig.currentPrimedTnt = 0; // Spigot } -@@ -1199,7 +1199,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -1149,7 +1149,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { @Override public List getEntities(@Nullable Entity except, AABB box, Predicate predicate) { @@ -1727,29 +1728,28 @@ index 5e3acd365d9aca4271a590564e3eaad0d268bf11..0bb14272d024af90e7aef40f2f694e18 List list = Lists.newArrayList(); ((ServerLevel)this).getEntityLookup().getEntities(except, box, list, predicate); // Paper - optimise this call return list; -@@ -1207,7 +1207,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -1168,7 +1168,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { + } - @Override - public List getEntities(EntityTypeTest filter, AABB box, Predicate predicate) { + public void getEntities(EntityTypeTest filter, AABB box, Predicate predicate, List result, int limit) { - this.getProfiler().incrementCounter("getEntities"); + //this.getProfiler().incrementCounter("getEntities"); // Purpur - List list = Lists.newArrayList(); - // Paper start - optimise this call -@@ -1538,7 +1538,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { + //TODO use limit + if (filter instanceof net.minecraft.world.entity.EntityType entityTypeTest) { +@@ -1497,6 +1497,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { } public ProfilerFiller getProfiler() { -- if (gg.pufferfish.pufferfish.PufferfishConfig.disableMethodProfiler) return net.minecraft.util.profiling.InactiveProfiler.INSTANCE; // Pufferfish -+ if (true || gg.pufferfish.pufferfish.PufferfishConfig.disableMethodProfiler) return net.minecraft.util.profiling.InactiveProfiler.INSTANCE; // Pufferfish // Purpur ++ // Purpur - diff on change return (ProfilerFiller) this.profiler.get(); } diff --git a/src/main/java/net/minecraft/world/level/NaturalSpawner.java b/src/main/java/net/minecraft/world/level/NaturalSpawner.java -index 2d19db940d4f1624631cec29547e88842a4cfb98..5b5c18f70a989da6bff77485692a4ceef9a6f08d 100644 +index 940e324efa81981a17cd5d6e5e09aa3379b66afc..55ad593b3380ed6ff3ce2ef0e9a9e80aa03024b4 100644 --- a/src/main/java/net/minecraft/world/level/NaturalSpawner.java +++ b/src/main/java/net/minecraft/world/level/NaturalSpawner.java -@@ -131,7 +131,7 @@ public final class NaturalSpawner { +@@ -132,7 +132,7 @@ public final class NaturalSpawner { } public static void spawnForChunk(ServerLevel world, LevelChunk chunk, NaturalSpawner.SpawnState info, boolean spawnAnimals, boolean spawnMonsters, boolean rareSpawn) { @@ -1758,7 +1758,7 @@ index 2d19db940d4f1624631cec29547e88842a4cfb98..5b5c18f70a989da6bff77485692a4cee //world.timings.mobSpawn.startTiming(); // Spigot // Purpur MobCategory[] aenumcreaturetype = NaturalSpawner.SPAWNING_CATEGORIES; int i = aenumcreaturetype.length; -@@ -188,7 +188,7 @@ public final class NaturalSpawner { +@@ -189,7 +189,7 @@ public final class NaturalSpawner { } //world.timings.mobSpawn.stopTiming(); // Spigot // Purpur @@ -1768,10 +1768,10 @@ index 2d19db940d4f1624631cec29547e88842a4cfb98..5b5c18f70a989da6bff77485692a4cee // Paper start diff --git a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java -index 772a2dc21071a3f687b51fbddf9f12a90d41ce79..2877441927de3aeba28f5c3dd876e2ae4c15797c 100644 +index fda4c4f03983d31f04047fe6d277e2cf06189965..09e357833f9bbe26da7fa7142875daf2733d6420 100644 --- a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java +++ b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java -@@ -1309,9 +1309,9 @@ public class LevelChunk extends ChunkAccess { +@@ -1294,9 +1294,9 @@ public class LevelChunk extends ChunkAccess { if (LevelChunk.this.isTicking(blockposition)) { try { @@ -1783,7 +1783,7 @@ index 772a2dc21071a3f687b51fbddf9f12a90d41ce79..2877441927de3aeba28f5c3dd876e2ae //this.blockEntity.tickTimer.startTiming(); // Spigot // Purpur BlockState iblockdata = LevelChunk.this.getBlockState(blockposition); -@@ -1323,7 +1323,7 @@ public class LevelChunk extends ChunkAccess { +@@ -1308,7 +1308,7 @@ public class LevelChunk extends ChunkAccess { LevelChunk.LOGGER.warn("Block entity {} @ {} state {} invalid for ticking:", new Object[]{LogUtils.defer(this::getType), LogUtils.defer(this::getPos), iblockdata}); } diff --git a/patches/server/0289-Add-more-logger-output-for-invalid-movement-kicks.patch b/patches/server/0281-Add-more-logger-output-for-invalid-movement-kicks.patch similarity index 91% rename from patches/server/0289-Add-more-logger-output-for-invalid-movement-kicks.patch rename to patches/server/0281-Add-more-logger-output-for-invalid-movement-kicks.patch index d9b31475c..ca363b691 100644 --- a/patches/server/0289-Add-more-logger-output-for-invalid-movement-kicks.patch +++ b/patches/server/0281-Add-more-logger-output-for-invalid-movement-kicks.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add more logger output for invalid movement kicks diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index d74ee9e75eaf3b012c61b93e2b6f6a36a592688a..66c632f9a824e705420b9bb86de294f0e7305c50 100644 +index 77f67560a004779c3091435d3d04e36c393b9a19..7e0522f1d8ae7b4fb5a6acac4ffc5d1f2ced21ec 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -858,6 +858,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -849,6 +849,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic if (packet.getId() == this.awaitingTeleport) { if (this.awaitingPositionFromClient == null) { this.disconnect(Component.translatable("multiplayer.disconnect.invalid_player_movement"), org.bukkit.event.player.PlayerKickEvent.Cause.INVALID_PLAYER_MOVEMENT); // Paper - kick event cause @@ -16,7 +16,7 @@ index d74ee9e75eaf3b012c61b93e2b6f6a36a592688a..66c632f9a824e705420b9bb86de294f0 return; } -@@ -1438,8 +1439,16 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -1428,8 +1429,16 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic @Override public void handleMovePlayer(ServerboundMovePlayerPacket packet) { PacketUtils.ensureRunningOnSameThread(packet, this, this.player.getLevel()); diff --git a/patches/server/0290-Add-Bee-API.patch b/patches/server/0282-Add-Bee-API.patch similarity index 89% rename from patches/server/0290-Add-Bee-API.patch rename to patches/server/0282-Add-Bee-API.patch index 0abd66774..85d73f238 100644 --- a/patches/server/0290-Add-Bee-API.patch +++ b/patches/server/0282-Add-Bee-API.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add Bee API diff --git a/src/main/java/net/minecraft/world/entity/animal/Bee.java b/src/main/java/net/minecraft/world/entity/animal/Bee.java -index a2637285440e047e2b318c2c915ea2ccc4f72711..0a432fe44e8d444d635b3e3e274dd20cf0b910f3 100644 +index 7d8ab3c5d5277b81157d56b408293cc3ae511c78..87bd7991a81a2e30ecfccb60e614d7f13acd3744 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Bee.java +++ b/src/main/java/net/minecraft/world/entity/animal/Bee.java -@@ -806,6 +806,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -809,6 +809,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { if (optional.isPresent()) { Bee.this.savedFlowerPos = (BlockPos) optional.get(); Bee.this.navigation.moveTo((double) Bee.this.savedFlowerPos.getX() + 0.5D, (double) Bee.this.savedFlowerPos.getY() + 0.5D, (double) Bee.this.savedFlowerPos.getZ() + 0.5D, 1.2000000476837158D); @@ -16,7 +16,7 @@ index a2637285440e047e2b318c2c915ea2ccc4f72711..0a432fe44e8d444d635b3e3e274dd20c return true; } else { Bee.this.remainingCooldownBeforeLocatingNewFlower = Mth.nextInt(Bee.this.random, 20, 60); -@@ -862,6 +863,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -865,6 +866,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { this.pollinating = false; Bee.this.navigation.stop(); Bee.this.remainingCooldownBeforeLocatingNewFlower = 200; @@ -24,7 +24,7 @@ index a2637285440e047e2b318c2c915ea2ccc4f72711..0a432fe44e8d444d635b3e3e274dd20c } @Override -@@ -908,6 +910,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -911,6 +913,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { this.setWantedPos(); } diff --git a/patches/server/0291-Debug-Marker-API.patch b/patches/server/0283-Debug-Marker-API.patch similarity index 93% rename from patches/server/0291-Debug-Marker-API.patch rename to patches/server/0283-Debug-Marker-API.patch index e60d8f80e..e51dde136 100644 --- a/patches/server/0291-Debug-Marker-API.patch +++ b/patches/server/0283-Debug-Marker-API.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Debug Marker API diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 621461cedbdad4b28da7047e3c26cc9ed60e1439..9883c5732cb136194c5d11fbe76f66fd234e3f82 100644 +index c77f76d3b346d25aa48233ad8516a85118f26a9f..79ee10b16295d2eafe1555331c03d45526c3b480 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -1468,6 +1468,42 @@ public final class CraftServer implements Server { +@@ -1487,6 +1487,42 @@ public final class CraftServer implements Server { public void removeFuel(org.bukkit.Material material) { net.minecraft.world.level.block.entity.AbstractFurnaceBlockEntity.removeFuel(net.minecraft.world.item.ItemStack.fromBukkitCopy(new ItemStack(material))); } @@ -52,10 +52,10 @@ index 621461cedbdad4b28da7047e3c26cc9ed60e1439..9883c5732cb136194c5d11fbe76f66fd @Override diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -index c43be63f65c4cec94d19e3a75cf05d5d6f75c4d3..41fafd4a1583e748d763439e8838739ec1ff8e1d 100644 +index 8e2e58ae379379808f347d503ddcfbb961c98763..069bb67d1f79e63dce85cba347a1fd67a4781043 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -@@ -2238,6 +2238,42 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -2237,6 +2237,42 @@ public class CraftWorld extends CraftRegionAccessor implements World { public float getLocalDifficultyAt(Location location) { return getHandle().getCurrentDifficultyAt(io.papermc.paper.util.MCUtil.toBlockPosition(location)).getEffectiveDifficulty(); } @@ -99,10 +99,10 @@ index c43be63f65c4cec94d19e3a75cf05d5d6f75c4d3..41fafd4a1583e748d763439e8838739e @Override diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 6d45052c9fd8cecfd76eae3c8bea55cdfa3b58a5..d5631b08a44812c1ebf737277c74c85fdee0d2ed 100644 +index d09ccb8931e9e89fcfb045bfbd4f178282b8b263..61cc3f41a8ef8d3cfe15fe6e92fa9b4977a26c24 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -3065,5 +3065,48 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -3074,5 +3074,48 @@ public class CraftPlayer extends CraftHumanEntity implements Player { public boolean hasFlyingFallDamage() { return getHandle().flyingFallDamage; } diff --git a/patches/server/0292-add-Player-showCreditScreen.patch b/patches/server/0284-add-Player-showCreditScreen.patch similarity index 86% rename from patches/server/0292-add-Player-showCreditScreen.patch rename to patches/server/0284-add-Player-showCreditScreen.patch index 5a5eba5d5..512451e0b 100644 --- a/patches/server/0292-add-Player-showCreditScreen.patch +++ b/patches/server/0284-add-Player-showCreditScreen.patch @@ -5,10 +5,10 @@ Subject: [PATCH] add Player#showCreditScreen diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 897597dbd38b7433c9e414ed71269d48cf2d2c41..a432feb58be5947688502e7b4e3e81cf09eb3f47 100644 +index 61cc3f41a8ef8d3cfe15fe6e92fa9b4977a26c24..1e9e73762bea7c80ec732e9b7977b6908917c044 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -2654,6 +2654,13 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -2606,6 +2606,13 @@ public class CraftPlayer extends CraftHumanEntity implements Player { this.getHandle().connection.send(new ClientboundGameEventPacket(ClientboundGameEventPacket.DEMO_EVENT, ClientboundGameEventPacket.DEMO_PARAM_INTRO)); } diff --git a/patches/server/0293-mob-spawning-option-to-ignore-creative-players.patch b/patches/server/0285-mob-spawning-option-to-ignore-creative-players.patch similarity index 92% rename from patches/server/0293-mob-spawning-option-to-ignore-creative-players.patch rename to patches/server/0285-mob-spawning-option-to-ignore-creative-players.patch index c7998bc28..2a3c5b43e 100644 --- a/patches/server/0293-mob-spawning-option-to-ignore-creative-players.patch +++ b/patches/server/0285-mob-spawning-option-to-ignore-creative-players.patch @@ -5,10 +5,10 @@ Subject: [PATCH] mob spawning option to ignore creative players diff --git a/src/main/java/net/minecraft/world/level/NaturalSpawner.java b/src/main/java/net/minecraft/world/level/NaturalSpawner.java -index e882996b64178d2e22aeaf6f6a16a05eb715362d..6b8356e592bfca69cf785457284c99e47e360bd6 100644 +index 55ad593b3380ed6ff3ce2ef0e9a9e80aa03024b4..decf30b590658a627d47cb688531ec1cc24ba001 100644 --- a/src/main/java/net/minecraft/world/level/NaturalSpawner.java +++ b/src/main/java/net/minecraft/world/level/NaturalSpawner.java -@@ -259,7 +259,7 @@ public final class NaturalSpawner { +@@ -260,7 +260,7 @@ public final class NaturalSpawner { blockposition_mutableblockposition.set(l, i, i1); double d0 = (double) l + 0.5D; double d1 = (double) i1 + 0.5D; @@ -18,7 +18,7 @@ index e882996b64178d2e22aeaf6f6a16a05eb715362d..6b8356e592bfca69cf785457284c99e4 if (entityhuman != null) { double d2 = entityhuman.distanceToSqr(d0, (double) i, d1); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index f4c1698a7e8a929313bbc5aec6df197237cc2680..13c7cdbe4a08b3b452d6e53275ada5c81ae401b5 100644 +index 189d409e83529740221df7565c343bb108ca1203..57469d9f1fe5153ac140a8e36d411084d802f2c1 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -376,6 +376,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0294-Make-pufferfish-config-relocatable.patch b/patches/server/0286-Make-pufferfish-config-relocatable.patch similarity index 50% rename from patches/server/0294-Make-pufferfish-config-relocatable.patch rename to patches/server/0286-Make-pufferfish-config-relocatable.patch index f7953d73d..a98706522 100644 --- a/patches/server/0294-Make-pufferfish-config-relocatable.patch +++ b/patches/server/0286-Make-pufferfish-config-relocatable.patch @@ -4,41 +4,20 @@ Date: Sun, 12 Jun 2022 09:18:57 -0500 Subject: [PATCH] Make pufferfish config relocatable -diff --git a/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java b/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java -index 44ee788422cdf946be5f156e2a4662b0b030cdc9..c9ae76401278057f87ebef13619a114722e81a1d 100644 ---- a/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java -+++ b/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java -@@ -28,6 +28,7 @@ public class PufferfishConfig { - - private static final YamlFile config = new YamlFile(); - private static int updates = 0; -+ public static File pufferfishFile; // Purpur - - private static ConfigurationSection convertToBukkit(org.simpleyaml.configuration.ConfigurationSection section) { - ConfigurationSection newSection = new MemoryConfiguration(); -@@ -50,7 +51,7 @@ public class PufferfishConfig { - } - - public static void load() throws IOException { -- File configFile = new File("pufferfish.yml"); -+ File configFile = pufferfishFile; // Purpur - - if (configFile.exists()) { - try { diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java -index 8b8655300fa81de8352dfec92c088f4f45511f21..d6c563dff2e816e043e096f8286e3d975cc86290 100644 +index fa87a019247a23cd71b6ca57146ef55d14afd2a1..5b44f7512f21dba3f3306c7f42fa2d78e600847a 100644 --- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java +++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java -@@ -235,6 +235,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface +@@ -230,6 +230,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface com.destroystokyo.paper.VersionHistoryManager.INSTANCE.getClass(); // load version history now io.papermc.paper.brigadier.PaperBrigadierProviderImpl.INSTANCE.getClass(); // init PaperBrigadierProvider // Paper end -+ gg.pufferfish.pufferfish.PufferfishConfig.pufferfishFile = (java.io.File) options.valueOf("pufferfish-settings"); // Purpur - gg.pufferfish.pufferfish.PufferfishConfig.load(); // Pufferfish - gg.pufferfish.pufferfish.PufferfishCommand.init(); // Pufferfish ++ // gg.pufferfish.pufferfish.PufferfishConfig.pufferfishFile = (java.io.File) options.valueOf("pufferfish-settings"); // Purpur + this.setPvpAllowed(dedicatedserverproperties.pvp); + this.setFlightAllowed(dedicatedserverproperties.allowFlight); diff --git a/src/main/java/org/bukkit/craftbukkit/Main.java b/src/main/java/org/bukkit/craftbukkit/Main.java -index f42d75f326bc26e4ab15f12a1a3e0cfc68ce91db..8a4c8701122edf2f29edbe97e4fa199da2744e9e 100644 +index 7b6063bede6771eb15bc5b01dc8bce7c2949c6b4..72810905cc50af204161a02872d599af4aba8dbb 100644 --- a/src/main/java/org/bukkit/craftbukkit/Main.java +++ b/src/main/java/org/bukkit/craftbukkit/Main.java @@ -172,6 +172,12 @@ public class Main { diff --git a/patches/server/0295-Add-skeleton-bow-accuracy-option.patch b/patches/server/0287-Add-skeleton-bow-accuracy-option.patch similarity index 93% rename from patches/server/0295-Add-skeleton-bow-accuracy-option.patch rename to patches/server/0287-Add-skeleton-bow-accuracy-option.patch index a8bbf2a64..170797761 100644 --- a/patches/server/0295-Add-skeleton-bow-accuracy-option.patch +++ b/patches/server/0287-Add-skeleton-bow-accuracy-option.patch @@ -18,10 +18,10 @@ index e542407894f58fb8c0339a7a6d2e7b2cb5891eb4..0cfe5cb3ce0ac8554bbdb68c66583693 org.bukkit.event.entity.EntityShootBowEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityShootBowEvent(this, this.getMainHandItem(), entityarrow.getPickupItem(), entityarrow, net.minecraft.world.InteractionHand.MAIN_HAND, 0.8F, true); // Paper if (event.isCancelled()) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 38555330148ee325645d23f0bb39901f5f96495a..5461424bb336a0822af97c6b7ad128482196e68a 100644 +index 6a162fa85ea2a3efa53bc89d68f0a5b4ed5ac79a..c6279a549d68bff81e14f1ad4793266638d19442 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -2385,6 +2385,8 @@ public class PurpurWorldConfig { +@@ -2388,6 +2388,8 @@ public class PurpurWorldConfig { public boolean skeletonAlwaysDropExp = false; public double skeletonHeadVisibilityPercent = 0.5D; public int skeletonFeedWitherRoses = 0; @@ -30,7 +30,7 @@ index 38555330148ee325645d23f0bb39901f5f96495a..5461424bb336a0822af97c6b7ad12848 private void skeletonSettings() { skeletonRidable = getBoolean("mobs.skeleton.ridable", skeletonRidable); skeletonRidableInWater = getBoolean("mobs.skeleton.ridable-in-water", skeletonRidableInWater); -@@ -2399,6 +2401,18 @@ public class PurpurWorldConfig { +@@ -2402,6 +2404,18 @@ public class PurpurWorldConfig { skeletonAlwaysDropExp = getBoolean("mobs.skeleton.always-drop-exp", skeletonAlwaysDropExp); skeletonHeadVisibilityPercent = getDouble("mobs.skeleton.head-visibility-percent", skeletonHeadVisibilityPercent); skeletonFeedWitherRoses = getInt("mobs.skeleton.feed-wither-roses", skeletonFeedWitherRoses); diff --git a/patches/server/0296-Allay-respect-item-NBT.patch b/patches/server/0288-Allay-respect-item-NBT.patch similarity index 73% rename from patches/server/0296-Allay-respect-item-NBT.patch rename to patches/server/0288-Allay-respect-item-NBT.patch index 167492af1..2d15ab325 100644 --- a/patches/server/0296-Allay-respect-item-NBT.patch +++ b/patches/server/0288-Allay-respect-item-NBT.patch @@ -5,24 +5,16 @@ Subject: [PATCH] Allay respect item NBT diff --git a/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java b/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java -index 499a6b84f0db4a7ad881224f445558feae4f893f..8f843b562d96274d7e786f1dc1f04602a7303222 100644 +index c03eca3f9e5ca87e7607aeca86ff62638d294ff9..a3d34e100647853f887d6ee8a5cf87a3f0d051a5 100644 --- a/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java +++ b/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java -@@ -15,6 +15,7 @@ import net.minecraft.core.Vec3i; - import net.minecraft.core.particles.ParticleTypes; - import net.minecraft.nbt.CompoundTag; - import net.minecraft.nbt.NbtOps; -+import net.minecraft.nbt.Tag; - import net.minecraft.network.protocol.game.DebugPackets; - import net.minecraft.network.syncher.EntityDataAccessor; - import net.minecraft.network.syncher.EntityDataSerializers; -@@ -411,9 +412,31 @@ public class Allay extends PathfinderMob implements InventoryCarrier { +@@ -412,9 +412,31 @@ public class Allay extends PathfinderMob implements InventoryCarrier { @Override public boolean wantsToPickUp(ItemStack stack) { - ItemStack itemstack1 = this.getItemInHand(InteractionHand.MAIN_HAND); - -- return !itemstack1.isEmpty() && itemstack1.sameItemStackIgnoreDurability(stack) && this.inventory.canAddItem(stack) && this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); +- return !itemstack1.isEmpty() && this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) && this.inventory.canAddItem(stack) && this.allayConsidersItemEqual(itemstack1, stack); + // Purpur start + if (!this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { + return false; @@ -31,7 +23,7 @@ index 499a6b84f0db4a7ad881224f445558feae4f893f..8f843b562d96274d7e786f1dc1f04602 + if (itemStack.isEmpty()) { + return false; + } -+ if (!itemStack.sameItemStackIgnoreDurability(stack)) { ++ if (!allayConsidersItemEqual(itemStack, stack)) { + return false; + } + if (!this.inventory.canAddItem(stack)) { @@ -50,9 +42,9 @@ index 499a6b84f0db4a7ad881224f445558feae4f893f..8f843b562d96274d7e786f1dc1f04602 + // Purpur end } - @Override + private boolean allayConsidersItemEqual(ItemStack stack, ItemStack stack2) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 2cd4b04bf1820b28050f3af492186135b9b69712..5686dfd41dad412cdbef9345eff3542740599462 100644 +index a5515245fdcf096dea59dc0e93298633c2ae7f06..fe34899a605525361e5cb6b2b8f7f0d097cbf788 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -1043,10 +1043,13 @@ public class PurpurWorldConfig { diff --git a/patches/server/0297-Add-death-screen-API.patch b/patches/server/0289-Add-death-screen-API.patch similarity index 94% rename from patches/server/0297-Add-death-screen-API.patch rename to patches/server/0289-Add-death-screen-API.patch index 3da7ca57e..6437c9763 100644 --- a/patches/server/0297-Add-death-screen-API.patch +++ b/patches/server/0289-Add-death-screen-API.patch @@ -30,10 +30,10 @@ index 53b75f5737a910ffc5448cd9a85eae57f9c1488f..ea95873dd034779e56a8b924cd27f937 } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 9c513b2db3a377e3eff7b042db6bb7139a9d1246..6c816179a2fef2c913580339eb68040e5af3fd92 100644 +index 1e9e73762bea7c80ec732e9b7977b6908917c044..82697576db752e3dad908e389035ec66c728f0ec 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -3115,5 +3115,18 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -3124,5 +3124,18 @@ public class CraftPlayer extends CraftHumanEntity implements Player { if (this.getHandle().connection == null) return; this.getHandle().connection.send(new net.minecraft.network.protocol.game.ClientboundCustomPayloadPacket(ClientboundCustomPayloadPacket.DEBUG_GAME_TEST_CLEAR, new FriendlyByteBuf(io.netty.buffer.Unpooled.buffer()))); } diff --git a/patches/server/0298-Implement-ram-and-rambar-commands.patch b/patches/server/0290-Implement-ram-and-rambar-commands.patch similarity index 95% rename from patches/server/0298-Implement-ram-and-rambar-commands.patch rename to patches/server/0290-Implement-ram-and-rambar-commands.patch index 899e12b0a..9883a770d 100644 --- a/patches/server/0298-Implement-ram-and-rambar-commands.patch +++ b/patches/server/0290-Implement-ram-and-rambar-commands.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Implement ram and rambar commands diff --git a/src/main/java/net/minecraft/commands/Commands.java b/src/main/java/net/minecraft/commands/Commands.java -index e2a90eed64717ef24b4e1c3dd0b6d90da3ac5eed..6505112d94ad7d21a71663ae6516c5196abb6531 100644 +index a6996259f9fcb2d6520ca45fa42b11c42824ef9d..1a6f3c602437eaedbc96f1d47d08ff3ab25c0469 100644 --- a/src/main/java/net/minecraft/commands/Commands.java +++ b/src/main/java/net/minecraft/commands/Commands.java -@@ -213,6 +213,8 @@ public class Commands { +@@ -221,6 +221,8 @@ public class Commands { org.purpurmc.purpur.command.UptimeCommand.register(this.dispatcher); // Purpur org.purpurmc.purpur.command.TPSBarCommand.register(this.dispatcher); // Purpur org.purpurmc.purpur.command.CompassCommand.register(this.dispatcher); // Purpur @@ -18,18 +18,18 @@ index e2a90eed64717ef24b4e1c3dd0b6d90da3ac5eed..6505112d94ad7d21a71663ae6516c519 if (environment.includeIntegrated) { diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index 5cfed037cda553f4d752770890ae0c9b3f42cbfd..bd472130d94ec2a7507a585809fa99047eb60d19 100644 +index 5e495c427abaae7476149c19a2131d5804aecab2..7f2a811505c2aeaad6e1a91a0719613a6694f77a 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java -@@ -263,6 +263,7 @@ public class ServerPlayer extends Player { - public PlayerNaturallySpawnCreaturesEvent playerNaturallySpawnedEvent; // Paper +@@ -272,6 +272,7 @@ public class ServerPlayer extends Player { + public org.bukkit.event.player.PlayerQuitEvent.QuitReason quitReason = null; // Paper - there are a lot of changes to do if we change all methods leading to the event public boolean purpurClient = false; // Purpur public boolean acceptingResourcePack = false; // Purpur + private boolean ramBar = false; // Purpur private boolean tpsBar = false; // Purpur private boolean compassBar = false; // Purpur -@@ -498,6 +499,7 @@ public class ServerPlayer extends Player { +@@ -513,6 +514,7 @@ public class ServerPlayer extends Player { } } @@ -37,7 +37,7 @@ index 5cfed037cda553f4d752770890ae0c9b3f42cbfd..bd472130d94ec2a7507a585809fa9904 if (nbt.contains("Purpur.TPSBar")) { this.tpsBar = nbt.getBoolean("Purpur.TPSBar"); } // Purpur if (nbt.contains("Purpur.CompassBar")) { this.compassBar = nbt.getBoolean("Purpur.CompassBar"); } // Purpur } -@@ -560,6 +562,7 @@ public class ServerPlayer extends Player { +@@ -581,6 +583,7 @@ public class ServerPlayer extends Player { } this.getBukkitEntity().setExtraData(nbt); // CraftBukkit @@ -45,7 +45,7 @@ index 5cfed037cda553f4d752770890ae0c9b3f42cbfd..bd472130d94ec2a7507a585809fa9904 nbt.putBoolean("Purpur.TPSBar", this.tpsBar); // Purpur nbt.putBoolean("Purpur.CompassBar", this.compassBar); // Purpur } -@@ -2654,6 +2657,14 @@ public class ServerPlayer extends Player { +@@ -2694,6 +2697,14 @@ public class ServerPlayer extends Player { } } @@ -61,7 +61,7 @@ index 5cfed037cda553f4d752770890ae0c9b3f42cbfd..bd472130d94ec2a7507a585809fa9904 return this.tpsBar; } diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -index d75604b369b44e493da22a5408530b644c6dc1d6..697367da89959abc7145c76d49f6d801d9ab0b23 100644 +index 986f4daaf054b0807deab5066c6734b18ddaa7a1..49a2b0f141cdd02217240fdad78d554e7dc06d25 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java @@ -181,6 +181,8 @@ public class PurpurConfig { diff --git a/patches/server/0299-Add-item-packet-serialize-event.patch b/patches/server/0291-Add-item-packet-serialize-event.patch similarity index 82% rename from patches/server/0299-Add-item-packet-serialize-event.patch rename to patches/server/0291-Add-item-packet-serialize-event.patch index f510690a1..a32a31285 100644 --- a/patches/server/0299-Add-item-packet-serialize-event.patch +++ b/patches/server/0291-Add-item-packet-serialize-event.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add item packet serialize event diff --git a/src/main/java/net/minecraft/network/FriendlyByteBuf.java b/src/main/java/net/minecraft/network/FriendlyByteBuf.java -index 35377576ed182814051c11f902e02e8e921e84e3..a7b6e22daf64abca311bc5771192a3c09368537f 100644 +index 32ee4ed11aefd82dca2e3e78b3108f041fdc3695..314318a21b6fa9e827945d8996c6ed0f9679a4eb 100644 --- a/src/main/java/net/minecraft/network/FriendlyByteBuf.java +++ b/src/main/java/net/minecraft/network/FriendlyByteBuf.java -@@ -83,6 +83,8 @@ public class FriendlyByteBuf extends ByteBuf { +@@ -89,6 +89,8 @@ public class FriendlyByteBuf extends ByteBuf { private static final int MAX_PUBLIC_KEY_HEADER_SIZE = 256; private static final int MAX_PUBLIC_KEY_LENGTH = 512; @@ -17,7 +17,7 @@ index 35377576ed182814051c11f902e02e8e921e84e3..a7b6e22daf64abca311bc5771192a3c0 public FriendlyByteBuf(ByteBuf parent) { this.source = parent; } -@@ -570,6 +572,13 @@ public class FriendlyByteBuf extends ByteBuf { +@@ -632,6 +634,13 @@ public class FriendlyByteBuf extends ByteBuf { this.writeBoolean(false); } else { this.writeBoolean(true); @@ -30,12 +30,12 @@ index 35377576ed182814051c11f902e02e8e921e84e3..a7b6e22daf64abca311bc5771192a3c0 + // Purpur end Item item = stack.getItem(); - this.writeId(Registry.ITEM, item); + this.writeId(BuiltInRegistries.ITEM, item); diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 0168d31480ded035584157c747f60df7f712f250..735e01c550d561aa21c3c8f7f34a495ec3a0ab67 100644 +index 99727dd2ee576c8c2fe2be1e6dcf9b1f6be0c894..b915e6a13a518f05d109c707142efa3946892f0c 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1537,6 +1537,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop piercedAndKilledEntities; @@ -16,7 +16,7 @@ index 98cfacc950b088a98f592fdf6e00d8a057628ed5..f2321de6bbba7681bcc82c5706f01b76 // Spigot Start @Override -@@ -622,6 +623,12 @@ public abstract class AbstractArrow extends Projectile { +@@ -623,6 +624,12 @@ public abstract class AbstractArrow extends Projectile { this.knockback = punch; } @@ -48,10 +48,10 @@ index 220513d3fd5645322886522ea4f6b8c55d043b3c..d45a2f49c82d00801578c34e5f5277fc org.bukkit.event.entity.EntityShootBowEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityShootBowEvent(entityhuman, stack, itemstack1, entityarrow, entityhuman.getUsedItemHand(), f, !flag1); if (event.isCancelled()) { diff --git a/src/main/java/net/minecraft/world/item/CrossbowItem.java b/src/main/java/net/minecraft/world/item/CrossbowItem.java -index 2d30300de78de957358cfddac12294b308062e2a..37cbd0d95f3232ed399c6ef19f714c547b9fd8e5 100644 +index 8a3c0b52c64c0116872abbcad8f5d743b9aa9bd9..c4942deb963064c61d4ab95c27ed341a6648dcc8 100644 --- a/src/main/java/net/minecraft/world/item/CrossbowItem.java +++ b/src/main/java/net/minecraft/world/item/CrossbowItem.java -@@ -294,6 +294,14 @@ public class CrossbowItem extends ProjectileWeaponItem implements Vanishable { +@@ -293,6 +293,14 @@ public class CrossbowItem extends ProjectileWeaponItem implements Vanishable { entityarrow.setPierceLevel((byte) i); } @@ -104,10 +104,10 @@ index 31918fa2eb38e42a5ea5366e559f25ea9d7d59ae..15d8e9261a89da30529ac347462c5209 if (context.hasParam(LootContextParams.LOOTING_MOD)) { i = context.getParamOrNull(LootContextParams.LOOTING_MOD); diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -index 697367da89959abc7145c76d49f6d801d9ab0b23..01fe3af88214ec7d73f307d5209955bd925ccc96 100644 +index 49a2b0f141cdd02217240fdad78d554e7dc06d25..0648026d1f14efc39199193e04824c5f235ed693 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -@@ -568,4 +568,9 @@ public class PurpurConfig { +@@ -566,4 +566,9 @@ public class PurpurConfig { } }); } diff --git a/patches/server/0303-Configurable-block-blast-resistance.patch b/patches/server/0295-Configurable-block-blast-resistance.patch similarity index 83% rename from patches/server/0303-Configurable-block-blast-resistance.patch rename to patches/server/0295-Configurable-block-blast-resistance.patch index 35d64ec44..553260ce5 100644 --- a/patches/server/0303-Configurable-block-blast-resistance.patch +++ b/patches/server/0295-Configurable-block-blast-resistance.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Configurable block blast resistance diff --git a/src/main/java/net/minecraft/world/level/block/state/BlockBehaviour.java b/src/main/java/net/minecraft/world/level/block/state/BlockBehaviour.java -index 304f0f372d669e3da2e8131c50f2f1246185a56b..bcc4c1af0fe153ed87e55706a1a6a5c6e945fec8 100644 +index b40e09b4fdf26c08c048cbf3cad4d4cabec0fe90..53a3ba27364cdc2ef046756845f0b01b24339563 100644 --- a/src/main/java/net/minecraft/world/level/block/state/BlockBehaviour.java +++ b/src/main/java/net/minecraft/world/level/block/state/BlockBehaviour.java -@@ -75,7 +75,7 @@ public abstract class BlockBehaviour { +@@ -79,7 +79,7 @@ public abstract class BlockBehaviour implements FeatureElement { protected static final Direction[] UPDATE_SHAPE_ORDER = new Direction[]{Direction.WEST, Direction.EAST, Direction.NORTH, Direction.SOUTH, Direction.DOWN, Direction.UP}; public final Material material; // Purpur - protected -> public public final boolean hasCollision; @@ -18,17 +18,17 @@ index 304f0f372d669e3da2e8131c50f2f1246185a56b..bcc4c1af0fe153ed87e55706a1a6a5c6 protected final SoundType soundType; protected final float friction; diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -index 01fe3af88214ec7d73f307d5209955bd925ccc96..14844cb8a402ac987f44a91b95d5ebdac73c6dfe 100644 +index 263de5c77c5f079d2bf3aa177a89f919c8fec68c..1288d79a7db44adde173a9650d6525d56b0c2c5b 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -@@ -573,4 +573,19 @@ public class PurpurConfig { +@@ -571,4 +571,19 @@ public class PurpurConfig { private static void fixProjectileLootingTransfer() { fixProjectileLootingTransfer = getBoolean("settings.fix-projectile-looting-transfer", fixProjectileLootingTransfer); } + + private static void blastResistanceSettings() { + getMap("settings.blast-resistance-overrides", Collections.emptyMap()).forEach((blockId, value) -> { -+ Block block = Registry.BLOCK.get(new ResourceLocation(blockId)); ++ Block block = BuiltInRegistries.BLOCK.get(new ResourceLocation(blockId)); + if (block == Blocks.AIR) { + log(Level.SEVERE, "Invalid block for `settings.blast-resistance-overrides`: " + blockId); + return; diff --git a/patches/server/0304-Configurable-block-fall-damage-modifiers.patch b/patches/server/0296-Configurable-block-fall-damage-modifiers.patch similarity index 90% rename from patches/server/0304-Configurable-block-fall-damage-modifiers.patch rename to patches/server/0296-Configurable-block-fall-damage-modifiers.patch index 50eed9f96..65acd5ed5 100644 --- a/patches/server/0304-Configurable-block-fall-damage-modifiers.patch +++ b/patches/server/0296-Configurable-block-fall-damage-modifiers.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Configurable block fall damage modifiers diff --git a/src/main/java/net/minecraft/world/level/block/BedBlock.java b/src/main/java/net/minecraft/world/level/block/BedBlock.java -index e1d274a9be856f6fa5be00958c35b7d7c58357a7..1df761d866b10a3fb46d132c0377b58293b0cb07 100644 +index 812a93197774b8fbcb5745a5590717e1e3ba1472..497e405781199788c76e3042bf13514f740d6873 100644 --- a/src/main/java/net/minecraft/world/level/block/BedBlock.java +++ b/src/main/java/net/minecraft/world/level/block/BedBlock.java -@@ -170,7 +170,7 @@ public class BedBlock extends HorizontalDirectionalBlock implements EntityBlock +@@ -173,7 +173,7 @@ public class BedBlock extends HorizontalDirectionalBlock implements EntityBlock @Override public void fallOn(Level world, BlockState state, BlockPos pos, Entity entity, float fallDistance) { @@ -18,10 +18,10 @@ index e1d274a9be856f6fa5be00958c35b7d7c58357a7..1df761d866b10a3fb46d132c0377b582 @Override diff --git a/src/main/java/net/minecraft/world/level/block/Block.java b/src/main/java/net/minecraft/world/level/block/Block.java -index ce4127f3701efa7d1c86bcdb4e7804fee11c397c..e94ca6283a0471a49b31942de763472ccb989dcb 100644 +index 4375b4b61fe06b4598e8f4bd73b17254d1cb9c86..0c348b366623e350393f035d760adc6ee4142687 100644 --- a/src/main/java/net/minecraft/world/level/block/Block.java +++ b/src/main/java/net/minecraft/world/level/block/Block.java -@@ -98,6 +98,10 @@ public class Block extends BlockBehaviour implements ItemLike { +@@ -96,6 +96,10 @@ public class Block extends BlockBehaviour implements ItemLike { public static final int UPDATE_LIMIT = 512; protected final StateDefinition stateDefinition; private BlockState defaultBlockState; @@ -32,7 +32,7 @@ index ce4127f3701efa7d1c86bcdb4e7804fee11c397c..e94ca6283a0471a49b31942de763472c // Paper start public final boolean isDestroyable() { return io.papermc.paper.configuration.GlobalConfiguration.get().unsupportedSettings.allowPermanentBlockBreakExploits || -@@ -516,7 +520,7 @@ public class Block extends BlockBehaviour implements ItemLike { +@@ -514,7 +518,7 @@ public class Block extends BlockBehaviour implements ItemLike { } public void fallOn(Level world, BlockState state, BlockPos pos, Entity entity, float fallDistance) { @@ -54,10 +54,10 @@ index c316fb1d3081c1fbf4602dd72e96e57491bc8efd..3b054f2bda6fae31e8ab7bce088e228f } } diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -index 14844cb8a402ac987f44a91b95d5ebdac73c6dfe..3cfbb4300e82cce409a7a0b53ef98987f166143c 100644 +index 1288d79a7db44adde173a9650d6525d56b0c2c5b..8de0bcd62a7bb72ab3ad8189425fcaf33cf1fb77 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -@@ -588,4 +588,50 @@ public class PurpurConfig { +@@ -586,4 +586,50 @@ public class PurpurConfig { block.explosionResistance = blastResistance.floatValue(); }); } @@ -81,7 +81,7 @@ index 14844cb8a402ac987f44a91b95d5ebdac73c6dfe..3cfbb4300e82cce409a7a0b53ef98987 + Map.entry("minecraft:purple_bed", Map.of("distance", 0.5F)), + Map.entry("minecraft:magenta_bed", Map.of("distance", 0.5F)) + )).forEach((blockId, value) -> { -+ Block block = Registry.BLOCK.get(new ResourceLocation(blockId)); ++ Block block = BuiltInRegistries.BLOCK.get(new ResourceLocation(blockId)); + if (block == Blocks.AIR) { + log(Level.SEVERE, "Invalid block for `settings.block-fall-multipliers`: " + blockId); + return; diff --git a/patches/server/0305-Language-API.patch b/patches/server/0297-Language-API.patch similarity index 88% rename from patches/server/0305-Language-API.patch rename to patches/server/0297-Language-API.patch index 192601241..1e4b72d49 100644 --- a/patches/server/0305-Language-API.patch +++ b/patches/server/0297-Language-API.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Language API diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 9883c5732cb136194c5d11fbe76f66fd234e3f82..ed7e59b4d573ea9124a086708ca84f755861c896 100644 +index 79ee10b16295d2eafe1555331c03d45526c3b480..80d4167edd7c87240ce02ae122153976015d548a 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -238,6 +238,7 @@ import org.bukkit.scoreboard.Criteria; +@@ -251,6 +251,7 @@ import org.bukkit.scoreboard.Criteria; import org.bukkit.structure.StructureManager; import org.bukkit.util.StringUtil; import org.bukkit.util.permissions.DefaultPermissions; @@ -16,7 +16,7 @@ index 9883c5732cb136194c5d11fbe76f66fd234e3f82..ed7e59b4d573ea9124a086708ca84f75 import org.yaml.snakeyaml.Yaml; import org.yaml.snakeyaml.constructor.SafeConstructor; import org.yaml.snakeyaml.error.MarkedYAMLException; -@@ -307,6 +308,20 @@ public final class CraftServer implements Server { +@@ -320,6 +321,20 @@ public final class CraftServer implements Server { this.structureManager = new CraftStructureManager(console.getStructureManager()); Bukkit.setServer(this); diff --git a/patches/server/0306-Milk-Keeps-Beneficial-Effects.patch b/patches/server/0298-Milk-Keeps-Beneficial-Effects.patch similarity index 91% rename from patches/server/0306-Milk-Keeps-Beneficial-Effects.patch rename to patches/server/0298-Milk-Keeps-Beneficial-Effects.patch index 6c7e52934..e810ebc6a 100644 --- a/patches/server/0306-Milk-Keeps-Beneficial-Effects.patch +++ b/patches/server/0298-Milk-Keeps-Beneficial-Effects.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Milk Keeps Beneficial Effects diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 45f11b6ae25a2f509b788c185dcf9cf33ef2271e..f23829690d2be20af50256e4d985e3e342415d54 100644 +index 8916d51bb543cce1b7b52ba14d01ecfbee77e6e3..ee87227269b36ff758dceb8dcf20b9367470d6df 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -1110,6 +1110,7 @@ public abstract class LivingEntity extends Entity { +@@ -1114,6 +1114,7 @@ public abstract class LivingEntity extends Entity { for (flag = false; iterator.hasNext(); flag = true) { // CraftBukkit start MobEffectInstance effect = (MobEffectInstance) iterator.next(); @@ -17,7 +17,7 @@ index 45f11b6ae25a2f509b788c185dcf9cf33ef2271e..f23829690d2be20af50256e4d985e3e3 if (event.isCancelled()) { continue; diff --git a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java -index 558884b68263f4fd89e5b7e6226faa2b268168da..cdbd13212b366d9601d4b100fde43cefb5c9cf6f 100644 +index da9e749cf775fc4e3ec6846dab1f92e64f088442..6a4983999666c6b59c2c46f194190059574fb9df 100644 --- a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java +++ b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java @@ -110,7 +110,7 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill @@ -30,7 +30,7 @@ index 558884b68263f4fd89e5b7e6226faa2b268168da..cdbd13212b366d9601d4b100fde43cef this.goalSelector.addGoal(1, new TradeWithPlayerGoal(this)); this.goalSelector.addGoal(1, new AvoidEntityGoal<>(this, Zombie.class, 8.0F, 0.5D, 0.5D)); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 85a6092ea0ab280506f04ac0f19d0f05d6d6dfd2..7a187be41ad0024cb9c515fc0bab249051be4b9d 100644 +index 3784bb4df9b77fe63c0b2edafa44310460d4f487..309485bcbab8ab132bec492ae3ad44e58dc61078 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -131,6 +131,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0307-MC-121706-Fix-mobs-not-looking-up-and-down-when-stra.patch b/patches/server/0299-MC-121706-Fix-mobs-not-looking-up-and-down-when-stra.patch similarity index 100% rename from patches/server/0307-MC-121706-Fix-mobs-not-looking-up-and-down-when-stra.patch rename to patches/server/0299-MC-121706-Fix-mobs-not-looking-up-and-down-when-stra.patch diff --git a/patches/server/0308-Add-log-suppression-for-LibraryLoader.patch b/patches/server/0300-Add-log-suppression-for-LibraryLoader.patch similarity index 82% rename from patches/server/0308-Add-log-suppression-for-LibraryLoader.patch rename to patches/server/0300-Add-log-suppression-for-LibraryLoader.patch index e5db30404..2bd49eeb9 100644 --- a/patches/server/0308-Add-log-suppression-for-LibraryLoader.patch +++ b/patches/server/0300-Add-log-suppression-for-LibraryLoader.patch @@ -5,20 +5,19 @@ Subject: [PATCH] Add log suppression for LibraryLoader diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -index 3cfbb4300e82cce409a7a0b53ef98987f166143c..5d71e3040df116a94df7efa83e61dc1766cc4a93 100644 +index 14ebe9d00704a97876775c23d92cdb8b23271aee..8123dcff4ce0a6c7536fe6369458b397a9f685a4 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -@@ -488,12 +488,15 @@ public class PurpurConfig { +@@ -487,11 +487,14 @@ public class PurpurConfig { + public static boolean loggerSuppressIgnoredAdvancementWarnings = false; public static boolean loggerSuppressUnrecognizedRecipeErrors = false; public static boolean loggerSuppressSetBlockFarChunk = false; - public static boolean loggerSuppressSentExpiredChat = false; + public static boolean loggerSuppressLibraryLoader = false; private static void loggerSettings() { loggerSuppressInitLegacyMaterialError = getBoolean("settings.logger.suppress-init-legacy-material-errors", loggerSuppressInitLegacyMaterialError); loggerSuppressIgnoredAdvancementWarnings = getBoolean("settings.logger.suppress-ignored-advancement-warnings", loggerSuppressIgnoredAdvancementWarnings); loggerSuppressUnrecognizedRecipeErrors = getBoolean("settings.logger.suppress-unrecognized-recipe-errors", loggerSuppressUnrecognizedRecipeErrors); loggerSuppressSetBlockFarChunk = getBoolean("settings.logger.suppress-setblock-in-far-chunk-errors", loggerSuppressSetBlockFarChunk); - loggerSuppressSentExpiredChat = getBoolean("settings.logger.suppress-sent-expired-chat", loggerSuppressSentExpiredChat); + loggerSuppressLibraryLoader = getBoolean("settings.logger.suppress-library-loader", loggerSuppressLibraryLoader); + org.bukkit.plugin.java.JavaPluginLoader.SuppressLibraryLoaderLogger = loggerSuppressLibraryLoader; } diff --git a/patches/server/0309-Allow-Transparent-Blocks-In-Enchanting-Box.patch b/patches/server/0301-Allow-Transparent-Blocks-In-Enchanting-Box.patch similarity index 96% rename from patches/server/0309-Allow-Transparent-Blocks-In-Enchanting-Box.patch rename to patches/server/0301-Allow-Transparent-Blocks-In-Enchanting-Box.patch index 920ed2fed..da65b9118 100644 --- a/patches/server/0309-Allow-Transparent-Blocks-In-Enchanting-Box.patch +++ b/patches/server/0301-Allow-Transparent-Blocks-In-Enchanting-Box.patch @@ -20,7 +20,7 @@ index 37a888e5db65b927094b43775ae9d4098244f809..c4a91d7f1320027ee6a2b364303c01eb } diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -index 5d71e3040df116a94df7efa83e61dc1766cc4a93..ccca392a45cb05abb55ddd5c6c36e6f9c7a5d171 100644 +index 8123dcff4ce0a6c7536fe6369458b397a9f685a4..0cacfe28097db2d2b7c0b54d0163607628d63840 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java @@ -432,6 +432,7 @@ public class PurpurConfig { diff --git a/patches/server/0310-Add-option-to-allow-creeper-to-encircle-target-when-.patch b/patches/server/0302-Add-option-to-allow-creeper-to-encircle-target-when-.patch similarity index 92% rename from patches/server/0310-Add-option-to-allow-creeper-to-encircle-target-when-.patch rename to patches/server/0302-Add-option-to-allow-creeper-to-encircle-target-when-.patch index acd864742..d9b1861c9 100644 --- a/patches/server/0310-Add-option-to-allow-creeper-to-encircle-target-when-.patch +++ b/patches/server/0302-Add-option-to-allow-creeper-to-encircle-target-when-.patch @@ -24,10 +24,10 @@ index e241ae250f4f04a17ef2c583d00b065a4ca56a4c..02b567e4e808e1a809d285ef39e1abc5 } } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 33d7c132b19095598eb681da8487a072f1dccab6..3409480d4e01db19e3e54474c9e122232043e4b0 100644 +index 79da889535ce03c87f41b828119db85c594bc8e1..f6d7b27063e08e2d65b8b73f2ef7ddc764537bf7 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1291,6 +1291,7 @@ public class PurpurWorldConfig { +@@ -1296,6 +1296,7 @@ public class PurpurWorldConfig { public boolean creeperHealthRadius = false; public boolean creeperAlwaysDropExp = false; public double creeperHeadVisibilityPercent = 0.5D; @@ -35,7 +35,7 @@ index 33d7c132b19095598eb681da8487a072f1dccab6..3409480d4e01db19e3e54474c9e12223 private void creeperSettings() { creeperRidable = getBoolean("mobs.creeper.ridable", creeperRidable); creeperRidableInWater = getBoolean("mobs.creeper.ridable-in-water", creeperRidableInWater); -@@ -1309,6 +1310,7 @@ public class PurpurWorldConfig { +@@ -1314,6 +1315,7 @@ public class PurpurWorldConfig { creeperHealthRadius = getBoolean("mobs.creeper.health-impacts-explosion", creeperHealthRadius); creeperAlwaysDropExp = getBoolean("mobs.creeper.always-drop-exp", creeperAlwaysDropExp); creeperHeadVisibilityPercent = getDouble("mobs.creeper.head-visibility-percent", creeperHeadVisibilityPercent); diff --git a/patches/server/0311-Fire-Immunity-API.patch b/patches/server/0303-Fire-Immunity-API.patch similarity index 89% rename from patches/server/0311-Fire-Immunity-API.patch rename to patches/server/0303-Fire-Immunity-API.patch index 169a5fb25..14ce37081 100644 --- a/patches/server/0311-Fire-Immunity-API.patch +++ b/patches/server/0303-Fire-Immunity-API.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Fire Immunity API diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 0981acb2a87bb2535a0b447c4f23e14befcc81d3..a9a915efb5b270b3f13cb7493f59b36d818312d8 100644 +index 4759b7e70792003769a79880e2c04cf7ed3ec50a..b52af4f5f17814c5e4bfc4bf4de756e5c15b40c7 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -398,6 +398,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { @@ -16,7 +16,7 @@ index 0981acb2a87bb2535a0b447c4f23e14befcc81d3..a9a915efb5b270b3f13cb7493f59b36d public void setOrigin(@javax.annotation.Nonnull Location location) { this.origin = location.toVector(); -@@ -1665,7 +1666,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -1641,7 +1642,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { } public boolean fireImmune() { @@ -25,7 +25,7 @@ index 0981acb2a87bb2535a0b447c4f23e14befcc81d3..a9a915efb5b270b3f13cb7493f59b36d } public boolean causeFallDamage(float fallDistance, float damageMultiplier, DamageSource damageSource) { -@@ -2302,6 +2303,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -2283,6 +2284,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { nbt.putBoolean("Paper.FreezeLock", true); } // Paper end @@ -37,7 +37,7 @@ index 0981acb2a87bb2535a0b447c4f23e14befcc81d3..a9a915efb5b270b3f13cb7493f59b36d return nbt; } catch (Throwable throwable) { CrashReport crashreport = CrashReport.forThrowable(throwable, "Saving entity NBT"); -@@ -2469,6 +2475,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -2450,6 +2456,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { freezeLocked = nbt.getBoolean("Paper.FreezeLock"); } // Paper end @@ -50,10 +50,10 @@ index 0981acb2a87bb2535a0b447c4f23e14befcc81d3..a9a915efb5b270b3f13cb7493f59b36d } catch (Throwable throwable) { CrashReport crashreport = CrashReport.forThrowable(throwable, "Loading entity NBT"); diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java -index e08cbcb9230889cc86b0726d67038e1cf9914c87..ede4d01f59de68326c65bb1b08ce29ddb6fc94d5 100644 +index f5f30763a8d497aa02c9e02938e49a644fcf2754..5d15a948cff495195d217bde2af6fd231564fa4e 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java -@@ -1421,5 +1421,15 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { +@@ -1423,5 +1423,15 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { public boolean isRidableInWater() { return getHandle().rideableUnderWater(); } diff --git a/patches/server/0312-Add-option-to-teleport-to-spawn-on-nether-ceiling-da.patch b/patches/server/0304-Add-option-to-teleport-to-spawn-on-nether-ceiling-da.patch similarity index 83% rename from patches/server/0312-Add-option-to-teleport-to-spawn-on-nether-ceiling-da.patch rename to patches/server/0304-Add-option-to-teleport-to-spawn-on-nether-ceiling-da.patch index 73d9a6271..968422611 100644 --- a/patches/server/0312-Add-option-to-teleport-to-spawn-on-nether-ceiling-da.patch +++ b/patches/server/0304-Add-option-to-teleport-to-spawn-on-nether-ceiling-da.patch @@ -5,19 +5,18 @@ Subject: [PATCH] Add option to teleport to spawn on nether ceiling damage diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index a9a915efb5b270b3f13cb7493f59b36d818312d8..dd13fc7cbf82948b1474ea33411e64b465608672 100644 +index b52af4f5f17814c5e4bfc4bf4de756e5c15b40c7..64b91d72fca05f2e74bcaf83bccf061a25a0c868 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -420,7 +420,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { - public int activatedPriority = gg.pufferfish.pufferfish.PufferfishConfig.maximumActivationPrio; // golf score - public final BlockPos.MutableBlockPos cachedBlockPos = new BlockPos.MutableBlockPos(); // used where needed - // Pufferfish end -- +@@ -415,6 +415,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { + return this.originWorld; + } + // Paper end + public float getBukkitYaw() { return this.yRot; } -@@ -897,6 +897,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -863,6 +864,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { && this.level.paperConfig().environment.netherCeilingVoidDamageHeight.test(v -> this.getY() >= v) && (!(this instanceof Player player) || !player.getAbilities().invulnerable))) { // Paper end @@ -26,7 +25,7 @@ index a9a915efb5b270b3f13cb7493f59b36d818312d8..dd13fc7cbf82948b1474ea33411e64b4 } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 3409480d4e01db19e3e54474c9e122232043e4b0..bb352ed86e4047e38ad27900f72fc0ddb741bf71 100644 +index 994fa545487dd00b94ef4f5d26c0301297904528..0a9b48c7a6dc88a123522ca9c85be94836fd59b8 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -418,6 +418,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0313-Added-got-ram-event.patch b/patches/server/0305-Added-got-ram-event.patch similarity index 86% rename from patches/server/0313-Added-got-ram-event.patch rename to patches/server/0305-Added-got-ram-event.patch index 40424938f..922e0cdd7 100644 --- a/patches/server/0313-Added-got-ram-event.patch +++ b/patches/server/0305-Added-got-ram-event.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Added got ram event diff --git a/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java b/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java -index 6df25a181567021ee60ea72847459e25b9ee5b99..2e2f1b4088f6b5e327c668dc5ecd60b97e3628ff 100644 +index dee2c9b1b1ed9e03170123e6b13eea2ed70c374e..ab497376c8ebd5527f63035fbed684aaafd49f88 100644 --- a/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java +++ b/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java -@@ -401,6 +401,7 @@ public class Goat extends Animal { +@@ -425,6 +425,7 @@ public class Goat extends Animal { // Paper start - Goat ram API public void ram(net.minecraft.world.entity.LivingEntity entity) { diff --git a/patches/server/0314-Log-skipped-entity-s-position.patch b/patches/server/0306-Log-skipped-entity-s-position.patch similarity index 83% rename from patches/server/0314-Log-skipped-entity-s-position.patch rename to patches/server/0306-Log-skipped-entity-s-position.patch index e786c5425..54d5f37ab 100644 --- a/patches/server/0314-Log-skipped-entity-s-position.patch +++ b/patches/server/0306-Log-skipped-entity-s-position.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Log skipped entity's position diff --git a/src/main/java/net/minecraft/world/entity/EntityType.java b/src/main/java/net/minecraft/world/entity/EntityType.java -index 91be8629612d3afdcd742c2cd0155df738fd992c..a5bce375d2d333eec117239d0f0850f6f77e6b2e 100644 +index 30cfdacc049e9397fad759b26adc3c711d16c9bb..9f38eff49565faedb1a442d5b4fe8d01be9b9426 100644 --- a/src/main/java/net/minecraft/world/entity/EntityType.java +++ b/src/main/java/net/minecraft/world/entity/EntityType.java -@@ -573,6 +573,12 @@ public class EntityType implements EntityTypeTest { +@@ -597,6 +597,12 @@ public class EntityType implements FeatureElement, EntityTypeT entity.load(nbt); }, () -> { EntityType.LOGGER.warn("Skipping Entity with id {}", nbt.getString("id"));