diff --git a/gradle.properties b/gradle.properties index 701c42e51..3741887ef 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ group = org.purpurmc.purpur version = 1.20-R0.1-SNAPSHOT mcVersion = 1.20 -paperCommit = ac1a62649313cc64dbc130b9399b79053d200c86 +paperCommit = f0aea8123e4a6d3c854f7147c3aff150b79b4f63 org.gradle.caching = true org.gradle.parallel = true diff --git a/patches/api/0003-Purpur-client-support.patch b/patches/api/0003-Purpur-client-support.patch index b04a74c0e..6d147d338 100644 --- a/patches/api/0003-Purpur-client-support.patch +++ b/patches/api/0003-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 def31cdbe5765f5d05386753868e51c424cbfe9e..d9e3157a9e4732f4a1cf87f206dceff48e853781 100644 +index a5be783b06f97d45897a359db4e2f213343adebc..7ea9ace724fc47694dcdf6f81ce1bc2d72f6320b 100644 --- a/src/main/java/org/bukkit/entity/Player.java +++ b/src/main/java/org/bukkit/entity/Player.java -@@ -3091,4 +3091,13 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM +@@ -3072,4 +3072,13 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM @Override Spigot spigot(); // Spigot end diff --git a/patches/api/0008-AFK-API.patch b/patches/api/0008-AFK-API.patch index cfecae16f..c0d71d7e8 100644 --- a/patches/api/0008-AFK-API.patch +++ b/patches/api/0008-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 d9e3157a9e4732f4a1cf87f206dceff48e853781..891bceaca672d23ccb179bc0c777aec9ca2dbdc6 100644 +index 7ea9ace724fc47694dcdf6f81ce1bc2d72f6320b..22cc810ae8acbebfba0a47e27dc9ea587804836c 100644 --- a/src/main/java/org/bukkit/entity/Player.java +++ b/src/main/java/org/bukkit/entity/Player.java -@@ -3099,5 +3099,24 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM +@@ -3080,5 +3080,24 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM * @return True if Player uses Purpur Client */ public boolean usesPurpurClient(); diff --git a/patches/api/0015-Player-invulnerabilities.patch b/patches/api/0015-Player-invulnerabilities.patch index a552a5606..2399e3c67 100644 --- a/patches/api/0015-Player-invulnerabilities.patch +++ b/patches/api/0015-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 891bceaca672d23ccb179bc0c777aec9ca2dbdc6..c0e82ea4376ac29c99f42a9630d279480050fd0c 100644 +index 22cc810ae8acbebfba0a47e27dc9ea587804836c..aae142a2222905b45b799f3bd6ee70c6a67a4a10 100644 --- a/src/main/java/org/bukkit/entity/Player.java +++ b/src/main/java/org/bukkit/entity/Player.java -@@ -3118,5 +3118,26 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM +@@ -3099,5 +3099,26 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM * Reset the idle timer back to 0 */ void resetIdleTimer(); diff --git a/patches/api/0044-Debug-Marker-API.patch b/patches/api/0044-Debug-Marker-API.patch index 78d492a64..98a144b51 100644 --- a/patches/api/0044-Debug-Marker-API.patch +++ b/patches/api/0044-Debug-Marker-API.patch @@ -260,10 +260,10 @@ index d07b6f40c111c9b131f2995e9796d66f5344c5df..adf8169d5baefa7a33c33ef066180a81 /** diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java -index c0e82ea4376ac29c99f42a9630d279480050fd0c..49abe346f15f898efeff30dba66958eefc269926 100644 +index aae142a2222905b45b799f3bd6ee70c6a67a4a10..9bd89aa586d9f1e9526b9abc470242f4476265c3 100644 --- a/src/main/java/org/bukkit/entity/Player.java +++ b/src/main/java/org/bukkit/entity/Player.java -@@ -3139,5 +3139,75 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM +@@ -3120,5 +3120,75 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM * @param invulnerableTicks Invulnerable ticks remaining */ void setSpawnInvulnerableTicks(int invulnerableTicks); diff --git a/patches/api/0045-Add-death-screen-API.patch b/patches/api/0045-Add-death-screen-API.patch index 769ed9cb6..c5b8f18f1 100644 --- a/patches/api/0045-Add-death-screen-API.patch +++ b/patches/api/0045-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 49abe346f15f898efeff30dba66958eefc269926..185abf59b61f066a5961dd949d12469d9b4885f9 100644 +index 9bd89aa586d9f1e9526b9abc470242f4476265c3..2242659685fa8589e4201d82afdcc42f2072bfb1 100644 --- a/src/main/java/org/bukkit/entity/Player.java +++ b/src/main/java/org/bukkit/entity/Player.java -@@ -3209,5 +3209,21 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM +@@ -3190,5 +3190,21 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM * Clears all debug block highlights */ void clearBlockHighlights(); diff --git a/patches/server/.gitkeep b/patches/server/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/patches/todo/server/0003-Rebrand.patch b/patches/server/0001-Rebrand.patch similarity index 96% rename from patches/todo/server/0003-Rebrand.patch rename to patches/server/0001-Rebrand.patch index fb1621788..d80457921 100644 --- a/patches/todo/server/0003-Rebrand.patch +++ b/patches/server/0001-Rebrand.patch @@ -5,25 +5,21 @@ Subject: [PATCH] Rebrand diff --git a/build.gradle.kts b/build.gradle.kts -index 3ee1160c796cc86db9bc9438055b307239e9a8f7..9c01005751c0088f560f96401cdfdebbbda4e7ec 100644 +index a3a76b9b7efa773117d2ee1ce53ef784b09b277d..7117f9a7b4b6bbad751e4afda1f00692e6884625 100644 --- a/build.gradle.kts +++ b/build.gradle.kts -@@ -7,12 +7,8 @@ plugins { +@@ -7,8 +7,8 @@ plugins { } dependencies { -- 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 -+ implementation(project(":purpur-api")) // Purpur -+ implementation("io.papermc.paper:paper-mojangapi:1.19.4-R0.1-SNAPSHOT") // Purpur +- implementation(project(":paper-api")) +- implementation(project(":paper-mojangapi")) ++ implementation(project(":purpur-api")) // Pufferfish // Purpur ++ implementation("io.papermc.paper:paper-mojangapi:1.19.4-R0.1-SNAPSHOT") // Purpur // todo: update to 1.20 once on the repo // Paper start implementation("org.jline:jline-terminal-jansi:3.21.0") implementation("net.minecrell:terminalconsoleappender:1.3.0") -@@ -42,6 +38,10 @@ dependencies { +@@ -38,6 +38,10 @@ dependencies { } // Paper end @@ -31,19 +27,19 @@ index 3ee1160c796cc86db9bc9438055b307239e9a8f7..9c01005751c0088f560f96401cdfdebb + implementation("org.mozilla:rhino-engine:1.7.14") // 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 +81,7 @@ tasks.jar { + runtimeOnly("org.apache.maven:maven-resolver-provider:3.9.2") + runtimeOnly("org.apache.maven.resolver:maven-resolver-connector-basic:1.9.10") + runtimeOnly("org.apache.maven.resolver:maven-resolver-transport-http:1.9.10") +@@ -62,7 +66,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-Paper-$implementationVersion", + "Implementation-Version" to "git-Purpur-$implementationVersion", // Pufferfish // Purpur "Implementation-Vendor" to date, // Paper "Specification-Title" to "Bukkit", "Specification-Version" to project.version, -@@ -153,7 +153,7 @@ fun TaskContainer.registerRunTask( +@@ -134,7 +138,7 @@ fun TaskContainer.registerRunTask( name: String, block: JavaExec.() -> Unit ): TaskProvider = register(name) { @@ -175,10 +171,10 @@ index abe37c7c3c6f5ab73afd738ec78f06d7e4d2ed96..b5b6657e52e4f7a630229bd3ba433438 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 a29d92b3f2658b63545b25092bb3a1fea46ca36b..0f6d1c56efbab0f9b84f09f7dc27eb705f4006a9 100644 +index fb82bb52f219e7683fe1d3c0fb3acbe2251de8d4..7fe5d22b4c9eac832646780d4b5326edaca2979e 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -927,7 +927,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop // Paper - Paper > // Spigot - Spigot > // CraftBukkit - cb > vanilla! +- return "Paper"; // Paper - Paper > // Spigot - Spigot > // CraftBukkit - cb > vanilla! + return "Purpur"; // Purpur - Purpur > // Pufferfish - Pufferfish > // Paper - Paper > // Spigot - Spigot > // CraftBukkit - cb > vanilla! } public SystemReport fillSystemReport(SystemReport details) { diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 6ff93df3e870ebc6e52f8b8a719908bfa16a839b..2b3d30a7c32090a4df13d3baca38593314391226 100644 +index f87433133fa6a68dac33895f91770f453e0678d2..977ca71853dee58deed9e025942e7c6e103a40d2 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -262,7 +262,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 = "Paper"; // Paper + private final String serverName = "Purpur"; // Paper // Pufferfish // Purpur private final String serverVersion; private final String bukkitVersion = Versioning.getBukkitVersion(); @@ -237,7 +233,7 @@ index 4e56018b64d11f76c8da43fd8f85c6de72204e36..9607675e6c5bff2183c4420d11fc63ee @Override diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java -index d43859f8aa7beed82dd3a146bb1086982cd0cda7..b548f06bc0569f0f1ee5edaa07806c3017d5399a 100644 +index 42a4a45ece562d543cc4fab9d9e7c70573705f10..050d297ef20d8b8f2601c70256aefadeb95b8a51 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java @@ -884,7 +884,7 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { @@ -263,33 +259,33 @@ index cdefb2025eedea7e204d70d568adaf1c1ec4c03c..d1526ed7197b883e1d1f07baf285bf5e // (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 1ecf065c5323f65401412cb98d4a0b622f356759..1bf9a11abf7884a421374cbca5ccc18480717b79 100644 +index b059bb46b649cbf82debdb8d58fe4ba77d040276..09c39f72fe1e8e6967f415dfd0d7aea8e50d0379 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java +++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java @@ -472,7 +472,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(); + 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..99597258e8e88cd9e2c901c4ac3ff7faeeabee2b 100644 +index 774556a62eb240da42e84db4502e2ed43495be17..99597258e8e88cd9e2c901c4ac3ff7faeeabee2b 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/io.papermc.paper/paper-api/pom.properties"); + InputStream stream = Bukkit.class.getClassLoader().getResourceAsStream("META-INF/maven/org.purpurmc.purpur/purpur-api/pom.properties"); // Pufferfish // 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 +index 98fba0288be9ed2cb18ffba5cf81148157dd4fcf..0801dea155048ac5383295f4fef9bd597b678535 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 diff --git a/patches/todo/server/0004-Purpur-config-files.patch b/patches/server/0002-Purpur-config-files.patch similarity index 93% rename from patches/todo/server/0004-Purpur-config-files.patch rename to patches/server/0002-Purpur-config-files.patch index 0029eede4..f8f446e3f 100644 --- a/patches/todo/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 692c962193cf9fcc6801fc93f3220bdc673d527b..8cde30544e14f8fc2dac32966ae3c21f8cf3a551 100644 +index 4b002e8b75d117b726b0de274a76d3596fce015b..8cde30544e14f8fc2dac32966ae3c21f8cf3a551 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()); // Pufferfish // Purpur metrics.addCustomChart(new Metrics.SimplePie("minecraft_version", () -> { @@ -26,21 +26,21 @@ index 692c962193cf9fcc6801fc93f3220bdc673d527b..8cde30544e14f8fc2dac32966ae3c21f - final String implVersion = org.bukkit.craftbukkit.Main.class.getPackage().getImplementationVersion(); - if (implVersion != null) { - final String buildOrHash = implVersion.substring(implVersion.lastIndexOf('-') + 1); -- paperVersion = "git-Pufferfish-%s-%s".formatted(Bukkit.getServer().getMinecraftVersion(), buildOrHash); // Pufferfish +- paperVersion = "git-Paper-%s-%s".formatted(Bukkit.getServer().getMinecraftVersion(), buildOrHash); - } else { - paperVersion = "unknown"; - } -- metrics.addCustomChart(new Metrics.SimplePie("pufferfish_version", () -> paperVersion)); // Pufferfish +- metrics.addCustomChart(new Metrics.SimplePie("paper_version", () -> paperVersion)); + 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", () -> (org.bukkit.craftbukkit.Main.class.getPackage().getImplementationVersion() != null) ? org.bukkit.craftbukkit.Main.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 7b6b51392b123d34382233adcf4c3d4867bdaa32..ccc78857b51e25640ec1e4dcfe4c76a06d1bbff4 100644 +index 22884a2b148b9a5af8655bb754ebe73618218a83..4d9a796422ab595acc8b0158cf9dcd5b1d0c9a75 100644 --- a/src/main/java/net/minecraft/commands/CommandSourceStack.java +++ b/src/main/java/net/minecraft/commands/CommandSourceStack.java -@@ -317,6 +317,30 @@ public class CommandSourceStack implements SharedSuggestionProvider, com.destroy +@@ -330,6 +330,30 @@ public class CommandSourceStack implements SharedSuggestionProvider, com.destroy } } @@ -64,15 +64,15 @@ index 7b6b51392b123d34382233adcf4c3d4867bdaa32..ccc78857b51e25640ec1e4dcfe4c76a0 + if (message == null) { + return; + } -+ sendSuccess(io.papermc.paper.adventure.PaperAdventure.asVanilla(message), broadcastToOps); ++ sendSuccess(() -> io.papermc.paper.adventure.PaperAdventure.asVanilla(message), broadcastToOps); + } + // Purpur end + - public void sendSuccess(Component message, boolean broadcastToOps) { - if (this.source.acceptsSuccess() && !this.silent) { - this.source.sendSystemMessage(message); + public void sendSuccess(Supplier feedbackSupplier, boolean broadcastToOps) { + boolean flag1 = this.source.acceptsSuccess() && !this.silent; + boolean flag2 = broadcastToOps && this.source.shouldInformAdmins() && !this.silent; diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java -index ad4fdbdcf09f30d10e61ccf47f8fb9ce6bd92e73..ca6a2fee12ac8a89dae57aa2787462f190463cd0 100644 +index 7f0b8cdae07e7e4745a099242a4f0c5914be8667..2dbb2a21942a4e2cb2d3e1fc77a487dd5bd3d964 100644 --- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java +++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java @@ -218,6 +218,15 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface @@ -92,19 +92,19 @@ index ad4fdbdcf09f30d10e61ccf47f8fb9ce6bd92e73..ca6a2fee12ac8a89dae57aa2787462f1 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 66cc44d9f14b01f6c8e53b0f990866ac897c1c81..c38aff50c6f0bc37e539bb4d5206f7b6065fa680 100644 +index 7771748a15c153352ce4874495f5fa7437aaf9a7..9669206231d90d371b6d55e8e6360eb9dd89c485 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java -@@ -177,6 +177,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -175,6 +175,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { + } // Paper end - public final com.destroystokyo.paper.antixray.ChunkPacketBlockController chunkPacketBlockController; // Paper - Anti-Xray + public final org.purpurmc.purpur.PurpurWorldConfig purpurConfig; // Purpur public final co.aikar.timings.WorldTimingsHandler timings; // Paper public static BlockPos lastPhysicsProblem; // Spigot private org.spigotmc.TickLimiter entityLimiter; -@@ -288,6 +289,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { - protected Level(WritableLevelData worlddatamutable, ResourceKey resourcekey, RegistryAccess iregistrycustom, 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 +@@ -275,6 +276,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { + protected Level(WritableLevelData worlddatamutable, ResourceKey resourcekey, RegistryAccess iregistrycustom, 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) { // Paper 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 @@ -112,7 +112,7 @@ index 66cc44d9f14b01f6c8e53b0f990866ac897c1c81..c38aff50c6f0bc37e539bb4d5206f7b6 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 2b3d30a7c32090a4df13d3baca38593314391226..043513623ddcf493f73e86fb5f5bf034ae536b13 100644 +index 977ca71853dee58deed9e025942e7c6e103a40d2..4b5aea6617a11914ee15dc12a3393504d6f48a1d 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -979,6 +979,7 @@ public final class CraftServer implements Server { @@ -139,7 +139,7 @@ index 2b3d30a7c32090a4df13d3baca38593314391226..043513623ddcf493f73e86fb5f5bf034 this.overrideAllCommandBlockCommands = this.commandsConfiguration.getStringList("command-block-overrides").contains("*"); this.ignoreVanillaPermissions = this.commandsConfiguration.getBoolean("ignore-vanilla-permissions"); -@@ -2768,6 +2771,18 @@ public final class CraftServer implements Server { +@@ -2761,6 +2764,18 @@ public final class CraftServer implements Server { return CraftServer.this.console.paperConfigurations.createLegacyObject(CraftServer.this.console); } @@ -159,7 +159,7 @@ index 2b3d30a7c32090a4df13d3baca38593314391226..043513623ddcf493f73e86fb5f5bf034 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 bfa091f72d6f477bcaf63d364639a1b4df9b1987..61dc0de4cd324c714e7ce78d179447c5de7a9555 100644 +index 717e292040ed7779eb4b6c5fa26665d3df9024e7..2be5346e48f9f8410f3e4e9a2aa57b063495eb93 100644 --- a/src/main/java/org/bukkit/craftbukkit/Main.java +++ b/src/main/java/org/bukkit/craftbukkit/Main.java @@ -173,6 +173,14 @@ public class Main { diff --git a/patches/todo/server/0005-Purpur-client-support.patch b/patches/server/0003-Purpur-client-support.patch similarity index 77% rename from patches/todo/server/0005-Purpur-client-support.patch rename to patches/server/0003-Purpur-client-support.patch index b2c4a6afd..d74d31c59 100644 --- a/patches/todo/server/0005-Purpur-client-support.patch +++ b/patches/server/0003-Purpur-client-support.patch @@ -5,7 +5,7 @@ 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 98df2463bf41fc736aa6a2b6ddf89e5abde6eb39..61b818e93de53ef14b9b928193da9b6fea3ff003 100644 +index 5fad40fa88f697108e42461c41012d5964ed7d75..a808c7bb143dc8c5f60bf8eacdb6e45f73da69fb 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java @@ -277,6 +277,7 @@ public class ServerPlayer extends Player { @@ -14,13 +14,13 @@ index 98df2463bf41fc736aa6a2b6ddf89e5abde6eb39..61b818e93de53ef14b9b928193da9b6f 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 ServerPlayer(MinecraftServer server, ServerLevel world, GameProfile profile) { - super(world, world.getSharedSpawnPos(), world.getSharedSpawnAngle(), profile); + private final java.util.concurrent.atomic.AtomicReference viewDistances = new java.util.concurrent.atomic.AtomicReference<>(new io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader.ViewDistances(-1, -1, -1)); + public io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader.PlayerChunkLoaderData chunkLoader; diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 9d2d72fe48b69be2f6ebe74309673a3a4e51eae4..299d43f714637beb6cdce186368c4171cac74c4c 100644 +index 705181a7cc203b7f60d7038d1f341c2d52cec6b1..67a71b0d04cc3c8239dce26c7022b18a6ff3a58c 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -3542,6 +3542,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -3501,6 +3501,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 9d2d72fe48b69be2f6ebe74309673a3a4e51eae4..299d43f714637beb6cdce186368c4171 @Override public void handleCustomPayload(ServerboundCustomPayloadPacket packet) { -@@ -3566,6 +3567,13 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -3525,6 +3526,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 9d2d72fe48b69be2f6ebe74309673a3a4e51eae4..299d43f714637beb6cdce186368c4171 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 be64633c8bcee96f2ad5247525cac965b7b031b1..39ab19be66530c4792719d2d86b6979cffedcf83 100644 +index be933acd3004e7e092be3688d0d9ee97b159ab5a..09d2f1586d19d0d5c9c78cde5263f30e7a7d0647 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -3180,4 +3180,11 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -3143,4 +3143,11 @@ public class CraftPlayer extends CraftHumanEntity implements Player { return this.spigot; } // Spigot end diff --git a/patches/todo/server/0006-Fix-decompile-errors.patch b/patches/server/0004-Fix-decompile-errors.patch similarity index 87% rename from patches/todo/server/0006-Fix-decompile-errors.patch rename to patches/server/0004-Fix-decompile-errors.patch index 289fd9590..9f9c3c120 100644 --- a/patches/todo/server/0006-Fix-decompile-errors.patch +++ b/patches/server/0004-Fix-decompile-errors.patch @@ -5,7 +5,7 @@ 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 ad0df80d1adb1d945f40e1b5f7732bb36b2ca2ff..cefb3d0658e56c7c103626b8cfc5faa05f03665b 100644 +index 0f4ef103afcbabc04880c8fc3547b861341c15fc..d5784a19cec98eb199a51acd9e1f4de8c6bf7265 100644 --- a/src/main/java/net/minecraft/world/entity/decoration/Painting.java +++ b/src/main/java/net/minecraft/world/entity/decoration/Painting.java @@ -121,7 +121,7 @@ public class Painting extends HangingEntity implements VariantHolder type) { diff --git a/patches/todo/server/0007-Component-related-conveniences.patch b/patches/server/0005-Component-related-conveniences.patch similarity index 88% rename from patches/todo/server/0007-Component-related-conveniences.patch rename to patches/server/0005-Component-related-conveniences.patch index 3925b7ac5..76b81e87a 100644 --- a/patches/todo/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 61b818e93de53ef14b9b928193da9b6fea3ff003..74e2731c614e0387de8eee93af005c7c1bf109f1 100644 +index a808c7bb143dc8c5f60bf8eacdb6e45f73da69fb..15539499b5a0f16ad2d44c39c5b824876fdf0951 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java -@@ -1729,6 +1729,26 @@ public class ServerPlayer extends Player { +@@ -1774,6 +1774,26 @@ public class ServerPlayer extends Player { this.lastSentExp = -1; // CraftBukkit - Added to reset } @@ -36,10 +36,10 @@ index 61b818e93de53ef14b9b928193da9b6fea3ff003..74e2731c614e0387de8eee93af005c7c 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 92e758a286a5db079c32d53cc52c8a422457daef..7942c33f3ec34ec2c6cccef6bfd22f7a691d00b2 100644 +index 731459d80748cdcc7cb9c6c9ede3c56f3f5a0060..b2f26b4b09d9bf2de273e1258f98c175c6d5900a 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java -@@ -1029,6 +1029,20 @@ public abstract class PlayerList { +@@ -1036,6 +1036,20 @@ public abstract class PlayerList { } // CraftBukkit end @@ -61,7 +61,7 @@ index 92e758a286a5db079c32d53cc52c8a422457daef..7942c33f3ec34ec2c6cccef6bfd22f7a 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 93a1e990b0a6caae4143c2f9d09bfb368fa1d6db..615611fe372d6edaef56db058bbf2cf7641e3c26 100644 +index 25a5a3b949a0eb632611355e74ccd4865be108ca..14fcfd7c1d3a62833978e163f4e0d6f9b2203042 100644 --- a/src/main/java/net/minecraft/world/damagesource/DamageSource.java +++ b/src/main/java/net/minecraft/world/damagesource/DamageSource.java @@ -126,6 +126,15 @@ public class DamageSource { @@ -81,10 +81,10 @@ index 93a1e990b0a6caae4143c2f9d09bfb368fa1d6db..615611fe372d6edaef56db058bbf2cf7 return this.type().msgId(); } diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index b4ab2cfb7a5fa0d2efd1a759d754d5203aaac077..3576c00873127e9d22916156bee620ca4ad00b74 100644 +index 81fdfe150845d57e82fb136af63424103197aebd..cf68705a5cfde9a1e5e3161c73e6308354e01043 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -3916,6 +3916,20 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -3978,6 +3978,20 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { return SlotAccess.NULL; } diff --git a/patches/todo/server/0009-Configurable-entity-base-attributes.patch b/patches/server/0006-Configurable-entity-base-attributes.patch similarity index 63% rename from patches/todo/server/0009-Configurable-entity-base-attributes.patch rename to patches/server/0006-Configurable-entity-base-attributes.patch index 9fb02ca39..5c8450251 100644 --- a/patches/todo/server/0009-Configurable-entity-base-attributes.patch +++ b/patches/server/0006-Configurable-entity-base-attributes.patch @@ -5,10 +5,10 @@ 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 546ae68177a3188efe911aa535e058ae69341818..9f26371ca53dba729a696626c35ef06043dfb995 100644 +index cf68705a5cfde9a1e5e3161c73e6308354e01043..05c3985cddae94e26fb70657c1add2f87bff8080 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -156,7 +156,7 @@ import org.bukkit.plugin.PluginManager; +@@ -155,7 +155,7 @@ import org.bukkit.plugin.PluginManager; // CraftBukkit end public abstract class Entity implements Nameable, EntityAccess, CommandSource { @@ -18,34 +18,34 @@ index 546ae68177a3188efe911aa535e058ae69341818..9f26371ca53dba729a696626c35ef060 private static final int CURRENT_LEVEL = 2; public boolean preserveMotion = true; // Paper - keep initial motion on first setPositionRotation diff --git a/src/main/java/net/minecraft/world/entity/GlowSquid.java b/src/main/java/net/minecraft/world/entity/GlowSquid.java -index 7b1ca8fd2908b8a02ec2cd1966a31e06eaa2dd1f..b86329a18dc83073462049da975dd71b9d637ab2 100644 +index 759713f7c646aaf1a918c87a2834a1d405385dad..213f89b22650f43daaec01e7c301e3e8a7e98684 100644 --- a/src/main/java/net/minecraft/world/entity/GlowSquid.java +++ b/src/main/java/net/minecraft/world/entity/GlowSquid.java -@@ -34,6 +34,11 @@ public class GlowSquid extends Squid { - public boolean isControllable() { - return level.purpurConfig.glowSquidControllable; +@@ -23,6 +23,11 @@ public class GlowSquid extends Squid { + super(type, world); } -+ + + @Override + public void initAttributes() { + this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.glowSquidMaxHealth); + } - // Purpur end - ++ @Override + 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 9b430f8624ba6326f54ca6e18a49f97cc9221b10..cc2369f208546bf8c346c30d5c3ccd535e09f09f 100644 +index a6d730eaee1df1c5c61aa0f8731b8c055080a9a6..91309d12ae4a1157d507062b27147cdcc4053658 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -285,6 +285,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -289,6 +289,7 @@ public abstract class LivingEntity extends Entity implements Attackable { this.useItem = ItemStack.EMPTY; this.lastClimbablePos = Optional.empty(); - this.attributes = new AttributeMap(DefaultAttributes.getSupplier(type), this); // Purpur + this.attributes = new AttributeMap(DefaultAttributes.getSupplier(type)); + this.initAttributes(); // Purpur 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()); -@@ -300,6 +301,8 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -304,6 +305,8 @@ public abstract class LivingEntity extends Entity implements Attackable { this.brain = this.makeBrain(new Dynamic(dynamicopsnbt, (Tag) dynamicopsnbt.createMap((Map) ImmutableMap.of(dynamicopsnbt.createString("memories"), (Tag) dynamicopsnbt.emptyMap())))); } @@ -55,14 +55,13 @@ index 9b430f8624ba6326f54ca6e18a49f97cc9221b10..cc2369f208546bf8c346c30d5c3ccd53 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 29bfea3c4f92033aed1de1cf159d61b38708a281..b1fb9035dc3a1e0d34e1e339f89d9eba073b0d1c 100644 +index 940cd932e74bc2e6754186731d7aa6f10d56eb68..eb6ced824d024a6402772e4df56e867e18fae988 100644 --- a/src/main/java/net/minecraft/world/entity/ambient/Bat.java +++ b/src/main/java/net/minecraft/world/entity/ambient/Bat.java -@@ -93,6 +93,18 @@ public class Bat extends AmbientCreature { - setDeltaMovement(mot.scale(0.9D)); +@@ -222,6 +222,18 @@ public class Bat extends AmbientCreature { } } -+ + + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.batMaxHealth); @@ -74,187 +73,188 @@ index 29bfea3c4f92033aed1de1cf159d61b38708a281..b1fb9035dc3a1e0d34e1e339f89d9eba + this.getAttribute(Attributes.ARMOR_TOUGHNESS).setBaseValue(this.level.purpurConfig.batArmorToughness); + this.getAttribute(Attributes.ATTACK_KNOCKBACK).setBaseValue(this.level.purpurConfig.batAttackKnockback); + } - // Purpur end - ++ @Override + public void readAdditionalSaveData(CompoundTag nbt) { + super.readAdditionalSaveData(nbt); 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 9881c77aca7a0b25d1dda9c5a89c367df516743f..c0b85da9cce5ec75d83945ba7b4d2fc823105103 100644 +index f6062bf8c888baeb7b421150a2c64bf1af1a312b..cd960eaeb3b86177b962db69173112f746bc52e1 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 { - setDeltaMovement(mot.scale(0.9D)); +@@ -415,6 +415,11 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { } } -+ + + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.beeMaxHealth); + } - // Purpur end - ++ @Override + public int getRemainingPersistentAngerTime() { + return (Integer) this.entityData.get(Bee.DATA_REMAINING_ANGER_TIME); 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 a708cacf755ce82042452558bef3140361b945c2..944da53f7f48e5218c12b7fd4bb443621cafc331 100644 +index 90ce201bc7c47cef9bc59d7b535a7453854bac75..3981a2b7501ceb62562785b2ace5990473919fa0 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cat.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cat.java -@@ -120,6 +120,11 @@ public class Cat extends TamableAnimal implements VariantHolder { - setLying(false); - setRelaxStateOne(false); +@@ -97,6 +97,11 @@ public class Cat extends TamableAnimal implements VariantHolder { + super(type, world); } -+ + + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.catMaxHealth); + } - // Purpur end - ++ public ResourceLocation getResourceLocation() { + return this.getVariant().texture(); + } 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 a2c72f9c90aa95d50ee9fb0e278171a6a0cee2a5..5207a2a8c06cd413e1d62c5eec7a232dce952b8b 100644 +index 84cefbc339ca368ac306d521012ce2f826a660b5..c7ff22ee963e3d7ca3c5b819b38cca466c5d78c5 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Chicken.java +++ b/src/main/java/net/minecraft/world/entity/animal/Chicken.java -@@ -69,6 +69,11 @@ public class Chicken extends Animal { - public boolean isControllable() { - return level.purpurConfig.chickenControllable; +@@ -54,6 +54,11 @@ public class Chicken extends Animal { + this.setPathfindingMalus(BlockPathTypes.WATER, 0.0F); } -+ + + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.chickenMaxHealth); + } - // Purpur end - ++ @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); diff --git a/src/main/java/net/minecraft/world/entity/animal/Cod.java b/src/main/java/net/minecraft/world/entity/animal/Cod.java -index 718b064fa3fb3d1a00f786ff839c91ce88ae4f70..47b537deac66f93a66a1df007b2bb8afac0ed079 100644 +index 824e5e4fe7619ae46061c3c978c9a044db8c84ab..3e213264f5991ccfcb5c207621334b8e9d6cc9bc 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cod.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cod.java -@@ -23,6 +23,11 @@ public class Cod extends AbstractSchoolingFish { - public boolean isControllable() { - return level.purpurConfig.codControllable; +@@ -13,6 +13,11 @@ public class Cod extends AbstractSchoolingFish { + super(type, world); } -+ + + @Override + public void initAttributes() { + this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.codMaxHealth); + } - // Purpur end - ++ @Override + 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 2424ff760fc7dd91962e070f373ebf8e21f41b7d..e24173dcd6f083a3ae61edcf71bb7236d644a422 100644 +index 4b63f6aa3d19cc4f47b05d531df3a43bf398c9ea..2f45444ad13e5ef3619788b19ec9c16be1f87950 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cow.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cow.java -@@ -56,6 +56,11 @@ public class Cow extends Animal { - public boolean isControllable() { - return level.purpurConfig.cowControllable; +@@ -41,6 +41,11 @@ public class Cow extends Animal { + super(type, world); } -+ + + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.cowMaxHealth); + } - // Purpur end - ++ @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); diff --git a/src/main/java/net/minecraft/world/entity/animal/Dolphin.java b/src/main/java/net/minecraft/world/entity/animal/Dolphin.java -index 106caca10bdd8dd546b6de24594afe236c8f7ce8..0accc5595461ce92259e3f819a9837aabd442d77 100644 +index 501e6cb4aa83f81c1f657e41f4e7f11d19d46831..376fe57c3518d42c887726338b15f59d072d8d87 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Dolphin.java +++ b/src/main/java/net/minecraft/world/entity/animal/Dolphin.java -@@ -152,6 +152,11 @@ public class Dolphin extends WaterAnimal { - } - return false; +@@ -86,6 +86,11 @@ public class Dolphin extends WaterAnimal { + this.setCanPickUpLoot(true); } -+ + + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.dolphinMaxHealth); + } - // Purpur end - ++ @Nullable + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor world, DifficultyInstance difficulty, MobSpawnType spawnReason, @Nullable SpawnGroupData entityData, @Nullable CompoundTag entityNbt) { 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 eb7f96f7b1583dfeb8e57a1984ed8cabeac0a2fe..5de86c59bf857e6697bb768e3dd71a05739fb3d2 100644 +index 844083101e9763330af0175388f6cdda27a97ecc..b75c942e212e6659723c4fea3f06f85a627096f0 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Fox.java +++ b/src/main/java/net/minecraft/world/entity/animal/Fox.java -@@ -177,6 +177,11 @@ public class Fox extends Animal implements VariantHolder { - super.onDismount(rider); - setCanPickUpLoot(true); +@@ -141,6 +141,11 @@ public class Fox extends Animal implements VariantHolder { + this.setCanPickUpLoot(true); } -+ + + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.foxMaxHealth); + } - // Purpur end - ++ @Override + protected void defineSynchedData() { + super.defineSynchedData(); diff --git a/src/main/java/net/minecraft/world/entity/animal/IronGolem.java b/src/main/java/net/minecraft/world/entity/animal/IronGolem.java -index 44db31b9f93970a65735eab4850dc799e6bdf002..ca4ef2397582245b52c73b12f80e876e03bb7e55 100644 +index f383928fc5b331ddf128bdcb6a23010d8fe088d3..4bdef5dd01b69ff64f632a71096c1a87b2fc1195 100644 --- a/src/main/java/net/minecraft/world/entity/animal/IronGolem.java +++ b/src/main/java/net/minecraft/world/entity/animal/IronGolem.java -@@ -84,6 +84,11 @@ public class IronGolem extends AbstractGolem implements NeutralMob { - public boolean isControllable() { - return level.purpurConfig.ironGolemControllable; +@@ -66,6 +66,11 @@ public class IronGolem extends AbstractGolem implements NeutralMob { + this.setMaxUpStep(1.0F); } -+ + + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.ironGolemMaxHealth); + } - // Purpur end - ++ @Override + protected void registerGoals() { + this.goalSelector.addGoal(1, new MeleeAttackGoal(this, 1.0D, true)); 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 b27e7381db833f4583a32b4276caddf277f5d25c..b1c2663a7f42714a620d59096f26f0a965875846 100644 +index a04374f91f2fbb31219d86b6ae63bcf8fdf7318c..9e5a1d8a406ad43d762f421a2589f649402b6f7d 100644 --- a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java +++ b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java -@@ -78,6 +78,11 @@ public class MushroomCow extends Cow implements Shearable, VariantHolder { - } - wasOnGround = onGround; +@@ -91,6 +91,11 @@ public class Rabbit extends Animal implements VariantHolder { + this.initializePathFinderGoals(); // CraftBukkit - moved code } -+ + + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.rabbitMaxHealth); + } - // Purpur end - ++ // CraftBukkit start - code from constructor + public void initializePathFinderGoals(){ + this.setSpeedModifier(0.0D); diff --git a/src/main/java/net/minecraft/world/entity/animal/Salmon.java b/src/main/java/net/minecraft/world/entity/animal/Salmon.java -index cc1e6f9d0ee241f32878ed96820f17ccb72396ba..2d525af3955a1f6dfbd21f07d813a832fd7f6c76 100644 +index 0af79daa357f53a8871e293b57e16c099e5d3f64..40196aa0f8abc8be68dffd397f706a0c2c0fc320 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Salmon.java +++ b/src/main/java/net/minecraft/world/entity/animal/Salmon.java -@@ -23,6 +23,11 @@ public class Salmon extends AbstractSchoolingFish { - public boolean isControllable() { - return level.purpurConfig.salmonControllable; +@@ -13,6 +13,11 @@ public class Salmon extends AbstractSchoolingFish { + super(type, world); } -+ + + @Override + public void initAttributes() { + this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.salmonMaxHealth); + } - // Purpur end - ++ @Override + 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 99c55d6bae08d75ae19c5dc004ca577e44b589a4..ce2bac7cc95dca0f3d8c97ba6d7cf922d328c579 100644 +index c0e89262c596fbdd0bb3c3f76baccb17a1bb5fcd..5886a9a40cbac1a97d4213d4a806802359953d18 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 { - public boolean isControllable() { - return level.purpurConfig.sheepControllable; +@@ -117,6 +117,11 @@ public class Sheep extends Animal implements Shearable { + super(type, world); } -+ + + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.sheepMaxHealth); + } - // Purpur end - ++ @Override + protected void registerGoals() { + this.eatBlockGoal = new EatBlockGoal(this); diff --git a/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java b/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java -index 383302ab11d2e62cc4ca135fda9c1ebe566491e5..7da9fcf10e6480a71d7a3e9934bb91320cac227e 100644 +index 96bfba9d3ccdbf95b8eea4038bf42e6b1430181d..64919b11f1b73f63a44e5f395687704e50e76c9a 100644 --- a/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java +++ b/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java -@@ -69,6 +69,11 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM - public boolean isControllable() { - return level.purpurConfig.snowGolemControllable; +@@ -54,6 +54,11 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM + super(type, world); } -+ + + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.snowGolemMaxHealth); + } - // Purpur end - ++ @Override + protected void registerGoals() { + this.goalSelector.addGoal(1, new RangedAttackGoal(this, 1.25D, 20, 10.0F)); 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 aa19d10f44aebed8fb174479b72da2a1601c2e38..0c2b930a0fc5e32afd12a4850acaaa7eb732fc01 100644 +index b72006c4b2342ca9d9a81f54f89fa6d979c33c85..55ca4f5e136cd902b2df425c8e65b12bfb45b28e 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Squid.java +++ b/src/main/java/net/minecraft/world/entity/animal/Squid.java -@@ -70,6 +70,11 @@ public class Squid extends WaterAnimal { - vector.setX(cos * x - sine * z); - vector.setZ(sine * x + cos * z); +@@ -50,6 +50,11 @@ public class Squid extends WaterAnimal { + this.tentacleSpeed = 1.0F / (this.random.nextFloat() + 1.0F) * 0.2F; } -+ + + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.squidMaxHealth); + } - // Purpur end - ++ @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new Squid.SquidRandomMovementGoal(this)); 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 7c90f91685845329845a8c81f87ad9f6fdf4d973..948d86a125648300a258e08200bb90e9ba8eaf59 100644 +index b05b560b7570e97bc234b75f26233909fcf575b3..c0605ccfd050417189595cdcb68eb9d56e9fc4ee 100644 --- a/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java +++ b/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java -@@ -52,6 +52,11 @@ public class TropicalFish extends AbstractSchoolingFish implements VariantHolder - public boolean isControllable() { - return level.purpurConfig.tropicalFishControllable; +@@ -42,6 +42,11 @@ public class TropicalFish extends AbstractSchoolingFish implements VariantHolder + super(type, world); } -+ + + @Override + public void initAttributes() { + this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.tropicalFishMaxHealth); + } - // Purpur end - ++ public static String getPredefinedName(int variant) { + 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 ea66c2976401752688fdf9ee44802c79ea8545a1..67c8f06d1befaf810e3954dbda156ee29bfbc0d4 100644 +index 9f7fa132997829e9a34aaae7aac7a6f7d529eee2..fc98554897f009352f1869d3e5a42d209a8d520c 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Turtle.java +++ b/src/main/java/net/minecraft/world/entity/animal/Turtle.java -@@ -98,6 +98,11 @@ public class Turtle extends Animal { - public boolean isControllable() { - return level.purpurConfig.turtleControllable; +@@ -83,6 +83,11 @@ public class Turtle extends Animal { + this.setMaxUpStep(1.0F); } -+ + + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.turtleMaxHealth); + } - // Purpur end - ++ public void setHomePos(BlockPos pos) { + this.entityData.set(Turtle.HOME_POS, pos.immutable()); // Paper - called with mutablepos... + } 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 c8a18ecd36393747a95ad9026c5a7b1d62ff727a..05792466a89bdcffe1a4241761b7c23afcc6bc88 100644 +index 27c4dd3605373f08078048fe923a8f6f4d3ccf3b..123bb0b0a8437935ae5dafbe93b44eb268d1b4c0 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 { - public boolean isControllable() { - return level.purpurConfig.wolfControllable; +@@ -102,6 +102,11 @@ public class Wolf extends TamableAnimal implements NeutralMob { + this.setPathfindingMalus(BlockPathTypes.DANGER_POWDER_SNOW, -1.0F); } -+ + + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.wolfMaxHealth); + } - // Purpur end - ++ @Override + protected void registerGoals() { + this.goalSelector.addGoal(1, new FloatGoal(this)); 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 2c5aa1fe81a2411de81c233092bbe3841ed627ea..65587c422eb7e2b64670dd869e01297998765c30 100644 +index 2682a49cd3948e0f80e2d7e58abcd3e6d8f7ac4e..d90bf5a45466525c9a04d54b02d366861423be8f 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 -@@ -113,6 +113,11 @@ public class Axolotl extends Animal implements LerpingModel, VariantHolder getModelRotationValues() { + return this.modelRotationValues; 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 05c7680569346bb863b896bcc9515f3e7cfb8114..a58028bfd3722210e801e85c355d679cd8557e85 100644 +index 4efa7e331cc974008c653a04687a336e97626445..95fbdb0e9c59edeb647fe0e5d51d5e6a35152cd6 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 -@@ -314,6 +314,23 @@ public class Camel extends AbstractHorse implements PlayerRideableJumping, Rider +@@ -319,6 +319,23 @@ public class Camel extends AbstractHorse implements PlayerRideableJumping, Rider return this.dashCooldown; } @@ -503,14 +503,13 @@ index 05c7680569346bb863b896bcc9515f3e7cfb8114..a58028bfd3722210e801e85c355d679c protected SoundEvent getAmbientSound() { return SoundEvents.CAMEL_AMBIENT; 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 2d298960afe61ed2b73ca72908849879408738b9..28dbaeb4de0c133a68878f65da33d2939c7344b2 100644 +index 79b6e241f425622fdc575b77d8dce7061c0ab783..7827187afa738776908d1c2151556af95affcbe8 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 -@@ -155,6 +155,44 @@ public abstract class AbstractHorse extends Animal implements ContainerListener, - public boolean isRidable() { - return false; // vanilla handles +@@ -148,6 +148,44 @@ public abstract class AbstractHorse extends Animal implements ContainerListener, + this.createInventory(); } -+ + + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.generateMaxHealth(random)); @@ -548,10 +547,11 @@ index 2d298960afe61ed2b73ca72908849879408738b9..28dbaeb4de0c133a68878f65da33d293 + protected double generateSpeed(RandomSource random) { + return (0.44999998807907104D + random.nextDouble() * 0.3D + random.nextDouble() * 0.3D + random.nextDouble() * 0.3D) * 0.25D; + } - // Purpur end - ++ @Override -@@ -1263,7 +1301,7 @@ public abstract class AbstractHorse extends Animal implements ContainerListener, + protected void registerGoals() { + this.goalSelector.addGoal(1, new PanicGoal(this, 1.2D)); +@@ -1253,7 +1291,7 @@ public abstract class AbstractHorse extends Animal implements ContainerListener, entityData = new AgeableMob.AgeableMobGroupData(0.2F); } @@ -561,14 +561,13 @@ index 2d298960afe61ed2b73ca72908849879408738b9..28dbaeb4de0c133a68878f65da33d293 } 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 6ed4ef1c628b77448629388bfc4a8575dd4afefd..7afd065d6a5d5b9650e64a26449dcf81724744bb 100644 +index e0dfee0e0ce091d5ae0ec740e939c2c50915c104..d3e8b9ddc42c506f8a0b696becc2ca63414db76f 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 -@@ -20,6 +20,21 @@ public class Donkey extends AbstractChestedHorse { - public boolean dismountsUnderwater() { - return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.donkeyRidableInWater; +@@ -15,6 +15,21 @@ public class Donkey extends AbstractChestedHorse { + super(type, world); } -+ + + @Override + public float generateMaxHealth(net.minecraft.util.RandomSource random) { + return (float) generateMaxHealth(this.level.purpurConfig.donkeyMaxHealthMin, this.level.purpurConfig.donkeyMaxHealthMax); @@ -583,18 +582,18 @@ index 6ed4ef1c628b77448629388bfc4a8575dd4afefd..7afd065d6a5d5b9650e64a26449dcf81 + public double generateSpeed(net.minecraft.util.RandomSource random) { + return generateSpeed(this.level.purpurConfig.donkeyMovementSpeedMin, this.level.purpurConfig.donkeyMovementSpeedMax); + } - // Purpur end - ++ @Override + protected SoundEvent getAmbientSound() { + return SoundEvents.DONKEY_AMBIENT; diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Horse.java b/src/main/java/net/minecraft/world/entity/animal/horse/Horse.java -index 9d8879fc2f7afafdd42cd8ee471c698b31159209..fcd5afe0e25482877894fde500ddf7a0cb290b62 100644 +index 5f5dc651d570989ec1294c31a14dcfede466b80a..62f7cdc02e7eb15a96f20ff48470d9869ec82d59 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 -@@ -45,6 +45,21 @@ public class Horse extends AbstractHorse implements VariantHolder { - public boolean dismountsUnderwater() { - return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.horseRidableInWater; +@@ -40,6 +40,21 @@ public class Horse extends AbstractHorse implements VariantHolder { + super(type, world); } -+ + + @Override + public float generateMaxHealth(RandomSource random) { + return (float) generateMaxHealth(this.level.purpurConfig.horseMaxHealthMin, this.level.purpurConfig.horseMaxHealthMax); @@ -609,18 +608,18 @@ index 9d8879fc2f7afafdd42cd8ee471c698b31159209..fcd5afe0e25482877894fde500ddf7a0 + public double generateSpeed(RandomSource random) { + return generateSpeed(this.level.purpurConfig.horseMovementSpeedMin, this.level.purpurConfig.horseMovementSpeedMax); + } - // Purpur end - ++ @Override + protected void randomizeAttributes(RandomSource random) { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue((double)generateMaxHealth(random::nextInt)); 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 42861ddab4397187eb6a5d4a729bc58e6fc7ddeb..9953f80e924e8843ceebdbfa675c2315bf6cf63f 100644 +index 3bbb1455773570e3f7f6b8b144d3c589e2705b81..08fbfa5df3196ad3d9fe086dcd8210ec8747f053 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 -@@ -120,6 +120,21 @@ public class Llama extends AbstractChestedHorse implements VariantHolder type, ServerLevelAccessor world, MobSpawnType spawnReason, BlockPos pos, RandomSource random) { + return checkMonsterSpawnRules(type, world, spawnReason, pos, random) && (spawnReason == MobSpawnType.SPAWNER || world.canSeeSky(pos)); + } diff --git a/src/main/java/net/minecraft/world/entity/monster/Illusioner.java b/src/main/java/net/minecraft/world/entity/monster/Illusioner.java -index 91e048a14366aec2142ca36c3a8081eea6af0052..a22756ed865dfa583029a742f3e9f9c80e1533ad 100644 +index 63fce7e3d9f59f36e29bc827a46396d73143bb8b..03646f5ffa43b19679241999877da1e93b293744 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Illusioner.java +++ b/src/main/java/net/minecraft/world/entity/monster/Illusioner.java -@@ -74,6 +74,13 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { - public boolean isControllable() { - return level.purpurConfig.illusionerControllable; +@@ -59,6 +59,13 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { + } -+ + + @Override + protected void initAttributes() { + this.getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(this.level.purpurConfig.illusionerMovementSpeed); + this.getAttribute(Attributes.FOLLOW_RANGE).setBaseValue(this.level.purpurConfig.illusionerFollowRange); + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.illusionerMaxHealth); + } - // Purpur end - ++ @Override + protected void registerGoals() { + super.registerGoals(); diff --git a/src/main/java/net/minecraft/world/entity/monster/MagmaCube.java b/src/main/java/net/minecraft/world/entity/monster/MagmaCube.java -index b51f11fe8366ba15e02083a50ee401e1f335fbb6..c78bc3ca4324905d03e789c516d6a9a7226e072d 100644 +index 2858ea5562d06c11e5c7337a2b123f9be7a3f62e..0f375ed5073435f6826c4d946e50a2d24ae54be0 100644 --- a/src/main/java/net/minecraft/world/entity/monster/MagmaCube.java +++ b/src/main/java/net/minecraft/world/entity/monster/MagmaCube.java -@@ -45,6 +45,26 @@ public class MagmaCube extends Slime { - public float getJumpPower() { - return 0.42F * this.getBlockJumpFactor(); // from EntityLiving +@@ -25,6 +25,26 @@ public class MagmaCube extends Slime { + super(type, world); } -+ + + @Override + protected String getMaxHealthEquation() { + return level.purpurConfig.magmaCubeMaxHealth; @@ -1049,18 +1048,30 @@ index b51f11fe8366ba15e02083a50ee401e1f335fbb6..c78bc3ca4324905d03e789c516d6a9a7 + protected java.util.Map getAttackDamageCache() { + return level.purpurConfig.magmaCubeAttackDamageCache; + } - // Purpur end - ++ public static AttributeSupplier.Builder createAttributes() { + return Monster.createMonsterAttributes().add(Attributes.MOVEMENT_SPEED, (double)0.2F); + } diff --git a/src/main/java/net/minecraft/world/entity/monster/Phantom.java b/src/main/java/net/minecraft/world/entity/monster/Phantom.java -index 736610f5d1e180b4df68a9355adce9b8135268ff..e271555ac03fcbb565a7fe08efdc9a6036164e74 100644 +index 4a132c3eff6978e927bcd4df56b9ce0306af6d19..07070846057b80eb24e6afa4ddcf39221df0c7b3 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Phantom.java +++ b/src/main/java/net/minecraft/world/entity/monster/Phantom.java -@@ -116,6 +116,21 @@ public class Phantom extends FlyingMob implements Enemy { - level.addFreshEntity(flames); +@@ -90,7 +90,10 @@ public class Phantom extends FlyingMob implements Enemy { + + private void updatePhantomSizeInfo() { + this.refreshDimensions(); +- this.getAttribute(Attributes.ATTACK_DAMAGE).setBaseValue((double) (6 + this.getPhantomSize())); ++ // Purpur start ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(getFromCache(() -> this.level.purpurConfig.phantomMaxHealth, () -> this.level.purpurConfig.phantomMaxHealthCache, () -> 20.0D)); ++ this.getAttribute(Attributes.ATTACK_DAMAGE).setBaseValue(getFromCache(() -> this.level.purpurConfig.phantomAttackDamage, () -> this.level.purpurConfig.phantomAttackDamageCache, () -> (double) 6 + this.getPhantomSize())); ++ // Purpur end + } + + public int getPhantomSize() { +@@ -120,6 +123,21 @@ public class Phantom extends FlyingMob implements Enemy { return true; } -+ + + private double getFromCache(java.util.function.Supplier equation, java.util.function.Supplier> cache, java.util.function.Supplier defaultValue) { + int size = getPhantomSize(); + Double value = cache.get().get(size); @@ -1075,110 +1086,98 @@ index 736610f5d1e180b4df68a9355adce9b8135268ff..e271555ac03fcbb565a7fe08efdc9a60 + } + return value; + } - // Purpur end - ++ @Override -@@ -150,7 +165,10 @@ public class Phantom extends FlyingMob implements Enemy { - - private void updatePhantomSizeInfo() { - this.refreshDimensions(); -- this.getAttribute(Attributes.ATTACK_DAMAGE).setBaseValue((double) (6 + this.getPhantomSize())); -+ // Purpur start -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(getFromCache(() -> this.level.purpurConfig.phantomMaxHealth, () -> this.level.purpurConfig.phantomMaxHealthCache, () -> 20.0D)); -+ this.getAttribute(Attributes.ATTACK_DAMAGE).setBaseValue(getFromCache(() -> this.level.purpurConfig.phantomAttackDamage, () -> this.level.purpurConfig.phantomAttackDamageCache, () -> (double) 6 + this.getPhantomSize())); -+ // Purpur end - } - - public int getPhantomSize() { + public void tick() { + super.tick(); 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 f2a8dffecc27ec45e3f7341cb67a2bd783400f4a..ea1da86fef146a50a6908cbc51fab9d195693aeb 100644 +index cec545c3baa6599d47b9cf1a4b97de8771062a22..508d76f5120ec614092669af7d7c61f7216c8dc3 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Pillager.java +++ b/src/main/java/net/minecraft/world/entity/monster/Pillager.java -@@ -77,6 +77,11 @@ public class Pillager extends AbstractIllager implements CrossbowAttackMob, Inve - public boolean isControllable() { - return level.purpurConfig.pillagerControllable; +@@ -62,6 +62,11 @@ public class Pillager extends AbstractIllager implements CrossbowAttackMob, Inve + super(type, world); } -+ + + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.pillagerMaxHealth); + } - // Purpur end - ++ @Override + protected void registerGoals() { + super.registerGoals(); diff --git a/src/main/java/net/minecraft/world/entity/monster/Ravager.java b/src/main/java/net/minecraft/world/entity/monster/Ravager.java -index 78bd5a76f105ff1ebf005ccb2590b4a04934ebb2..2d592307f42ede8a490c072da9ec796b2e356f0a 100644 +index 75d661c23cde1ba09ea0b673860c9659c32ef77e..45ac92467b5cdadcc692c8867a52277e1754a934 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Ravager.java +++ b/src/main/java/net/minecraft/world/entity/monster/Ravager.java -@@ -86,6 +86,11 @@ public class Ravager extends Raider { - super.onMount(rider); - getNavigation().stop(); +@@ -65,6 +65,11 @@ public class Ravager extends Raider { + this.setPathfindingMalus(BlockPathTypes.LEAVES, 0.0F); } -+ + + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.ravagerMaxHealth); + } - // Purpur end - ++ @Override + protected void registerGoals() { + super.registerGoals(); 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 6f652413d5375e0e6ddf82b3be682560ea6f5d67..5a5dd029af3517f3552055b32a9d4951ac2e14e6 100644 +index cdccbe68fb591181517893a5dd1e93489b578f4d..b7900691214fabe130f163253879c38952b9a20b 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Shulker.java +++ b/src/main/java/net/minecraft/world/entity/monster/Shulker.java -@@ -113,6 +113,11 @@ public class Shulker extends AbstractGolem implements VariantHolder type, ServerLevelAccessor world, MobSpawnType spawnReason, BlockPos pos, RandomSource random) { + 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 da652fdb3afbdae1a26d76a2669b57affbfecd84..0a480333373c3f3a9504d0b4a3e00fba2e8b2e15 100644 +index ebf54d6e36fdee2833250816fae14195ac45eb67..bf44fc59eb4f2d18c728a7c24fd8b5c518208f09 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Strider.java +++ b/src/main/java/net/minecraft/world/entity/monster/Strider.java -@@ -115,6 +115,11 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { - public boolean isControllable() { - return level.purpurConfig.striderControllable; +@@ -100,6 +100,11 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { + this.setPathfindingMalus(BlockPathTypes.DAMAGE_FIRE, 0.0F); } -+ + + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.striderMaxHealth); + } - // Purpur end - ++ public static boolean checkStriderSpawnRules(EntityType type, LevelAccessor world, MobSpawnType spawnReason, BlockPos pos, RandomSource random) { + BlockPos.MutableBlockPos blockposition_mutableblockposition = pos.mutable(); + 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 38f7e1e41816721f332f548887d69c5eb98bad6a..87956e99e8a309c90b522652d29458d6f437f866 100644 +index 65cb385ab294e362d666a6d03c4496cdc3b64890..41b6c2d33121144e062f0733db55ec6a40603020 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Vex.java +++ b/src/main/java/net/minecraft/world/entity/monster/Vex.java -@@ -105,6 +105,11 @@ public class Vex extends Monster implements TraceableEntity { - public boolean causeFallDamage(float fallDistance, float damageMultiplier, DamageSource damageSource) { - return false; // no fall damage please +@@ -63,6 +63,11 @@ public class Vex extends Monster implements TraceableEntity { + this.xpReward = 3; } -+ + + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.vexMaxHealth); + } - // Purpur end - ++ @Override + protected float getStandingEyeHeight(Pose pose, EntityDimensions dimensions) { + return dimensions.height - 0.28125F; diff --git a/src/main/java/net/minecraft/world/entity/monster/Vindicator.java b/src/main/java/net/minecraft/world/entity/monster/Vindicator.java -index 78fe2cc6c866252c1d537c1e23854a0d2608fe36..0a4f7125c38d3138ec8eedec4ca72000f25ba6ac 100644 +index 2acc531bd9e948251cac77d979f973678f576394..3bf6463d356f3ba64c2d5279cbf79c289fc09a8f 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Vindicator.java +++ b/src/main/java/net/minecraft/world/entity/monster/Vindicator.java -@@ -73,6 +73,11 @@ public class Vindicator extends AbstractIllager { - public boolean isControllable() { - return level.purpurConfig.vindicatorControllable; +@@ -58,6 +58,11 @@ public class Vindicator extends AbstractIllager { + super(type, world); } -+ + + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.vindicatorMaxHealth); + } - // Purpur end - ++ @Override + protected void registerGoals() { + super.registerGoals(); diff --git a/src/main/java/net/minecraft/world/entity/monster/Witch.java b/src/main/java/net/minecraft/world/entity/monster/Witch.java -index c15a35e7ac5dac31872b5e27671ce26fe1702eef..cbbdbf3bf316140b2591f29f0309ed17f341473e 100644 +index 701f6bf1d558cf0ec4bc1abb9e1f66d96ea5a6c9..956e0f5ea71f01f4ae192c8c8e0f1e8b323b06ba 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Witch.java +++ b/src/main/java/net/minecraft/world/entity/monster/Witch.java -@@ -72,6 +72,11 @@ public class Witch extends Raider implements RangedAttackMob { - public boolean isControllable() { - return level.purpurConfig.witchControllable; +@@ -57,6 +57,11 @@ public class Witch extends Raider implements RangedAttackMob { + super(type, world); } -+ + + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.witchMaxHealth); + } - // Purpur end - ++ @Override + protected void registerGoals() { + super.registerGoals(); diff --git a/src/main/java/net/minecraft/world/entity/monster/WitherSkeleton.java b/src/main/java/net/minecraft/world/entity/monster/WitherSkeleton.java -index 8da19fac75c283f026cb051668557c2034c40af9..ff43c5a1f8398b2c56920ec4e0a8fa5fbd135df8 100644 +index 9a81cb0c3a5ac40ff50dc7c81f6196a447cd03c6..dda157fa91572198407a0840079cd18473adae4e 100644 --- a/src/main/java/net/minecraft/world/entity/monster/WitherSkeleton.java +++ b/src/main/java/net/minecraft/world/entity/monster/WitherSkeleton.java -@@ -50,6 +50,11 @@ public class WitherSkeleton extends AbstractSkeleton { - public boolean isControllable() { - return level.purpurConfig.witherSkeletonControllable; +@@ -35,6 +35,11 @@ public class WitherSkeleton extends AbstractSkeleton { + this.setPathfindingMalus(BlockPathTypes.LAVA, 8.0F); } -+ + + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.witherSkeletonMaxHealth); + } - // Purpur end - ++ @Override + 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 ee1bbff9e9dfd110e33a36c652d50a7f83093cab..13010725d9e6026ac77eb69e9f302684dc50cfec 100644 +index 7815af9b64ead32d6f7bcad6f86b2d21ec4aec22..54ce647b16efcc15d378009e56691cdf47bd04e4 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zoglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zoglin.java -@@ -82,6 +82,11 @@ public class Zoglin extends Monster implements Enemy, HoglinBase { - public boolean isControllable() { - return level.purpurConfig.zoglinControllable; +@@ -67,6 +67,11 @@ public class Zoglin extends Monster implements Enemy, HoglinBase { + this.xpReward = 5; } -+ + + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.zoglinMaxHealth); + } - // Purpur end - ++ @Override + protected Brain.Provider brainProvider() { + return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); 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 aa264a5975b1373fa979104355dae899c785aaf1..77712e0bb78bef24f05d9949c3ae4ee7ec2efb96 100644 +index 3f8c1d1d3c408fc4f15c4b5680bc22c86f104a9d..3263d467cbff5cd7382f9618c342314aafb2a004 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zombie.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -@@ -121,6 +121,11 @@ public class Zombie extends Monster { - public boolean isControllable() { - return level.purpurConfig.zombieControllable; +@@ -106,6 +106,11 @@ public class Zombie extends Monster { + this(EntityType.ZOMBIE, world); } -+ + + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.zombieMaxHealth); + } - // Purpur end - ++ @Override -@@ -614,7 +619,7 @@ public class Zombie extends Monster { + protected void registerGoals() { + if (this.level().paperConfig().entities.behavior.zombiesTargetTurtleEggs) this.goalSelector.addGoal(4, new Zombie.ZombieAttackTurtleEggGoal(this, 1.0D, 3)); // Paper +@@ -595,7 +600,7 @@ public class Zombie extends Monster { } protected void randomizeReinforcementsChance() { @@ -1378,14 +1378,13 @@ index aa264a5975b1373fa979104355dae899c785aaf1..77712e0bb78bef24f05d9949c3ae4ee7 @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 02a97f526fb10056dcad78614ae8f6973449e9ab..073a45cd24c92e63b349a93da91cedfa10103101 100644 +index 25ed5571b24e590bc95056020d84496492b53298..7ca69d4ae42f982eef7c4470d6a28a3eb334401c 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java -@@ -94,6 +94,16 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { - public boolean isControllable() { - return level.purpurConfig.zombieVillagerControllable; +@@ -79,6 +79,16 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { + }); } -+ + + @Override + public void initAttributes() { + this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.zombieVillagerMaxHealth); @@ -1395,26 +1394,27 @@ index 02a97f526fb10056dcad78614ae8f6973449e9ab..073a45cd24c92e63b349a93da91cedfa + protected void randomizeReinforcementsChance() { + this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.SPAWN_REINFORCEMENTS_CHANCE).setBaseValue(this.random.nextDouble() * this.level.purpurConfig.zombieVillagerSpawnReinforcements); + } - // Purpur end - ++ @Override + 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 ad82c064c9e31ffc1dd96e44517187635100fc22..2df1aa1af12b403e9cd87d61b2ff1516f754f589 100644 +index aff140cfb2bbdce8b512080cf394c84c5c4ff807..5e97cec00a6ea97520f0e5acb6e30d5e7e5fab89 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java -@@ -78,6 +78,11 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { - public boolean isControllable() { - return level.purpurConfig.zombifiedPiglinControllable; +@@ -63,6 +63,11 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { + this.setPathfindingMalus(BlockPathTypes.LAVA, 8.0F); } -+ + + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.zombifiedPiglinMaxHealth); + } - // Purpur end - ++ @Override -@@ -267,7 +272,7 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { + public void setPersistentAngerTarget(@Nullable UUID angryAt) { + this.persistentAngerTarget = angryAt; +@@ -250,7 +255,7 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { @Override protected void randomizeReinforcementsChance() { @@ -1424,104 +1424,99 @@ index ad82c064c9e31ffc1dd96e44517187635100fc22..2df1aa1af12b403e9cd87d61b2ff1516 @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 74d3068c4f74c19740ad3e2f507489d405d78598..b855647ebd374e4d01e90b78a5d650ceab85173d 100644 +index e8f6c34ea789136d63c0aa88aec90203ef6282b5..139c0853d54f736d61ae8c2f90c8bef9e4acb164 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 { - public boolean isControllable() { - return level.purpurConfig.hoglinControllable; +@@ -67,6 +67,11 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { + this.xpReward = 5; } -+ + + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.hoglinMaxHealth); + } - // Purpur end - ++ @Override + public boolean canBeLeashed(Player player) { + return !this.isLeashed(); 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 5dcaa05ee11872502736c39588dfe03cb59c8e2d..c36b17a7f209ce5f2b366077a192c16fc389cbf7 100644 +index 27d9145693a772cd1b5d171da303c934101f3be8..7e1a46eba403e238c266680e9f1fae435a246e1c 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 -@@ -112,6 +112,11 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento - public boolean isControllable() { - return level.purpurConfig.piglinControllable; +@@ -96,6 +96,11 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento + this.xpReward = 5; } -+ + + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.piglinMaxHealth); + } - // Purpur end - ++ @Override + public void addAdditionalSaveData(CompoundTag nbt) { + super.addAdditionalSaveData(nbt); 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 ac066b2f3e369321752470722941ae26af511309..ba460cb0f65eb98d2c0934084c51c81ef10a0b44 100644 +index e1be4a77fae0b9120781f460079269b85c993930..5f4dcb1d2fd8e3354fb5148512648062463b5bd8 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 -@@ -56,6 +56,11 @@ public class PiglinBrute extends AbstractPiglin { - public boolean isControllable() { - return level.purpurConfig.piglinBruteControllable; +@@ -41,6 +41,11 @@ public class PiglinBrute extends AbstractPiglin { + this.xpReward = 20; } -+ + + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.piglinBruteMaxHealth); + } - // Purpur end - ++ public static AttributeSupplier.Builder createAttributes() { + return Monster.createMonsterAttributes().add(Attributes.MAX_HEALTH, 50.0D).add(Attributes.MOVEMENT_SPEED, (double)0.35F).add(Attributes.ATTACK_DAMAGE, 7.0D); + } 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 bf232c81f07e5783071b79b5f3510f9ed473e400..fc25e9deb12162f2fe9067da819ff6946f4a5be4 100644 +index e30d5ae3e2900f43d7cafde71b8196f26e872841..423d0eb98c144d98622884212235b33213aaac6e 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 - protected void registerGoals() { - this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); +@@ -154,6 +154,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler + this.setVillagerData(this.getVillagerData().setType(type).setProfession(VillagerProfession.NONE)); } -+ + + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.villagerMaxHealth); + } - // Purpur end - ++ @Override + public Brain getBrain() { + return (Brain) super.getBrain(); // CraftBukkit - decompile error 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 89ec1e52f91c2e4cd17eeaa23cab366c9cbb8dc0..71212ecb84bdbf838b4a5fbefbe9cfa6343542c4 100644 +index 2e7de2378e01aed514e237029d6d64e78871c9b4..5df4c2468ff809b805d4f16021e7ffd2c1c2dd33 100644 --- a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java +++ b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java -@@ -84,6 +84,11 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill - public boolean isControllable() { - return level.purpurConfig.wanderingTraderControllable; +@@ -66,6 +66,11 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill + this.setDespawnDelay(48000); // CraftBukkit - set default from MobSpawnerTrader } -+ + + @Override + public void initAttributes() { + this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.wanderingTraderMaxHealth); + } - // Purpur end - ++ @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index ec168b917d60cc6d8c48620eb4dcd89b0b121aea..46b6994812086405f20a4dd410c1d79621958cd5 100644 +index 2b7f1dedb3289efc7e42a138f4483f4969902801..3a44c1fff53590ae5c65404564a3a2ee12be62cf 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -114,94 +114,181 @@ public class PurpurWorldConfig { - - public boolean axolotlRidable = false; - public boolean axolotlControllable = true; -+ public double axolotlMaxHealth = 14.0D; - private void axolotlSettings() { - axolotlRidable = getBoolean("mobs.axolotl.ridable", axolotlRidable); - axolotlControllable = getBoolean("mobs.axolotl.controllable", axolotlControllable); -+ axolotlMaxHealth = getDouble("mobs.axolotl.attributes.max_health", axolotlMaxHealth); +@@ -91,4 +91,901 @@ public class PurpurWorldConfig { + final Map value = PurpurConfig.getMap("world-settings." + worldName + "." + path, null); + return value.isEmpty() ? fallback : value; } - - public boolean batRidable = false; - public boolean batRidableInWater = true; - public boolean batControllable = true; - public double batMaxY = 320D; ++ ++ public double axolotlMaxHealth = 14.0D; ++ private void axolotlSettings() { ++ axolotlMaxHealth = getDouble("mobs.axolotl.attributes.max_health", axolotlMaxHealth); ++ } ++ + public double batMaxHealth = 6.0D; + public double batFollowRange = 16.0D; + public double batKnockbackResistance = 0.0D; @@ -1530,47 +1525,34 @@ index ec168b917d60cc6d8c48620eb4dcd89b0b121aea..46b6994812086405f20a4dd410c1d796 + public double batArmor = 0.0D; + public double batArmorToughness = 0.0D; + public double batAttackKnockback = 0.0D; - private void batSettings() { - batRidable = getBoolean("mobs.bat.ridable", batRidable); - batRidableInWater = getBoolean("mobs.bat.ridable-in-water", batRidableInWater); - batControllable = getBoolean("mobs.bat.controllable", batControllable); - batMaxY = getDouble("mobs.bat.ridable-max-y", batMaxY); ++ private void batSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.bat.attributes.max-health", batMaxHealth); + set("mobs.bat.attributes.max-health", null); + set("mobs.bat.attributes.max_health", oldValue); + } + batMaxHealth = getDouble("mobs.bat.attributes.max_health", batMaxHealth); - } - - public boolean beeRidable = false; - public boolean beeRidableInWater = true; - public boolean beeControllable = true; - public double beeMaxY = 320D; ++ batFollowRange = getDouble("mobs.bat.attributes.follow_range", batFollowRange); ++ batKnockbackResistance = getDouble("mobs.bat.attributes.knockback_resistance", batKnockbackResistance); ++ batMovementSpeed = getDouble("mobs.bat.attributes.movement_speed", batMovementSpeed); ++ batFlyingSpeed = getDouble("mobs.bat.attributes.flying_speed", batFlyingSpeed); ++ batArmor = getDouble("mobs.bat.attributes.armor", batArmor); ++ batArmorToughness = getDouble("mobs.bat.attributes.armor_toughness", batArmorToughness); ++ batAttackKnockback = getDouble("mobs.bat.attributes.attack_knockback", batAttackKnockback); ++ } ++ + public double beeMaxHealth = 10.0D; - private void beeSettings() { - beeRidable = getBoolean("mobs.bee.ridable", beeRidable); - beeRidableInWater = getBoolean("mobs.bee.ridable-in-water", beeRidableInWater); - beeControllable = getBoolean("mobs.bee.controllable", beeControllable); - beeMaxY = getDouble("mobs.bee.ridable-max-y", beeMaxY); ++ private void beeSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.bee.attributes.max-health", beeMaxHealth); + set("mobs.bee.attributes.max-health", null); + set("mobs.bee.attributes.max_health", oldValue); + } + beeMaxHealth = getDouble("mobs.bee.attributes.max_health", beeMaxHealth); - } - - public boolean blazeRidable = false; - public boolean blazeRidableInWater = true; - public boolean blazeControllable = true; - public double blazeMaxY = 320D; ++ } ++ + public double blazeMaxHealth = 20.0D; - private void blazeSettings() { - blazeRidable = getBoolean("mobs.blaze.ridable", blazeRidable); - blazeRidableInWater = getBoolean("mobs.blaze.ridable-in-water", blazeRidableInWater); - blazeControllable = getBoolean("mobs.blaze.controllable", blazeControllable); - blazeMaxY = getDouble("mobs.blaze.ridable-max-y", blazeMaxY); ++ private void blazeSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.blaze.attributes.max-health", blazeMaxHealth); + set("mobs.blaze.attributes.max-health", null); @@ -1592,131 +1574,85 @@ index ec168b917d60cc6d8c48620eb4dcd89b0b121aea..46b6994812086405f20a4dd410c1d796 + camelJumpStrengthMax = getDouble("mobs.camel.attributes.jump_strength.max", camelJumpStrengthMax); + camelMovementSpeedMin = getDouble("mobs.camel.attributes.movement_speed.min", camelMovementSpeedMin); + camelMovementSpeedMax = getDouble("mobs.camel.attributes.movement_speed.max", camelMovementSpeedMax); - } - - public boolean catRidable = false; - public boolean catRidableInWater = true; - public boolean catControllable = true; ++ } ++ + public double catMaxHealth = 10.0D; - private void catSettings() { - catRidable = getBoolean("mobs.cat.ridable", catRidable); - catRidableInWater = getBoolean("mobs.cat.ridable-in-water", catRidableInWater); - catControllable = getBoolean("mobs.cat.controllable", catControllable); ++ private void catSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.cat.attributes.max-health", catMaxHealth); + set("mobs.cat.attributes.max-health", null); + set("mobs.cat.attributes.max_health", oldValue); + } + catMaxHealth = getDouble("mobs.cat.attributes.max_health", catMaxHealth); - } - - public boolean caveSpiderRidable = false; - public boolean caveSpiderRidableInWater = true; - public boolean caveSpiderControllable = true; ++ } ++ + public double caveSpiderMaxHealth = 12.0D; - private void caveSpiderSettings() { - caveSpiderRidable = getBoolean("mobs.cave_spider.ridable", caveSpiderRidable); - caveSpiderRidableInWater = getBoolean("mobs.cave_spider.ridable-in-water", caveSpiderRidableInWater); - caveSpiderControllable = getBoolean("mobs.cave_spider.controllable", caveSpiderControllable); ++ private void caveSpiderSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.cave_spider.attributes.max-health", caveSpiderMaxHealth); + set("mobs.cave_spider.attributes.max-health", null); + set("mobs.cave_spider.attributes.max_health", oldValue); + } + caveSpiderMaxHealth = getDouble("mobs.cave_spider.attributes.max_health", caveSpiderMaxHealth); - } - - public boolean chickenRidable = false; - public boolean chickenRidableInWater = false; - public boolean chickenControllable = true; ++ } ++ + public double chickenMaxHealth = 4.0D; - private void chickenSettings() { - chickenRidable = getBoolean("mobs.chicken.ridable", chickenRidable); - chickenRidableInWater = getBoolean("mobs.chicken.ridable-in-water", chickenRidableInWater); - chickenControllable = getBoolean("mobs.chicken.controllable", chickenControllable); ++ private void chickenSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.chicken.attributes.max-health", chickenMaxHealth); + set("mobs.chicken.attributes.max-health", null); + set("mobs.chicken.attributes.max_health", oldValue); + } + chickenMaxHealth = getDouble("mobs.chicken.attributes.max_health", chickenMaxHealth); - } - - public boolean codRidable = false; - public boolean codControllable = true; ++ } ++ + public double codMaxHealth = 3.0D; - private void codSettings() { - codRidable = getBoolean("mobs.cod.ridable", codRidable); - codControllable = getBoolean("mobs.cod.controllable", codControllable); ++ private void codSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.cod.attributes.max-health", codMaxHealth); + set("mobs.cod.attributes.max-health", null); + set("mobs.cod.attributes.max_health", oldValue); + } + codMaxHealth = getDouble("mobs.cod.attributes.max_health", codMaxHealth); - } - - public boolean cowRidable = false; - public boolean cowRidableInWater = true; - public boolean cowControllable = true; ++ } ++ + public double cowMaxHealth = 10.0D; - private void cowSettings() { - cowRidable = getBoolean("mobs.cow.ridable", cowRidable); - cowRidableInWater = getBoolean("mobs.cow.ridable-in-water", cowRidableInWater); - cowControllable = getBoolean("mobs.cow.controllable", cowControllable); ++ private void cowSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.cow.attributes.max-health", cowMaxHealth); + set("mobs.cow.attributes.max-health", null); + set("mobs.cow.attributes.max_health", oldValue); + } + cowMaxHealth = getDouble("mobs.cow.attributes.max_health", cowMaxHealth); - } - - public boolean creeperRidable = false; - public boolean creeperRidableInWater = true; - public boolean creeperControllable = true; ++ } ++ + public double creeperMaxHealth = 20.0D; - private void creeperSettings() { - creeperRidable = getBoolean("mobs.creeper.ridable", creeperRidable); - creeperRidableInWater = getBoolean("mobs.creeper.ridable-in-water", creeperRidableInWater); - creeperControllable = getBoolean("mobs.creeper.controllable", creeperControllable); ++ private void creeperSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.creeper.attributes.max-health", creeperMaxHealth); + set("mobs.creeper.attributes.max-health", null); + set("mobs.creeper.attributes.max_health", oldValue); + } + creeperMaxHealth = getDouble("mobs.creeper.attributes.max_health", creeperMaxHealth); - } - - public boolean dolphinRidable = false; -@@ -209,80 +296,161 @@ public class PurpurWorldConfig { - public int dolphinSpitCooldown = 20; - public float dolphinSpitSpeed = 1.0F; - public float dolphinSpitDamage = 2.0F; ++ } ++ + public double dolphinMaxHealth = 10.0D; - private void dolphinSettings() { - dolphinRidable = getBoolean("mobs.dolphin.ridable", dolphinRidable); - dolphinControllable = getBoolean("mobs.dolphin.controllable", dolphinControllable); - dolphinSpitCooldown = getInt("mobs.dolphin.spit.cooldown", dolphinSpitCooldown); - dolphinSpitSpeed = (float) getDouble("mobs.dolphin.spit.speed", dolphinSpitSpeed); - dolphinSpitDamage = (float) getDouble("mobs.dolphin.spit.damage", dolphinSpitDamage); ++ private void dolphinSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.dolphin.attributes.max-health", dolphinMaxHealth); + set("mobs.dolphin.attributes.max-health", null); + set("mobs.dolphin.attributes.max_health", oldValue); + } + dolphinMaxHealth = getDouble("mobs.dolphin.attributes.max_health", dolphinMaxHealth); - } - - public boolean donkeyRidableInWater = false; ++ } ++ + public double donkeyMaxHealthMin = 15.0D; + public double donkeyMaxHealthMax = 30.0D; + public double donkeyJumpStrengthMin = 0.5D; + public double donkeyJumpStrengthMax = 0.5D; + public double donkeyMovementSpeedMin = 0.175D; + public double donkeyMovementSpeedMax = 0.175D; - private void donkeySettings() { - donkeyRidableInWater = getBoolean("mobs.donkey.ridable-in-water", donkeyRidableInWater); ++ private void donkeySettings() { + if (PurpurConfig.version < 10) { + double oldMin = getDouble("mobs.donkey.attributes.max-health.min", donkeyMaxHealthMin); + double oldMax = getDouble("mobs.donkey.attributes.max-health.max", donkeyMaxHealthMax); @@ -1730,17 +1666,11 @@ index ec168b917d60cc6d8c48620eb4dcd89b0b121aea..46b6994812086405f20a4dd410c1d796 + 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); - } - - public boolean drownedRidable = false; - public boolean drownedRidableInWater = true; - public boolean drownedControllable = true; ++ } ++ + public double drownedMaxHealth = 20.0D; + public double drownedSpawnReinforcements = 0.1D; - private void drownedSettings() { - drownedRidable = getBoolean("mobs.drowned.ridable", drownedRidable); - drownedRidableInWater = getBoolean("mobs.drowned.ridable-in-water", drownedRidableInWater); - drownedControllable = getBoolean("mobs.drowned.controllable", drownedControllable); ++ private void drownedSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.drowned.attributes.max-health", drownedMaxHealth); + set("mobs.drowned.attributes.max-health", null); @@ -1748,32 +1678,20 @@ index ec168b917d60cc6d8c48620eb4dcd89b0b121aea..46b6994812086405f20a4dd410c1d796 + } + drownedMaxHealth = getDouble("mobs.drowned.attributes.max_health", drownedMaxHealth); + drownedSpawnReinforcements = getDouble("mobs.drowned.attributes.spawn_reinforcements", drownedSpawnReinforcements); - } - - public boolean elderGuardianRidable = false; - public boolean elderGuardianControllable = true; ++ } ++ + public double elderGuardianMaxHealth = 80.0D; - private void elderGuardianSettings() { - elderGuardianRidable = getBoolean("mobs.elder_guardian.ridable", elderGuardianRidable); - elderGuardianControllable = getBoolean("mobs.elder_guardian.controllable", elderGuardianControllable); ++ private void elderGuardianSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.elder_guardian.attributes.max-health", elderGuardianMaxHealth); + set("mobs.elder_guardian.attributes.max-health", null); + set("mobs.elder_guardian.attributes.max_health", oldValue); + } + elderGuardianMaxHealth = getDouble("mobs.elder_guardian.attributes.max_health", elderGuardianMaxHealth); - } - - public boolean enderDragonRidable = false; - public boolean enderDragonRidableInWater = true; - public boolean enderDragonControllable = true; - public double enderDragonMaxY = 320D; ++ } ++ + public double enderDragonMaxHealth = 200.0D; - private void enderDragonSettings() { - enderDragonRidable = getBoolean("mobs.ender_dragon.ridable", enderDragonRidable); - enderDragonRidableInWater = getBoolean("mobs.ender_dragon.ridable-in-water", enderDragonRidableInWater); - enderDragonControllable = getBoolean("mobs.ender_dragon.controllable", enderDragonControllable); - enderDragonMaxY = getDouble("mobs.ender_dragon.ridable-max-y", enderDragonMaxY); ++ private void enderDragonSettings() { + if (PurpurConfig.version < 8) { + double oldValue = getDouble("mobs.ender_dragon.max-health", enderDragonMaxHealth); + set("mobs.ender_dragon.max-health", null); @@ -1784,101 +1702,62 @@ index ec168b917d60cc6d8c48620eb4dcd89b0b121aea..46b6994812086405f20a4dd410c1d796 + set("mobs.ender_dragon.attributes.max_health", oldValue); + } + enderDragonMaxHealth = getDouble("mobs.ender_dragon.attributes.max_health", enderDragonMaxHealth); - } - - public boolean endermanRidable = false; - public boolean endermanRidableInWater = true; - public boolean endermanControllable = true; ++ } ++ + public double endermanMaxHealth = 40.0D; - private void endermanSettings() { - endermanRidable = getBoolean("mobs.enderman.ridable", endermanRidable); - endermanRidableInWater = getBoolean("mobs.enderman.ridable-in-water", endermanRidableInWater); - endermanControllable = getBoolean("mobs.enderman.controllable", endermanControllable); ++ private void endermanSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.enderman.attributes.max-health", endermanMaxHealth); + set("mobs.enderman.attributes.max-health", null); + set("mobs.enderman.attributes.max_health", oldValue); + } + endermanMaxHealth = getDouble("mobs.enderman.attributes.max_health", endermanMaxHealth); - } - - public boolean endermiteRidable = false; - public boolean endermiteRidableInWater = true; - public boolean endermiteControllable = true; ++ } ++ + public double endermiteMaxHealth = 8.0D; - private void endermiteSettings() { - endermiteRidable = getBoolean("mobs.endermite.ridable", endermiteRidable); - endermiteRidableInWater = getBoolean("mobs.endermite.ridable-in-water", endermiteRidableInWater); - endermiteControllable = getBoolean("mobs.endermite.controllable", endermiteControllable); ++ private void endermiteSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.endermite.attributes.max-health", endermiteMaxHealth); + set("mobs.endermite.attributes.max-health", null); + set("mobs.endermite.attributes.max_health", oldValue); + } + endermiteMaxHealth = getDouble("mobs.endermite.attributes.max_health", endermiteMaxHealth); - } - - public boolean evokerRidable = false; - public boolean evokerRidableInWater = true; - public boolean evokerControllable = true; ++ } ++ + public double evokerMaxHealth = 24.0D; - private void evokerSettings() { - evokerRidable = getBoolean("mobs.evoker.ridable", evokerRidable); - evokerRidableInWater = getBoolean("mobs.evoker.ridable-in-water", evokerRidableInWater); - evokerControllable = getBoolean("mobs.evoker.controllable", evokerControllable); ++ private void evokerSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.evoker.attributes.max-health", evokerMaxHealth); + set("mobs.evoker.attributes.max-health", null); + set("mobs.evoker.attributes.max_health", oldValue); + } + evokerMaxHealth = getDouble("mobs.evoker.attributes.max_health", evokerMaxHealth); - } - - public boolean foxRidable = false; - public boolean foxRidableInWater = true; - public boolean foxControllable = true; ++ } ++ + public double foxMaxHealth = 10.0D; - private void foxSettings() { - foxRidable = getBoolean("mobs.fox.ridable", foxRidable); - foxRidableInWater = getBoolean("mobs.fox.ridable-in-water", foxRidableInWater); - foxControllable = getBoolean("mobs.fox.controllable", foxControllable); ++ private void foxSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.fox.attributes.max-health", foxMaxHealth); + set("mobs.fox.attributes.max-health", null); + set("mobs.fox.attributes.max_health", oldValue); + } + foxMaxHealth = getDouble("mobs.fox.attributes.max_health", foxMaxHealth); - } - - public boolean frogRidable = false; -@@ -300,147 +468,316 @@ public class PurpurWorldConfig { - public boolean ghastRidableInWater = true; - public boolean ghastControllable = true; - public double ghastMaxY = 320D; ++ } ++ + public double ghastMaxHealth = 10.0D; - private void ghastSettings() { - ghastRidable = getBoolean("mobs.ghast.ridable", ghastRidable); - ghastRidableInWater = getBoolean("mobs.ghast.ridable-in-water", ghastRidableInWater); - ghastControllable = getBoolean("mobs.ghast.controllable", ghastControllable); - ghastMaxY = getDouble("mobs.ghast.ridable-max-y", ghastMaxY); ++ private void ghastSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.ghast.attributes.max-health", ghastMaxHealth); + set("mobs.ghast.attributes.max-health", null); + set("mobs.ghast.attributes.max_health", oldValue); + } + ghastMaxHealth = getDouble("mobs.ghast.attributes.max_health", ghastMaxHealth); - } - - public boolean giantRidable = false; - public boolean giantRidableInWater = true; - public boolean giantControllable = true; ++ } ++ + public double giantMovementSpeed = 0.5D; + public double giantAttackDamage = 50.0D; + public double giantMaxHealth = 100.0D; - private void giantSettings() { - giantRidable = getBoolean("mobs.giant.ridable", giantRidable); - giantRidableInWater = getBoolean("mobs.giant.ridable-in-water", giantRidableInWater); - giantControllable = getBoolean("mobs.giant.controllable", giantControllable); ++ private void giantSettings() { + giantMovementSpeed = getDouble("mobs.giant.movement-speed", giantMovementSpeed); + giantAttackDamage = getDouble("mobs.giant.attack-damage", giantAttackDamage); + if (PurpurConfig.version < 8) { @@ -1891,67 +1770,45 @@ index ec168b917d60cc6d8c48620eb4dcd89b0b121aea..46b6994812086405f20a4dd410c1d796 + set("mobs.giant.attributes.max_health", oldValue); + } + giantMaxHealth = getDouble("mobs.giant.attributes.max_health", giantMaxHealth); - } - - public boolean glowSquidRidable = false; - public boolean glowSquidControllable = true; ++ } ++ + public double glowSquidMaxHealth = 10.0D; - private void glowSquidSettings() { - glowSquidRidable = getBoolean("mobs.glow_squid.ridable", glowSquidRidable); - glowSquidControllable = getBoolean("mobs.glow_squid.controllable", glowSquidControllable); ++ private void glowSquidSettings() { + glowSquidMaxHealth = getDouble("mobs.glow_squid.attributes.max_health", glowSquidMaxHealth); - } - - public boolean goatRidable = false; - public boolean goatRidableInWater = true; - public boolean goatControllable = true; ++ } ++ + public double goatMaxHealth = 10.0D; - private void goatSettings() { - goatRidable = getBoolean("mobs.goat.ridable", goatRidable); - goatRidableInWater = getBoolean("mobs.goat.ridable-in-water", goatRidableInWater); - goatControllable = getBoolean("mobs.goat.controllable", goatControllable); ++ private void goatSettings() { + goatMaxHealth = getDouble("mobs.goat.attributes.max_health", goatMaxHealth); - } - - public boolean guardianRidable = false; - public boolean guardianControllable = true; ++ } ++ + public double guardianMaxHealth = 30.0D; - private void guardianSettings() { - guardianRidable = getBoolean("mobs.guardian.ridable", guardianRidable); - guardianControllable = getBoolean("mobs.guardian.controllable", guardianControllable); ++ private void guardianSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.guardian.attributes.max-health", guardianMaxHealth); + set("mobs.guardian.attributes.max-health", null); + set("mobs.guardian.attributes.max_health", oldValue); + } + guardianMaxHealth = getDouble("mobs.guardian.attributes.max_health", guardianMaxHealth); - } - - public boolean hoglinRidable = false; - public boolean hoglinRidableInWater = true; - public boolean hoglinControllable = true; ++ } ++ + public double hoglinMaxHealth = 40.0D; - private void hoglinSettings() { - hoglinRidable = getBoolean("mobs.hoglin.ridable", hoglinRidable); - hoglinRidableInWater = getBoolean("mobs.hoglin.ridable-in-water", hoglinRidableInWater); - hoglinControllable = getBoolean("mobs.hoglin.controllable", hoglinControllable); ++ private void hoglinSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.hoglin.attributes.max-health", hoglinMaxHealth); + set("mobs.hoglin.attributes.max-health", null); + set("mobs.hoglin.attributes.max_health", oldValue); + } + hoglinMaxHealth = getDouble("mobs.hoglin.attributes.max_health", hoglinMaxHealth); - } - - public boolean horseRidableInWater = false; ++ } ++ + public double horseMaxHealthMin = 15.0D; + public double horseMaxHealthMax = 30.0D; + public double horseJumpStrengthMin = 0.4D; + public double horseJumpStrengthMax = 1.0D; + public double horseMovementSpeedMin = 0.1125D; + public double horseMovementSpeedMax = 0.3375D; - private void horseSettings() { - horseRidableInWater = getBoolean("mobs.horse.ridable-in-water", horseRidableInWater); ++ private void horseSettings() { + if (PurpurConfig.version < 10) { + double oldMin = getDouble("mobs.horse.attributes.max-health.min", horseMaxHealthMin); + double oldMax = getDouble("mobs.horse.attributes.max-health.max", horseMaxHealthMax); @@ -1965,17 +1822,11 @@ index ec168b917d60cc6d8c48620eb4dcd89b0b121aea..46b6994812086405f20a4dd410c1d796 + 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); - } - - public boolean huskRidable = false; - public boolean huskRidableInWater = true; - public boolean huskControllable = true; ++ } ++ + public double huskMaxHealth = 20.0D; + public double huskSpawnReinforcements = 0.1D; - private void huskSettings() { - huskRidable = getBoolean("mobs.husk.ridable", huskRidable); - huskRidableInWater = getBoolean("mobs.husk.ridable-in-water", huskRidableInWater); - huskControllable = getBoolean("mobs.husk.controllable", huskControllable); ++ private void huskSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.husk.attributes.max-health", huskMaxHealth); + set("mobs.husk.attributes.max-health", null); @@ -1983,18 +1834,12 @@ index ec168b917d60cc6d8c48620eb4dcd89b0b121aea..46b6994812086405f20a4dd410c1d796 + } + huskMaxHealth = getDouble("mobs.husk.attributes.max_health", huskMaxHealth); + huskSpawnReinforcements = getDouble("mobs.husk.attributes.spawn_reinforcements", huskSpawnReinforcements); - } - - public boolean illusionerRidable = false; - public boolean illusionerRidableInWater = true; - public boolean illusionerControllable = true; ++ } ++ + public double illusionerMovementSpeed = 0.5D; + public double illusionerFollowRange = 18.0D; + public double illusionerMaxHealth = 32.0D; - private void illusionerSettings() { - illusionerRidable = getBoolean("mobs.illusioner.ridable", illusionerRidable); - illusionerRidableInWater = getBoolean("mobs.illusioner.ridable-in-water", illusionerRidableInWater); - illusionerControllable = getBoolean("mobs.illusioner.controllable", illusionerControllable); ++ private void illusionerSettings() { + illusionerMovementSpeed = getDouble("mobs.illusioner.movement-speed", illusionerMovementSpeed); + illusionerFollowRange = getDouble("mobs.illusioner.follow-range", illusionerFollowRange); + if (PurpurConfig.version < 8) { @@ -2007,39 +1852,31 @@ index ec168b917d60cc6d8c48620eb4dcd89b0b121aea..46b6994812086405f20a4dd410c1d796 + set("mobs.illusioner.attributes.max_health", oldValue); + } + illusionerMaxHealth = getDouble("mobs.illusioner.attributes.max_health", illusionerMaxHealth); - } - - public boolean ironGolemRidable = false; - public boolean ironGolemRidableInWater = true; - public boolean ironGolemControllable = true; - public boolean ironGolemCanSwim = false; ++ } ++ + public double ironGolemMaxHealth = 100.0D; - private void ironGolemSettings() { - ironGolemRidable = getBoolean("mobs.iron_golem.ridable", ironGolemRidable); - ironGolemRidableInWater = getBoolean("mobs.iron_golem.ridable-in-water", ironGolemRidableInWater); - ironGolemControllable = getBoolean("mobs.iron_golem.controllable", ironGolemControllable); - ironGolemCanSwim = getBoolean("mobs.iron_golem.can-swim", ironGolemCanSwim); ++ private void ironGolemSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.iron_golem.attributes.max-health", ironGolemMaxHealth); + set("mobs.iron_golem.attributes.max-health", null); + set("mobs.iron_golem.attributes.max_health", oldValue); + } + ironGolemMaxHealth = getDouble("mobs.iron_golem.attributes.max_health", ironGolemMaxHealth); - } - - public boolean llamaRidable = false; - public boolean llamaRidableInWater = false; - public boolean llamaControllable = true; ++ } ++ ++ public boolean llamaRidable = false; ++ public boolean llamaRidableInWater = false; ++ public boolean llamaControllable = true; + public double llamaMaxHealthMin = 15.0D; + public double llamaMaxHealthMax = 30.0D; + public double llamaJumpStrengthMin = 0.5D; + public double llamaJumpStrengthMax = 0.5D; + public double llamaMovementSpeedMin = 0.175D; + public double llamaMovementSpeedMax = 0.175D; - private void llamaSettings() { - llamaRidable = getBoolean("mobs.llama.ridable", llamaRidable); - llamaRidableInWater = getBoolean("mobs.llama.ridable-in-water", llamaRidableInWater); - llamaControllable = getBoolean("mobs.llama.controllable", llamaControllable); ++ private void llamaSettings() { ++ llamaRidable = getBoolean("mobs.llama.ridable", llamaRidable); ++ llamaRidableInWater = getBoolean("mobs.llama.ridable-in-water", llamaRidableInWater); ++ llamaControllable = getBoolean("mobs.llama.controllable", llamaControllable); + if (PurpurConfig.version < 10) { + double oldMin = getDouble("mobs.llama.attributes.max-health.min", llamaMaxHealthMin); + double oldMax = getDouble("mobs.llama.attributes.max-health.max", llamaMaxHealthMax); @@ -2053,19 +1890,13 @@ index ec168b917d60cc6d8c48620eb4dcd89b0b121aea..46b6994812086405f20a4dd410c1d796 + 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); - } - - public boolean magmaCubeRidable = false; - public boolean magmaCubeRidableInWater = true; - public boolean magmaCubeControllable = true; ++ } ++ + public String magmaCubeMaxHealth = "size * size"; + public String magmaCubeAttackDamage = "size"; + public Map magmaCubeMaxHealthCache = new HashMap<>(); + public Map magmaCubeAttackDamageCache = new HashMap<>(); - private void magmaCubeSettings() { - magmaCubeRidable = getBoolean("mobs.magma_cube.ridable", magmaCubeRidable); - magmaCubeRidableInWater = getBoolean("mobs.magma_cube.ridable-in-water", magmaCubeRidableInWater); - magmaCubeControllable = getBoolean("mobs.magma_cube.controllable", magmaCubeControllable); ++ private void magmaCubeSettings() { + if (PurpurConfig.version < 10) { + String oldValue = getString("mobs.magma_cube.attributes.max-health", magmaCubeMaxHealth); + set("mobs.magma_cube.attributes.max-health", null); @@ -2075,33 +1906,25 @@ index ec168b917d60cc6d8c48620eb4dcd89b0b121aea..46b6994812086405f20a4dd410c1d796 + magmaCubeAttackDamage = getString("mobs.magma_cube.attributes.attack_damage", magmaCubeAttackDamage); + magmaCubeMaxHealthCache.clear(); + magmaCubeAttackDamageCache.clear(); - } - - public boolean mooshroomRidable = false; - public boolean mooshroomRidableInWater = true; - public boolean mooshroomControllable = true; ++ } ++ + public double mooshroomMaxHealth = 10.0D; - private void mooshroomSettings() { - mooshroomRidable = getBoolean("mobs.mooshroom.ridable", mooshroomRidable); - mooshroomRidableInWater = getBoolean("mobs.mooshroom.ridable-in-water", mooshroomRidableInWater); - mooshroomControllable = getBoolean("mobs.mooshroom.controllable", mooshroomControllable); ++ private void mooshroomSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.mooshroom.attributes.max-health", mooshroomMaxHealth); + set("mobs.mooshroom.attributes.max-health", null); + set("mobs.mooshroom.attributes.max_health", oldValue); + } + mooshroomMaxHealth = getDouble("mobs.mooshroom.attributes.max_health", mooshroomMaxHealth); - } - - public boolean muleRidableInWater = false; ++ } ++ + public double muleMaxHealthMin = 15.0D; + public double muleMaxHealthMax = 30.0D; + public double muleJumpStrengthMin = 0.5D; + public double muleJumpStrengthMax = 0.5D; + public double muleMovementSpeedMin = 0.175D; + public double muleMovementSpeedMax = 0.175D; - private void muleSettings() { - muleRidableInWater = getBoolean("mobs.mule.ridable-in-water", muleRidableInWater); ++ private void muleSettings() { + if (PurpurConfig.version < 10) { + double oldMin = getDouble("mobs.mule.attributes.max-health.min", muleMaxHealthMin); + double oldMax = getDouble("mobs.mule.attributes.max-health.max", muleMaxHealthMax); @@ -2115,74 +1938,43 @@ index ec168b917d60cc6d8c48620eb4dcd89b0b121aea..46b6994812086405f20a4dd410c1d796 + 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); - } - - public boolean ocelotRidable = false; - public boolean ocelotRidableInWater = true; - public boolean ocelotControllable = true; ++ } ++ + public double ocelotMaxHealth = 10.0D; - private void ocelotSettings() { - ocelotRidable = getBoolean("mobs.ocelot.ridable", ocelotRidable); - ocelotRidableInWater = getBoolean("mobs.ocelot.ridable-in-water", ocelotRidableInWater); - ocelotControllable = getBoolean("mobs.ocelot.controllable", ocelotControllable); ++ private void ocelotSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.ocelot.attributes.max-health", ocelotMaxHealth); + set("mobs.ocelot.attributes.max-health", null); + set("mobs.ocelot.attributes.max_health", oldValue); + } + ocelotMaxHealth = getDouble("mobs.ocelot.attributes.max_health", ocelotMaxHealth); - } - - public boolean pandaRidable = false; - public boolean pandaRidableInWater = true; - public boolean pandaControllable = true; ++ } ++ + public double pandaMaxHealth = 20.0D; - private void pandaSettings() { - pandaRidable = getBoolean("mobs.panda.ridable", pandaRidable); - pandaRidableInWater = getBoolean("mobs.panda.ridable-in-water", pandaRidableInWater); - pandaControllable = getBoolean("mobs.panda.controllable", pandaControllable); ++ private void pandaSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.panda.attributes.max-health", pandaMaxHealth); + set("mobs.panda.attributes.max-health", null); + set("mobs.panda.attributes.max_health", oldValue); + } + pandaMaxHealth = getDouble("mobs.panda.attributes.max_health", pandaMaxHealth); - } - - public boolean parrotRidable = false; - public boolean parrotRidableInWater = true; - public boolean parrotControllable = true; - public double parrotMaxY = 320D; ++ } ++ + public double parrotMaxHealth = 6.0D; - private void parrotSettings() { - parrotRidable = getBoolean("mobs.parrot.ridable", parrotRidable); - parrotRidableInWater = getBoolean("mobs.parrot.ridable-in-water", parrotRidableInWater); - parrotControllable = getBoolean("mobs.parrot.controllable", parrotControllable); - parrotMaxY = getDouble("mobs.parrot.ridable-max-y", parrotMaxY); ++ private void parrotSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.parrot.attributes.max-health", parrotMaxHealth); + set("mobs.parrot.attributes.max-health", null); + set("mobs.parrot.attributes.max_health", oldValue); + } + parrotMaxHealth = getDouble("mobs.parrot.attributes.max_health", parrotMaxHealth); - } - - public boolean phantomRidable = false; -@@ -450,6 +787,10 @@ public class PurpurWorldConfig { - public float phantomFlameDamage = 1.0F; - public int phantomFlameFireTime = 8; - public boolean phantomAllowGriefing = false; ++ } ++ + public String phantomMaxHealth = "20.0"; + public String phantomAttackDamage = "6 + size"; + public Map phantomMaxHealthCache = new HashMap<>(); + public Map phantomAttackDamageCache = new HashMap<>(); - private void phantomSettings() { - phantomRidable = getBoolean("mobs.phantom.ridable", phantomRidable); - phantomRidableInWater = getBoolean("mobs.phantom.ridable-in-water", phantomRidableInWater); -@@ -458,189 +799,361 @@ public class PurpurWorldConfig { - phantomFlameDamage = (float) getDouble("mobs.phantom.flames.damage", phantomFlameDamage); - phantomFlameFireTime = getInt("mobs.phantom.flames.fire-time", phantomFlameFireTime); - phantomAllowGriefing = getBoolean("mobs.phantom.allow-griefing", phantomAllowGriefing); ++ private void phantomSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.phantom.attributes.max-health", Double.parseDouble(phantomMaxHealth)); + set("mobs.phantom.attributes.max-health", null); @@ -2196,223 +1988,145 @@ index ec168b917d60cc6d8c48620eb4dcd89b0b121aea..46b6994812086405f20a4dd410c1d796 + phantomAttackDamage = getString("mobs.phantom.attributes.attack_damage", phantomAttackDamage); + phantomMaxHealthCache.clear(); + phantomAttackDamageCache.clear(); - } - - public boolean pigRidable = false; - public boolean pigRidableInWater = false; - public boolean pigControllable = true; ++ } ++ + public double pigMaxHealth = 10.0D; - private void pigSettings() { - pigRidable = getBoolean("mobs.pig.ridable", pigRidable); - pigRidableInWater = getBoolean("mobs.pig.ridable-in-water", pigRidableInWater); - pigControllable = getBoolean("mobs.pig.controllable", pigControllable); ++ private void pigSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.pig.attributes.max-health", pigMaxHealth); + set("mobs.pig.attributes.max-health", null); + set("mobs.pig.attributes.max_health", oldValue); + } + pigMaxHealth = getDouble("mobs.pig.attributes.max_health", pigMaxHealth); - } - - public boolean piglinRidable = false; - public boolean piglinRidableInWater = true; - public boolean piglinControllable = true; ++ } ++ + public double piglinMaxHealth = 16.0D; - private void piglinSettings() { - piglinRidable = getBoolean("mobs.piglin.ridable", piglinRidable); - piglinRidableInWater = getBoolean("mobs.piglin.ridable-in-water", piglinRidableInWater); - piglinControllable = getBoolean("mobs.piglin.controllable", piglinControllable); ++ private void piglinSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.piglin.attributes.max-health", piglinMaxHealth); + set("mobs.piglin.attributes.max-health", null); + set("mobs.piglin.attributes.max_health", oldValue); + } + piglinMaxHealth = getDouble("mobs.piglin.attributes.max_health", piglinMaxHealth); - } - - public boolean piglinBruteRidable = false; - public boolean piglinBruteRidableInWater = true; - public boolean piglinBruteControllable = true; ++ } ++ + public double piglinBruteMaxHealth = 50.0D; - private void piglinBruteSettings() { - piglinBruteRidable = getBoolean("mobs.piglin_brute.ridable", piglinBruteRidable); - piglinBruteRidableInWater = getBoolean("mobs.piglin_brute.ridable-in-water", piglinBruteRidableInWater); - piglinBruteControllable = getBoolean("mobs.piglin_brute.controllable", piglinBruteControllable); ++ private void piglinBruteSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.piglin_brute.attributes.max-health", piglinBruteMaxHealth); + set("mobs.piglin_brute.attributes.max-health", null); + set("mobs.piglin_brute.attributes.max_health", oldValue); + } + piglinBruteMaxHealth = getDouble("mobs.piglin_brute.attributes.max_health", piglinBruteMaxHealth); - } - - public boolean pillagerRidable = false; - public boolean pillagerRidableInWater = true; - public boolean pillagerControllable = true; ++ } ++ + public double pillagerMaxHealth = 24.0D; - private void pillagerSettings() { - pillagerRidable = getBoolean("mobs.pillager.ridable", pillagerRidable); - pillagerRidableInWater = getBoolean("mobs.pillager.ridable-in-water", pillagerRidableInWater); - pillagerControllable = getBoolean("mobs.pillager.controllable", pillagerControllable); ++ private void pillagerSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.pillager.attributes.max-health", pillagerMaxHealth); + set("mobs.pillager.attributes.max-health", null); + set("mobs.pillager.attributes.max_health", oldValue); + } + pillagerMaxHealth = getDouble("mobs.pillager.attributes.max_health", pillagerMaxHealth); - } - - public boolean polarBearRidable = false; - public boolean polarBearRidableInWater = true; - public boolean polarBearControllable = true; ++ } ++ + public double polarBearMaxHealth = 30.0D; - private void polarBearSettings() { - polarBearRidable = getBoolean("mobs.polar_bear.ridable", polarBearRidable); - polarBearRidableInWater = getBoolean("mobs.polar_bear.ridable-in-water", polarBearRidableInWater); - polarBearControllable = getBoolean("mobs.polar_bear.controllable", polarBearControllable); ++ private void polarBearSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.polar_bear.attributes.max-health", polarBearMaxHealth); + set("mobs.polar_bear.attributes.max-health", null); + set("mobs.polar_bear.attributes.max_health", oldValue); + } + polarBearMaxHealth = getDouble("mobs.polar_bear.attributes.max_health", polarBearMaxHealth); - } - - public boolean pufferfishRidable = false; - public boolean pufferfishControllable = true; ++ } ++ + public double pufferfishMaxHealth = 3.0D; - private void pufferfishSettings() { - pufferfishRidable = getBoolean("mobs.pufferfish.ridable", pufferfishRidable); - pufferfishControllable = getBoolean("mobs.pufferfish.controllable", pufferfishControllable); ++ private void pufferfishSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.pufferfish.attributes.max-health", pufferfishMaxHealth); + set("mobs.pufferfish.attributes.max-health", null); + set("mobs.pufferfish.attributes.max_health", oldValue); + } + pufferfishMaxHealth = getDouble("mobs.pufferfish.attributes.max_health", pufferfishMaxHealth); - } - - public boolean rabbitRidable = false; - public boolean rabbitRidableInWater = true; - public boolean rabbitControllable = true; ++ } ++ + public double rabbitMaxHealth = 3.0D; - private void rabbitSettings() { - rabbitRidable = getBoolean("mobs.rabbit.ridable", rabbitRidable); - rabbitRidableInWater = getBoolean("mobs.rabbit.ridable-in-water", rabbitRidableInWater); - rabbitControllable = getBoolean("mobs.rabbit.controllable", rabbitControllable); ++ private void rabbitSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.rabbit.attributes.max-health", rabbitMaxHealth); + set("mobs.rabbit.attributes.max-health", null); + set("mobs.rabbit.attributes.max_health", oldValue); + } + rabbitMaxHealth = getDouble("mobs.rabbit.attributes.max_health", rabbitMaxHealth); - } - - public boolean ravagerRidable = false; - public boolean ravagerRidableInWater = false; - public boolean ravagerControllable = true; ++ } ++ + public double ravagerMaxHealth = 100.0D; - private void ravagerSettings() { - ravagerRidable = getBoolean("mobs.ravager.ridable", ravagerRidable); - ravagerRidableInWater = getBoolean("mobs.ravager.ridable-in-water", ravagerRidableInWater); - ravagerControllable = getBoolean("mobs.ravager.controllable", ravagerControllable); ++ private void ravagerSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.ravager.attributes.max-health", ravagerMaxHealth); + set("mobs.ravager.attributes.max-health", null); + set("mobs.ravager.attributes.max_health", oldValue); + } + ravagerMaxHealth = getDouble("mobs.ravager.attributes.max_health", ravagerMaxHealth); - } - - public boolean salmonRidable = false; - public boolean salmonControllable = true; ++ } ++ + public double salmonMaxHealth = 3.0D; - private void salmonSettings() { - salmonRidable = getBoolean("mobs.salmon.ridable", salmonRidable); - salmonControllable = getBoolean("mobs.salmon.controllable", salmonControllable); ++ private void salmonSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.salmon.attributes.max-health", salmonMaxHealth); + set("mobs.salmon.attributes.max-health", null); + set("mobs.salmon.attributes.max_health", oldValue); + } + salmonMaxHealth = getDouble("mobs.salmon.attributes.max_health", salmonMaxHealth); - } - - public boolean sheepRidable = false; - public boolean sheepRidableInWater = true; - public boolean sheepControllable = true; ++ } ++ + public double sheepMaxHealth = 8.0D; - private void sheepSettings() { - sheepRidable = getBoolean("mobs.sheep.ridable", sheepRidable); - sheepRidableInWater = getBoolean("mobs.sheep.ridable-in-water", sheepRidableInWater); - sheepControllable = getBoolean("mobs.sheep.controllable", sheepControllable); ++ private void sheepSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.sheep.attributes.max-health", sheepMaxHealth); + set("mobs.sheep.attributes.max-health", null); + set("mobs.sheep.attributes.max_health", oldValue); + } + sheepMaxHealth = getDouble("mobs.sheep.attributes.max_health", sheepMaxHealth); - } - - public boolean shulkerRidable = false; - public boolean shulkerRidableInWater = true; - public boolean shulkerControllable = true; ++ } ++ + public double shulkerMaxHealth = 30.0D; - private void shulkerSettings() { - shulkerRidable = getBoolean("mobs.shulker.ridable", shulkerRidable); - shulkerRidableInWater = getBoolean("mobs.shulker.ridable-in-water", shulkerRidableInWater); - shulkerControllable = getBoolean("mobs.shulker.controllable", shulkerControllable); ++ private void shulkerSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.shulker.attributes.max-health", shulkerMaxHealth); + set("mobs.shulker.attributes.max-health", null); + set("mobs.shulker.attributes.max_health", oldValue); + } + shulkerMaxHealth = getDouble("mobs.shulker.attributes.max_health", shulkerMaxHealth); - } - - public boolean silverfishRidable = false; - public boolean silverfishRidableInWater = true; - public boolean silverfishControllable = true; ++ } ++ + public double silverfishMaxHealth = 8.0D; - private void silverfishSettings() { - silverfishRidable = getBoolean("mobs.silverfish.ridable", silverfishRidable); - silverfishRidableInWater = getBoolean("mobs.silverfish.ridable-in-water", silverfishRidableInWater); - silverfishControllable = getBoolean("mobs.silverfish.controllable", silverfishControllable); ++ private void silverfishSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.silverfish.attributes.max-health", silverfishMaxHealth); + set("mobs.silverfish.attributes.max-health", null); + set("mobs.silverfish.attributes.max_health", oldValue); + } + silverfishMaxHealth = getDouble("mobs.silverfish.attributes.max_health", silverfishMaxHealth); - } - - public boolean skeletonRidable = false; - public boolean skeletonRidableInWater = true; - public boolean skeletonControllable = true; ++ } ++ + public double skeletonMaxHealth = 20.0D; - private void skeletonSettings() { - skeletonRidable = getBoolean("mobs.skeleton.ridable", skeletonRidable); - skeletonRidableInWater = getBoolean("mobs.skeleton.ridable-in-water", skeletonRidableInWater); - skeletonControllable = getBoolean("mobs.skeleton.controllable", skeletonControllable); ++ private void skeletonSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.skeleton.attributes.max-health", skeletonMaxHealth); + set("mobs.skeleton.attributes.max-health", null); + set("mobs.skeleton.attributes.max_health", oldValue); + } + skeletonMaxHealth = getDouble("mobs.skeleton.attributes.max_health", skeletonMaxHealth); - } - - public boolean skeletonHorseRidableInWater = true; - public boolean skeletonHorseCanSwim = false; ++ } ++ + public double skeletonHorseMaxHealthMin = 15.0D; + public double skeletonHorseMaxHealthMax = 15.0D; + public double skeletonHorseJumpStrengthMin = 0.4D; + public double skeletonHorseJumpStrengthMax = 1.0D; + public double skeletonHorseMovementSpeedMin = 0.2D; + public double skeletonHorseMovementSpeedMax = 0.2D; - private void skeletonHorseSettings() { - skeletonHorseRidableInWater = getBoolean("mobs.skeleton_horse.ridable-in-water", skeletonHorseRidableInWater); - skeletonHorseCanSwim = getBoolean("mobs.skeleton_horse.can-swim", skeletonHorseCanSwim); ++ private void skeletonHorseSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.skeleton_horse.attributes.max-health", skeletonHorseMaxHealthMin); + set("mobs.skeleton_horse.attributes.max-health", null); @@ -2425,19 +2139,13 @@ index ec168b917d60cc6d8c48620eb4dcd89b0b121aea..46b6994812086405f20a4dd410c1d796 + 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); - } - - public boolean slimeRidable = false; - public boolean slimeRidableInWater = true; - public boolean slimeControllable = true; ++ } ++ + public String slimeMaxHealth = "size * size"; + public String slimeAttackDamage = "size"; + public Map slimeMaxHealthCache = new HashMap<>(); + public Map slimeAttackDamageCache = new HashMap<>(); - private void slimeSettings() { - slimeRidable = getBoolean("mobs.slime.ridable", slimeRidable); - slimeRidableInWater = getBoolean("mobs.slime.ridable-in-water", slimeRidableInWater); - slimeControllable = getBoolean("mobs.slime.controllable", slimeControllable); ++ private void slimeSettings() { + if (PurpurConfig.version < 10) { + String oldValue = getString("mobs.slime.attributes.max-health", slimeMaxHealth); + set("mobs.slime.attributes.max-health", null); @@ -2447,114 +2155,72 @@ index ec168b917d60cc6d8c48620eb4dcd89b0b121aea..46b6994812086405f20a4dd410c1d796 + slimeAttackDamage = getString("mobs.slime.attributes.attack_damage", slimeAttackDamage); + slimeMaxHealthCache.clear(); + slimeAttackDamageCache.clear(); - } - - public boolean snowGolemRidable = false; - public boolean snowGolemRidableInWater = true; - public boolean snowGolemControllable = true; - public boolean snowGolemLeaveTrailWhenRidden = false; ++ } ++ ++ public boolean snowGolemLeaveTrailWhenRidden = false; + public double snowGolemMaxHealth = 4.0D; - private void snowGolemSettings() { - snowGolemRidable = getBoolean("mobs.snow_golem.ridable", snowGolemRidable); - snowGolemRidableInWater = getBoolean("mobs.snow_golem.ridable-in-water", snowGolemRidableInWater); - snowGolemControllable = getBoolean("mobs.snow_golem.controllable", snowGolemControllable); - snowGolemLeaveTrailWhenRidden = getBoolean("mobs.snow_golem.leave-trail-when-ridden", snowGolemLeaveTrailWhenRidden); ++ private void snowGolemSettings() { ++ snowGolemLeaveTrailWhenRidden = getBoolean("mobs.snow_golem.leave-trail-when-ridden", snowGolemLeaveTrailWhenRidden); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.snow_golem.attributes.max-health", snowGolemMaxHealth); + set("mobs.snow_golem.attributes.max-health", null); + set("mobs.snow_golem.attributes.max_health", oldValue); + } + snowGolemMaxHealth = getDouble("mobs.snow_golem.attributes.max_health", snowGolemMaxHealth); - } - - public boolean snifferRidable = false; - public boolean snifferRidableInWater = true; - public boolean snifferControllable = true; ++ } ++ + public double snifferMaxHealth = 14.0D; - private void snifferSettings() { - snifferRidable = getBoolean("mobs.sniffer.ridable", snifferRidable); - snifferRidableInWater = getBoolean("mobs.sniffer.ridable-in-water", snifferRidableInWater); - snifferControllable = getBoolean("mobs.sniffer.controllable", snifferControllable); ++ private void snifferSettings() { + snifferMaxHealth = getDouble("mobs.sniffer.attributes.max_health", snifferMaxHealth); - } - - public boolean squidRidable = false; - public boolean squidControllable = true; ++ } ++ + public double squidMaxHealth = 10.0D; - private void squidSettings() { - squidRidable = getBoolean("mobs.squid.ridable", squidRidable); - squidControllable = getBoolean("mobs.squid.controllable", squidControllable); ++ private void squidSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.squid.attributes.max-health", squidMaxHealth); + set("mobs.squid.attributes.max-health", null); + set("mobs.squid.attributes.max_health", oldValue); + } + squidMaxHealth = getDouble("mobs.squid.attributes.max_health", squidMaxHealth); - } - - public boolean spiderRidable = false; - public boolean spiderRidableInWater = false; - public boolean spiderControllable = true; ++ } ++ + public double spiderMaxHealth = 16.0D; - private void spiderSettings() { - spiderRidable = getBoolean("mobs.spider.ridable", spiderRidable); - spiderRidableInWater = getBoolean("mobs.spider.ridable-in-water", spiderRidableInWater); - spiderControllable = getBoolean("mobs.spider.controllable", spiderControllable); ++ private void spiderSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.spider.attributes.max-health", spiderMaxHealth); + set("mobs.spider.attributes.max-health", null); + set("mobs.spider.attributes.max_health", oldValue); + } + spiderMaxHealth = getDouble("mobs.spider.attributes.max_health", spiderMaxHealth); - } - - public boolean strayRidable = false; - public boolean strayRidableInWater = true; - public boolean strayControllable = true; ++ } ++ + public double strayMaxHealth = 20.0D; - private void straySettings() { - strayRidable = getBoolean("mobs.stray.ridable", strayRidable); - strayRidableInWater = getBoolean("mobs.stray.ridable-in-water", strayRidableInWater); - strayControllable = getBoolean("mobs.stray.controllable", strayControllable); ++ private void straySettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.stray.attributes.max-health", strayMaxHealth); + set("mobs.stray.attributes.max-health", null); + set("mobs.stray.attributes.max_health", oldValue); + } + strayMaxHealth = getDouble("mobs.stray.attributes.max_health", strayMaxHealth); - } - - public boolean striderRidable = false; - public boolean striderRidableInWater = false; - public boolean striderControllable = true; ++ } ++ + public double striderMaxHealth = 20.0D; - private void striderSettings() { - striderRidable = getBoolean("mobs.strider.ridable", striderRidable); - striderRidableInWater = getBoolean("mobs.strider.ridable-in-water", striderRidableInWater); - striderControllable = getBoolean("mobs.strider.controllable", striderControllable); ++ private void striderSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.strider.attributes.max-health", striderMaxHealth); + set("mobs.strider.attributes.max-health", null); + set("mobs.strider.attributes.max_health", oldValue); + } + striderMaxHealth = getDouble("mobs.strider.attributes.max_health", striderMaxHealth); - } - - public boolean tadpoleRidable = false; -@@ -655,64 +1168,125 @@ public class PurpurWorldConfig { - public boolean traderLlamaRidable = false; - public boolean traderLlamaRidableInWater = false; - public boolean traderLlamaControllable = true; ++ } ++ + public double traderLlamaMaxHealthMin = 15.0D; + public double traderLlamaMaxHealthMax = 30.0D; + public double traderLlamaJumpStrengthMin = 0.5D; + public double traderLlamaJumpStrengthMax = 0.5D; + public double traderLlamaMovementSpeedMin = 0.175D; + public double traderLlamaMovementSpeedMax = 0.175D; - private void traderLlamaSettings() { - traderLlamaRidable = getBoolean("mobs.trader_llama.ridable", traderLlamaRidable); - traderLlamaRidableInWater = getBoolean("mobs.trader_llama.ridable-in-water", traderLlamaRidableInWater); - traderLlamaControllable = getBoolean("mobs.trader_llama.controllable", traderLlamaControllable); ++ private void traderLlamaSettings() { + if (PurpurConfig.version < 10) { + double oldMin = getDouble("mobs.trader_llama.attributes.max-health.min", traderLlamaMaxHealthMin); + double oldMax = getDouble("mobs.trader_llama.attributes.max-health.max", traderLlamaMaxHealthMax); @@ -2568,132 +2234,82 @@ index ec168b917d60cc6d8c48620eb4dcd89b0b121aea..46b6994812086405f20a4dd410c1d796 + 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); - } - - public boolean tropicalFishRidable = false; - public boolean tropicalFishControllable = true; ++ } ++ + public double tropicalFishMaxHealth = 3.0D; - private void tropicalFishSettings() { - tropicalFishRidable = getBoolean("mobs.tropical_fish.ridable", tropicalFishRidable); - tropicalFishControllable = getBoolean("mobs.tropical_fish.controllable", tropicalFishControllable); ++ private void tropicalFishSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.tropical_fish.attributes.max-health", tropicalFishMaxHealth); + set("mobs.tropical_fish.attributes.max-health", null); + set("mobs.tropical_fish.attributes.max_health", oldValue); + } + tropicalFishMaxHealth = getDouble("mobs.tropical_fish.attributes.max_health", tropicalFishMaxHealth); - } - - public boolean turtleRidable = false; - public boolean turtleRidableInWater = true; - public boolean turtleControllable = true; ++ } ++ + public double turtleMaxHealth = 30.0D; - private void turtleSettings() { - turtleRidable = getBoolean("mobs.turtle.ridable", turtleRidable); - turtleRidableInWater = getBoolean("mobs.turtle.ridable-in-water", turtleRidableInWater); - turtleControllable = getBoolean("mobs.turtle.controllable", turtleControllable); ++ private void turtleSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.turtle.attributes.max-health", turtleMaxHealth); + set("mobs.turtle.attributes.max-health", null); + set("mobs.turtle.attributes.max_health", oldValue); + } + turtleMaxHealth = getDouble("mobs.turtle.attributes.max_health", turtleMaxHealth); - } - - public boolean vexRidable = false; - public boolean vexRidableInWater = true; - public boolean vexControllable = true; - public double vexMaxY = 320D; ++ } ++ ++ public double vexMaxY = 320D; + public double vexMaxHealth = 14.0D; - private void vexSettings() { - vexRidable = getBoolean("mobs.vex.ridable", vexRidable); - vexRidableInWater = getBoolean("mobs.vex.ridable-in-water", vexRidableInWater); - vexControllable = getBoolean("mobs.vex.controllable", vexControllable); - vexMaxY = getDouble("mobs.vex.ridable-max-y", vexMaxY); ++ private void vexSettings() { ++ vexMaxY = getDouble("mobs.vex.ridable-max-y", vexMaxY); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.vex.attributes.max-health", vexMaxHealth); + set("mobs.vex.attributes.max-health", null); + set("mobs.vex.attributes.max_health", oldValue); + } + vexMaxHealth = getDouble("mobs.vex.attributes.max_health", vexMaxHealth); - } - - public boolean villagerRidable = false; - public boolean villagerRidableInWater = true; - public boolean villagerControllable = true; ++ } ++ + public double villagerMaxHealth = 20.0D; - private void villagerSettings() { - villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); - villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); - villagerControllable = getBoolean("mobs.villager.controllable", villagerControllable); ++ private void villagerSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.villager.attributes.max-health", villagerMaxHealth); + set("mobs.villager.attributes.max-health", null); + set("mobs.villager.attributes.max_health", oldValue); + } + villagerMaxHealth = getDouble("mobs.villager.attributes.max_health", villagerMaxHealth); - } - - public boolean vindicatorRidable = false; - public boolean vindicatorRidableInWater = true; - public boolean vindicatorControllable = true; ++ } ++ + public double vindicatorMaxHealth = 24.0D; - private void vindicatorSettings() { - vindicatorRidable = getBoolean("mobs.vindicator.ridable", vindicatorRidable); - vindicatorRidableInWater = getBoolean("mobs.vindicator.ridable-in-water", vindicatorRidableInWater); - vindicatorControllable = getBoolean("mobs.vindicator.controllable", vindicatorControllable); ++ private void vindicatorSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.vindicator.attributes.max-health", vindicatorMaxHealth); + set("mobs.vindicator.attributes.max-health", null); + set("mobs.vindicator.attributes.max_health", oldValue); + } + vindicatorMaxHealth = getDouble("mobs.vindicator.attributes.max_health", vindicatorMaxHealth); - } - - public boolean wanderingTraderRidable = false; - public boolean wanderingTraderRidableInWater = true; - public boolean wanderingTraderControllable = true; ++ } ++ + public double wanderingTraderMaxHealth = 20.0D; - private void wanderingTraderSettings() { - wanderingTraderRidable = getBoolean("mobs.wandering_trader.ridable", wanderingTraderRidable); - wanderingTraderRidableInWater = getBoolean("mobs.wandering_trader.ridable-in-water", wanderingTraderRidableInWater); - wanderingTraderControllable = getBoolean("mobs.wandering_trader.controllable", wanderingTraderControllable); ++ private void wanderingTraderSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.wandering_trader.attributes.max-health", wanderingTraderMaxHealth); + set("mobs.wandering_trader.attributes.max-health", null); + set("mobs.wandering_trader.attributes.max_health", oldValue); + } + wanderingTraderMaxHealth = getDouble("mobs.wandering_trader.attributes.max_health", wanderingTraderMaxHealth); - } - - public boolean wardenRidable = false; -@@ -727,81 +1301,165 @@ public class PurpurWorldConfig { - public boolean witchRidable = false; - public boolean witchRidableInWater = true; - public boolean witchControllable = true; ++ } ++ + public double witchMaxHealth = 26.0D; - private void witchSettings() { - witchRidable = getBoolean("mobs.witch.ridable", witchRidable); - witchRidableInWater = getBoolean("mobs.witch.ridable-in-water", witchRidableInWater); - witchControllable = getBoolean("mobs.witch.controllable", witchControllable); ++ private void witchSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.witch.attributes.max-health", witchMaxHealth); + set("mobs.witch.attributes.max-health", null); + set("mobs.witch.attributes.max_health", oldValue); + } + witchMaxHealth = getDouble("mobs.witch.attributes.max_health", witchMaxHealth); - } - - public boolean witherRidable = false; - public boolean witherRidableInWater = true; - public boolean witherControllable = true; - public double witherMaxY = 320D; ++ } ++ + public double witherMaxHealth = 300.0D; - private void witherSettings() { - witherRidable = getBoolean("mobs.wither.ridable", witherRidable); - witherRidableInWater = getBoolean("mobs.wither.ridable-in-water", witherRidableInWater); - witherControllable = getBoolean("mobs.wither.controllable", witherControllable); - witherMaxY = getDouble("mobs.wither.ridable-max-y", witherMaxY); ++ private void witherSettings() { + if (PurpurConfig.version < 8) { + double oldValue = getDouble("mobs.wither.max-health", witherMaxHealth); + set("mobs.wither.max_health", null); @@ -2704,65 +2320,41 @@ index ec168b917d60cc6d8c48620eb4dcd89b0b121aea..46b6994812086405f20a4dd410c1d796 + set("mobs.wither.attributes.max_health", oldValue); + } + witherMaxHealth = getDouble("mobs.wither.attributes.max_health", witherMaxHealth); - } - - public boolean witherSkeletonRidable = false; - public boolean witherSkeletonRidableInWater = true; - public boolean witherSkeletonControllable = true; ++ } ++ + public double witherSkeletonMaxHealth = 20.0D; - private void witherSkeletonSettings() { - witherSkeletonRidable = getBoolean("mobs.wither_skeleton.ridable", witherSkeletonRidable); - witherSkeletonRidableInWater = getBoolean("mobs.wither_skeleton.ridable-in-water", witherSkeletonRidableInWater); - witherSkeletonControllable = getBoolean("mobs.wither_skeleton.controllable", witherSkeletonControllable); ++ private void witherSkeletonSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.wither_skeleton.attributes.max-health", witherSkeletonMaxHealth); + set("mobs.wither_skeleton.attributes.max-health", null); + set("mobs.wither_skeleton.attributes.max_health", oldValue); + } + witherSkeletonMaxHealth = getDouble("mobs.wither_skeleton.attributes.max_health", witherSkeletonMaxHealth); - } - - public boolean wolfRidable = false; - public boolean wolfRidableInWater = true; - public boolean wolfControllable = true; ++ } ++ + public double wolfMaxHealth = 8.0D; - private void wolfSettings() { - wolfRidable = getBoolean("mobs.wolf.ridable", wolfRidable); - wolfRidableInWater = getBoolean("mobs.wolf.ridable-in-water", wolfRidableInWater); - wolfControllable = getBoolean("mobs.wolf.controllable", wolfControllable); ++ private void wolfSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.wolf.attributes.max-health", wolfMaxHealth); + set("mobs.wolf.attributes.max-health", null); + set("mobs.wolf.attributes.max_health", oldValue); + } + wolfMaxHealth = getDouble("mobs.wolf.attributes.max_health", wolfMaxHealth); - } - - public boolean zoglinRidable = false; - public boolean zoglinRidableInWater = true; - public boolean zoglinControllable = true; ++ } ++ + public double zoglinMaxHealth = 40.0D; - private void zoglinSettings() { - zoglinRidable = getBoolean("mobs.zoglin.ridable", zoglinRidable); - zoglinRidableInWater = getBoolean("mobs.zoglin.ridable-in-water", zoglinRidableInWater); - zoglinControllable = getBoolean("mobs.zoglin.controllable", zoglinControllable); ++ private void zoglinSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.zoglin.attributes.max-health", zoglinMaxHealth); + set("mobs.zoglin.attributes.max-health", null); + set("mobs.zoglin.attributes.max_health", oldValue); + } + zoglinMaxHealth = getDouble("mobs.zoglin.attributes.max_health", zoglinMaxHealth); - } - - public boolean zombieRidable = false; - public boolean zombieRidableInWater = true; - public boolean zombieControllable = true; ++ } ++ + public double zombieMaxHealth = 20.0D; + public double zombieSpawnReinforcements = 0.1D; - private void zombieSettings() { - zombieRidable = getBoolean("mobs.zombie.ridable", zombieRidable); - zombieRidableInWater = getBoolean("mobs.zombie.ridable-in-water", zombieRidableInWater); - zombieControllable = getBoolean("mobs.zombie.controllable", zombieControllable); ++ private void zombieSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.zombie.attributes.max-health", zombieMaxHealth); + set("mobs.zombie.attributes.max-health", null); @@ -2770,19 +2362,15 @@ index ec168b917d60cc6d8c48620eb4dcd89b0b121aea..46b6994812086405f20a4dd410c1d796 + } + zombieMaxHealth = getDouble("mobs.zombie.attributes.max_health", zombieMaxHealth); + zombieSpawnReinforcements = getDouble("mobs.zombie.attributes.spawn_reinforcements", zombieSpawnReinforcements); - } - - public boolean zombieHorseRidableInWater = false; - public boolean zombieHorseCanSwim = false; ++ } ++ + public double zombieHorseMaxHealthMin = 15.0D; + public double zombieHorseMaxHealthMax = 15.0D; + public double zombieHorseJumpStrengthMin = 0.4D; + public double zombieHorseJumpStrengthMax = 1.0D; + public double zombieHorseMovementSpeedMin = 0.2D; + public double zombieHorseMovementSpeedMax = 0.2D; - private void zombieHorseSettings() { - zombieHorseRidableInWater = getBoolean("mobs.zombie_horse.ridable-in-water", zombieHorseRidableInWater); - zombieHorseCanSwim = getBoolean("mobs.zombie_horse.can-swim", zombieHorseCanSwim); ++ private void zombieHorseSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.zombie_horse.attributes.max-health", zombieHorseMaxHealthMin); + set("mobs.zombie_horse.attributes.max-health", null); @@ -2795,17 +2383,11 @@ index ec168b917d60cc6d8c48620eb4dcd89b0b121aea..46b6994812086405f20a4dd410c1d796 + 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); - } - - public boolean zombieVillagerRidable = false; - public boolean zombieVillagerRidableInWater = true; - public boolean zombieVillagerControllable = true; ++ } ++ + public double zombieVillagerMaxHealth = 20.0D; + public double zombieVillagerSpawnReinforcements = 0.1D; - private void zombieVillagerSettings() { - zombieVillagerRidable = getBoolean("mobs.zombie_villager.ridable", zombieVillagerRidable); - zombieVillagerRidableInWater = getBoolean("mobs.zombie_villager.ridable-in-water", zombieVillagerRidableInWater); - zombieVillagerControllable = getBoolean("mobs.zombie_villager.controllable", zombieVillagerControllable); ++ private void zombieVillagerSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.zombie_villager.attributes.max-health", zombieVillagerMaxHealth); + set("mobs.zombie_villager.attributes.max-health", null); @@ -2813,17 +2395,11 @@ index ec168b917d60cc6d8c48620eb4dcd89b0b121aea..46b6994812086405f20a4dd410c1d796 + } + zombieVillagerMaxHealth = getDouble("mobs.zombie_villager.attributes.max_health", zombieVillagerMaxHealth); + zombieVillagerSpawnReinforcements = getDouble("mobs.zombie_villager.attributes.spawn_reinforcements", zombieVillagerSpawnReinforcements); - } - - public boolean zombifiedPiglinRidable = false; - public boolean zombifiedPiglinRidableInWater = true; - public boolean zombifiedPiglinControllable = true; ++ } ++ + public double zombifiedPiglinMaxHealth = 20.0D; + public double zombifiedPiglinSpawnReinforcements = 0.0D; - private void zombifiedPiglinSettings() { - zombifiedPiglinRidable = getBoolean("mobs.zombified_piglin.ridable", zombifiedPiglinRidable); - zombifiedPiglinRidableInWater = getBoolean("mobs.zombified_piglin.ridable-in-water", zombifiedPiglinRidableInWater); - zombifiedPiglinControllable = getBoolean("mobs.zombified_piglin.controllable", zombifiedPiglinControllable); ++ private void zombifiedPiglinSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.zombified_piglin.attributes.max-health", zombifiedPiglinMaxHealth); + set("mobs.zombified_piglin.attributes.max-health", null); @@ -2831,5 +2407,5 @@ index ec168b917d60cc6d8c48620eb4dcd89b0b121aea..46b6994812086405f20a4dd410c1d796 + } + zombifiedPiglinMaxHealth = getDouble("mobs.zombified_piglin.attributes.max_health", zombifiedPiglinMaxHealth); + zombifiedPiglinSpawnReinforcements = getDouble("mobs.zombified_piglin.attributes.spawn_reinforcements", zombifiedPiglinSpawnReinforcements); - } ++ } } diff --git a/patches/todo/server/0010-Barrels-and-enderchests-6-rows.patch b/patches/server/0007-Barrels-and-enderchests-6-rows.patch similarity index 95% rename from patches/todo/server/0010-Barrels-and-enderchests-6-rows.patch rename to patches/server/0007-Barrels-and-enderchests-6-rows.patch index 5c652eb3c..8c9fe1dfe 100644 --- a/patches/todo/server/0010-Barrels-and-enderchests-6-rows.patch +++ b/patches/server/0007-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 0e75163468ab91e7c6d245577041c288a9d865ac..7387bc99cd4d5172ef93364608a9ba178cc3597c 100644 +index b2f26b4b09d9bf2de273e1258f98c175c6d5900a..394427f591eb6e1f98bac92d6bfebea641da8154 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java -@@ -1154,6 +1154,27 @@ public abstract class PlayerList { +@@ -1161,6 +1161,27 @@ public abstract class PlayerList { player.getBukkitEntity().recalculatePermissions(); // CraftBukkit this.server.getCommands().sendCommands(player); } // Paper @@ -37,10 +37,10 @@ index 0e75163468ab91e7c6d245577041c288a9d865ac..7387bc99cd4d5172ef93364608a9ba17 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 ffcc81c07b5aa45d1471e05676f43e96db13b045..5cc0b0754feb9a78b8a71e0cb22d2a29243ba3d2 100644 +index 58152160d609d0e9d105153aeb166a56a7955603..6b068863368e3f0c1102f35b87ffce3f77370fcb 100644 --- a/src/main/java/net/minecraft/world/entity/player/Player.java +++ b/src/main/java/net/minecraft/world/entity/player/Player.java -@@ -186,6 +186,7 @@ public abstract class Player extends LivingEntity { +@@ -187,6 +187,7 @@ public abstract class Player extends LivingEntity { public boolean affectsSpawning = true; public net.kyori.adventure.util.TriState flyingFallDamage = net.kyori.adventure.util.TriState.NOT_SET; // Paper end @@ -198,10 +198,10 @@ index 416aa989ebb18a8741cc9d605a1180ab830f6643..e38a0adf5463c48311ad08b8d2e5b5c2 @Override diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java -index 04088918e172eecb8d53b0e6de9be0071ccf33b5..eddd6073e0feb7b046db1d169020ca067fdf689c 100644 +index bdaa739aa18a95894a165e9333a3e9d596fd7dc3..ef999d36a9bc8a22b6f9e1039173e4270804585a 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java -@@ -182,8 +182,19 @@ public class CraftContainer extends AbstractContainerMenu { +@@ -180,8 +180,19 @@ public class CraftContainer extends AbstractContainerMenu { case PLAYER: case CHEST: case ENDER_CHEST: @@ -236,12 +236,12 @@ index 092f6843e3b43d4c615d2eee344f5966e96ae850..cb0c851ab5fcf676da2397040835a94d } diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -index 943b65dd5169946d5fec86e3fc38076cae47ba58..6b0e6f3c93092dcabe53048a9260941c095ef996 100644 +index 9fe1cdafdafc3f718ef4eb4fd4150971e2832738..5b10feadf1ec5e7bbba4244b6347fdedd0f4b1d4 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -@@ -177,4 +177,39 @@ public class PurpurConfig { - private static void messages() { - cannotRideMob = getString("settings.messages.cannot-ride-mob", cannotRideMob); +@@ -172,4 +172,39 @@ public class PurpurConfig { + } + return builder.build(); } + + public static int barrelRows = 3; diff --git a/patches/todo/server/0011-Llama-API.patch b/patches/server/0008-Llama-API.patch similarity index 87% rename from patches/todo/server/0011-Llama-API.patch rename to patches/server/0008-Llama-API.patch index 40bdf20c3..02f6bedca 100644 --- a/patches/todo/server/0011-Llama-API.patch +++ b/patches/server/0008-Llama-API.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Llama API diff --git a/src/main/java/net/minecraft/world/entity/ai/goal/LlamaFollowCaravanGoal.java b/src/main/java/net/minecraft/world/entity/ai/goal/LlamaFollowCaravanGoal.java -index 721971f7618751a2e95f1c49fdc48a9c0c672cab..7b141c495095afcd9c8b04c059d692e829259e7a 100644 +index 21725aee29e9120d1c7e1e19f91c21a73a28844f..849f0c7c6d13df00d90211a48d8b56ab156812b8 100644 --- a/src/main/java/net/minecraft/world/entity/ai/goal/LlamaFollowCaravanGoal.java +++ b/src/main/java/net/minecraft/world/entity/ai/goal/LlamaFollowCaravanGoal.java @@ -22,6 +22,7 @@ public class LlamaFollowCaravanGoal extends Goal { @@ -14,7 +14,7 @@ index 721971f7618751a2e95f1c49fdc48a9c0c672cab..7b141c495095afcd9c8b04c059d692e8 public boolean canUse() { + if (!this.llama.shouldJoinCaravan) return false; // Purpur if (!this.llama.isLeashed() && !this.llama.inCaravan()) { - List list = this.llama.level.getEntities(this.llama, this.llama.getBoundingBox().inflate(9.0D, 4.0D, 9.0D), (entity) -> { + List list = this.llama.level().getEntities(this.llama, this.llama.getBoundingBox().inflate(9.0D, 4.0D, 9.0D), (entity) -> { EntityType entityType = entity.getType(); @@ -71,6 +72,7 @@ public class LlamaFollowCaravanGoal extends Goal { @@ -25,7 +25,7 @@ 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 9953f80e924e8843ceebdbfa675c2315bf6cf63f..2343accfb669e38635eab949ff04a3f729ac3992 100644 +index 08fbfa5df3196ad3d9fe086dcd8210ec8747f053..fbcd47e656a8d33da08d1d852a959bc7cf3a2394 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 @@ -73,6 +73,7 @@ public class Llama extends AbstractChestedHorse implements VariantHolder type, Level world) { super(type, world); -@@ -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. + if (this.player.getLastActionTime() > 0L && this.server.getPlayerIdleTimeout() > 0 && Util.getMillis() - this.player.getLastActionTime() > (long) this.server.getPlayerIdleTimeout() * 1000L * 60L && !this.player.wonGame) { // Paper - Prevent AFK kick while watching end credits. + // Purpur start + this.player.setAfk(true); + if (!this.player.level.purpurConfig.idleTimeoutKick || (!Boolean.parseBoolean(System.getenv("PURPUR_FORCE_IDLE_KICK")) && kickPermissionCache.getUnchecked(this.player.getBukkitEntity()))) { @@ -116,7 +116,7 @@ index ec4891a736c5c91af7589071f87fa664983f7f72..24545eaad4b0867b4d14f0418a27d465 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 +@@ -751,6 +771,8 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic this.lastYaw = to.getYaw(); this.lastPitch = to.getPitch(); @@ -125,16 +125,16 @@ index ec4891a736c5c91af7589071f87fa664983f7f72..24545eaad4b0867b4d14f0418a27d465 // 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 +@@ -1549,7 +1571,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 + if (!this.player.isChangingDimension() && d10 > 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 - ServerGamePacketListenerImpl.LOGGER.warn("{} moved wrongly!", this.player.getName().getString()); + ServerGamePacketListenerImpl.LOGGER.warn("{} moved wrongly!, ({})", this.player.getName().getString(), d11); // Purpur } - this.player.absMoveTo(d0, d1, d2, f, f1); -@@ -1599,6 +1621,8 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic + // Paper start - optimise out extra getCubes +@@ -1596,6 +1618,8 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic this.lastYaw = to.getYaw(); this.lastPitch = to.getPitch(); @@ -166,7 +166,7 @@ index 823efad652d8ff9e96b99375b102fef6f017716e..60f89d7c77a5e792e21e93e35ed1670b } // CraftBukkit start diff --git a/src/main/java/net/minecraft/world/entity/EntitySelector.java b/src/main/java/net/minecraft/world/entity/EntitySelector.java -index 72abebff2018cde2922e97ad6478f93da9aed3ec..412963d7af38a53b6010007278d959a5b11b83c3 100644 +index 3ff999734d14e2b6e7828e117f5ee32a60c26bc1..cfa9607241c3e69777ffc317206996c2f783437a 100644 --- a/src/main/java/net/minecraft/world/entity/EntitySelector.java +++ b/src/main/java/net/minecraft/world/entity/EntitySelector.java @@ -39,6 +39,7 @@ public final class EntitySelector { @@ -178,7 +178,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 58422f00c7d64dbd1cf6d7211c9838875cbe7778..12efea4fd2a78f32a165941aff52edd024a5592b 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 { @@ -191,14 +191,14 @@ index e752c83df50fb9b670ecea2abc95426c2a009b6f..baa4f9026d31de92210300ecb8ee8c1b + // Purpur end } else { if (baseEntity == null) { - if (this.isCombat && (!targetEntity.canBeSeenAsEnemy() || targetEntity.level.getDifficulty() == Difficulty.PEACEFUL)) { + 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 5cc0b0754feb9a78b8a71e0cb22d2a29243ba3d2..05106a3bd2284d1ab25067241248238bb69d4610 100644 +index 6b068863368e3f0c1102f35b87ffce3f77370fcb..9c118a5ebeb1fb473f8038b3cb4a157dc0084413 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,13 @@ public abstract class Player extends LivingEntity { - // Purpur start - public abstract void resetLastActionTime(); +@@ -193,6 +193,13 @@ public abstract class Player extends LivingEntity { + public boolean fauxSleeping; + public int oldLevel = -1; + public void setAfk(boolean afk) { + } @@ -208,8 +208,8 @@ index 5cc0b0754feb9a78b8a71e0cb22d2a29243ba3d2..05106a3bd2284d1ab25067241248238b + } + @Override - public boolean processClick(InteractionHand hand) { - Entity vehicle = getRootVehicle(); + public CraftHumanEntity getBukkitEntity() { + return (CraftHumanEntity) super.getBukkitEntity(); diff --git a/src/main/java/net/minecraft/world/level/EntityGetter.java b/src/main/java/net/minecraft/world/level/EntityGetter.java index 3b959f42d958bf0f426853aee56753d6c455fcdb..d17abb283ea818244df0379d6b57fc634071e0b9 100644 --- a/src/main/java/net/minecraft/world/level/EntityGetter.java @@ -224,10 +224,10 @@ index 3b959f42d958bf0f426853aee56753d6c455fcdb..d17abb283ea818244df0379d6b57fc63 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 39ab19be66530c4792719d2d86b6979cffedcf83..2fd1eb97d70890efe431af32f47db29bdab60aa3 100644 +index 09d2f1586d19d0d5c9c78cde5263f30e7a7d0647..fea8f974c5e35b0f5c515a4c7f033482e54979c6 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -534,10 +534,15 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -501,10 +501,15 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @Override public void setPlayerListName(String name) { @@ -244,7 +244,7 @@ index 39ab19be66530c4792719d2d86b6979cffedcf83..2fd1eb97d70890efe431af32f47db29b for (ServerPlayer player : (List) server.getHandle().players) { if (player.getBukkitEntity().canSee(this)) { player.connection.send(new ClientboundPlayerInfoUpdatePacket(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_DISPLAY_NAME, this.getHandle())); -@@ -3186,5 +3191,20 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -3149,5 +3154,20 @@ public class CraftPlayer extends CraftHumanEntity implements Player { public boolean usesPurpurClient() { return getHandle().purpurClient; } @@ -266,30 +266,31 @@ index 39ab19be66530c4792719d2d86b6979cffedcf83..2fd1eb97d70890efe431af32f47db29b // Purpur end } diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -index e6a720f25266d793bec5f644dadacbf45aef23f5..6b768cff1318b4bcebeed95345f3cfdce05a2c16 100644 +index 5b10feadf1ec5e7bbba4244b6347fdedd0f4b1d4..19e32a65f89ab2b4b44997028043e2b304209eff 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -@@ -174,8 +174,18 @@ public class PurpurConfig { +@@ -173,6 +173,19 @@ public class PurpurConfig { + return builder.build(); } - public static String cannotRideMob = "You cannot mount that mob"; + public static String afkBroadcastAway = "%s is now AFK"; + public static String afkBroadcastBack = "%s is no longer AFK"; + public static boolean afkBroadcastUseDisplayName = false; + public static String afkTabListPrefix = "[AFK] "; + public static String afkTabListSuffix = ""; - private static void messages() { - cannotRideMob = getString("settings.messages.cannot-ride-mob", cannotRideMob); ++ private static void messages() { + afkBroadcastAway = getString("settings.messages.afk-broadcast-away", afkBroadcastAway); + afkBroadcastBack = getString("settings.messages.afk-broadcast-back", afkBroadcastBack); + afkBroadcastUseDisplayName = getBoolean("settings.messages.afk-broadcast-use-display-name", afkBroadcastUseDisplayName); + afkTabListPrefix = MiniMessage.miniMessage().serialize(MiniMessage.miniMessage().deserialize(getString("settings.messages.afk-tab-list-prefix", afkTabListPrefix))); + afkTabListSuffix = MiniMessage.miniMessage().serialize(MiniMessage.miniMessage().deserialize(getString("settings.messages.afk-tab-list-suffix", afkTabListSuffix))); - } - ++ } ++ public static int barrelRows = 3; + public static boolean enderChestSixRows = false; + public static boolean enderChestPermissionRows = false; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 46b6994812086405f20a4dd410c1d79621958cd5..cbb750eabb892348b3b6632782e9eef9b125d16d 100644 +index 3a44c1fff53590ae5c65404564a3a2ee12be62cf..e37db90448b0d1df6b40028ef6ebc80a51932180 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -92,6 +92,24 @@ public class PurpurWorldConfig { @@ -314,14 +315,14 @@ index 46b6994812086405f20a4dd410c1d79621958cd5..cbb750eabb892348b3b6632782e9eef9 + idleTimeoutTargetPlayer = getBoolean("gameplay-mechanics.player.idle-timeout.mobs-target", idleTimeoutTargetPlayer); + } + - public boolean babiesAreRidable = true; - public boolean untamedTamablesAreRidable = true; - public boolean useNightVisionWhenRiding = false; + public double axolotlMaxHealth = 14.0D; + private void axolotlSettings() { + axolotlMaxHealth = getDouble("mobs.axolotl.attributes.max_health", axolotlMaxHealth); diff --git a/src/main/java/org/spigotmc/ActivationRange.java b/src/main/java/org/spigotmc/ActivationRange.java -index 07050c78a2eb6ce0c699101b38961b111d631a41..1f37695950e69fc9784a415a5ab9c6586ed32e61 100644 +index d4da9ec6e00bb92b70598ee9a0d0ca5816562378..ea978171f89ac467b235f66fd539b957ba73e371 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/todo/server/0013-Bring-back-server-name.patch b/patches/server/0010-Bring-back-server-name.patch similarity index 91% rename from patches/todo/server/0013-Bring-back-server-name.patch rename to patches/server/0010-Bring-back-server-name.patch index 151624212..411b3929b 100644 --- a/patches/todo/server/0013-Bring-back-server-name.patch +++ b/patches/server/0010-Bring-back-server-name.patch @@ -17,10 +17,10 @@ index 818289e831e3dad29345c43265e2efd7689bc500..1ea3012995c738c67b31e997c138f824 public final boolean spawnNpcs = this.get("spawn-npcs", true); public final boolean pvp = this.get("pvp", true); diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 043513623ddcf493f73e86fb5f5bf034ae536b13..7bd2b6a0049d008e3702f1bcd06b760b6681b9cb 100644 +index 4b5aea6617a11914ee15dc12a3393504d6f48a1d..7df709528c8c1d743d0ce1711a7acde4b5c4abb8 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -2996,4 +2996,11 @@ public final class CraftServer implements Server { +@@ -2989,4 +2989,11 @@ public final class CraftServer implements Server { } // Paper end diff --git a/patches/todo/server/0014-Configurable-server-mod-name.patch b/patches/server/0011-Configurable-server-mod-name.patch similarity index 85% rename from patches/todo/server/0014-Configurable-server-mod-name.patch rename to patches/server/0011-Configurable-server-mod-name.patch index de3a7e2cf..e98e6b3bd 100644 --- a/patches/todo/server/0014-Configurable-server-mod-name.patch +++ b/patches/server/0011-Configurable-server-mod-name.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Configurable server mod name diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 7f37231b33d6cfbd3d10c6c5d0b3e0b96ba0ceb3..57f6de7872bfa80cf7668524975946cbd7fcda56 100644 +index 7fe5d22b4c9eac832646780d4b5326edaca2979e..c88da193507aa4b322586e38ed04caf834c6b481 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1685,7 +1685,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop drops = new ArrayList(); public final org.bukkit.craftbukkit.attribute.CraftAttributeMap craftAttributes; -@@ -351,8 +352,8 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -354,7 +355,7 @@ public abstract class LivingEntity extends Entity implements Attackable { this.tryAddSoulSpeed(); } -- if (!this.level.isClientSide && this.fallDistance > 3.0F && onGround) { -- float f = (float) Mth.ceil(this.fallDistance - 3.0F); -+ if (!this.level.isClientSide && this.fallDistance > this.safeFallDistance && onGround) { // Purpur -+ float f = (float) Mth.ceil(this.fallDistance - this.safeFallDistance); // Purpur +- if (!this.level().isClientSide && this.fallDistance > 3.0F && onGround && !state.isAir()) { ++ if (!this.level().isClientSide && this.fallDistance > this.safeFallDistance && onGround && !state.isAir()) { // Purpur + double d1 = this.getX(); + double d2 = this.getY(); + double d3 = this.getZ(); +@@ -369,7 +370,7 @@ public abstract class LivingEntity extends Entity implements Attackable { + d3 = (double) landedPosition.getZ() + 0.5D + d5 / d6 * 0.5D; + } - if (!state.isAir()) { - double d1 = Math.min((double) (0.2F + f / 15.0F), 2.5D); -@@ -2018,7 +2019,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +- float f = (float) Mth.ceil(this.fallDistance - 3.0F); ++ float f = (float) Mth.ceil(this.fallDistance - this.safeFallDistance); // Purpur + double d7 = Math.min((double) (0.2F + f / 15.0F), 2.5D); + int i = (int) (150.0D * d7); + +@@ -2038,7 +2039,7 @@ public abstract class LivingEntity extends Entity implements Attackable { MobEffectInstance mobeffect = this.getEffect(MobEffects.JUMP); float f2 = mobeffect == null ? 0.0F : (float) (mobeffect.getAmplifier() + 1); @@ -37,10 +44,10 @@ index cc2369f208546bf8c346c30d5c3ccd535e09f09f..ad1591644a429b33c042e84a0114fe36 } 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 28dbaeb4de0c133a68878f65da33d2939c7344b2..c044ed3a96f10584fd5aec836624bca1b414182d 100644 +index 7827187afa738776908d1c2151556af95affcbe8..55ced31c3e8118b11a6201a7d8a2779244b4c9b1 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 -@@ -385,7 +385,7 @@ public abstract class AbstractHorse extends Animal implements ContainerListener, +@@ -370,7 +370,7 @@ public abstract class AbstractHorse extends Animal implements ContainerListener, @Override protected int calculateFallDamage(float fallDistance, float damageMultiplier) { @@ -50,7 +57,7 @@ index 28dbaeb4de0c133a68878f65da33d2939c7344b2..c044ed3a96f10584fd5aec836624bca1 protected int getInventorySize() { diff --git a/src/main/java/net/minecraft/world/entity/monster/Giant.java b/src/main/java/net/minecraft/world/entity/monster/Giant.java -index 2019896dee313bcc982686fc665d1cb3e2d40503..2050230df7949e21f2158d2be5be885461afb66d 100644 +index 4a38296843048d3fff255370f980d81d0808bbef..4511b56c6f58336920f1470400f8e120f12f72e6 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Giant.java +++ b/src/main/java/net/minecraft/world/entity/monster/Giant.java @@ -12,6 +12,7 @@ import net.minecraft.world.level.LevelReader; @@ -60,9 +67,9 @@ index 2019896dee313bcc982686fc665d1cb3e2d40503..2050230df7949e21f2158d2be5be8854 + this.safeFallDistance = 10.0F; // Purpur } - // Purpur start + @Override diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java -index b548f06bc0569f0f1ee5edaa07806c3017d5399a..6dfb577d1b6451d5a6c9231ad57e4aef7976edfc 100644 +index 050d297ef20d8b8f2601c70256aefadeb95b8a51..a939bcdbcdef50379b473822655e1f6a8db44892 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java @@ -1071,4 +1071,16 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { diff --git a/patches/todo/server/0016-Lagging-threshold.patch b/patches/server/0013-Lagging-threshold.patch similarity index 83% rename from patches/todo/server/0016-Lagging-threshold.patch rename to patches/server/0013-Lagging-threshold.patch index 2f9517e05..d011818d8 100644 --- a/patches/todo/server/0016-Lagging-threshold.patch +++ b/patches/server/0013-Lagging-threshold.patch @@ -5,7 +5,7 @@ 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 57f6de7872bfa80cf7668524975946cbd7fcda56..6cdcd4f105b15f10d60499572f6f4f830565513e 100644 +index c88da193507aa4b322586e38ed04caf834c6b481..1c9c9260c442f3173d60b3ed564d8c3eee862628 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -309,6 +309,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop implements FeatureElement, EntityTypeT +@@ -313,6 +313,16 @@ public class EntityType implements FeatureElement, EntityTypeT return (EntityType) Registry.register(BuiltInRegistries.ENTITY_TYPE, id, (EntityType) type.build(id)); // CraftBukkit - decompile error } @@ -25,7 +25,7 @@ index 8af0918d3a62de58a4b2af55022c812bb0e46092..944ccfacd740ea0cdd0b8ffbd75bd2e5 public static ResourceLocation getKey(EntityType type) { return BuiltInRegistries.ENTITY_TYPE.getKey(type); } -@@ -530,6 +540,16 @@ public class EntityType implements FeatureElement, EntityTypeT +@@ -528,6 +538,16 @@ public class EntityType implements FeatureElement, EntityTypeT return this.category; } @@ -43,7 +43,7 @@ index 8af0918d3a62de58a4b2af55022c812bb0e46092..944ccfacd740ea0cdd0b8ffbd75bd2e5 if (this.descriptionId == null) { 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 31268e25056f980798ef7db72c4f955a074cc639..955822da142a2463af536dd1ce48037deda41402 100644 +index 741719301e6fc91a598e74342810c4185e6fde26..6fbff9c02fbabf03c9c649a9ea6128021081f9cd 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 { diff --git a/patches/todo/server/0018-Player-invulnerabilities.patch b/patches/server/0015-Player-invulnerabilities.patch similarity index 84% rename from patches/todo/server/0018-Player-invulnerabilities.patch rename to patches/server/0015-Player-invulnerabilities.patch index 7ce71b6f5..5e20bf4c3 100644 --- a/patches/todo/server/0018-Player-invulnerabilities.patch +++ b/patches/server/0015-Player-invulnerabilities.patch @@ -5,7 +5,7 @@ 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 58d7daf06352713ad6dee2412dc0b9d5e900ddd0..c69d3d7a1970f7cec7a3e12b8633b9328c8d5d67 100644 +index a1e43e2b05217a3345d048da05fbcfd506522809..7dc8d5a86eeae7e291a6295a23a062903c77d37d 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java @@ -278,6 +278,7 @@ public class ServerPlayer extends Player { @@ -14,9 +14,9 @@ index 58d7daf06352713ad6dee2412dc0b9d5e900ddd0..c69d3d7a1970f7cec7a3e12b8633b932 public boolean purpurClient = false; // Purpur + public boolean acceptingResourcePack = false; // Purpur - public ServerPlayer(MinecraftServer server, ServerLevel world, GameProfile profile) { - super(world, world.getSharedSpawnPos(), world.getSharedSpawnAngle(), profile); -@@ -377,6 +378,7 @@ public class ServerPlayer extends Player { + private final java.util.concurrent.atomic.AtomicReference viewDistances = new java.util.concurrent.atomic.AtomicReference<>(new io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader.ViewDistances(-1, -1, -1)); + public io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader.PlayerChunkLoaderData chunkLoader; +@@ -418,6 +419,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 58d7daf06352713ad6dee2412dc0b9d5e900ddd0..c69d3d7a1970f7cec7a3e12b8633b932 } // Yes, this doesn't match Vanilla, but it's the best we can do for now. -@@ -1058,6 +1060,12 @@ public class ServerPlayer extends Player { +@@ -1090,6 +1092,12 @@ public class ServerPlayer extends Player { } @@ -37,7 +37,7 @@ index 58d7daf06352713ad6dee2412dc0b9d5e900ddd0..c69d3d7a1970f7cec7a3e12b8633b932 @Override public boolean hurt(DamageSource source, float amount) { if (this.isInvulnerableTo(source)) { -@@ -1065,7 +1073,7 @@ public class ServerPlayer extends Player { +@@ -1097,7 +1105,7 @@ public class ServerPlayer extends Player { } else { boolean flag = this.server.isDedicatedServer() && this.isPvpAllowed() && source.is(DamageTypeTags.IS_FALL); @@ -46,7 +46,7 @@ index 58d7daf06352713ad6dee2412dc0b9d5e900ddd0..c69d3d7a1970f7cec7a3e12b8633b932 return false; } else { Entity entity = source.getEntity(); -@@ -1245,6 +1253,7 @@ public class ServerPlayer extends Player { +@@ -1276,6 +1284,7 @@ public class ServerPlayer extends Player { } // Paper end @@ -54,7 +54,7 @@ index 58d7daf06352713ad6dee2412dc0b9d5e900ddd0..c69d3d7a1970f7cec7a3e12b8633b932 return this; } } -@@ -2057,6 +2066,7 @@ public class ServerPlayer extends Player { +@@ -2093,6 +2102,7 @@ public class ServerPlayer extends Player { } public void sendTexturePack(String url, String hash, boolean required, @Nullable Component resourcePackPrompt) { @@ -62,7 +62,7 @@ index 58d7daf06352713ad6dee2412dc0b9d5e900ddd0..c69d3d7a1970f7cec7a3e12b8633b932 this.connection.send(new ClientboundResourcePackPacket(url, hash, required, resourcePackPrompt)); } -@@ -2604,9 +2614,17 @@ public class ServerPlayer extends Player { +@@ -2680,9 +2690,17 @@ public class ServerPlayer extends Player { @Override public boolean isImmobile() { @@ -82,13 +82,13 @@ index 58d7daf06352713ad6dee2412dc0b9d5e900ddd0..c69d3d7a1970f7cec7a3e12b8633b932 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 24545eaad4b0867b4d14f0418a27d465461c7e1e..db737258db16ec9f61d0d601a6ea5f6b14638033 100644 +index 76434e1b7307bdc3074847a99d780686f73c96a9..1782c461c5d5cc1a2416deb58c8345f16984ddbb 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -2092,12 +2092,21 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -2088,12 +2088,21 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic @Override public void handleResourcePackResponse(ServerboundResourcePackPacket packet) { - PacketUtils.ensureRunningOnSameThread(packet, this, this.player.getLevel()); + PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel()); + // Purpur start + if (player.level.purpurConfig.playerInvulnerableWhileAcceptingResourcePack && !this.player.acceptingResourcePack) { + ServerGamePacketListenerImpl.LOGGER.info("Disconnecting {} due to resource pack packet exploitation attempt", this.player.getName()); @@ -108,10 +108,10 @@ index 24545eaad4b0867b4d14f0418a27d465461c7e1e..db737258db16ec9f61d0d601a6ea5f6b 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 bf6d6d7a587d05f38952b22774933d9a45f8365e..e73c77cfd61cdaebf4effe302f2a25bf614d7563 100644 +index 394427f591eb6e1f98bac92d6bfebea641da8154..d90c2b0f304c4900b3308903702c0ef489b9f511 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java -@@ -969,6 +969,8 @@ public abstract class PlayerList { +@@ -976,6 +976,8 @@ public abstract class PlayerList { } // Paper end @@ -121,10 +121,10 @@ index bf6d6d7a587d05f38952b22774933d9a45f8365e..e73c77cfd61cdaebf4effe302f2a25bf 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 2fd1eb97d70890efe431af32f47db29bdab60aa3..e323c7238e481e9e64748792f734a40dcab9e6f6 100644 +index fea8f974c5e35b0f5c515a4c7f033482e54979c6..cf82afb7949a0031c1b656149e583c4075362211 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -3206,5 +3206,20 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -3169,5 +3169,20 @@ public class CraftPlayer extends CraftHumanEntity implements Player { public void resetIdleTimer() { getHandle().resetLastActionTime(); } @@ -146,7 +146,7 @@ index 2fd1eb97d70890efe431af32f47db29bdab60aa3..e323c7238e481e9e64748792f734a40d // Purpur end } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index cbb750eabb892348b3b6632782e9eef9b125d16d..5bda6411f4c419cf6c0f8b6e498ec22f3f34da3a 100644 +index e37db90448b0d1df6b40028ef6ebc80a51932180..1e5290c9ef98f5ce2cca85e876fe8103b0368a02 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -97,6 +97,8 @@ public class PurpurWorldConfig { @@ -166,4 +166,4 @@ index cbb750eabb892348b3b6632782e9eef9b125d16d..5bda6411f4c419cf6c0f8b6e498ec22f + playerInvulnerableWhileAcceptingResourcePack = getBoolean("gameplay-mechanics.player.invulnerable-while-accepting-resource-pack", playerInvulnerableWhileAcceptingResourcePack); } - public boolean babiesAreRidable = true; + public double axolotlMaxHealth = 14.0D; diff --git a/patches/todo/server/0019-Anvil-API.patch b/patches/server/0016-Anvil-API.patch similarity index 92% rename from patches/todo/server/0019-Anvil-API.patch rename to patches/server/0016-Anvil-API.patch index 9ad9c81db..03553fdbb 100644 --- a/patches/todo/server/0019-Anvil-API.patch +++ b/patches/server/0016-Anvil-API.patch @@ -5,7 +5,7 @@ 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 c84908095a93d42826b21bf5f3490410fb0a5708..20b328704981c088597359fe18c1d67c339c1c0f 100644 +index 706b354ac9a1a6a4a1e61b2a109180d1dd22bbbd..9ca261c9f21279558961649cb4849ac379d67573 100644 --- a/src/main/java/net/minecraft/world/inventory/AbstractContainerMenu.java +++ b/src/main/java/net/minecraft/world/inventory/AbstractContainerMenu.java @@ -76,6 +76,7 @@ public abstract class AbstractContainerMenu { @@ -17,10 +17,10 @@ index c84908095a93d42826b21bf5f3490410fb0a5708..20b328704981c088597359fe18c1d67c // CraftBukkit start public boolean checkReachable = true; diff --git a/src/main/java/net/minecraft/world/inventory/AnvilMenu.java b/src/main/java/net/minecraft/world/inventory/AnvilMenu.java -index b7a2295290227045e6426ee0f71707185d95b943..8475a8514b39d543cc7cf0dbfef6d2aabb6127d0 100644 +index e0c3a4ba27e21c3692e601acd0af60873bcbb84c..b500a04b8135604f0159a741b3d228c9e87b2a46 100644 --- a/src/main/java/net/minecraft/world/inventory/AnvilMenu.java +++ b/src/main/java/net/minecraft/world/inventory/AnvilMenu.java -@@ -21,6 +21,13 @@ import org.slf4j.Logger; +@@ -23,6 +23,13 @@ import org.slf4j.Logger; import org.bukkit.craftbukkit.inventory.CraftInventoryView; // CraftBukkit end @@ -34,7 +34,7 @@ index b7a2295290227045e6426ee0f71707185d95b943..8475a8514b39d543cc7cf0dbfef6d2aa public class AnvilMenu extends ItemCombinerMenu { public static final int INPUT_SLOT = 0; -@@ -48,6 +55,8 @@ public class AnvilMenu extends ItemCombinerMenu { +@@ -51,6 +58,8 @@ public class AnvilMenu extends ItemCombinerMenu { public int maximumRepairCost = 40; private CraftInventoryView bukkitEntity; // CraftBukkit end @@ -43,7 +43,7 @@ index b7a2295290227045e6426ee0f71707185d95b943..8475a8514b39d543cc7cf0dbfef6d2aa public AnvilMenu(int syncId, Inventory inventory) { this(syncId, inventory, ContainerLevelAccess.NULL); -@@ -75,12 +84,15 @@ public class AnvilMenu extends ItemCombinerMenu { +@@ -78,12 +87,15 @@ public class AnvilMenu extends ItemCombinerMenu { @Override protected boolean mayPickup(Player player, boolean present) { @@ -60,7 +60,7 @@ index b7a2295290227045e6426ee0f71707185d95b943..8475a8514b39d543cc7cf0dbfef6d2aa player.giveExperienceLevels(-this.cost.get()); } -@@ -131,6 +143,12 @@ public class AnvilMenu extends ItemCombinerMenu { +@@ -134,6 +146,12 @@ public class AnvilMenu extends ItemCombinerMenu { @Override public void createResult() { @@ -73,7 +73,7 @@ index b7a2295290227045e6426ee0f71707185d95b943..8475a8514b39d543cc7cf0dbfef6d2aa ItemStack itemstack = this.inputSlots.getItem(0); this.cost.set(1); -@@ -207,7 +225,7 @@ public class AnvilMenu extends ItemCombinerMenu { +@@ -210,7 +228,7 @@ public class AnvilMenu extends ItemCombinerMenu { int i2 = (Integer) map1.get(enchantment); i2 = l1 == i2 ? i2 + 1 : Math.max(i2, l1); @@ -82,7 +82,7 @@ index b7a2295290227045e6426ee0f71707185d95b943..8475a8514b39d543cc7cf0dbfef6d2aa if (this.player.getAbilities().instabuild || itemstack.is(Items.ENCHANTED_BOOK)) { flag3 = true; -@@ -219,7 +237,7 @@ public class AnvilMenu extends ItemCombinerMenu { +@@ -222,7 +240,7 @@ public class AnvilMenu extends ItemCombinerMenu { Enchantment enchantment1 = (Enchantment) iterator1.next(); if (enchantment1 != enchantment && !enchantment.isCompatibleWith(enchantment1)) { @@ -91,7 +91,7 @@ index b7a2295290227045e6426ee0f71707185d95b943..8475a8514b39d543cc7cf0dbfef6d2aa ++i; } } -@@ -290,6 +308,13 @@ public class AnvilMenu extends ItemCombinerMenu { +@@ -293,6 +311,13 @@ public class AnvilMenu extends ItemCombinerMenu { this.cost.set(this.maximumRepairCost - 1); // CraftBukkit } @@ -105,7 +105,7 @@ index b7a2295290227045e6426ee0f71707185d95b943..8475a8514b39d543cc7cf0dbfef6d2aa if (this.cost.get() >= this.maximumRepairCost && !this.player.getAbilities().instabuild) { // CraftBukkit itemstack1 = ItemStack.EMPTY; } -@@ -312,6 +337,12 @@ public class AnvilMenu extends ItemCombinerMenu { +@@ -315,6 +340,12 @@ public class AnvilMenu extends ItemCombinerMenu { org.bukkit.craftbukkit.event.CraftEventFactory.callPrepareAnvilEvent(this.getBukkitView(), itemstack1); // CraftBukkit sendAllDataToRemote(); // CraftBukkit - SPIGOT-6686: Always send completed inventory to stay in sync with client this.broadcastChanges(); diff --git a/patches/todo/server/0020-Alternative-Keepalive-Handling.patch b/patches/server/0017-Alternative-Keepalive-Handling.patch similarity index 91% rename from patches/todo/server/0020-Alternative-Keepalive-Handling.patch rename to patches/server/0017-Alternative-Keepalive-Handling.patch index 46460932d..f1e18b127 100644 --- a/patches/todo/server/0020-Alternative-Keepalive-Handling.patch +++ b/patches/server/0017-Alternative-Keepalive-Handling.patch @@ -5,7 +5,7 @@ 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 db737258db16ec9f61d0d601a6ea5f6b14638033..f7b3110cf30124fc4054bfcda6d5ad28a5c0a48c 100644 +index 1782c461c5d5cc1a2416deb58c8345f16984ddbb..7d61ad24a1e8654ee0a0988b59c3f4b4598b306d 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java @@ -263,6 +263,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic @@ -38,7 +38,7 @@ index db737258db16ec9f61d0d601a6ea5f6b14638033..f7b3110cf30124fc4054bfcda6d5ad28 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 -@@ -3527,6 +3543,16 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -3484,6 +3500,16 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic @Override public void handleKeepAlive(ServerboundKeepAlivePacket packet) { @@ -52,14 +52,14 @@ index db737258db16ec9f61d0d601a6ea5f6b14638033..f7b3110cf30124fc4054bfcda6d5ad28 + } + } else + // Purpur end - //PacketUtils.ensureRunningOnSameThread(packet, this, this.player.getLevel()); // CraftBukkit // Paper - This shouldn't be on the main thread + //PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel()); // CraftBukkit // Paper - This shouldn't be on the main thread if (this.keepAlivePending && packet.getId() == this.keepAliveChallenge) { int i = (int) (Util.getMillis() - this.keepAliveTime); diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -index 16ba03a9df0c3709c4794df7cb46249bda0bbac6..fa27bb42697cd5741b7308b34cd768232604a20f 100644 +index f0dfed4573f1cac8aa9148fbddf9e8c601c21bdf..dba0de7594851560706afaeb5e56f8c5574da303 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -@@ -198,6 +198,11 @@ public class PurpurConfig { +@@ -196,6 +196,11 @@ public class PurpurConfig { laggingThreshold = getDouble("settings.lagging-threshold", laggingThreshold); } diff --git a/patches/todo/server/0021-Silk-touch-spawners.patch b/patches/server/0018-Silk-touch-spawners.patch similarity index 94% rename from patches/todo/server/0021-Silk-touch-spawners.patch rename to patches/server/0018-Silk-touch-spawners.patch index 213923e7e..85ba6f558 100644 --- a/patches/todo/server/0021-Silk-touch-spawners.patch +++ b/patches/server/0018-Silk-touch-spawners.patch @@ -5,10 +5,10 @@ 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 775823daa5187804d27e5ee696cd75f703bb067c..42e6aeea8d2e076aea7fa2c1ccf5edcc5efba46f 100644 +index 5f20e075c532f0f1d413242949d1738c0c152bf7..e6f8cb165f7e3da5f0edfc952d14059516de8acf 100644 --- a/src/main/java/net/minecraft/world/item/Items.java +++ b/src/main/java/net/minecraft/world/item/Items.java -@@ -292,7 +292,7 @@ public class Items { +@@ -294,7 +294,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); @@ -89,7 +89,7 @@ index 936d844a5a246138c9f9ae4ae6e318242b8f1420..d58dc4aa02fe371deaf879df8692dbe9 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 786c1e30c56dfe28d00a9727c97d837cf7310ad3..e7b23899c4787fbcb6a8c65ece88967eece4f3e1 100644 +index 1e5290c9ef98f5ce2cca85e876fe8103b0368a02..47f686b066da17d207052904ecf0bb172243b9b2 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -114,6 +114,38 @@ public class PurpurWorldConfig { @@ -118,19 +118,19 @@ index 786c1e30c56dfe28d00a9727c97d837cf7310ad3..e7b23899c4787fbcb6a8c65ece88967e + .forEach(line -> silkTouchSpawnerLore.add(line.toString())); + silkTouchTools.clear(); + getList("gameplay-mechanics.silk-touch.tools", List.of( -+ "minecraft:iron_pickaxe", -+ "minecraft:golden_pickaxe", -+ "minecraft:diamond_pickaxe", -+ "minecraft:netherite_pickaxe" ++ "minecraft:iron_pickaxe", ++ "minecraft:golden_pickaxe", ++ "minecraft:diamond_pickaxe", ++ "minecraft:netherite_pickaxe" + )).forEach(key -> { + Item item = BuiltInRegistries.ITEM.get(new ResourceLocation(key.toString())); + if (item != Items.AIR) silkTouchTools.add(item); + }); + } + - public boolean babiesAreRidable = true; - public boolean untamedTamablesAreRidable = true; - public boolean useNightVisionWhenRiding = false; + public double axolotlMaxHealth = 14.0D; + private void axolotlSettings() { + axolotlMaxHealth = getDouble("mobs.axolotl.attributes.max_health", axolotlMaxHealth); 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..c038fb2bbb0f0e78380bc24bbd6348b869669a90 diff --git a/patches/todo/server/0022-Add-turtle-egg-block-options.patch b/patches/server/0019-Add-turtle-egg-block-options.patch similarity index 90% rename from patches/todo/server/0022-Add-turtle-egg-block-options.patch rename to patches/server/0019-Add-turtle-egg-block-options.patch index f5119e132..8003cbdef 100644 --- a/patches/todo/server/0022-Add-turtle-egg-block-options.patch +++ b/patches/server/0019-Add-turtle-egg-block-options.patch @@ -36,7 +36,7 @@ index 6c1a0e6f961e46a1a89850746a71e97b32514adf..1942649e868fc985a488034c411a6721 } } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index e7b23899c4787fbcb6a8c65ece88967eece4f3e1..1046f6de8a04c4368870596f90236fe01671173d 100644 +index 47f686b066da17d207052904ecf0bb172243b9b2..c8df1eca97b510559482d41b28569df0e9934b3d 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -146,6 +146,15 @@ public class PurpurWorldConfig { @@ -52,6 +52,6 @@ index e7b23899c4787fbcb6a8c65ece88967eece4f3e1..1046f6de8a04c4368870596f90236fe0 + turtleEggsBreakFromMinecarts = getBoolean("blocks.turtle_egg.break-from-minecarts", turtleEggsBreakFromMinecarts); + } + - public boolean babiesAreRidable = true; - public boolean untamedTamablesAreRidable = true; - public boolean useNightVisionWhenRiding = false; + public double axolotlMaxHealth = 14.0D; + private void axolotlSettings() { + axolotlMaxHealth = getDouble("mobs.axolotl.attributes.max_health", axolotlMaxHealth); diff --git a/patches/todo/server/0023-Logger-settings-suppressing-pointless-logs.patch b/patches/server/0020-Logger-settings-suppressing-pointless-logs.patch similarity index 92% rename from patches/todo/server/0023-Logger-settings-suppressing-pointless-logs.patch rename to patches/server/0020-Logger-settings-suppressing-pointless-logs.patch index e3a4a7dcf..7daa2bc00 100644 --- a/patches/todo/server/0023-Logger-settings-suppressing-pointless-logs.patch +++ b/patches/server/0020-Logger-settings-suppressing-pointless-logs.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Logger settings (suppressing pointless logs) diff --git a/src/main/java/net/minecraft/server/PlayerAdvancements.java b/src/main/java/net/minecraft/server/PlayerAdvancements.java -index 26888ebd38280de92e41dd8006d2b24e874afe26..25b832fe30c3837d02b10017e58ad0fa9d097092 100644 +index acc49f66bf34e2507d0ee6fec0a56b11bfc68f46..52891c4a4260d1938f2f4565b5219ad303555638 100644 --- a/src/main/java/net/minecraft/server/PlayerAdvancements.java +++ b/src/main/java/net/minecraft/server/PlayerAdvancements.java @@ -147,6 +147,7 @@ public class PlayerAdvancements { @@ -29,10 +29,10 @@ index 877498729c66de9aa6a27c9148f7494d7895615c..acd7468ee3c86d3456e96e4ec3d7e6a4 Util.logAndPauseIfInIde("Detected setBlock in a far chunk [" + i + ", " + j + "], pos: " + pos + ", status: " + this.generatingStatus + (this.currentlyGenerating == null ? "" : ", currently generating: " + (String) this.currentlyGenerating.get())); hasSetFarWarned = true; diff --git a/src/main/java/net/minecraft/stats/ServerRecipeBook.java b/src/main/java/net/minecraft/stats/ServerRecipeBook.java -index d13ed3069e944d138442ea440ac3eaf8d44c18d3..29ac7f202aa23f7e6fcdc9829af3d59875c92d4e 100644 +index ea29e07a105f3ba6a878bdccf36e7eaf66280280..d5dce6c8d85938d61a57a78f82381d26daf8f87a 100644 --- a/src/main/java/net/minecraft/stats/ServerRecipeBook.java +++ b/src/main/java/net/minecraft/stats/ServerRecipeBook.java -@@ -122,6 +122,7 @@ public class ServerRecipeBook extends RecipeBook { +@@ -125,6 +125,7 @@ public class ServerRecipeBook extends RecipeBook { Optional> optional = recipeManager.byKey(minecraftkey); if (!optional.isPresent()) { @@ -53,10 +53,10 @@ index 110503062b3043cffa082a1cda6b8d57152869aa..3e7e06bd5e9e4ed45c9e3452eb04e946 if (MinecraftServer.getServer() != null && MinecraftServer.getServer().isDebugging()) { new Exception().printStackTrace(); diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -index fa27bb42697cd5741b7308b34cd768232604a20f..9db231480f0763c2b6514a956ec9398b98b7d1bc 100644 +index dba0de7594851560706afaeb5e56f8c5574da303..c875d0351a32fa5bd75f4f440d6623830febf86b 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -@@ -237,4 +237,15 @@ public class PurpurConfig { +@@ -235,4 +235,15 @@ public class PurpurConfig { org.bukkit.event.inventory.InventoryType.ENDER_CHEST.setDefaultSize(enderChestSixRows ? 54 : 27); enderChestPermissionRows = getBoolean("settings.blocks.ender_chest.use-permissions-for-rows", enderChestPermissionRows); } diff --git a/patches/todo/server/0024-Disable-outdated-build-check.patch b/patches/server/0021-Disable-outdated-build-check.patch similarity index 92% rename from patches/todo/server/0024-Disable-outdated-build-check.patch rename to patches/server/0021-Disable-outdated-build-check.patch index 14f4d901c..f6d5981b2 100644 --- a/patches/todo/server/0024-Disable-outdated-build-check.patch +++ b/patches/server/0021-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 61dc0de4cd324c714e7ce78d179447c5de7a9555..6dcec99ed891c96f7f89fbbbea0b2912c3e55709 100644 +index 2be5346e48f9f8410f3e4e9a2aa57b063495eb93..20aed44f6d50ff279002259c05c84e7d15904142 100644 --- a/src/main/java/org/bukkit/craftbukkit/Main.java +++ b/src/main/java/org/bukkit/craftbukkit/Main.java @@ -292,7 +292,7 @@ public class Main { diff --git a/patches/todo/server/0025-Giants-AI-settings.patch b/patches/server/0022-Giants-AI-settings.patch similarity index 80% rename from patches/todo/server/0025-Giants-AI-settings.patch rename to patches/server/0022-Giants-AI-settings.patch index 9fdfabb43..c330654b1 100644 --- a/patches/todo/server/0025-Giants-AI-settings.patch +++ b/patches/server/0022-Giants-AI-settings.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Giants AI settings diff --git a/src/main/java/net/minecraft/world/entity/monster/Giant.java b/src/main/java/net/minecraft/world/entity/monster/Giant.java -index 2050230df7949e21f2158d2be5be885461afb66d..14b393c8b70a1aa950df9dcaef648a90469bde65 100644 +index 4511b56c6f58336920f1470400f8e120f12f72e6..3d45d1a5091fbf7dd275aebfca336d80a72010b0 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Giant.java +++ b/src/main/java/net/minecraft/world/entity/monster/Giant.java @@ -1,13 +1,36 @@ @@ -45,33 +45,20 @@ index 2050230df7949e21f2158d2be5be885461afb66d..14b393c8b70a1aa950df9dcaef648a90 public class Giant extends Monster { public Giant(EntityType type, Level world) { -@@ -31,18 +54,59 @@ public class Giant extends Monster { - return level.purpurConfig.giantControllable; - } - -- @Override -- protected void registerGoals() { -- this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); -- this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); -- } -- - @Override - protected void initAttributes() { - this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.giantMaxHealth); - this.getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(this.level.purpurConfig.giantMovementSpeed); +@@ -22,6 +45,53 @@ public class Giant extends Monster { this.getAttribute(Attributes.ATTACK_DAMAGE).setBaseValue(this.level.purpurConfig.giantAttackDamage); } -+ + + @Override + protected void registerGoals() { -+ if (level.purpurConfig.giantHaveAI) { ++ if (level().purpurConfig.giantHaveAI) { + this.goalSelector.addGoal(0, new FloatGoal(this)); + this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); + this.goalSelector.addGoal(7, new WaterAvoidingRandomStrollGoal(this, 1.0D)); + this.goalSelector.addGoal(8, new LookAtPlayerGoal(this, Player.class, 16.0F)); + this.goalSelector.addGoal(8, new RandomLookAroundGoal(this)); + this.goalSelector.addGoal(5, new MoveTowardsRestrictionGoal(this, 1.0D)); -+ if (level.purpurConfig.giantHaveHostileAI) { ++ if (level().purpurConfig.giantHaveHostileAI) { + this.goalSelector.addGoal(2, new MeleeAttackGoal(this, 1.0D, false)); + this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); + this.targetSelector.addGoal(1, new HurtByTargetGoal(this).setAlertOthers(ZombifiedPiglin.class)); @@ -97,7 +84,7 @@ index 2050230df7949e21f2158d2be5be885461afb66d..14b393c8b70a1aa950df9dcaef648a90 + protected void populateDefaultEquipmentSlots(net.minecraft.util.RandomSource random, DifficultyInstance difficulty) { + super.populateDefaultEquipmentSlots(this.random, difficulty); + // TODO make configurable -+ if (random.nextFloat() < (level.getDifficulty() == Difficulty.HARD ? 0.1F : 0.05F)) { ++ if (random.nextFloat() < (level().getDifficulty() == Difficulty.HARD ? 0.1F : 0.05F)) { + this.setItemSlot(EquipmentSlot.MAINHAND, new ItemStack(Items.IRON_SWORD)); + } + } @@ -106,12 +93,13 @@ index 2050230df7949e21f2158d2be5be885461afb66d..14b393c8b70a1aa950df9dcaef648a90 + public float getJumpPower() { + // make giants jump as high as everything else relative to their size + // 1.0 makes bottom of feet about as high as their waist when they jump -+ return level.purpurConfig.giantJumpHeight; ++ return level().purpurConfig.giantJumpHeight; + } - // Purpur end - ++ @Override -@@ -56,6 +120,6 @@ public class Giant extends Monster { + protected float getStandingEyeHeight(Pose pose, EntityDimensions dimensions) { + return 10.440001F; +@@ -33,6 +103,6 @@ public class Giant extends Monster { @Override public float getWalkTargetValue(BlockPos pos, LevelReader world) { @@ -120,10 +108,10 @@ index 2050230df7949e21f2158d2be5be885461afb66d..14b393c8b70a1aa950df9dcaef648a90 } } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 5320558a12d811afbea5f3a96c3ccce249e6962a..e697c549fd1097b071350a937acb097d39fbd4cd 100644 +index c8df1eca97b510559482d41b28569df0e9934b3d..71333fd7ea1cde870bb1d76959d1b599d8c6376d 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -551,6 +551,10 @@ public class PurpurWorldConfig { +@@ -400,6 +400,10 @@ public class PurpurWorldConfig { public double giantMovementSpeed = 0.5D; public double giantAttackDamage = 50.0D; public double giantMaxHealth = 100.0D; @@ -132,9 +120,9 @@ index 5320558a12d811afbea5f3a96c3ccce249e6962a..e697c549fd1097b071350a937acb097d + public boolean giantHaveAI = false; + public boolean giantHaveHostileAI = false; private void giantSettings() { - giantRidable = getBoolean("mobs.giant.ridable", giantRidable); - giantRidableInWater = getBoolean("mobs.giant.ridable-in-water", giantRidableInWater); -@@ -567,6 +571,10 @@ public class PurpurWorldConfig { + giantMovementSpeed = getDouble("mobs.giant.movement-speed", giantMovementSpeed); + giantAttackDamage = getDouble("mobs.giant.attack-damage", giantAttackDamage); +@@ -413,6 +417,10 @@ public class PurpurWorldConfig { set("mobs.giant.attributes.max_health", oldValue); } giantMaxHealth = getDouble("mobs.giant.attributes.max_health", giantMaxHealth); @@ -144,4 +132,4 @@ index 5320558a12d811afbea5f3a96c3ccce249e6962a..e697c549fd1097b071350a937acb097d + giantHaveHostileAI = getBoolean("mobs.giant.have-hostile-ai", giantHaveHostileAI); } - public boolean glowSquidRidable = false; + public double glowSquidMaxHealth = 10.0D; diff --git a/patches/todo/server/0026-Zombie-horse-naturally-spawn.patch b/patches/server/0023-Zombie-horse-naturally-spawn.patch similarity index 83% rename from patches/todo/server/0026-Zombie-horse-naturally-spawn.patch rename to patches/server/0023-Zombie-horse-naturally-spawn.patch index 8dc2262ca..6ce592895 100644 --- a/patches/todo/server/0026-Zombie-horse-naturally-spawn.patch +++ b/patches/server/0023-Zombie-horse-naturally-spawn.patch @@ -5,10 +5,10 @@ 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 3d641a5721b90230c79dca9e43ccc6fa21f24946..575be84b580f7d7f4968bc4e2a69e0a067a3a617 100644 +index 42d5b4ffc51da90a8f3bbec84e44ac2b0cb7b5ee..ac9f7e786d2e2042b8694a4ddd2f806758f9ea50 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java -@@ -830,10 +830,18 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -873,10 +873,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) { @@ -30,22 +30,22 @@ index 3d641a5721b90230c79dca9e43ccc6fa21f24946..575be84b580f7d7f4968bc4e2a69e0a0 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 e697c549fd1097b071350a937acb097d39fbd4cd..5d390156e36b953ade9b009b17332c2907e30b3c 100644 +index 71333fd7ea1cde870bb1d76959d1b599d8c6376d..9e0017fb69ea24c866fe78f0dc7cc90cfdb17517 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1481,6 +1481,7 @@ public class PurpurWorldConfig { +@@ -1021,6 +1021,7 @@ public class PurpurWorldConfig { public double zombieHorseJumpStrengthMax = 1.0D; public double zombieHorseMovementSpeedMin = 0.2D; public double zombieHorseMovementSpeedMax = 0.2D; + public double zombieHorseSpawnChance = 0.0D; private void zombieHorseSettings() { - zombieHorseRidableInWater = getBoolean("mobs.zombie_horse.ridable-in-water", zombieHorseRidableInWater); - zombieHorseCanSwim = getBoolean("mobs.zombie_horse.can-swim", zombieHorseCanSwim); -@@ -1496,6 +1497,7 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.zombie_horse.attributes.max-health", zombieHorseMaxHealthMin); +@@ -1034,6 +1035,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); + zombieHorseSpawnChance = getDouble("mobs.zombie_horse.spawn-chance", zombieHorseSpawnChance); } - public boolean zombieVillagerRidable = false; + public double zombieVillagerMaxHealth = 20.0D; diff --git a/patches/todo/server/0027-Charged-creeper-naturally-spawn.patch b/patches/server/0024-Charged-creeper-naturally-spawn.patch similarity index 72% rename from patches/todo/server/0027-Charged-creeper-naturally-spawn.patch rename to patches/server/0024-Charged-creeper-naturally-spawn.patch index 34a89976c..b0fcc43c6 100644 --- a/patches/todo/server/0027-Charged-creeper-naturally-spawn.patch +++ b/patches/server/0024-Charged-creeper-naturally-spawn.patch @@ -5,14 +5,13 @@ 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 50fa28f8348625be15e93800e2c071e243afd39a..76d796600411144b73d1e7e67f70bb032055d02a 100644 +index d2d7ca4666d4cfd43dfcc8697e0957921bc48e61..9658611850a266ee1acf347d3f90cf4922a89d3c 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Creeper.java +++ b/src/main/java/net/minecraft/world/entity/monster/Creeper.java -@@ -142,6 +142,14 @@ public class Creeper extends Monster implements PowerableMob { - public void initAttributes() { +@@ -178,6 +178,14 @@ public class Creeper extends Monster implements PowerableMob { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.creeperMaxHealth); } -+ + + public net.minecraft.world.entity.SpawnGroupData finalizeSpawn(net.minecraft.world.level.ServerLevelAccessor world, net.minecraft.world.DifficultyInstance difficulty, net.minecraft.world.entity.MobSpawnType spawnReason, @Nullable net.minecraft.world.entity.SpawnGroupData entityData, @Nullable CompoundTag entityNbt) { + double chance = world.getLevel().purpurConfig.creeperChargedChance; + if (chance > 0D && random.nextDouble() <= chance) { @@ -20,26 +19,27 @@ index 50fa28f8348625be15e93800e2c071e243afd39a..76d796600411144b73d1e7e67f70bb03 + } + return super.finalizeSpawn(world, difficulty, spawnReason, entityData, entityNbt); + } - // Purpur end - ++ @Override + protected SoundEvent getHurtSound(DamageSource source) { + return SoundEvents.CREEPER_HURT; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 5d390156e36b953ade9b009b17332c2907e30b3c..3f994f5563950ebcd23c077e21f3ad691f900762 100644 +index 9e0017fb69ea24c866fe78f0dc7cc90cfdb17517..51ed3dd68cd723d9865207a6296016eddec71791 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -342,6 +342,7 @@ public class PurpurWorldConfig { - public boolean creeperRidableInWater = true; - public boolean creeperControllable = true; +@@ -270,6 +270,7 @@ public class PurpurWorldConfig { + } + public double creeperMaxHealth = 20.0D; + public double creeperChargedChance = 0.0D; private void creeperSettings() { - creeperRidable = getBoolean("mobs.creeper.ridable", creeperRidable); - creeperRidableInWater = getBoolean("mobs.creeper.ridable-in-water", creeperRidableInWater); -@@ -352,6 +353,7 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.creeper.attributes.max-health", creeperMaxHealth); +@@ -277,6 +278,7 @@ public class PurpurWorldConfig { set("mobs.creeper.attributes.max_health", oldValue); } creeperMaxHealth = getDouble("mobs.creeper.attributes.max_health", creeperMaxHealth); + creeperChargedChance = getDouble("mobs.creeper.naturally-charged-chance", creeperChargedChance); } - public boolean dolphinRidable = false; + public double dolphinMaxHealth = 10.0D; diff --git a/patches/todo/server/0028-Rabbit-naturally-spawn-toast-and-killer.patch b/patches/server/0025-Rabbit-naturally-spawn-toast-and-killer.patch similarity index 77% rename from patches/todo/server/0028-Rabbit-naturally-spawn-toast-and-killer.patch rename to patches/server/0025-Rabbit-naturally-spawn-toast-and-killer.patch index b5c520e71..2a3518df4 100644 --- a/patches/todo/server/0028-Rabbit-naturally-spawn-toast-and-killer.patch +++ b/patches/server/0025-Rabbit-naturally-spawn-toast-and-killer.patch @@ -5,10 +5,10 @@ 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 ebb85ac5b77450a1ae91c986512125814fa0907f..620cf2c9927648804155495a908df1d36d9832af 100644 +index 1cb36eb937084c6dbc72d33e51c52af6f14c885d..1e8627f92580d791601fddb01f73b281797c06cb 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Rabbit.java +++ b/src/main/java/net/minecraft/world/entity/animal/Rabbit.java -@@ -465,10 +465,23 @@ public class Rabbit extends Animal implements VariantHolder { +@@ -410,10 +410,23 @@ public class Rabbit extends Animal implements VariantHolder { } this.setVariant(entityrabbit_variant); @@ -33,19 +33,19 @@ index ebb85ac5b77450a1ae91c986512125814fa0907f..620cf2c9927648804155495a908df1d3 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 3f994f5563950ebcd23c077e21f3ad691f900762..ca4f635ac65dcbdf5ebbe8d351623f64dded41e0 100644 +index 51ed3dd68cd723d9865207a6296016eddec71791..d402acc4bba74963809af86e5348405312781620 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -985,6 +985,8 @@ public class PurpurWorldConfig { - public boolean rabbitRidableInWater = true; - public boolean rabbitControllable = true; +@@ -704,6 +704,8 @@ public class PurpurWorldConfig { + } + public double rabbitMaxHealth = 3.0D; + public double rabbitNaturalToast = 0.0D; + public double rabbitNaturalKiller = 0.0D; private void rabbitSettings() { - rabbitRidable = getBoolean("mobs.rabbit.ridable", rabbitRidable); - rabbitRidableInWater = getBoolean("mobs.rabbit.ridable-in-water", rabbitRidableInWater); -@@ -995,6 +997,8 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.rabbit.attributes.max-health", rabbitMaxHealth); +@@ -711,6 +713,8 @@ public class PurpurWorldConfig { set("mobs.rabbit.attributes.max_health", oldValue); } rabbitMaxHealth = getDouble("mobs.rabbit.attributes.max_health", rabbitMaxHealth); @@ -53,4 +53,4 @@ index 3f994f5563950ebcd23c077e21f3ad691f900762..ca4f635ac65dcbdf5ebbe8d351623f64 + rabbitNaturalKiller = getDouble("mobs.rabbit.spawn-killer-rabbit-chance", rabbitNaturalKiller); } - public boolean ravagerRidable = false; + public double ravagerMaxHealth = 100.0D; diff --git a/patches/todo/server/0029-Fix-outdated-server-showing-in-ping-before-server-fu.patch b/patches/server/0026-Fix-outdated-server-showing-in-ping-before-server-fu.patch similarity index 100% rename from patches/todo/server/0029-Fix-outdated-server-showing-in-ping-before-server-fu.patch rename to patches/server/0026-Fix-outdated-server-showing-in-ping-before-server-fu.patch diff --git a/patches/todo/server/0030-Tulips-change-fox-type.patch b/patches/server/0027-Tulips-change-fox-type.patch similarity index 83% rename from patches/todo/server/0030-Tulips-change-fox-type.patch rename to patches/server/0027-Tulips-change-fox-type.patch index a684570ab..b2db9906c 100644 --- a/patches/todo/server/0030-Tulips-change-fox-type.patch +++ b/patches/server/0027-Tulips-change-fox-type.patch @@ -5,7 +5,7 @@ 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 5de86c59bf857e6697bb768e3dd71a05739fb3d2..d5f536eb87163c946815ace610ba99ad2a0b16c5 100644 +index b75c942e212e6659723c4fea3f06f85a627096f0..5ee2f4d9e0bb97de9cb8bd3b2c4b6280c607b323 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.RandomSource; @@ -24,7 +24,7 @@ index 5de86c59bf857e6697bb768e3dd71a05739fb3d2..d5f536eb87163c946815ace610ba99ad import net.minecraft.world.level.pathfinder.BlockPathTypes; import net.minecraft.world.phys.Vec3; -@@ -387,6 +389,11 @@ public class Fox extends Animal implements VariantHolder { +@@ -347,6 +349,11 @@ public class Fox extends Animal implements VariantHolder { } private void setTargetGoals() { @@ -36,7 +36,7 @@ index 5de86c59bf857e6697bb768e3dd71a05739fb3d2..d5f536eb87163c946815ace610ba99ad if (this.getVariant() == Fox.Type.RED) { this.targetSelector.addGoal(4, this.landTargetGoal); this.targetSelector.addGoal(4, this.turtleEggTargetGoal); -@@ -420,6 +427,7 @@ public class Fox extends Animal implements VariantHolder { +@@ -380,6 +387,7 @@ public class Fox extends Animal implements VariantHolder { public void setVariant(Fox.Type variant) { this.entityData.set(Fox.DATA_TYPE_ID, variant.getId()); @@ -44,7 +44,7 @@ index 5de86c59bf857e6697bb768e3dd71a05739fb3d2..d5f536eb87163c946815ace610ba99ad } List getTrustedUUIDs() { -@@ -756,6 +764,29 @@ public class Fox extends Animal implements VariantHolder { +@@ -716,6 +724,29 @@ public class Fox extends Animal implements VariantHolder { return this.getTrustedUUIDs().contains(uuid); } @@ -75,22 +75,22 @@ index 5de86c59bf857e6697bb768e3dd71a05739fb3d2..d5f536eb87163c946815ace610ba99ad // 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 ca4f635ac65dcbdf5ebbe8d351623f64dded41e0..470833e60081dd32a58d5efacad1ecff5b5b1812 100644 +index d402acc4bba74963809af86e5348405312781620..ebc2aa944fdd6bde9463450387a0dda7462debc5 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -506,6 +506,7 @@ public class PurpurWorldConfig { - public boolean foxRidableInWater = true; - public boolean foxControllable = true; +@@ -380,6 +380,7 @@ public class PurpurWorldConfig { + } + public double foxMaxHealth = 10.0D; + public boolean foxTypeChangesWithTulips = false; private void foxSettings() { - foxRidable = getBoolean("mobs.fox.ridable", foxRidable); - foxRidableInWater = getBoolean("mobs.fox.ridable-in-water", foxRidableInWater); -@@ -516,6 +517,7 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.fox.attributes.max-health", foxMaxHealth); +@@ -387,6 +388,7 @@ public class PurpurWorldConfig { set("mobs.fox.attributes.max_health", oldValue); } foxMaxHealth = getDouble("mobs.fox.attributes.max_health", foxMaxHealth); + foxTypeChangesWithTulips = getBoolean("mobs.fox.tulips-change-type", foxTypeChangesWithTulips); } - public boolean frogRidable = false; + public double ghastMaxHealth = 10.0D; diff --git a/patches/todo/server/0031-Breedable-Polar-Bears.patch b/patches/server/0028-Breedable-Polar-Bears.patch similarity index 76% rename from patches/todo/server/0031-Breedable-Polar-Bears.patch rename to patches/server/0028-Breedable-Polar-Bears.patch index 0fa5101a2..afcd7530e 100644 --- a/patches/todo/server/0031-Breedable-Polar-Bears.patch +++ b/patches/server/0028-Breedable-Polar-Bears.patch @@ -5,14 +5,13 @@ 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 90e5114a5c1a341d0ac64d72d6306ddeb09cb728..69a0e50a4f136a3e799f8fc079bd931a83235bd0 100644 +index 71f75dd1d0c9b77f73138297a1be642c67c78c01..071236ec8534dfce2560ca14c09865fc053ab36a 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 { - public void initAttributes() { +@@ -70,6 +70,27 @@ public class PolarBear extends Animal implements NeutralMob { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.polarBearMaxHealth); } -+ + + public boolean canMate(Animal other) { + if (other == this) { + return false; @@ -33,10 +32,11 @@ index 90e5114a5c1a341d0ac64d72d6306ddeb09cb728..69a0e50a4f136a3e799f8fc079bd931a + return this.isInLove() && bear.isInLove(); + } + } - // Purpur end - ++ @Nullable -@@ -107,7 +128,7 @@ public class PolarBear extends Animal implements NeutralMob { + @Override + public AgeableMob getBreedOffspring(ServerLevel world, AgeableMob entity) { +@@ -78,7 +99,7 @@ public class PolarBear extends Animal implements NeutralMob { @Override public boolean isFood(ItemStack stack) { @@ -45,8 +45,8 @@ index 90e5114a5c1a341d0ac64d72d6306ddeb09cb728..69a0e50a4f136a3e799f8fc079bd931a } @Override -@@ -117,6 +138,12 @@ public class PolarBear extends Animal implements NeutralMob { - this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur +@@ -87,6 +108,12 @@ public class PolarBear extends Animal implements NeutralMob { + this.goalSelector.addGoal(0, new FloatGoal(this)); this.goalSelector.addGoal(1, new PolarBear.PolarBearMeleeAttackGoal()); this.goalSelector.addGoal(1, new PolarBear.PolarBearPanicGoal()); + // Purpur start @@ -59,19 +59,19 @@ index 90e5114a5c1a341d0ac64d72d6306ddeb09cb728..69a0e50a4f136a3e799f8fc079bd931a 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 470833e60081dd32a58d5efacad1ecff5b5b1812..5eaf43ea5d983db45b95acb5c9e5e97e79606785 100644 +index ebc2aa944fdd6bde9463450387a0dda7462debc5..4d4e44957d4a67aed358d4e2e3161fbab83d1f6c 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -957,6 +957,8 @@ public class PurpurWorldConfig { - public boolean polarBearRidableInWater = true; - public boolean polarBearControllable = true; +@@ -686,6 +686,8 @@ public class PurpurWorldConfig { + } + public double polarBearMaxHealth = 30.0D; + public String polarBearBreedableItemString = ""; + public Item polarBearBreedableItem = null; private void polarBearSettings() { - polarBearRidable = getBoolean("mobs.polar_bear.ridable", polarBearRidable); - polarBearRidableInWater = getBoolean("mobs.polar_bear.ridable-in-water", polarBearRidableInWater); -@@ -967,6 +969,9 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.polar_bear.attributes.max-health", polarBearMaxHealth); +@@ -693,6 +695,9 @@ public class PurpurWorldConfig { set("mobs.polar_bear.attributes.max_health", oldValue); } polarBearMaxHealth = getDouble("mobs.polar_bear.attributes.max_health", polarBearMaxHealth); @@ -80,4 +80,4 @@ index 470833e60081dd32a58d5efacad1ecff5b5b1812..5eaf43ea5d983db45b95acb5c9e5e97e + if (item != Items.AIR) polarBearBreedableItem = item; } - public boolean pufferfishRidable = false; + public double pufferfishMaxHealth = 3.0D; diff --git a/patches/todo/server/0032-Chickens-can-retaliate.patch b/patches/server/0029-Chickens-can-retaliate.patch similarity index 76% rename from patches/todo/server/0032-Chickens-can-retaliate.patch rename to patches/server/0029-Chickens-can-retaliate.patch index 0afb697be..4d3042cf9 100644 --- a/patches/todo/server/0032-Chickens-can-retaliate.patch +++ b/patches/server/0029-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 5207a2a8c06cd413e1d62c5eec7a232dce952b8b..da281eb1355fd753dfdb69cee13661818b5d0fc8 100644 +index c7ff22ee963e3d7ca3c5b819b38cca466c5d78c5..7d6307aed4d1c15edf2008715ec90f61aac42046 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Chicken.java +++ b/src/main/java/net/minecraft/world/entity/animal/Chicken.java -@@ -73,6 +73,9 @@ public class Chicken extends Animal { +@@ -57,18 +57,29 @@ public class Chicken extends Animal { @Override public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.chickenMaxHealth); @@ -16,12 +16,10 @@ index 5207a2a8c06cd413e1d62c5eec7a232dce952b8b..da281eb1355fd753dfdb69cee1366181 + this.getAttribute(Attributes.ATTACK_DAMAGE).setBaseValue(2.0D); + } } - // Purpur end -@@ -80,13 +83,21 @@ public class Chicken extends Animal { + @Override protected void registerGoals() { 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, 1.4D)); + // this.goalSelector.addGoal(1, new PanicGoal(this, 1.4D)); // Purpur - moved down this.goalSelector.addGoal(2, new BreedGoal(this, 1.0D)); @@ -41,7 +39,7 @@ index 5207a2a8c06cd413e1d62c5eec7a232dce952b8b..da281eb1355fd753dfdb69cee1366181 } @Override -@@ -95,7 +106,7 @@ public class Chicken extends Animal { +@@ -77,7 +88,7 @@ public class Chicken extends Animal { } public static AttributeSupplier.Builder createAttributes() { @@ -51,22 +49,22 @@ index 5207a2a8c06cd413e1d62c5eec7a232dce952b8b..da281eb1355fd753dfdb69cee1366181 @Override diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 5eaf43ea5d983db45b95acb5c9e5e97e79606785..cefd5086a7fef31a88ed4781b6d0bdbd014d36c6 100644 +index 4d4e44957d4a67aed358d4e2e3161fbab83d1f6c..6d7ecc73de85f299f2ae315f58927431b399f3f2 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -296,6 +296,7 @@ public class PurpurWorldConfig { - public boolean chickenRidableInWater = false; - public boolean chickenControllable = true; +@@ -240,6 +240,7 @@ public class PurpurWorldConfig { + } + public double chickenMaxHealth = 4.0D; + public boolean chickenRetaliate = false; private void chickenSettings() { - chickenRidable = getBoolean("mobs.chicken.ridable", chickenRidable); - chickenRidableInWater = getBoolean("mobs.chicken.ridable-in-water", chickenRidableInWater); -@@ -306,6 +307,7 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.chicken.attributes.max-health", chickenMaxHealth); +@@ -247,6 +248,7 @@ public class PurpurWorldConfig { set("mobs.chicken.attributes.max_health", oldValue); } chickenMaxHealth = getDouble("mobs.chicken.attributes.max_health", chickenMaxHealth); + chickenRetaliate = getBoolean("mobs.chicken.retaliate", chickenRetaliate); } - public boolean codRidable = false; + public double codMaxHealth = 3.0D; diff --git a/patches/todo/server/0310-Add-mending-multiplier.patch b/patches/todo/server/0310-Add-mending-multiplier.patch new file mode 100644 index 000000000..94478795d --- /dev/null +++ b/patches/todo/server/0310-Add-mending-multiplier.patch @@ -0,0 +1,48 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: rafaelflromao <12960698+rafaelflromao@users.noreply.github.com> +Date: Mon, 8 May 2023 20:43:29 +0100 +Subject: [PATCH] Add mending multiplier + + +diff --git a/src/main/java/net/minecraft/world/entity/ExperienceOrb.java b/src/main/java/net/minecraft/world/entity/ExperienceOrb.java +index df8d8f85f8db396b7db9fa6e46aa55c934105394..9a1dbb058a468c267606df336027806884fee645 100644 +--- a/src/main/java/net/minecraft/world/entity/ExperienceOrb.java ++++ b/src/main/java/net/minecraft/world/entity/ExperienceOrb.java +@@ -346,13 +346,15 @@ public class ExperienceOrb extends Entity { + } + } + ++ // Purpur start + public int durabilityToXp(int repairAmount) { +- return repairAmount / 2; ++ return (int) (repairAmount / (2 * level.purpurConfig.mendingMultiplier)); + } + + public int xpToDurability(int experienceAmount) { +- return experienceAmount * 2; ++ return (int) ((experienceAmount * 2) * level.purpurConfig.mendingMultiplier); + } ++ // Purpur end + + public int getValue() { + return this.value; +diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +index 157c5ce26015cabd5a007cf7444c8255db1a0b0f..31622937846c14dab4177a1f08c15985957c98bb 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 { + } + + public boolean useBetterMending = false; ++ public double mendingMultiplier = 1.0; + public boolean alwaysTameInCreative = false; + public boolean boatEjectPlayersOnLand = false; + public boolean boatsDoFallDamage = false; +@@ -148,6 +149,7 @@ public class PurpurWorldConfig { + public int mobLastHurtByPlayerTime = 100; + private void miscGameplayMechanicsSettings() { + useBetterMending = getBoolean("gameplay-mechanics.use-better-mending", useBetterMending); ++ mendingMultiplier = getDouble("gameplay-mechanics.mending-multiplier", mendingMultiplier); + alwaysTameInCreative = getBoolean("gameplay-mechanics.always-tame-in-creative", alwaysTameInCreative); + boatEjectPlayersOnLand = getBoolean("gameplay-mechanics.boat.eject-players-on-land", boatEjectPlayersOnLand); + boatsDoFallDamage = getBoolean("gameplay-mechanics.boat.do-fall-damage", boatsDoFallDamage); diff --git a/todo.txt b/todo.txt new file mode 100644 index 000000000..38a8602e6 --- /dev/null +++ b/todo.txt @@ -0,0 +1 @@ +* make sure that all mobs are in entity attributes and ridables (some from previous updates weren't added to attributes)