From 865911304ee539d320a8770393df843096bd660f Mon Sep 17 00:00:00 2001 From: Dreeam <61569423+Dreeam-qwq@users.noreply.github.com> Date: Sun, 30 Jul 2023 09:57:18 +0800 Subject: [PATCH] Updated Upstream (Purpur) --- patches/api/0002-Purpur-API-Changes.patch | 12 +- patches/server/0009-Purpur-Base.patch | 2 +- .../server/0010-Purpur-Server-Changes.patch | 139 +++++++++++++++--- 3 files changed, 129 insertions(+), 24 deletions(-) diff --git a/patches/api/0002-Purpur-API-Changes.patch b/patches/api/0002-Purpur-API-Changes.patch index 7c940e6d7..6ec9a4d6d 100644 --- a/patches/api/0002-Purpur-API-Changes.patch +++ b/patches/api/0002-Purpur-API-Changes.patch @@ -3,7 +3,7 @@ From: Github Actions Date: Fri, 16 Jun 2023 05:21:52 +0000 Subject: [PATCH] Purpur API Changes -Commit: 5ee0c1b95ce2f8828622bc7b1224de0e672c2bd2 +Commit: a2e96448a0e4688585b5e7dee39caa90bfe48cdb Patches below are removed in this patch: Build-System-Changes.patch @@ -2834,17 +2834,19 @@ index 0000000000000000000000000000000000000000..519809eab5d926dc7b0a7bad5d446d0d +} diff --git a/src/main/java/org/purpurmc/purpur/event/PreBlockExplodeEvent.java b/src/main/java/org/purpurmc/purpur/event/PreBlockExplodeEvent.java new file mode 100644 -index 0000000000000000000000000000000000000000..b7db0db7f3afbccdb07390d1bcada109e9e6b30b +index 0000000000000000000000000000000000000000..32602b398ede24a35ed8a996faa2b23455615a7b --- /dev/null +++ b/src/main/java/org/purpurmc/purpur/event/PreBlockExplodeEvent.java -@@ -0,0 +1,52 @@ +@@ -0,0 +1,54 @@ +package org.purpurmc.purpur.event; + +import org.bukkit.block.Block; ++import org.bukkit.block.BlockState; +import org.bukkit.event.Cancellable; +import org.bukkit.event.HandlerList; +import org.bukkit.event.block.BlockExplodeEvent; +import org.jetbrains.annotations.NotNull; ++import org.jetbrains.annotations.Nullable; +import java.util.Collections; + +/** @@ -2855,8 +2857,8 @@ index 0000000000000000000000000000000000000000..b7db0db7f3afbccdb07390d1bcada109 + private boolean cancelled; + private final float yield; + -+ public PreBlockExplodeEvent(@NotNull final Block what, final float yield) { -+ super(what, Collections.emptyList(), yield); ++ public PreBlockExplodeEvent(@NotNull final Block what, final float yield, @Nullable BlockState explodedBlockState) { ++ super(what, Collections.emptyList(), yield, explodedBlockState); + this.yield = yield; + this.cancelled = false; + } diff --git a/patches/server/0009-Purpur-Base.patch b/patches/server/0009-Purpur-Base.patch index 4996692c6..8274fea24 100644 --- a/patches/server/0009-Purpur-Base.patch +++ b/patches/server/0009-Purpur-Base.patch @@ -3,7 +3,7 @@ From: Github Actions Date: Wed, 24 May 2023 06:00:03 +0800 Subject: [PATCH] Purpur Base -Commit: 5ee0c1b95ce2f8828622bc7b1224de0e672c2bd2 +Commit: a2e96448a0e4688585b5e7dee39caa90bfe48cdb Original license: MIT Original project: https://github.com/PurpurMC/Purpur diff --git a/patches/server/0010-Purpur-Server-Changes.patch b/patches/server/0010-Purpur-Server-Changes.patch index e6d3564d8..7486991f7 100644 --- a/patches/server/0010-Purpur-Server-Changes.patch +++ b/patches/server/0010-Purpur-Server-Changes.patch @@ -3,7 +3,7 @@ From: Github Actions Date: Fri, 16 Jun 2023 05:22:02 +0000 Subject: [PATCH] Purpur Server Changes -Commit: 5ee0c1b95ce2f8828622bc7b1224de0e672c2bd2 +Commit: a2e96448a0e4688585b5e7dee39caa90bfe48cdb Patches below are removed in this patch: MC-238526-Fix-spawner-not-spawning-water-animals-cor.patch @@ -17,7 +17,6 @@ Fix-outdated-server-showing-in-ping-before-server-fu.patch Alternative-Keepalive-Handling.patch Add-toggle-for-sand-duping-fix.patch Logger-settings-suppressing-pointless-logs.patch -Dont-eat-blocks-in-non-ticking-chunks.patch MC-121706-Fix-mobs-not-looking-up-and-down-when-stra.patch Remove-Timings.patch Remove-Mojang-Profiler.patch @@ -1566,7 +1565,7 @@ index f830ff98ac6e94fa4f0c9d85bcdd8f3816ecc645..24405fb76f0995350f259d5c5b775863 + // Purpur end } diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index b3205b20643cf380fa75f0c35bcb77f4496f7055..f1c6c550b653ea7f19e21b107bbf749275bea0a2 100644 +index b3205b20643cf380fa75f0c35bcb77f4496f7055..468866fddd92eef313df413a1d0b94cfccf03469 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java @@ -347,6 +347,20 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic @@ -1750,7 +1749,7 @@ index b3205b20643cf380fa75f0c35bcb77f4496f7055..f1c6c550b653ea7f19e21b107bbf7492 + // Purpur Start + if (this.player.level().purpurConfig.dontRunWithScissors && this.player.isSprinting() && !(this.player.level().purpurConfig.ignoreScissorsInWater && this.player.isInWater()) && !(this.player.level().purpurConfig.ignoreScissorsInLava && this.player.isInLava()) && (isScissor(this.player.getItemInHand(InteractionHand.MAIN_HAND)) || isScissor(this.player.getItemInHand(InteractionHand.OFF_HAND))) && (int) (Math.random() * 10) == 0) { -+ this.player.hurt(this.player.damageSources().magic(), (float) this.player.level().purpurConfig.scissorsRunningDamage); ++ this.player.hurt(this.player.damageSources().scissors(), (float) this.player.level().purpurConfig.scissorsRunningDamage); + if (!org.purpurmc.purpur.PurpurConfig.dontRunWithScissors.isBlank()) this.player.sendActionBarMessage(org.purpurmc.purpur.PurpurConfig.dontRunWithScissors); + } + // Purpur End @@ -2021,11 +2020,39 @@ index ccbfcef3e83b1bef364447657bfd08a92d615cf6..aa2331c6df4e79d4bb0add071a0b11d2 return damageDealt * (1.0F - f / 25.0F); } } +diff --git a/src/main/java/net/minecraft/world/damagesource/CombatTracker.java b/src/main/java/net/minecraft/world/damagesource/CombatTracker.java +index c12d7bacf2c54f268b1bc5e46250a083ca041415..45e4717ba832edceeafdba575323c2527c350193 100644 +--- a/src/main/java/net/minecraft/world/damagesource/CombatTracker.java ++++ b/src/main/java/net/minecraft/world/damagesource/CombatTracker.java +@@ -99,6 +99,13 @@ public class CombatTracker { + Component component = ComponentUtils.wrapInSquareBrackets(Component.translatable(string + ".link")).withStyle(INTENTIONAL_GAME_DESIGN_STYLE); + return Component.translatable(string + ".message", this.mob.getDisplayName(), component); + } else { ++ // Purpur start ++ if (damageSource.isScissors) { ++ return damageSource.getLocalizedDeathMessage(org.purpurmc.purpur.PurpurConfig.deathMsgRunWithScissors, this.mob); ++ } else if (damageSource.isStoneCutter) { ++ return damageSource.getLocalizedDeathMessage(org.purpurmc.purpur.PurpurConfig.deathMsgStonecutter, this.mob); ++ } ++ // Purpur end + return damageSource.getLocalizedDeathMessage(this.mob); + } + } diff --git a/src/main/java/net/minecraft/world/damagesource/DamageSource.java b/src/main/java/net/minecraft/world/damagesource/DamageSource.java -index 25a5a3b949a0eb632611355e74ccd4865be108ca..14fcfd7c1d3a62833978e163f4e0d6f9b2203042 100644 +index 25a5a3b949a0eb632611355e74ccd4865be108ca..d728712e8024480d336640a6801c1abb272adc13 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 { +@@ -54,6 +54,9 @@ public class DamageSource { + // CraftBukkit end + public @Nullable org.bukkit.block.BlockState explodedBlockState; // Paper - add exploded state + ++ public boolean isScissors; // Purpur ++ public boolean isStoneCutter; // Purpur ++ + public String toString() { + return "DamageSource (" + this.type().msgId() + ")"; + } +@@ -126,6 +129,15 @@ public class DamageSource { } } @@ -2041,6 +2068,29 @@ index 25a5a3b949a0eb632611355e74ccd4865be108ca..14fcfd7c1d3a62833978e163f4e0d6f9 public String getMsgId() { return this.type().msgId(); } +diff --git a/src/main/java/net/minecraft/world/damagesource/DamageSources.java b/src/main/java/net/minecraft/world/damagesource/DamageSources.java +index 4604f8b38460e9113e966889a679d4547f24aff6..751f6ab3f24ecc6d749417d12b654cd5c965f1e3 100644 +--- a/src/main/java/net/minecraft/world/damagesource/DamageSources.java ++++ b/src/main/java/net/minecraft/world/damagesource/DamageSources.java +@@ -267,4 +267,18 @@ public class DamageSources { + public DamageSource genericKill() { + return this.genericKill; + } ++ ++ // Purpur start ++ public DamageSource scissors() { ++ DamageSource source = new DamageSource(this.damageTypes.getHolderOrThrow(DamageTypes.MAGIC)); ++ source.isScissors = true; ++ return source; ++ } ++ ++ public DamageSource stonecutter() { ++ DamageSource source = new DamageSource(this.damageTypes.getHolderOrThrow(DamageTypes.MAGIC)); ++ source.isStoneCutter = true; ++ return source; ++ } ++ // Purpur end + } diff --git a/src/main/java/net/minecraft/world/effect/MobEffect.java b/src/main/java/net/minecraft/world/effect/MobEffect.java index 53cc6befb752affcfec65e18365f6d369448d407..01850fc596a85974287ff6750427186d21acac41 100644 --- a/src/main/java/net/minecraft/world/effect/MobEffect.java @@ -5248,7 +5298,7 @@ index e3b92e8b2274ee6d07d1e9c74f669aeaab594919..d1fdf8a13a85fa9331e3d4fdfa3e55fd ItemEntity entityitem = new ItemEntity(this.level(), this.getX(), this.getY(1.0D), this.getZ(), new ItemStack(this.getVariant().blockState.getBlock())); EntityDropItemEvent event = new EntityDropItemEvent(this.getBukkitEntity(), (org.bukkit.entity.Item) entityitem.getBukkitEntity()); diff --git a/src/main/java/net/minecraft/world/entity/animal/Ocelot.java b/src/main/java/net/minecraft/world/entity/animal/Ocelot.java -index 924ea172cab5178e5754bfe09cc7b83c1a66faa6..c72d5e7c2a19c5690a8065c95c75f0415358c2a9 100644 +index 924ea172cab5178e5754bfe09cc7b83c1a66faa6..45fb438065b1db2a9baa648f4d397472847ed638 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Ocelot.java +++ b/src/main/java/net/minecraft/world/entity/animal/Ocelot.java @@ -68,6 +68,43 @@ public class Ocelot extends Animal { @@ -5310,6 +5360,15 @@ index 924ea172cab5178e5754bfe09cc7b83c1a66faa6..c72d5e7c2a19c5690a8065c95c75f041 this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Chicken.class, false)); this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Turtle.class, 10, false, false, Turtle.BABY_ON_LAND_SELECTOR)); } +@@ -254,7 +293,7 @@ public class Ocelot extends Animal { + if (world.isUnobstructed(this) && !world.containsAnyLiquid(this.getBoundingBox())) { + BlockPos blockposition = this.blockPosition(); + +- if (blockposition.getY() < world.getSeaLevel()) { ++ if (!level().purpurConfig.ocelotSpawnUnderSeaLevel && blockposition.getY() < world.getSeaLevel()) { + return false; + } + diff --git a/src/main/java/net/minecraft/world/entity/animal/Panda.java b/src/main/java/net/minecraft/world/entity/animal/Panda.java index f43c4fed59c4c75540008284ddb197d9a6b5487b..bd7c5f6768a54a3d8ffd585d91414e65936991da 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Panda.java @@ -14422,18 +14481,53 @@ index 2941c16ef486345b57ab2dfcd26f0272285d3b5a..7cc6812bf6f2ba015f65fd1fc1eaac02 ((Mob) newEntityLiving).setPersistenceRequired(); // Paper end diff --git a/src/main/java/net/minecraft/world/item/ShovelItem.java b/src/main/java/net/minecraft/world/item/ShovelItem.java -index 21212462e6b415e96536a27b2c009d1562f18946..61015c3a53e41dd342ea682067c32c63bb65aba6 100644 +index 21212462e6b415e96536a27b2c009d1562f18946..98f4870ab82b25ed8bb144835f74c581ad9b9134 100644 --- a/src/main/java/net/minecraft/world/item/ShovelItem.java +++ b/src/main/java/net/minecraft/world/item/ShovelItem.java -@@ -34,7 +34,7 @@ public class ShovelItem extends DiggerItem { +@@ -34,13 +34,20 @@ public class ShovelItem extends DiggerItem { return InteractionResult.PASS; } else { Player player = context.getPlayer(); - BlockState blockState2 = FLATTENABLES.get(blockState.getBlock()); -+ BlockState blockState2 = level.purpurConfig.shovelTurnsBlockToGrassPath.contains(blockState.getBlock()) ? Blocks.DIRT_PATH.defaultBlockState() : null; // Purpur ++ // Purpur start ++ BlockState blockState2 = level.purpurConfig.shovelTurnsBlockToGrassPath.contains(blockState.getBlock()) ? Blocks.DIRT_PATH.defaultBlockState() : null; ++ boolean isUniqueFlattenable; ++ // Purpur end BlockState blockState3 = null; Runnable afterAction = null; // Paper if (blockState2 != null && level.getBlockState(blockPos.above()).isAir()) { +- afterAction = () -> level.playSound(player, blockPos, SoundEvents.SHOVEL_FLATTEN, SoundSource.BLOCKS, 1.0F, 1.0F); // Paper ++ // Purpur start ++ isUniqueFlattenable = FLATTENABLES.get(blockState.getBlock()) == null; ++ afterAction = () -> level.playSound(isUniqueFlattenable ? null : player, blockPos, SoundEvents.SHOVEL_FLATTEN, SoundSource.BLOCKS, 1.0F, 1.0F); // Paper ++ // Purpur end + blockState3 = blockState2; + } else if (blockState.getBlock() instanceof CampfireBlock && blockState.getValue(CampfireBlock.LIT)) { ++ isUniqueFlattenable = false; // Purpur + afterAction = () -> { // Paper + if (!level.isClientSide()) { + level.levelEvent((Player)null, 1009, blockPos, 0); +@@ -50,6 +57,11 @@ public class ShovelItem extends DiggerItem { + }; // Paper + blockState3 = blockState.setValue(CampfireBlock.LIT, Boolean.valueOf(false)); + } ++ // Purpur start ++ else { ++ isUniqueFlattenable = false; ++ } ++ // Purpur end + + if (blockState3 != null) { + if (!level.isClientSide) { +@@ -68,7 +80,7 @@ public class ShovelItem extends DiggerItem { + } + } + +- return InteractionResult.sidedSuccess(level.isClientSide); ++ return isUniqueFlattenable ? InteractionResult.SUCCESS : InteractionResult.sidedSuccess(level.isClientSide); // Purpur + } else { + return InteractionResult.PASS; + } diff --git a/src/main/java/net/minecraft/world/item/SnowballItem.java b/src/main/java/net/minecraft/world/item/SnowballItem.java index ef3f90a5bcdd7b9815a4053cff166f9d2552f55d..e7e5e1cc92f56e3daba8fa09c59188febec5e8f2 100644 --- a/src/main/java/net/minecraft/world/item/SnowballItem.java @@ -14730,7 +14824,7 @@ index 3b959f42d958bf0f426853aee56753d6c455fcdb..d17abb283ea818244df0379d6b57fc63 if (range < 0.0D || d < range * range) { return true; diff --git a/src/main/java/net/minecraft/world/level/Explosion.java b/src/main/java/net/minecraft/world/level/Explosion.java -index 2a7813209d664fd8c123488ce9c530b4440be163..a3eaeede3ee07a1e7e9a3493c5ae32553962b8f5 100644 +index 2a7813209d664fd8c123488ce9c530b4440be163..63f397a5d90d7f05d17db2a5f57dbf1bc7f585fd 100644 --- a/src/main/java/net/minecraft/world/level/Explosion.java +++ b/src/main/java/net/minecraft/world/level/Explosion.java @@ -86,7 +86,7 @@ public class Explosion { @@ -14761,7 +14855,7 @@ index 2a7813209d664fd8c123488ce9c530b4440be163..a3eaeede3ee07a1e7e9a3493c5ae3255 + } + }else { + Location location = new Location(this.level.getWorld(), this.x, this.y, this.z); -+ if(!new org.purpurmc.purpur.event.PreBlockExplodeEvent(location.getBlock(), this.blockInteraction == Explosion.BlockInteraction.DESTROY_WITH_DECAY ? 1.0F / this.radius : 1.0F).callEvent()) { ++ if(!new org.purpurmc.purpur.event.PreBlockExplodeEvent(location.getBlock(), this.blockInteraction == Explosion.BlockInteraction.DESTROY_WITH_DECAY ? 1.0F / this.radius : 1.0F, this.damageSource.explodedBlockState).callEvent()) { + this.wasCanceled = true; + return; + } @@ -15596,10 +15690,10 @@ index 41d7cff39fc37955877668337689b4b26cd8c7cf..2deddc746e43896584bd65ba8e7971a8 entity.portalWorld = ((ServerLevel)world); entity.portalBlock = pos.immutable(); diff --git a/src/main/java/net/minecraft/world/level/block/EnderChestBlock.java b/src/main/java/net/minecraft/world/level/block/EnderChestBlock.java -index 7385e91f32f070e86a4e0fd3d214f55d832c7979..c3b78dd2d06be7d64920c6bcffcd16c82caa52b4 100644 +index 7385e91f32f070e86a4e0fd3d214f55d832c7979..7b73de87236a60ce7343c29ec147e1866b448ba3 100644 --- a/src/main/java/net/minecraft/world/level/block/EnderChestBlock.java +++ b/src/main/java/net/minecraft/world/level/block/EnderChestBlock.java -@@ -85,6 +85,27 @@ public class EnderChestBlock extends AbstractChestBlock i +@@ -85,6 +85,34 @@ public class EnderChestBlock extends AbstractChestBlock i EnderChestBlockEntity enderChestBlockEntity = (EnderChestBlockEntity)blockEntity; playerEnderChestContainer.setActiveChest(enderChestBlockEntity); player.openMenu(new SimpleMenuProvider((syncId, inventory, playerx) -> { @@ -15608,19 +15702,26 @@ index 7385e91f32f070e86a4e0fd3d214f55d832c7979..c3b78dd2d06be7d64920c6bcffcd16c8 + if (org.purpurmc.purpur.PurpurConfig.enderChestPermissionRows) { + org.bukkit.craftbukkit.entity.CraftHumanEntity bukkitPlayer = player.getBukkitEntity(); + if (bukkitPlayer.hasPermission("purpur.enderchest.rows.six")) { ++ player.sixRowEnderchestSlotCount = 54; + return ChestMenu.sixRows(syncId, inventory, playerEnderChestContainer); + } else if (bukkitPlayer.hasPermission("purpur.enderchest.rows.five")) { ++ player.sixRowEnderchestSlotCount = 45; + return ChestMenu.fiveRows(syncId, inventory, playerEnderChestContainer); + } else if (bukkitPlayer.hasPermission("purpur.enderchest.rows.four")) { ++ player.sixRowEnderchestSlotCount = 36; + return ChestMenu.fourRows(syncId, inventory, playerEnderChestContainer); + } else if (bukkitPlayer.hasPermission("purpur.enderchest.rows.three")) { ++ player.sixRowEnderchestSlotCount = 27; + return ChestMenu.threeRows(syncId, inventory, playerEnderChestContainer); + } else if (bukkitPlayer.hasPermission("purpur.enderchest.rows.two")) { ++ player.sixRowEnderchestSlotCount = 18; + return ChestMenu.twoRows(syncId, inventory, playerEnderChestContainer); + } else if (bukkitPlayer.hasPermission("purpur.enderchest.rows.one")) { ++ player.sixRowEnderchestSlotCount = 9; + return ChestMenu.oneRow(syncId, inventory, playerEnderChestContainer); + } + } ++ player.sixRowEnderchestSlotCount = -1; + return ChestMenu.sixRows(syncId, inventory, playerEnderChestContainer); + } + // Purpur end @@ -16239,7 +16340,7 @@ index 4bce895268542531598a01a1bccd8ac1ed703b7d..179131f4149ec5ee38d07a7a87b0536b // NOP } else if (iblockdata.getBlock() instanceof LiquidBlock) { diff --git a/src/main/java/net/minecraft/world/level/block/StonecutterBlock.java b/src/main/java/net/minecraft/world/level/block/StonecutterBlock.java -index 0a95842c53a9d0286c57bcb42db97e468e30fb7d..e2d42e7947a237dd060ec1b9b63ac6ca4f37241a 100644 +index 0a95842c53a9d0286c57bcb42db97e468e30fb7d..0882e67c5cf876e0fc58a4ca4accb4be40418983 100644 --- a/src/main/java/net/minecraft/world/level/block/StonecutterBlock.java +++ b/src/main/java/net/minecraft/world/level/block/StonecutterBlock.java @@ -92,4 +92,16 @@ public class StonecutterBlock extends Block { @@ -16252,7 +16353,7 @@ index 0a95842c53a9d0286c57bcb42db97e468e30fb7d..e2d42e7947a237dd060ec1b9b63ac6ca + public void stepOn(Level level, BlockPos pos, BlockState state, net.minecraft.world.entity.Entity entity) { + if (level.purpurConfig.stonecutterDamage > 0.0F && entity instanceof net.minecraft.world.entity.LivingEntity) { + org.bukkit.craftbukkit.event.CraftEventFactory.blockDamage = level.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ()); -+ entity.hurt(entity.damageSources().magic(), level.purpurConfig.stonecutterDamage); ++ entity.hurt(entity.damageSources().stonecutter(), level.purpurConfig.stonecutterDamage); + org.bukkit.craftbukkit.event.CraftEventFactory.blockDamage = null; + } + super.stepOn(level, pos, state, entity); @@ -19147,10 +19248,10 @@ index 0000000000000000000000000000000000000000..b974b59d421cf97bc9547ea75fe4643d +} diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java new file mode 100644 -index 0000000000000000000000000000000000000000..59c413b5d6681da2636d7cfa0d452a4643e9f84b +index 0000000000000000000000000000000000000000..b70b9609671ae8bc9504cef48d7531b5ad5fe65f --- /dev/null +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -0,0 +1,3208 @@ +@@ -0,0 +1,3210 @@ +package org.purpurmc.purpur; + +import net.minecraft.core.registries.BuiltInRegistries; @@ -21168,6 +21269,7 @@ index 0000000000000000000000000000000000000000..59c413b5d6681da2636d7cfa0d452a46 + public int ocelotBreedingTicks = 6000; + public boolean ocelotTakeDamageFromWater = false; + public boolean ocelotAlwaysDropExp = false; ++ public boolean ocelotSpawnUnderSeaLevel = false; + private void ocelotSettings() { + ocelotRidable = getBoolean("mobs.ocelot.ridable", ocelotRidable); + ocelotRidableInWater = getBoolean("mobs.ocelot.ridable-in-water", ocelotRidableInWater); @@ -21181,6 +21283,7 @@ index 0000000000000000000000000000000000000000..59c413b5d6681da2636d7cfa0d452a46 + ocelotBreedingTicks = getInt("mobs.ocelot.breeding-delay-ticks", ocelotBreedingTicks); + ocelotTakeDamageFromWater = getBoolean("mobs.ocelot.takes-damage-from-water", ocelotTakeDamageFromWater); + ocelotAlwaysDropExp = getBoolean("mobs.ocelot.always-drop-exp", ocelotAlwaysDropExp); ++ ocelotSpawnUnderSeaLevel = getBoolean("mobs.ocelot.spawn-below-sea-level", ocelotSpawnUnderSeaLevel); + } + + public boolean pandaRidable = false;