diff --git a/patches/todo/server/0033-Add-option-to-set-armorstand-step-height.patch b/patches/server/0030-Add-option-to-set-armorstand-step-height.patch similarity index 82% rename from patches/todo/server/0033-Add-option-to-set-armorstand-step-height.patch rename to patches/server/0030-Add-option-to-set-armorstand-step-height.patch index 87e6f8b6d..b6014981a 100644 --- a/patches/todo/server/0033-Add-option-to-set-armorstand-step-height.patch +++ b/patches/server/0030-Add-option-to-set-armorstand-step-height.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add option to set armorstand step height diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 9f26371ca53dba729a696626c35ef06043dfb995..de4e0d9ca36aa1b75005ad3dcd9b9910b89fc5f1 100644 +index 05c3985cddae94e26fb70657c1add2f87bff8080..cd97c126dd4d15bdcd5f24792f67ce40b870dd2a 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -320,7 +320,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -321,7 +321,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { public double xOld; public double yOld; public double zOld; @@ -18,10 +18,10 @@ index 9f26371ca53dba729a696626c35ef06043dfb995..de4e0d9ca36aa1b75005ad3dcd9b9910 protected final RandomSource random; public int tickCount; diff --git a/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java b/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java -index 3677dd991ae73428984e62e4d6fb757317987887..697d6d6cca0a1c8df9c5bf6852495130a0c57eb4 100644 +index 8a8b9e8983be1acad66ad875c901be5bbdeabb1f..316716b8827b974fa62f7f27d57c3b776b42fbd8 100644 --- a/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java +++ b/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java -@@ -685,6 +685,7 @@ public class ArmorStand extends LivingEntity { +@@ -679,6 +679,7 @@ public class ArmorStand extends LivingEntity { @Override public void tick() { @@ -30,7 +30,7 @@ index 3677dd991ae73428984e62e4d6fb757317987887..697d6d6cca0a1c8df9c5bf6852495130 if (!this.canTick) { if (this.noTickPoseDirty) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index cefd5086a7fef31a88ed4781b6d0bdbd014d36c6..09fd86fd7b5a73c65301a7d23e559acf468fd3de 100644 +index 6d7ecc73de85f299f2ae315f58927431b399f3f2..9e332172eab872fa0b5c480ec723006d26713c8e 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -92,6 +92,11 @@ public class PurpurWorldConfig { diff --git a/patches/todo/server/0034-Cat-spawning-options.patch b/patches/server/0031-Cat-spawning-options.patch similarity index 87% rename from patches/todo/server/0034-Cat-spawning-options.patch rename to patches/server/0031-Cat-spawning-options.patch index 3fb229db5..4ae8816e1 100644 --- a/patches/todo/server/0034-Cat-spawning-options.patch +++ b/patches/server/0031-Cat-spawning-options.patch @@ -51,20 +51,20 @@ index 5f407535298a31a34cfe114dd863fd6a9b977707..29c7e33fe961020e5a0007287fe9b663 } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 09fd86fd7b5a73c65301a7d23e559acf468fd3de..21fec77f9cbbac41b92450cf7fd4ffc53efc27c3 100644 +index 9e332172eab872fa0b5c480ec723006d26713c8e..a3995aa84035771aad411d54bf2e41721f0f006d 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -269,6 +269,9 @@ public class PurpurWorldConfig { - public boolean catRidableInWater = true; - public boolean catControllable = true; +@@ -225,6 +225,9 @@ public class PurpurWorldConfig { + } + public double catMaxHealth = 10.0D; + public int catSpawnDelay = 1200; + public int catSpawnSwampHutScanRange = 16; + public int catSpawnVillageScanRange = 48; private void catSettings() { - catRidable = getBoolean("mobs.cat.ridable", catRidable); - catRidableInWater = getBoolean("mobs.cat.ridable-in-water", catRidableInWater); -@@ -279,6 +282,9 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.cat.attributes.max-health", catMaxHealth); +@@ -232,6 +235,9 @@ public class PurpurWorldConfig { set("mobs.cat.attributes.max_health", oldValue); } catMaxHealth = getDouble("mobs.cat.attributes.max_health", catMaxHealth); @@ -73,4 +73,4 @@ index 09fd86fd7b5a73c65301a7d23e559acf468fd3de..21fec77f9cbbac41b92450cf7fd4ffc5 + catSpawnVillageScanRange = getInt("mobs.cat.scan-range-for-other-cats.village", catSpawnVillageScanRange); } - public boolean caveSpiderRidable = false; + public double caveSpiderMaxHealth = 12.0D; diff --git a/patches/todo/server/0035-Cows-eat-mushrooms.patch b/patches/server/0032-Cows-eat-mushrooms.patch similarity index 86% rename from patches/todo/server/0035-Cows-eat-mushrooms.patch rename to patches/server/0032-Cows-eat-mushrooms.patch index fc38158c8..7b8643c74 100644 --- a/patches/todo/server/0035-Cows-eat-mushrooms.patch +++ b/patches/server/0032-Cows-eat-mushrooms.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Cows eat mushrooms diff --git a/src/main/java/net/minecraft/world/entity/animal/Cow.java b/src/main/java/net/minecraft/world/entity/animal/Cow.java -index e24173dcd6f083a3ae61edcf71bb7236d644a422..b7a0ee0e055d12e36b411859211367c9df3b9549 100644 +index 2f45444ad13e5ef3619788b19ec9c16be1f87950..2d8f51fd2f9562ccffe25a965aa02613eed3d71b 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cow.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cow.java @@ -2,6 +2,7 @@ package net.minecraft.world.entity.animal; @@ -24,18 +24,18 @@ index e24173dcd6f083a3ae61edcf71bb7236d644a422..b7a0ee0e055d12e36b411859211367c9 import net.minecraft.world.level.block.state.BlockState; // CraftBukkit start import org.bukkit.craftbukkit.event.CraftEventFactory; -@@ -69,6 +71,7 @@ public class Cow extends Animal { - this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur +@@ -51,6 +53,7 @@ public class Cow extends Animal { + this.goalSelector.addGoal(0, new FloatGoal(this)); this.goalSelector.addGoal(1, new PanicGoal(this, 2.0D)); this.goalSelector.addGoal(2, new BreedGoal(this, 1.0D)); + if (level.purpurConfig.cowFeedMushrooms > 0) this.goalSelector.addGoal(3, new TemptGoal(this, 1.25D, Ingredient.of(Items.WHEAT, Blocks.RED_MUSHROOM.asItem(), Blocks.BROWN_MUSHROOM.asItem()), false)); else // Purpur this.goalSelector.addGoal(3, new TemptGoal(this, 1.25D, Ingredient.of(Items.WHEAT), false)); this.goalSelector.addGoal(4, new FollowParentGoal(this, 1.25D)); this.goalSelector.addGoal(5, new WaterAvoidingRandomStrollGoal(this, 1.0D)); -@@ -124,6 +127,10 @@ public class Cow extends Animal { +@@ -105,6 +108,10 @@ public class Cow extends Animal { player.setItemInHand(hand, itemstack1); - return InteractionResult.sidedSuccess(this.level.isClientSide); + return InteractionResult.sidedSuccess(this.level().isClientSide); + // Purpur start - feed mushroom to change to mooshroom + } else if (level.purpurConfig.cowFeedMushrooms > 0 && this.getType() != EntityType.MOOSHROOM && isMushroom(itemstack)) { + return this.feedMushroom(player, itemstack); @@ -43,7 +43,7 @@ index e24173dcd6f083a3ae61edcf71bb7236d644a422..b7a0ee0e055d12e36b411859211367c9 } else { return super.mobInteract(player, hand); } -@@ -139,4 +146,69 @@ public class Cow extends Animal { +@@ -120,4 +127,69 @@ public class Cow extends Animal { protected float getStandingEyeHeight(Pose pose, EntityDimensions dimensions) { return this.isBaby() ? dimensions.height * 0.95F : 1.3F; } @@ -114,22 +114,22 @@ index e24173dcd6f083a3ae61edcf71bb7236d644a422..b7a0ee0e055d12e36b411859211367c9 + // Purpur end } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 21fec77f9cbbac41b92450cf7fd4ffc53efc27c3..068e387bdda6d7fe44fafd54aaee66eb44ff4380 100644 +index a3995aa84035771aad411d54bf2e41721f0f006d..c9a48e01a63ccefa152b5ae13a8b5f40337a69b5 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -339,6 +339,7 @@ public class PurpurWorldConfig { - public boolean cowRidableInWater = true; - public boolean cowControllable = true; +@@ -273,6 +273,7 @@ public class PurpurWorldConfig { + } + public double cowMaxHealth = 10.0D; + public int cowFeedMushrooms = 0; private void cowSettings() { - cowRidable = getBoolean("mobs.cow.ridable", cowRidable); - cowRidableInWater = getBoolean("mobs.cow.ridable-in-water", cowRidableInWater); -@@ -349,6 +350,7 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.cow.attributes.max-health", cowMaxHealth); +@@ -280,6 +281,7 @@ public class PurpurWorldConfig { set("mobs.cow.attributes.max_health", oldValue); } cowMaxHealth = getDouble("mobs.cow.attributes.max_health", cowMaxHealth); + cowFeedMushrooms = getInt("mobs.cow.feed-mushrooms-for-mooshroom", cowFeedMushrooms); } - public boolean creeperRidable = false; + public double creeperMaxHealth = 20.0D; diff --git a/patches/todo/server/0036-Fix-cow-rotation-when-shearing-mooshroom.patch b/patches/server/0033-Fix-cow-rotation-when-shearing-mooshroom.patch similarity index 88% rename from patches/todo/server/0036-Fix-cow-rotation-when-shearing-mooshroom.patch rename to patches/server/0033-Fix-cow-rotation-when-shearing-mooshroom.patch index 6f0d8a0ff..e768c0b09 100644 --- a/patches/todo/server/0036-Fix-cow-rotation-when-shearing-mooshroom.patch +++ b/patches/server/0033-Fix-cow-rotation-when-shearing-mooshroom.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Fix cow rotation when shearing mooshroom diff --git a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java -index b1c2663a7f42714a620d59096f26f0a965875846..12b715086a347b82726327358ac71c72a4fca8b0 100644 +index 9e5a1d8a406ad43d762f421a2589f649402b6f7d..841d97651827c24350854fa16f9c65e8daf70d55 100644 --- a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java +++ b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java -@@ -202,7 +202,13 @@ public class MushroomCow extends Cow implements Shearable, VariantHolder type, Level world, double x, double y, double z) { -@@ -334,6 +336,12 @@ public abstract class AbstractMinecart extends Entity { +@@ -335,6 +337,12 @@ public abstract class AbstractMinecart extends Entity { @Override public void tick() { + // Purpur start -+ if (storedMaxSpeed != level.purpurConfig.minecartMaxSpeed) { -+ maxSpeed = storedMaxSpeed = level.purpurConfig.minecartMaxSpeed; ++ if (storedMaxSpeed != level().purpurConfig.minecartMaxSpeed) { ++ maxSpeed = storedMaxSpeed = level().purpurConfig.minecartMaxSpeed; + } + // Purpur end + // CraftBukkit start double prevX = this.getX(); double prevY = this.getY(); -@@ -497,16 +505,63 @@ public abstract class AbstractMinecart extends Entity { +@@ -499,16 +507,62 @@ public abstract class AbstractMinecart extends Entity { public void activateMinecart(int x, int y, int z, boolean powered) {} @@ -55,17 +55,16 @@ index ee4f924afe15c9a4d96af7a55b357076c7b28501..f774c27dd52219cd524b63cbaa1b23ad + private Double lastSpeed; + + public double getControllableSpeed() { -+ BlockPos pos = new BlockPos(this); -+ Block block = level.getBlockState(pos).getBlock(); -+ if (!block.material.isSolid()) { -+ block = level.getBlockState(pos.relative(Direction.DOWN)).getBlock(); ++ BlockState blockState = level().getBlockState(this.blockPosition()); ++ if (!blockState.isSolid()) { ++ blockState = level().getBlockState(this.blockPosition().relative(Direction.DOWN)); + } -+ Double speed = level.purpurConfig.minecartControllableBlockSpeeds.get(block); -+ if (!block.material.isSolid()) { ++ Double speed = level().purpurConfig.minecartControllableBlockSpeeds.get(blockState.getBlock()); ++ if (!blockState.isSolid()) { + speed = lastSpeed; + } + if (speed == null) { -+ speed = level.purpurConfig.minecartControllableBaseSpeed; ++ speed = level().purpurConfig.minecartControllableBaseSpeed; + } + return lastSpeed = speed; + } @@ -78,12 +77,12 @@ index ee4f924afe15c9a4d96af7a55b357076c7b28501..f774c27dd52219cd524b63cbaa1b23ad this.setDeltaMovement(Mth.clamp(vec3d.x, -d0, d0), vec3d.y, Mth.clamp(vec3d.z, -d0, d0)); + + // Purpur start -+ if (level.purpurConfig.minecartControllable && !isInWater() && !isInLava() && !passengers.isEmpty()) { ++ if (level().purpurConfig.minecartControllable && !isInWater() && !isInLava() && !passengers.isEmpty()) { + Entity passenger = passengers.get(0); + if (passenger instanceof Player) { + Player player = (Player) passenger; + if (player.jumping && this.onGround) { -+ setDeltaMovement(new Vec3(getDeltaMovement().x, level.purpurConfig.minecartControllableHopBoost, getDeltaMovement().z)); ++ setDeltaMovement(new Vec3(getDeltaMovement().x, level().purpurConfig.minecartControllableHopBoost, getDeltaMovement().z)); + } + if (player.zza != 0.0F) { + Vector velocity = player.getBukkitEntity().getEyeLocation().getDirection().normalize().multiply(getControllableSpeed()); @@ -93,7 +92,7 @@ index ee4f924afe15c9a4d96af7a55b357076c7b28501..f774c27dd52219cd524b63cbaa1b23ad + setDeltaMovement(new Vec3(velocity.getX(), getDeltaMovement().y, velocity.getZ())); + } + this.setYRot(passenger.getYRot() - 90); -+ maxUpStep = level.purpurConfig.minecartControllableStepHeight; ++ maxUpStep = level().purpurConfig.minecartControllableStepHeight; + } else { + maxUpStep = 0.0F; + } @@ -101,16 +100,16 @@ index ee4f924afe15c9a4d96af7a55b357076c7b28501..f774c27dd52219cd524b63cbaa1b23ad + maxUpStep = 0.0F; + } + // Purpur end -+ - if (this.onGround) { ++ + if (this.onGround()) { // CraftBukkit start - replace magic numbers with our variables this.setDeltaMovement(new Vec3(this.getDeltaMovement().x * this.derailedX, this.getDeltaMovement().y * this.derailedY, this.getDeltaMovement().z * this.derailedZ)); // CraftBukkit end } -+ else if (level.purpurConfig.minecartControllable) setDeltaMovement(new Vec3(getDeltaMovement().x * derailedX, getDeltaMovement().y, getDeltaMovement().z * derailedZ)); // Purpur ++ else if (level().purpurConfig.minecartControllable) setDeltaMovement(new Vec3(getDeltaMovement().x * derailedX, getDeltaMovement().y, getDeltaMovement().z * derailedZ)); // Purpur this.move(MoverType.SELF, this.getDeltaMovement()); - if (!this.onGround) { + if (!this.onGround()) { diff --git a/src/main/java/net/minecraft/world/item/MinecartItem.java b/src/main/java/net/minecraft/world/item/MinecartItem.java index c6d2f764efa9b8bec730bbe757d480e365b25ccc..33a30d26da2401535f0a72acb2bbffec1aef151e 100644 --- a/src/main/java/net/minecraft/world/item/MinecartItem.java @@ -136,20 +135,20 @@ index c6d2f764efa9b8bec730bbe757d480e365b25ccc..33a30d26da2401535f0a72acb2bbffec } } diff --git a/src/main/java/net/minecraft/world/level/block/state/BlockBehaviour.java b/src/main/java/net/minecraft/world/level/block/state/BlockBehaviour.java -index 505503a3f59d4b747649275c6f6faa504b7c7b64..532a9920bccfc90ee75ac21714812e88d47b9ebb 100644 +index de4c1e4701236e7d5ec77339c51ad6a9d8288bb6..5ac102afde62c08f36886b466010ccfedabfa05e 100644 --- a/src/main/java/net/minecraft/world/level/block/state/BlockBehaviour.java +++ b/src/main/java/net/minecraft/world/level/block/state/BlockBehaviour.java -@@ -78,7 +78,7 @@ import net.minecraft.world.phys.shapes.VoxelShape; - public abstract class BlockBehaviour implements FeatureElement { +@@ -89,7 +89,7 @@ public abstract class BlockBehaviour implements FeatureElement { + protected final float jumpFactor; + protected final boolean dynamicShape; + protected final FeatureFlagSet requiredFeatures; +- protected final BlockBehaviour.Properties properties; ++ public final BlockBehaviour.Properties properties; // Purpur - protected -> public + @Nullable + protected ResourceLocation drops; - protected static final Direction[] UPDATE_SHAPE_ORDER = new Direction[]{Direction.WEST, Direction.EAST, Direction.NORTH, Direction.SOUTH, Direction.DOWN, Direction.UP}; -- protected final Material material; -+ public final Material material; // Purpur - protected -> public - public final boolean hasCollision; - protected final float explosionResistance; - protected final boolean isRandomlyTicking; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 028581cd6f36f267c81e5c8d09aa6be0172c8691..49d8e35b254e0df25963f7247326625928ed89e1 100644 +index ea8a4f38be9d7eed401f053c14003ef1ed9a52ae..dadd4d888c5202a5a95a712b4d5fd406bf8c0d7d 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -97,6 +97,68 @@ public class PurpurWorldConfig { diff --git a/patches/todo/server/0043-Disable-loot-drops-on-death-by-cramming.patch b/patches/server/0039-Disable-loot-drops-on-death-by-cramming.patch similarity index 83% rename from patches/todo/server/0043-Disable-loot-drops-on-death-by-cramming.patch rename to patches/server/0039-Disable-loot-drops-on-death-by-cramming.patch index a503c97ea..04f7e03e4 100644 --- a/patches/todo/server/0043-Disable-loot-drops-on-death-by-cramming.patch +++ b/patches/server/0039-Disable-loot-drops-on-death-by-cramming.patch @@ -5,18 +5,18 @@ Subject: [PATCH] Disable loot drops on death by cramming diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index ad1591644a429b33c042e84a0114fe36bbcc6ec4..161d52ff7b303f5f1eb5f094a63ed63e06d11d08 100644 +index 428678c4341c0bde812113229f5eb91be3da2345..ac0f725634029c12bd236df4bfcc857b5226f96c 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -1756,6 +1756,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -1799,6 +1799,7 @@ public abstract class LivingEntity extends Entity implements Attackable { this.dropEquipment(); // CraftBukkit - from below - if (this.shouldDropLoot() && this.level.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) { + if (this.shouldDropLoot() && this.level().getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) { + if (!(source.is(net.minecraft.world.damagesource.DamageTypes.CRAMMING) && level.purpurConfig.disableDropsOnCrammingDeath)) { // Purpur this.dropFromLootTable(source, flag); // Paper start final boolean prev = this.clearEquipmentSlots; -@@ -1764,6 +1765,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -1807,6 +1808,7 @@ public abstract class LivingEntity extends Entity implements Attackable { // Paper end this.dropCustomDeathLoot(source, i, flag); this.clearEquipmentSlots = prev; // Paper @@ -25,7 +25,7 @@ index ad1591644a429b33c042e84a0114fe36bbcc6ec4..161d52ff7b303f5f1eb5f094a63ed63e // CraftBukkit start - Call death event // Paper start - call advancement triggers with correct entity equipment org.bukkit.event.entity.EntityDeathEvent deathEvent = CraftEventFactory.callEntityDeathEvent(this, this.drops, () -> { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 49d8e35b254e0df25963f7247326625928ed89e1..2495ef7023aabb704d47e6b35c100d24828f0208 100644 +index dadd4d888c5202a5a95a712b4d5fd406bf8c0d7d..00dcdad8775519b8bc2d184902a5a2b66e2eaaa4 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -97,6 +97,11 @@ public class PurpurWorldConfig { diff --git a/patches/todo/server/0044-Option-to-toggle-milk-curing-bad-omen.patch b/patches/server/0040-Option-to-toggle-milk-curing-bad-omen.patch similarity index 95% rename from patches/todo/server/0044-Option-to-toggle-milk-curing-bad-omen.patch rename to patches/server/0040-Option-to-toggle-milk-curing-bad-omen.patch index b9d984d60..66c283e2d 100644 --- a/patches/todo/server/0044-Option-to-toggle-milk-curing-bad-omen.patch +++ b/patches/server/0040-Option-to-toggle-milk-curing-bad-omen.patch @@ -28,7 +28,7 @@ index f33977d95b6db473be4f95075ba99caf90ad0220..56dc04d8875971ee9a5d077a695509af return stack.isEmpty() ? new ItemStack(Items.BUCKET) : stack; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 2495ef7023aabb704d47e6b35c100d24828f0208..ac1cc7a535f76d84877c7f4cb047ddb41c089845 100644 +index 00dcdad8775519b8bc2d184902a5a2b66e2eaaa4..6e29f232f602e939f30e35a575749d23160e61ae 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -98,8 +98,10 @@ public class PurpurWorldConfig { diff --git a/patches/todo/server/0045-End-gateway-should-check-if-entity-can-use-portal.patch b/patches/server/0041-End-gateway-should-check-if-entity-can-use-portal.patch similarity index 91% rename from patches/todo/server/0045-End-gateway-should-check-if-entity-can-use-portal.patch rename to patches/server/0041-End-gateway-should-check-if-entity-can-use-portal.patch index 307ea380c..235b9f7bb 100644 --- a/patches/todo/server/0045-End-gateway-should-check-if-entity-can-use-portal.patch +++ b/patches/server/0041-End-gateway-should-check-if-entity-can-use-portal.patch @@ -5,7 +5,7 @@ Subject: [PATCH] End gateway should check if entity can use portal diff --git a/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java -index c73024cc62490c336ffe26313580e88d25ca7078..690d498a97b943a62e8ea415450ca44a2349fee0 100644 +index d9baa85962236c42219cf09d4f3129be93ff069c..678c4527ddc7032a07e7d74cc160ddcb8810abbf 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java @@ -178,6 +178,7 @@ public class TheEndGatewayBlockEntity extends TheEndPortalBlockEntity { diff --git a/patches/todo/server/0046-Skip-events-if-there-s-no-listeners.patch b/patches/server/0042-Skip-events-if-there-s-no-listeners.patch similarity index 88% rename from patches/todo/server/0046-Skip-events-if-there-s-no-listeners.patch rename to patches/server/0042-Skip-events-if-there-s-no-listeners.patch index af5d66e59..f0df55dd0 100644 --- a/patches/todo/server/0046-Skip-events-if-there-s-no-listeners.patch +++ b/patches/server/0042-Skip-events-if-there-s-no-listeners.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Skip events if there's no listeners diff --git a/src/main/java/net/minecraft/commands/Commands.java b/src/main/java/net/minecraft/commands/Commands.java -index 87cc7562e4a166d078fe11b7f6980497fc0bd33e..34d1fad0ad4adfcb0372ab16ecd7af0b92b5bedc 100644 +index 80c2c8d565f03ae0ea24fbdecdbe2bc5b9aa4b82..147fcbdd784f06fe23138b20aef82f92ba154998 100644 --- a/src/main/java/net/minecraft/commands/Commands.java +++ b/src/main/java/net/minecraft/commands/Commands.java -@@ -454,6 +454,7 @@ public class Commands { +@@ -456,6 +456,7 @@ public class Commands { private void runSync(ServerPlayer player, Collection bukkit, RootCommandNode rootcommandnode) { // Paper end - Async command map building new com.destroystokyo.paper.event.brigadier.AsyncPlayerSendCommandsEvent(player.getBukkitEntity(), (RootCommandNode) rootcommandnode, false).callEvent(); // Paper @@ -16,7 +16,7 @@ index 87cc7562e4a166d078fe11b7f6980497fc0bd33e..34d1fad0ad4adfcb0372ab16ecd7af0b PlayerCommandSendEvent event = new PlayerCommandSendEvent(player.getBukkitEntity(), new LinkedHashSet<>(bukkit)); event.getPlayer().getServer().getPluginManager().callEvent(event); -@@ -464,6 +465,7 @@ public class Commands { +@@ -466,6 +467,7 @@ public class Commands { } } // CraftBukkit end diff --git a/patches/todo/server/0047-Add-permission-for-F3-N-debug.patch b/patches/server/0043-Add-permission-for-F3-N-debug.patch similarity index 83% rename from patches/todo/server/0047-Add-permission-for-F3-N-debug.patch rename to patches/server/0043-Add-permission-for-F3-N-debug.patch index 526993771..c02429d97 100644 --- a/patches/todo/server/0047-Add-permission-for-F3-N-debug.patch +++ b/patches/server/0043-Add-permission-for-F3-N-debug.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add permission for F3+N debug diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index 1d92befb9b9dfb5877065beeb216bdf1caefb770..68905d5121eb05b825602d2bf24612283481c205 100644 +index d90c2b0f304c4900b3308903702c0ef489b9f511..32a693c323f812bce2f9d0df57b3357333bb8fab 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java -@@ -1148,6 +1148,7 @@ public abstract class PlayerList { +@@ -1155,6 +1155,7 @@ public abstract class PlayerList { } else { b0 = (byte) (24 + permissionLevel); } diff --git a/patches/todo/server/0048-Configurable-TPS-Catchup.patch b/patches/server/0044-Configurable-TPS-Catchup.patch similarity index 87% rename from patches/todo/server/0048-Configurable-TPS-Catchup.patch rename to patches/server/0044-Configurable-TPS-Catchup.patch index 09b895910..acbf89728 100644 --- a/patches/todo/server/0048-Configurable-TPS-Catchup.patch +++ b/patches/server/0044-Configurable-TPS-Catchup.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Configurable TPS Catchup diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 6cdcd4f105b15f10d60499572f6f4f830565513e..ceaafede643bac0b6714df3d5475b4cb03b2eaed 100644 +index 1c9c9260c442f3173d60b3ed564d8c3eee862628..baff72c3f9ec458dbdc179d0869b29e34bd7a755 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1178,7 +1178,13 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0 && (this.dealtDamage || this.isNoPhysics()) && entity != null) { + if (b0 > 0 && (this.dealtDamage || this.isNoPhysics() || (level.purpurConfig.tridentLoyaltyVoidReturnHeight < 0.0D && getY() < level.purpurConfig.tridentLoyaltyVoidReturnHeight)) && entity != null) { // Purpur if (!this.isAcceptibleReturnOwner()) { - if (!this.level.isClientSide && this.pickup == AbstractArrow.Pickup.ALLOWED) { + if (!this.level().isClientSide && this.pickup == AbstractArrow.Pickup.ALLOWED) { this.spawnAtLocation(this.getPickupItem(), 0.1F); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index ac1cc7a535f76d84877c7f4cb047ddb41c089845..acc6334ecb3523fa9bf76c53b823a6d848ba88a7 100644 +index 6e29f232f602e939f30e35a575749d23160e61ae..a08a38dabc08f88cea0411540236128b18ff47fa 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -99,9 +99,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0046-Add-enderman-and-creeper-griefing-controls.patch b/patches/server/0046-Add-enderman-and-creeper-griefing-controls.patch new file mode 100644 index 000000000..6010345ab --- /dev/null +++ b/patches/server/0046-Add-enderman-and-creeper-griefing-controls.patch @@ -0,0 +1,77 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: William Blake Galbreath +Date: Sun, 26 Apr 2020 16:28:38 -0500 +Subject: [PATCH] Add enderman and creeper griefing controls + + +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 9658611850a266ee1acf347d3f90cf4922a89d3c..7e3b64dbd6df0b4d3556f7666c632a630a3a381e 100644 +--- a/src/main/java/net/minecraft/world/entity/monster/Creeper.java ++++ b/src/main/java/net/minecraft/world/entity/monster/Creeper.java +@@ -284,7 +284,7 @@ public class Creeper extends Monster implements PowerableMob { + this.level().getCraftServer().getPluginManager().callEvent(event); + if (!event.isCancelled()) { + this.dead = true; +- this.level().explode(this, this.getX(), this.getY(), this.getZ(), event.getRadius(), event.getFire(), Level.ExplosionInteraction.MOB); ++ this.level().explode(this, this.getX(), this.getY(), this.getZ(), event.getRadius(), event.getFire(), this.level().getGameRules().getBoolean(net.minecraft.world.level.GameRules.RULE_MOBGRIEFING) && level().purpurConfig.creeperAllowGriefing ? Level.ExplosionInteraction.MOB : Level.ExplosionInteraction.NONE); // Purpur + this.discard(); + this.spawnLingeringCloud(); + } else { +diff --git a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +index 81b3f96b1fe8d592cac95e2deff8395edb6d589c..d1602c71f96d817d212582737dc6ec5db1c4f79a 100644 +--- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java ++++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +@@ -510,6 +510,7 @@ public class EnderMan extends Monster implements NeutralMob { + + @Override + public boolean canUse() { ++ if (!enderman.level().purpurConfig.endermanAllowGriefing) return false; // Purpur + return this.enderman.getCarriedBlock() == null ? false : (!this.enderman.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) ? false : this.enderman.getRandom().nextInt(reducedTickDelay(2000)) == 0); + } + +@@ -557,7 +558,8 @@ public class EnderMan extends Monster implements NeutralMob { + + @Override + public boolean canUse() { +- return this.enderman.getCarriedBlock() != null ? false : (!this.enderman.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) ? false : this.enderman.getRandom().nextInt(reducedTickDelay(20)) == 0); ++ if (!enderman.level().purpurConfig.endermanAllowGriefing) return false; // Purpur ++ return this.enderman.getCarriedBlock() != null ? false : (!this.enderman.level)_.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) ? false : this.enderman.getRandom().nextInt(reducedTickDelay(20)) == 0); + } + + @Override +diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +index a08a38dabc08f88cea0411540236128b18ff47fa..d725ea8aa559120f3b0841296cae8643475e0046 100644 +--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java ++++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +@@ -362,6 +362,7 @@ public class PurpurWorldConfig { + + public double creeperMaxHealth = 20.0D; + public double creeperChargedChance = 0.0D; ++ public boolean creeperAllowGriefing = true; + private void creeperSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.creeper.attributes.max-health", creeperMaxHealth); +@@ -370,6 +371,7 @@ public class PurpurWorldConfig { + } + creeperMaxHealth = getDouble("mobs.creeper.attributes.max_health", creeperMaxHealth); + creeperChargedChance = getDouble("mobs.creeper.naturally-charged-chance", creeperChargedChance); ++ creeperAllowGriefing = getBoolean("mobs.creeper.allow-griefing", creeperAllowGriefing); + } + + public double dolphinMaxHealth = 10.0D; +@@ -443,6 +445,7 @@ public class PurpurWorldConfig { + } + + public double endermanMaxHealth = 40.0D; ++ public boolean endermanAllowGriefing = true; + private void endermanSettings() { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.enderman.attributes.max-health", endermanMaxHealth); +@@ -450,6 +453,7 @@ public class PurpurWorldConfig { + set("mobs.enderman.attributes.max_health", oldValue); + } + endermanMaxHealth = getDouble("mobs.enderman.attributes.max_health", endermanMaxHealth); ++ endermanAllowGriefing = getBoolean("mobs.enderman.allow-griefing", endermanAllowGriefing); + } + + public double endermiteMaxHealth = 8.0D; diff --git a/patches/todo/server/0051-Villagers-follow-emerald-blocks.patch b/patches/server/0047-Villagers-follow-emerald-blocks.patch similarity index 71% rename from patches/todo/server/0051-Villagers-follow-emerald-blocks.patch rename to patches/server/0047-Villagers-follow-emerald-blocks.patch index 9c1097518..8a84d1e76 100644 --- a/patches/todo/server/0051-Villagers-follow-emerald-blocks.patch +++ b/patches/server/0047-Villagers-follow-emerald-blocks.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Villagers follow emerald blocks diff --git a/src/main/java/net/minecraft/world/entity/ai/goal/TemptGoal.java b/src/main/java/net/minecraft/world/entity/ai/goal/TemptGoal.java -index 79bb13c5614bab1f0749c5f8f57f762c6216c564..2cbc9adc8e417def48be03d08174a5833068ec65 100644 +index 0d9b194781d152e842c9a4b8d6f23d307b2e4452..00cf59524477ec79d4354cc403fc3e75a63b81a0 100644 --- a/src/main/java/net/minecraft/world/entity/ai/goal/TemptGoal.java +++ b/src/main/java/net/minecraft/world/entity/ai/goal/TemptGoal.java @@ -62,7 +62,7 @@ public class TemptGoal extends Goal { @@ -18,7 +18,7 @@ index 79bb13c5614bab1f0749c5f8f57f762c6216c564..2cbc9adc8e417def48be03d08174a583 @Override diff --git a/src/main/java/net/minecraft/world/entity/npc/AbstractVillager.java b/src/main/java/net/minecraft/world/entity/npc/AbstractVillager.java -index ca96b893e22de3ae7c11d5cded51edf70bdcb6f2..d4ab27de59e9c533789f062e74ceb453483e2e39 100644 +index 564908ce0a560c2190fb624e77d227d3b7031024..f2a4e214744227f1df32e3782e71f8a9d5cea261 100644 --- a/src/main/java/net/minecraft/world/entity/npc/AbstractVillager.java +++ b/src/main/java/net/minecraft/world/entity/npc/AbstractVillager.java @@ -43,6 +43,7 @@ import org.bukkit.event.entity.VillagerAcquireTradeEvent; @@ -30,22 +30,22 @@ index ca96b893e22de3ae7c11d5cded51edf70bdcb6f2..d4ab27de59e9c533789f062e74ceb453 // CraftBukkit start private CraftMerchant craftMerchant; 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 fc25e9deb12162f2fe9067da819ff6946f4a5be4..db3d9c95cc3d8212ee0893e0585099ef44da00a2 100644 +index 423d0eb98c144d98622884212235b33213aaac6e..8c24cb27cc54852eacb144d189e7edab5b44b56f 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java -@@ -174,6 +174,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler - @Override - protected void registerGoals() { - this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); +@@ -152,6 +152,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler + this.getNavigation().setCanFloat(true); + this.setCanPickUpLoot(true); + this.setVillagerData(this.getVillagerData().setType(type).setProfession(VillagerProfession.NONE)); + if (level.purpurConfig.villagerFollowEmeraldBlock) this.goalSelector.addGoal(3, new net.minecraft.world.entity.ai.goal.TemptGoal(this, 1.0D, TEMPT_ITEMS, false)); } @Override diff --git a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java -index 71212ecb84bdbf838b4a5fbefbe9cfa6343542c4..8bbf7dc66fb225d20fc68d858ce5ed339482b1ef 100644 +index 5df4c2468ff809b805d4f16021e7ffd2c1c2dd33..8623192215e428fede1c6bc57001e444b5476db3 100644 --- a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java +++ b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java -@@ -111,6 +111,7 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill +@@ -91,6 +91,7 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill this.goalSelector.addGoal(1, new PanicGoal(this, 0.5D)); this.goalSelector.addGoal(1, new LookAtTradingPlayerGoal(this)); this.goalSelector.addGoal(2, new WanderingTrader.WanderToPositionGoal(this, 2.0D, 0.35D)); @@ -54,38 +54,38 @@ index 71212ecb84bdbf838b4a5fbefbe9cfa6343542c4..8bbf7dc66fb225d20fc68d858ce5ed33 this.goalSelector.addGoal(8, new WaterAvoidingRandomStrollGoal(this, 0.35D)); this.goalSelector.addGoal(9, new InteractGoal(this, Player.class, 3.0F, 1.0F)); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 39d293b0007e13a12bc20f6e958038b328285c03..10045705f2a8c9af4df59fff7125c5a137bbf14d 100644 +index d725ea8aa559120f3b0841296cae8643475e0046..1f493fc2e01277da33c6a79ff7d1395e37cc5ebf 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1437,6 +1437,7 @@ public class PurpurWorldConfig { - public boolean villagerRidableInWater = true; - public boolean villagerControllable = true; +@@ -1036,6 +1036,7 @@ public class PurpurWorldConfig { + } + public double villagerMaxHealth = 20.0D; + public boolean villagerFollowEmeraldBlock = false; private void villagerSettings() { - villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); - villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); -@@ -1447,6 +1448,7 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.villager.attributes.max-health", villagerMaxHealth); +@@ -1043,6 +1044,7 @@ public class PurpurWorldConfig { set("mobs.villager.attributes.max_health", oldValue); } villagerMaxHealth = getDouble("mobs.villager.attributes.max_health", villagerMaxHealth); + villagerFollowEmeraldBlock = getBoolean("mobs.villager.follow-emerald-blocks", villagerFollowEmeraldBlock); } - public boolean vindicatorRidable = false; -@@ -1469,6 +1471,7 @@ public class PurpurWorldConfig { - public boolean wanderingTraderRidableInWater = true; - public boolean wanderingTraderControllable = true; + public double vindicatorMaxHealth = 24.0D; +@@ -1056,6 +1058,7 @@ public class PurpurWorldConfig { + } + public double wanderingTraderMaxHealth = 20.0D; + public boolean wanderingTraderFollowEmeraldBlock = false; private void wanderingTraderSettings() { - wanderingTraderRidable = getBoolean("mobs.wandering_trader.ridable", wanderingTraderRidable); - wanderingTraderRidableInWater = getBoolean("mobs.wandering_trader.ridable-in-water", wanderingTraderRidableInWater); -@@ -1479,6 +1482,7 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.wandering_trader.attributes.max-health", wanderingTraderMaxHealth); +@@ -1063,6 +1066,7 @@ public class PurpurWorldConfig { set("mobs.wandering_trader.attributes.max_health", oldValue); } wanderingTraderMaxHealth = getDouble("mobs.wandering_trader.attributes.max_health", wanderingTraderMaxHealth); + wanderingTraderFollowEmeraldBlock = getBoolean("mobs.wandering_trader.follow-emerald-blocks", wanderingTraderFollowEmeraldBlock); } - public boolean wardenRidable = false; + public double witchMaxHealth = 26.0D; diff --git a/patches/todo/server/0052-Allow-leashing-villagers.patch b/patches/server/0048-Allow-leashing-villagers.patch similarity index 71% rename from patches/todo/server/0052-Allow-leashing-villagers.patch rename to patches/server/0048-Allow-leashing-villagers.patch index 1477a6e99..71f4403cb 100644 --- a/patches/todo/server/0052-Allow-leashing-villagers.patch +++ b/patches/server/0048-Allow-leashing-villagers.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Allow leashing villagers diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java -index f6ec6a249b4559e681382c9690ddc7b9e17c9efb..7fda4e04a3e0ca8a09dccd1af36b77cca0b78a2b 100644 +index e2a25c29ec74147b3e66aa0b3deb85a8f6ee53a5..e62de6ba4836da2c2a389c753ac0865f9b0184a6 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java -@@ -1305,6 +1305,7 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -1302,6 +1302,7 @@ public abstract class Mob extends LivingEntity implements Targeting { if (!this.isAlive()) { return InteractionResult.PASS; } else if (this.getLeashHolder() == player) { @@ -17,70 +17,70 @@ index f6ec6a249b4559e681382c9690ddc7b9e17c9efb..7fda4e04a3e0ca8a09dccd1af36b77cc // Paper start - drop leash variable org.bukkit.event.player.PlayerUnleashEntityEvent event = CraftEventFactory.callPlayerUnleashEntityEvent(this, player, hand, !player.getAbilities().instabuild); 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 db3d9c95cc3d8212ee0893e0585099ef44da00a2..979bbbf4229a9355b31913454cb565fc98049911 100644 +index 8c24cb27cc54852eacb144d189e7edab5b44b56f..d2fcf2121ff9765fed268b2984a865329d27a17a 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java -@@ -181,6 +181,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler - public void initAttributes() { +@@ -160,6 +160,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.villagerMaxHealth); } -+ + + @Override + public boolean canBeLeashed(Player player) { + return level.purpurConfig.villagerCanBeLeashed && !this.isLeashed(); + } - // 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 8bbf7dc66fb225d20fc68d858ce5ed339482b1ef..559bad9524a00a5357973f30d54b0f1a3ed6dadb 100644 +index 8623192215e428fede1c6bc57001e444b5476db3..5bf96ff879318ea1be45f89b8689b6739ed9ca5b 100644 --- a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java +++ b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java -@@ -89,6 +89,11 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill - public void initAttributes() { +@@ -71,6 +71,11 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.wanderingTraderMaxHealth); } -+ + + @Override + public boolean canBeLeashed(Player player) { + return level.purpurConfig.wanderingTraderCanBeLeashed && !this.isLeashed(); + } - // 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 10045705f2a8c9af4df59fff7125c5a137bbf14d..422d784c62423933b78a624292d4bf9fa78358f1 100644 +index 1f493fc2e01277da33c6a79ff7d1395e37cc5ebf..5874ad0a9d3d2e838c15b3cc3c1e8a9992fdfc54 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1438,6 +1438,7 @@ public class PurpurWorldConfig { - public boolean villagerControllable = true; +@@ -1037,6 +1037,7 @@ public class PurpurWorldConfig { + public double villagerMaxHealth = 20.0D; public boolean villagerFollowEmeraldBlock = false; + public boolean villagerCanBeLeashed = false; private void villagerSettings() { - villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); - villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); -@@ -1449,6 +1450,7 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.villager.attributes.max-health", villagerMaxHealth); +@@ -1045,6 +1046,7 @@ public class PurpurWorldConfig { } villagerMaxHealth = getDouble("mobs.villager.attributes.max_health", villagerMaxHealth); villagerFollowEmeraldBlock = getBoolean("mobs.villager.follow-emerald-blocks", villagerFollowEmeraldBlock); + villagerCanBeLeashed = getBoolean("mobs.villager.can-be-leashed", villagerCanBeLeashed); } - public boolean vindicatorRidable = false; -@@ -1472,6 +1474,7 @@ public class PurpurWorldConfig { - public boolean wanderingTraderControllable = true; + public double vindicatorMaxHealth = 24.0D; +@@ -1059,6 +1061,7 @@ public class PurpurWorldConfig { + public double wanderingTraderMaxHealth = 20.0D; public boolean wanderingTraderFollowEmeraldBlock = false; + public boolean wanderingTraderCanBeLeashed = false; private void wanderingTraderSettings() { - wanderingTraderRidable = getBoolean("mobs.wandering_trader.ridable", wanderingTraderRidable); - wanderingTraderRidableInWater = getBoolean("mobs.wandering_trader.ridable-in-water", wanderingTraderRidableInWater); -@@ -1483,6 +1486,7 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.wandering_trader.attributes.max-health", wanderingTraderMaxHealth); +@@ -1067,6 +1070,7 @@ public class PurpurWorldConfig { } wanderingTraderMaxHealth = getDouble("mobs.wandering_trader.attributes.max_health", wanderingTraderMaxHealth); wanderingTraderFollowEmeraldBlock = getBoolean("mobs.wandering_trader.follow-emerald-blocks", wanderingTraderFollowEmeraldBlock); + wanderingTraderCanBeLeashed = getBoolean("mobs.wandering_trader.can-be-leashed", wanderingTraderCanBeLeashed); } - public boolean wardenRidable = false; + public double witchMaxHealth = 26.0D; diff --git a/patches/todo/server/0053-Implement-infinite-liquids.patch b/patches/server/0049-Implement-infinite-liquids.patch similarity index 76% rename from patches/todo/server/0053-Implement-infinite-liquids.patch rename to patches/server/0049-Implement-infinite-liquids.patch index c4c19ed40..817e367b5 100644 --- a/patches/todo/server/0053-Implement-infinite-liquids.patch +++ b/patches/server/0049-Implement-infinite-liquids.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Implement infinite liquids diff --git a/src/main/java/net/minecraft/world/level/material/FlowingFluid.java b/src/main/java/net/minecraft/world/level/material/FlowingFluid.java -index 6063665b8848a2cd9f0b262eed36a9dd48db6035..5536b9e36b4ea99e2aaa62690b5bf00208291a58 100644 +index 5502ad143fd2575f1346334b5b4fe7846628f54e..37f6de6166fbede2d216e462cf7b16721245c471 100644 --- a/src/main/java/net/minecraft/world/level/material/FlowingFluid.java +++ b/src/main/java/net/minecraft/world/level/material/FlowingFluid.java -@@ -226,7 +226,7 @@ public abstract class FlowingFluid extends Fluid { +@@ -217,7 +217,7 @@ public abstract class FlowingFluid extends Fluid { } } @@ -17,7 +17,7 @@ index 6063665b8848a2cd9f0b262eed36a9dd48db6035..5536b9e36b4ea99e2aaa62690b5bf002 BlockState iblockdata2 = world.getBlockState(pos.below()); FluidState fluid1 = iblockdata2.getFluidState(); -@@ -324,6 +324,12 @@ public abstract class FlowingFluid extends Fluid { +@@ -290,6 +290,12 @@ public abstract class FlowingFluid extends Fluid { protected abstract boolean canConvertToSource(Level world); @@ -31,7 +31,7 @@ index 6063665b8848a2cd9f0b262eed36a9dd48db6035..5536b9e36b4ea99e2aaa62690b5bf002 if (state.getBlock() instanceof LiquidBlockContainer) { ((LiquidBlockContainer) state.getBlock()).placeLiquid(world, pos, state, fluidState); diff --git a/src/main/java/net/minecraft/world/level/material/LavaFluid.java b/src/main/java/net/minecraft/world/level/material/LavaFluid.java -index 783e315d92227cbcb5cd207b0a06a12e0778d14b..e965d2cafdd887a7c61058ba2931596709e5aaa2 100644 +index 72f8b72c6436ca3b8eaeb39c7d3efe2c1462ae1d..3706ebc551413401b0e6a9a0b1c2e3257d1337c1 100644 --- a/src/main/java/net/minecraft/world/level/material/LavaFluid.java +++ b/src/main/java/net/minecraft/world/level/material/LavaFluid.java @@ -198,6 +198,13 @@ public abstract class LavaFluid extends FlowingFluid { @@ -67,7 +67,7 @@ index 82e85fbbd45244d02df90fa00c9046e7f51275a2..ec6c63075306f9e5389e83641d2c8a82 @Override protected void beforeDestroyingBlock(LevelAccessor world, BlockPos pos, BlockState state, BlockPos source) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 422d784c62423933b78a624292d4bf9fa78358f1..2db284e2c4a4bd22c964c2ed39a54797b6d22e35 100644 +index 5874ad0a9d3d2e838c15b3cc3c1e8a9992fdfc54..ff6bda851c5e7f7b5eba17d059fcda6e5a469db7 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -227,6 +227,11 @@ public class PurpurWorldConfig { @@ -79,18 +79,24 @@ index 422d784c62423933b78a624292d4bf9fa78358f1..2db284e2c4a4bd22c964c2ed39a54797 + lavaInfiniteRequiredSources = getInt("blocks.lava.infinite-required-sources", lavaInfiniteRequiredSources); + } + - public boolean signRightClickEdit = false; - private void signSettings() { - signRightClickEdit = getBoolean("blocks.sign.right-click-edit", signRightClickEdit); -@@ -241,6 +246,11 @@ public class PurpurWorldConfig { - turtleEggsBreakFromMinecarts = getBoolean("blocks.turtle_egg.break-from-minecarts", turtleEggsBreakFromMinecarts); + public boolean turtleEggsBreakFromExpOrbs = true; + public boolean turtleEggsBreakFromItems = true; + public boolean turtleEggsBreakFromMinecarts = true; +@@ -1186,3 +1191,17 @@ public class PurpurWorldConfig { + zombifiedPiglinSpawnReinforcements = getDouble("mobs.zombified_piglin.attributes.spawn_reinforcements", zombifiedPiglinSpawnReinforcements); } - + } ++||||||| expected ++ public boolean babiesAreRidable = true; ++ public boolean untamedTamablesAreRidable = true; ++ public boolean useNightVisionWhenRiding = false; ++======= + public int waterInfiniteRequiredSources = 2; + private void waterSources() { + waterInfiniteRequiredSources = getInt("blocks.water.infinite-required-sources", waterInfiniteRequiredSources); + } + - public boolean babiesAreRidable = true; - public boolean untamedTamablesAreRidable = true; - public boolean useNightVisionWhenRiding = false; ++ public boolean babiesAreRidable = true; ++ public boolean untamedTamablesAreRidable = true; ++ public boolean useNightVisionWhenRiding = false; ++>>>>>>> replacement diff --git a/patches/todo/server/0054-Make-lava-flow-speed-configurable.patch b/patches/server/0050-Make-lava-flow-speed-configurable.patch similarity index 87% rename from patches/todo/server/0054-Make-lava-flow-speed-configurable.patch rename to patches/server/0050-Make-lava-flow-speed-configurable.patch index 40a01ca5b..b7acdcca2 100644 --- a/patches/todo/server/0054-Make-lava-flow-speed-configurable.patch +++ b/patches/server/0050-Make-lava-flow-speed-configurable.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Make lava flow speed configurable diff --git a/src/main/java/net/minecraft/world/level/material/LavaFluid.java b/src/main/java/net/minecraft/world/level/material/LavaFluid.java -index e965d2cafdd887a7c61058ba2931596709e5aaa2..3a04cb4c646c07abf4338c70c865a4c4cb34b1bc 100644 +index 3706ebc551413401b0e6a9a0b1c2e3257d1337c1..b77cdbd8a7395e8442081c6a2b14695d62c9ef03 100644 --- a/src/main/java/net/minecraft/world/level/material/LavaFluid.java +++ b/src/main/java/net/minecraft/world/level/material/LavaFluid.java @@ -180,7 +180,7 @@ public abstract class LavaFluid extends FlowingFluid { @@ -18,7 +18,7 @@ index e965d2cafdd887a7c61058ba2931596709e5aaa2..3a04cb4c646c07abf4338c70c865a4c4 @Override diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 2db284e2c4a4bd22c964c2ed39a54797b6d22e35..3f3bb568d6991c00335f0c48a7d28663c3031aba 100644 +index ff6bda851c5e7f7b5eba17d059fcda6e5a469db7..6ac57d55bffcf2cec8d8c0369a14919256df1dad 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -228,8 +228,12 @@ public class PurpurWorldConfig { @@ -33,4 +33,4 @@ index 2db284e2c4a4bd22c964c2ed39a54797b6d22e35..3f3bb568d6991c00335f0c48a7d28663 + lavaSpeedNotNether = getInt("blocks.lava.speed.not-nether", lavaSpeedNotNether); } - public boolean signRightClickEdit = false; + public boolean turtleEggsBreakFromExpOrbs = true; diff --git a/patches/todo/server/0055-Add-player-death-exp-control-options.patch b/patches/server/0051-Add-player-death-exp-control-options.patch similarity index 89% rename from patches/todo/server/0055-Add-player-death-exp-control-options.patch rename to patches/server/0051-Add-player-death-exp-control-options.patch index 7030bbb16..67ee54589 100644 --- a/patches/todo/server/0055-Add-player-death-exp-control-options.patch +++ b/patches/server/0051-Add-player-death-exp-control-options.patch @@ -5,13 +5,13 @@ Subject: [PATCH] Add player death exp control options diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java -index 05106a3bd2284d1ab25067241248238bb69d4610..cd5d9b5e6853cebb556c347ebdcb0ec912a61f87 100644 +index 9c118a5ebeb1fb473f8038b3cb4a157dc0084413..d37080e74a7ce5442e4290eecb6352019b30fdb3 100644 --- a/src/main/java/net/minecraft/world/entity/player/Player.java +++ b/src/main/java/net/minecraft/world/entity/player/Player.java -@@ -1971,9 +1971,19 @@ public abstract class Player extends LivingEntity { +@@ -1985,9 +1985,19 @@ public abstract class Player extends LivingEntity { @Override public int getExperienceReward() { - if (!this.level.getGameRules().getBoolean(GameRules.RULE_KEEPINVENTORY) && !this.isSpectator()) { + if (!this.level().getGameRules().getBoolean(GameRules.RULE_KEEPINVENTORY) && !this.isSpectator()) { - int i = this.experienceLevel * 7; - - return i > 100 ? 100 : i; @@ -32,7 +32,7 @@ index 05106a3bd2284d1ab25067241248238bb69d4610..cd5d9b5e6853cebb556c347ebdcb0ec9 return 0; } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 3f3bb568d6991c00335f0c48a7d28663c3031aba..0cd282a9c4ace413c6fe66c3bafc2137573f529f 100644 +index 6ac57d55bffcf2cec8d8c0369a14919256df1dad..df98fd64b51dd0352f48b6c666e277d113ebdcf1 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -175,6 +175,8 @@ public class PurpurWorldConfig { diff --git a/patches/todo/server/0056-Configurable-void-damage-height-and-damage.patch b/patches/server/0052-Configurable-void-damage-height-and-damage.patch similarity index 80% rename from patches/todo/server/0056-Configurable-void-damage-height-and-damage.patch rename to patches/server/0052-Configurable-void-damage-height-and-damage.patch index 0df78123d..2bce9e048 100644 --- a/patches/todo/server/0056-Configurable-void-damage-height-and-damage.patch +++ b/patches/server/0052-Configurable-void-damage-height-and-damage.patch @@ -5,12 +5,12 @@ Subject: [PATCH] Configurable void damage height and damage diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 40d71ea65892910e5e9382591248aa337e9ab07c..7d6040eebf4789c136f10a28ee6a2fe687973986 100644 +index cd97c126dd4d15bdcd5f24792f67ce40b870dd2a..6a3ab6ad06b7ae33549cdfa52e717bbae1fe78ca 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -895,7 +895,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -834,7 +834,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { - public void checkOutOfWorld() { + public void checkBelowWorld() { // Paper start - Configurable nether ceiling damage - if (this.getY() < (double) (this.level.getMinBuildHeight() - 64) || (this.level.getWorld().getEnvironment() == org.bukkit.World.Environment.NETHER + if (this.getY() < (double) (this.level.getMinBuildHeight() + level.purpurConfig.voidDamageHeight) || (this.level.getWorld().getEnvironment() == org.bukkit.World.Environment.NETHER // Purpur @@ -18,20 +18,20 @@ index 40d71ea65892910e5e9382591248aa337e9ab07c..7d6040eebf4789c136f10a28ee6a2fe6 && (!(this instanceof Player player) || !player.getAbilities().invulnerable))) { // Paper end diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 161d52ff7b303f5f1eb5f094a63ed63e06d11d08..f55f39536356224438b52b2201ec7f66680865c8 100644 +index ac0f725634029c12bd236df4bfcc857b5226f96c..ea190b4a87daad0ac9dcd73fd4de7d24fa9d6a4a 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -2462,7 +2462,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -2480,7 +2480,7 @@ public abstract class LivingEntity extends Entity implements Attackable { @Override - protected void outOfWorld() { -- this.hurt(this.damageSources().outOfWorld(), 4.0F); -+ this.hurt(this.damageSources().outOfWorld(), (float) level.purpurConfig.voidDamageDealt); // Purpur + protected void onBelowWorld() { +- this.hurt(this.damageSources().fellOutOfWorld(), 4.0F); ++ this.hurt(this.damageSources().fellOutOfWorld(), (float) level().purpurConfig.voidDamageDealt); // Purpur } protected void updateSwingTime() { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 0cd282a9c4ace413c6fe66c3bafc2137573f529f..3c6025ff4fffdfd5f45011a1b65bf27323031a5c 100644 +index df98fd64b51dd0352f48b6c666e277d113ebdcf1..81c25f1498868d75107ec050fa95d02f2c0afea1 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -100,10 +100,14 @@ public class PurpurWorldConfig { diff --git a/patches/server/0053-Add-canSaveToDisk-to-Entity.patch b/patches/server/0053-Add-canSaveToDisk-to-Entity.patch new file mode 100644 index 000000000..7e1f67a41 --- /dev/null +++ b/patches/server/0053-Add-canSaveToDisk-to-Entity.patch @@ -0,0 +1,49 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: William Blake Galbreath +Date: Tue, 18 Feb 2020 20:07:08 -0600 +Subject: [PATCH] Add canSaveToDisk to Entity + + +diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java +index 6a3ab6ad06b7ae33549cdfa52e717bbae1fe78ca..b26e19f67767ef5d0da819be44f0ca0aabc2bdbb 100644 +--- a/src/main/java/net/minecraft/world/entity/Entity.java ++++ b/src/main/java/net/minecraft/world/entity/Entity.java +@@ -473,6 +473,10 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { + return false; + } + ++ public boolean canSaveToDisk() { ++ return true; ++ } ++ + public final boolean hardCollides() { + return this.hardCollides; + } +diff --git a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java +index cc51c88788e52c35447ff4c3dffaf8ac50474990..87a0d264d9b54e1b0b29f49431212c977864a30a 100644 +--- a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java ++++ b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java +@@ -194,6 +194,11 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob + vec3d = vec3d.add(vec3d2.x * 0.3D - vec3d.x * 0.6D, 0.0D, vec3d2.z * 0.3D - vec3d.z * 0.6D); + } + } ++ ++ @Override ++ public boolean canSaveToDisk() { ++ return false; ++ } + } + + this.setDeltaMovement(vec3d); +diff --git a/src/main/java/net/minecraft/world/level/chunk/storage/EntityStorage.java b/src/main/java/net/minecraft/world/level/chunk/storage/EntityStorage.java +index 0ec0be22f7292d57c40da6f1f4575bdebf8dbd09..f1d19cbe165a190cac325e646c7e8080b59cdd54 100644 +--- a/src/main/java/net/minecraft/world/level/chunk/storage/EntityStorage.java ++++ b/src/main/java/net/minecraft/world/level/chunk/storage/EntityStorage.java +@@ -111,6 +111,7 @@ public class EntityStorage implements EntityPersistentStorage { + + ListTag listTag = new ListTag(); + entities.forEach((entity) -> { // diff here: use entities parameter ++ if (!entity.canSaveToDisk()) return; // Purpur + CompoundTag compoundTag = new CompoundTag(); + if (entity.save(compoundTag)) { + listTag.add(compoundTag); diff --git a/patches/todo/server/0058-Dispenser-curse-of-binding-protection.patch b/patches/server/0054-Dispenser-curse-of-binding-protection.patch similarity index 92% rename from patches/todo/server/0058-Dispenser-curse-of-binding-protection.patch rename to patches/server/0054-Dispenser-curse-of-binding-protection.patch index 8cff73d97..1c560e548 100644 --- a/patches/todo/server/0058-Dispenser-curse-of-binding-protection.patch +++ b/patches/server/0054-Dispenser-curse-of-binding-protection.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Dispenser curse of binding protection diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java -index 7fda4e04a3e0ca8a09dccd1af36b77cca0b78a2b..89981efcb852fed1ca79f8b239aa1f044d713c6d 100644 +index e62de6ba4836da2c2a389c753ac0865f9b0184a6..fdd0acaaf69f9325feaf8167e8122191a0c7e9d7 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java @@ -65,6 +65,7 @@ import net.minecraft.world.item.ProjectileWeaponItem; @@ -16,7 +16,7 @@ index 7fda4e04a3e0ca8a09dccd1af36b77cca0b78a2b..89981efcb852fed1ca79f8b239aa1f04 import net.minecraft.world.level.GameRules; import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.Level; -@@ -1163,6 +1164,12 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -1160,6 +1161,12 @@ public abstract class Mob extends LivingEntity implements Targeting { } @@ -43,7 +43,7 @@ index d7a0cbde8f8c99276307502674c71463fbe7e89c..3500c56cb85d8c76b2acd77976d374ea // CraftBukkit start Level world = pointer.getLevel(); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 3c6025ff4fffdfd5f45011a1b65bf27323031a5c..b94467efbde7113bac462a0c698a95643beff41d 100644 +index 81c25f1498868d75107ec050fa95d02f2c0afea1..c6856ca91aed12bab95c115e5f3bc6d01ef75594 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -230,6 +230,11 @@ public class PurpurWorldConfig { diff --git a/patches/todo/server/0059-Add-option-for-boats-to-eject-players-on-land.patch b/patches/server/0055-Add-option-for-boats-to-eject-players-on-land.patch similarity index 91% rename from patches/todo/server/0059-Add-option-for-boats-to-eject-players-on-land.patch rename to patches/server/0055-Add-option-for-boats-to-eject-players-on-land.patch index f18239864..e64854a3d 100644 --- a/patches/todo/server/0059-Add-option-for-boats-to-eject-players-on-land.patch +++ b/patches/server/0055-Add-option-for-boats-to-eject-players-on-land.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add option for boats to eject players on land diff --git a/src/main/java/net/minecraft/world/entity/vehicle/Boat.java b/src/main/java/net/minecraft/world/entity/vehicle/Boat.java -index 12e3209c5246ede89daaf8455fe70b4a517e12f6..9038d694ea8d56aaed4794f55f7c23b8c1358ba7 100644 +index 35aeba4e8430e6419caa9db4a0b931a994228618..5e33f19193ff49d0d2119d811d8f81d0664e5cee 100644 --- a/src/main/java/net/minecraft/world/entity/vehicle/Boat.java +++ b/src/main/java/net/minecraft/world/entity/vehicle/Boat.java @@ -541,6 +541,7 @@ public class Boat extends Entity implements VariantHolder { @@ -17,7 +17,7 @@ index 12e3209c5246ede89daaf8455fe70b4a517e12f6..9038d694ea8d56aaed4794f55f7c23b8 } else { return Boat.Status.IN_AIR; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index b94467efbde7113bac462a0c698a95643beff41d..06f0e13063fc8e5438bce551c88b8d3b7b12d6d9 100644 +index c6856ca91aed12bab95c115e5f3bc6d01ef75594..93fd114bc45fe40eb19c5a7789bef1edd8f359e0 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -97,12 +97,14 @@ public class PurpurWorldConfig { diff --git a/patches/todo/server/0060-Mending-mends-most-damages-equipment-first.patch b/patches/server/0056-Mending-mends-most-damages-equipment-first.patch similarity index 92% rename from patches/todo/server/0060-Mending-mends-most-damages-equipment-first.patch rename to patches/server/0056-Mending-mends-most-damages-equipment-first.patch index e91bbb3f2..84d47957a 100644 --- a/patches/todo/server/0060-Mending-mends-most-damages-equipment-first.patch +++ b/patches/server/0056-Mending-mends-most-damages-equipment-first.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Mending mends most damages equipment first diff --git a/src/main/java/net/minecraft/world/entity/ExperienceOrb.java b/src/main/java/net/minecraft/world/entity/ExperienceOrb.java -index a9f20e6a73e2e1875abd1e122a5d08c4ef44f9d8..0813151ba9d1dcf1aa40fb4c7f259510adc326da 100644 +index 673327af0f77aeac0d704b0fb6bebebc76a3c966..9b122ea4a76a136719aac9910e229306128d382e 100644 --- a/src/main/java/net/minecraft/world/entity/ExperienceOrb.java +++ b/src/main/java/net/minecraft/world/entity/ExperienceOrb.java -@@ -324,7 +324,7 @@ public class ExperienceOrb extends Entity { +@@ -329,7 +329,7 @@ public class ExperienceOrb extends Entity { } private int repairPlayerItems(Player player, int amount) { @@ -18,10 +18,10 @@ index a9f20e6a73e2e1875abd1e122a5d08c4ef44f9d8..0813151ba9d1dcf1aa40fb4c7f259510 if (entry != null) { ItemStack itemstack = (ItemStack) entry.getValue(); diff --git a/src/main/java/net/minecraft/world/item/ItemStack.java b/src/main/java/net/minecraft/world/item/ItemStack.java -index d81fcbadc5c0b3d4b54dde5d47a0f847d8ec6918..a9fd9aa145a2d06d6d6733c541a0d13e6cadbecb 100644 +index 103ad5f373a59fadb4783892579f3e681a8fd596..62f70729e92c63b0fc060b0f1eadeb50c298d32f 100644 --- a/src/main/java/net/minecraft/world/item/ItemStack.java +++ b/src/main/java/net/minecraft/world/item/ItemStack.java -@@ -566,6 +566,16 @@ public final class ItemStack { +@@ -574,6 +574,16 @@ public final class ItemStack { return this.isDamageableItem() && this.getDamageValue() > 0; } @@ -73,7 +73,7 @@ index ecf640b00007a386290f8dfe9935a8aa610079fd..2048899f8e4c8211e8dde0d11148d647 public static Map.Entry getRandomItemWith(Enchantment enchantment, LivingEntity entity) { return getRandomItemWith(enchantment, entity, (stack) -> { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 06f0e13063fc8e5438bce551c88b8d3b7b12d6d9..d1c45c19697408fd97448953bada1de1edc67b1d 100644 +index 93fd114bc45fe40eb19c5a7789bef1edd8f359e0..853284560fdb47e4861dfdb84bcd317801d028e3 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -97,6 +97,7 @@ public class PurpurWorldConfig { diff --git a/patches/todo/server/0061-Add-5-second-tps-average-in-tps.patch b/patches/server/0057-Add-5-second-tps-average-in-tps.patch similarity index 94% rename from patches/todo/server/0061-Add-5-second-tps-average-in-tps.patch rename to patches/server/0057-Add-5-second-tps-average-in-tps.patch index 1deede194..8268b7c6c 100644 --- a/patches/todo/server/0061-Add-5-second-tps-average-in-tps.patch +++ b/patches/server/0057-Add-5-second-tps-average-in-tps.patch @@ -27,7 +27,7 @@ index fa56cd09102a89692b42f1d14257990508c5c720..f9251183df72ddc56662fd3f02acf216 setListData(vector); } diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index ceaafede643bac0b6714df3d5475b4cb03b2eaed..65ba915d3644b638ce3b5314c0aed5b2018f67e0 100644 +index baff72c3f9ec458dbdc179d0869b29e34bd7a755..cd883e14611cdb5ab74861b669e64a6445d9de9c 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -305,7 +305,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0) { @@ -66,7 +66,7 @@ index be0585ce01d851105699e02e6b35e486f0c13a88..6d3d68faba89cf388d52d9a526a3d14a int k = 0; for (int l = 0; j > 0 && l < amount; ++l) { -@@ -650,6 +650,12 @@ public final class ItemStack { +@@ -658,6 +658,12 @@ public final class ItemStack { if (this.hurt(amount, entity.getRandom(), entity /*instanceof ServerPlayer ? (ServerPlayer) entity : null*/)) { // Paper - pass LivingEntity for EntityItemDamageEvent breakCallback.accept(entity); Item item = this.getItem(); @@ -80,7 +80,7 @@ index be0585ce01d851105699e02e6b35e486f0c13a88..6d3d68faba89cf388d52d9a526a3d14a if (this.count == 1 && entity instanceof net.minecraft.world.entity.player.Player) { org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerItemBreakEvent((net.minecraft.world.entity.player.Player) entity, this); diff --git a/src/main/java/net/minecraft/world/item/TridentItem.java b/src/main/java/net/minecraft/world/item/TridentItem.java -index 9365f886a23a71c41091b22d46896ff18a5a0635..41bd45c0720751f348b5cf6eaecac4397a439857 100644 +index 8078f127ff4b6e0aafb5804b9c02e237f79445b5..06c2f30b77a2c8aecc65e0c305f643d53798f364 100644 --- a/src/main/java/net/minecraft/world/item/TridentItem.java +++ b/src/main/java/net/minecraft/world/item/TridentItem.java @@ -130,6 +130,14 @@ public class TridentItem extends Item implements Vanishable { @@ -97,9 +97,9 @@ index 9365f886a23a71c41091b22d46896ff18a5a0635..41bd45c0720751f348b5cf6eaecac439 + entityhuman.push((double) f2, (double) f3, (double) f4); entityhuman.startAutoSpinAttack(20); - if (entityhuman.isOnGround()) { + if (entityhuman.onGround()) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index d1c45c19697408fd97448953bada1de1edc67b1d..67ffbf096e4fcd29266eb329451213c72415e439 100644 +index 853284560fdb47e4861dfdb84bcd317801d028e3..dba373f3acf4f4400dfe5f7f49ae7d3f4c654090 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -114,6 +114,19 @@ public class PurpurWorldConfig { diff --git a/patches/todo/server/0063-Item-entity-immunities.patch b/patches/server/0059-Item-entity-immunities.patch similarity index 85% rename from patches/todo/server/0063-Item-entity-immunities.patch rename to patches/server/0059-Item-entity-immunities.patch index ac467d964..39d311c39 100644 --- a/patches/todo/server/0063-Item-entity-immunities.patch +++ b/patches/server/0059-Item-entity-immunities.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Item entity immunities diff --git a/src/main/java/net/minecraft/server/level/ServerEntity.java b/src/main/java/net/minecraft/server/level/ServerEntity.java -index d5cb594f0b17ec9dc1a19cdb99bba553e70171be..6afee2a744a3498d4a0eee35f77cde444f73d12c 100644 +index 6670e657e08e130f7e0368f418379fd1ece00cdf..923cf196ad556efb2aea759bc9f6f33da106af93 100644 --- a/src/main/java/net/minecraft/server/level/ServerEntity.java +++ b/src/main/java/net/minecraft/server/level/ServerEntity.java -@@ -72,7 +72,7 @@ public class ServerEntity { +@@ -70,7 +70,7 @@ public class ServerEntity { @Nullable private List> trackedDataValues; // CraftBukkit start @@ -18,7 +18,7 @@ index d5cb594f0b17ec9dc1a19cdb99bba553e70171be..6afee2a744a3498d4a0eee35f77cde44 public ServerEntity(ServerLevel worldserver, Entity entity, int i, boolean flag, Consumer> consumer, Set trackedPlayers) { this.trackedPlayers = trackedPlayers; diff --git a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java -index 453f0f7042bdf204db73be139aa36f211c5455e7..52a14af24e3c51c53b40fdb6594b1664eef6d486 100644 +index 3d41dbe0285f8fec8adae1e93010cf464df9b08c..9ff579c8f293491364e9de4b1e85cfb43c92a249 100644 --- a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java +++ b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java @@ -55,6 +55,12 @@ public class ItemEntity extends Entity implements TraceableEntity { @@ -34,7 +34,7 @@ index 453f0f7042bdf204db73be139aa36f211c5455e7..52a14af24e3c51c53b40fdb6594b1664 public ItemEntity(EntityType type, Level world) { super(type, world); -@@ -349,6 +355,15 @@ public class ItemEntity extends Entity implements TraceableEntity { +@@ -347,6 +353,15 @@ public class ItemEntity extends Entity implements TraceableEntity { return false; } else if (!this.getItem().getItem().canBeHurtBy(source)) { return false; @@ -47,18 +47,18 @@ index 453f0f7042bdf204db73be139aa36f211c5455e7..52a14af24e3c51c53b40fdb6594b1664 + ) { + return false; + // Purpur end - } else if (this.level.isClientSide) { + } else if (this.level().isClientSide) { return true; } else { -@@ -547,6 +562,12 @@ public class ItemEntity extends Entity implements TraceableEntity { +@@ -545,6 +560,12 @@ public class ItemEntity extends Entity implements TraceableEntity { this.getEntityData().set(ItemEntity.DATA_ITEM, stack); this.getEntityData().markDirty(ItemEntity.DATA_ITEM); // CraftBukkit - SPIGOT-4591, must mark dirty - this.despawnRate = level.paperConfig().entities.spawning.altItemDespawnRate.enabled ? level.paperConfig().entities.spawning.altItemDespawnRate.items.getOrDefault(stack.getItem(), level.spigotConfig.itemDespawnRate) : level.spigotConfig.itemDespawnRate; // Paper + this.despawnRate = this.level().paperConfig().entities.spawning.altItemDespawnRate.enabled ? this.level().paperConfig().entities.spawning.altItemDespawnRate.items.getOrDefault(stack.getItem(), this.level().spigotConfig.itemDespawnRate) : this.level().spigotConfig.itemDespawnRate; // Paper + // Purpur start -+ if (level.purpurConfig.itemImmuneToCactus.contains(stack.getItem())) immuneToCactus = true; -+ if (level.purpurConfig.itemImmuneToExplosion.contains(stack.getItem())) immuneToExplosion = true; -+ if (level.purpurConfig.itemImmuneToFire.contains(stack.getItem())) immuneToFire = true; -+ if (level.purpurConfig.itemImmuneToLightning.contains(stack.getItem())) immuneToLightning = true; ++ if (level().purpurConfig.itemImmuneToCactus.contains(stack.getItem())) immuneToCactus = true; ++ if (level().purpurConfig.itemImmuneToExplosion.contains(stack.getItem())) immuneToExplosion = true; ++ if (level().purpurConfig.itemImmuneToFire.contains(stack.getItem())) immuneToFire = true; ++ if (level().purpurConfig.itemImmuneToLightning.contains(stack.getItem())) immuneToLightning = true; + // level end } @@ -115,7 +115,7 @@ index a925b5c490e7129b27370aa57b5fad1cf05530c6..09001578b88658c44d0661d340a0ee0f + // Purpur end } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 67ffbf096e4fcd29266eb329451213c72415e439..0ea436e503d76a7ee74c8ef30722dfd06ed7449f 100644 +index dba373f3acf4f4400dfe5f7f49ae7d3f4c654090..31d259d0b914b344095dd0435891f55dd5ab4c56 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -127,6 +127,49 @@ public class PurpurWorldConfig { diff --git a/patches/todo/server/0064-Add-ping-command.patch b/patches/server/0060-Add-ping-command.patch similarity index 90% rename from patches/todo/server/0064-Add-ping-command.patch rename to patches/server/0060-Add-ping-command.patch index ba0eb0392..4f3cc359b 100644 --- a/patches/todo/server/0064-Add-ping-command.patch +++ b/patches/server/0060-Add-ping-command.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add ping command diff --git a/src/main/java/net/minecraft/commands/Commands.java b/src/main/java/net/minecraft/commands/Commands.java -index 34d1fad0ad4adfcb0372ab16ecd7af0b92b5bedc..dc34d1a2fe967d94eb6ea16b51f1b8da205f95b5 100644 +index 147fcbdd784f06fe23138b20aef82f92ba154998..aadc9fc53b0f495664d90c40f30f9a128c3b4c95 100644 --- a/src/main/java/net/minecraft/commands/Commands.java +++ b/src/main/java/net/minecraft/commands/Commands.java -@@ -222,6 +222,7 @@ public class Commands { +@@ -224,6 +224,7 @@ public class Commands { SetPlayerIdleTimeoutCommand.register(this.dispatcher); StopCommand.register(this.dispatcher); WhitelistCommand.register(this.dispatcher); @@ -17,18 +17,17 @@ index 34d1fad0ad4adfcb0372ab16ecd7af0b92b5bedc..dc34d1a2fe967d94eb6ea16b51f1b8da if (environment.includeIntegrated) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -index 4905358e2a1939bfba963bda3fcf914721dfac45..a74932163207506e779c941c819eb663b98bd18c 100644 +index 8c2bbafaef3469b90efa966a5eb1af3fada2a812..ce2a7f193c9faa4578b2447348c5d29864f5d634 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -@@ -179,6 +179,7 @@ public class PurpurConfig { +@@ -178,12 +178,14 @@ public class PurpurConfig { public static boolean afkBroadcastUseDisplayName = false; public static String afkTabListPrefix = "[AFK] "; public static String afkTabListSuffix = ""; + public static String pingCommandOutput = "%s's ping is %sms"; private static void messages() { - cannotRideMob = getString("settings.messages.cannot-ride-mob", cannotRideMob); afkBroadcastAway = getString("settings.messages.afk-broadcast-away", afkBroadcastAway); -@@ -186,6 +187,7 @@ public class PurpurConfig { + 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))); diff --git a/patches/todo/server/0065-Add-demo-command.patch b/patches/server/0061-Add-demo-command.patch similarity index 90% rename from patches/todo/server/0065-Add-demo-command.patch rename to patches/server/0061-Add-demo-command.patch index d2009aee3..c385e0745 100644 --- a/patches/todo/server/0065-Add-demo-command.patch +++ b/patches/server/0061-Add-demo-command.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add demo command diff --git a/src/main/java/net/minecraft/commands/Commands.java b/src/main/java/net/minecraft/commands/Commands.java -index dc34d1a2fe967d94eb6ea16b51f1b8da205f95b5..a7c26527eb282d2f80fa14d265b748f7a41a7ebe 100644 +index aadc9fc53b0f495664d90c40f30f9a128c3b4c95..54f9dd8d666b2b45190681f4362fce457e8e8ef2 100644 --- a/src/main/java/net/minecraft/commands/Commands.java +++ b/src/main/java/net/minecraft/commands/Commands.java -@@ -222,6 +222,7 @@ public class Commands { +@@ -224,6 +224,7 @@ public class Commands { SetPlayerIdleTimeoutCommand.register(this.dispatcher); StopCommand.register(this.dispatcher); WhitelistCommand.register(this.dispatcher); @@ -17,18 +17,18 @@ index dc34d1a2fe967d94eb6ea16b51f1b8da205f95b5..a7c26527eb282d2f80fa14d265b748f7 } diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -index a74932163207506e779c941c819eb663b98bd18c..235db276a07017bf89e6311a0b84291e8a0af06b 100644 +index ce2a7f193c9faa4578b2447348c5d29864f5d634..c78d76deb4b1c1a5bf3f2e7c4566f5cc6603dc52 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -@@ -179,6 +179,7 @@ public class PurpurConfig { +@@ -178,6 +178,7 @@ public class PurpurConfig { public static boolean afkBroadcastUseDisplayName = false; public static String afkTabListPrefix = "[AFK] "; public static String afkTabListSuffix = ""; + public static String demoCommandOutput = "%s has been shown the demo screen"; public static String pingCommandOutput = "%s's ping is %sms"; private static void messages() { - cannotRideMob = getString("settings.messages.cannot-ride-mob", cannotRideMob); -@@ -187,6 +188,7 @@ public class PurpurConfig { + afkBroadcastAway = getString("settings.messages.afk-broadcast-away", afkBroadcastAway); +@@ -185,6 +186,7 @@ public class PurpurConfig { 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))); diff --git a/patches/todo/server/0066-Add-credits-command.patch b/patches/server/0062-Add-credits-command.patch similarity index 93% rename from patches/todo/server/0066-Add-credits-command.patch rename to patches/server/0062-Add-credits-command.patch index 6bb46722a..3963594dc 100644 --- a/patches/todo/server/0066-Add-credits-command.patch +++ b/patches/server/0062-Add-credits-command.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add credits command diff --git a/src/main/java/net/minecraft/commands/Commands.java b/src/main/java/net/minecraft/commands/Commands.java -index a7c26527eb282d2f80fa14d265b748f7a41a7ebe..277fb799d898ca726205519b1516861901be33c5 100644 +index 54f9dd8d666b2b45190681f4362fce457e8e8ef2..e5b1b6ad32c48a4ba13b4930954fad18669677ad 100644 --- a/src/main/java/net/minecraft/commands/Commands.java +++ b/src/main/java/net/minecraft/commands/Commands.java -@@ -222,6 +222,7 @@ public class Commands { +@@ -224,6 +224,7 @@ public class Commands { SetPlayerIdleTimeoutCommand.register(this.dispatcher); StopCommand.register(this.dispatcher); WhitelistCommand.register(this.dispatcher); @@ -17,10 +17,10 @@ index a7c26527eb282d2f80fa14d265b748f7a41a7ebe..277fb799d898ca726205519b15168619 org.purpurmc.purpur.command.PingCommand.register(this.dispatcher); // Purpur } diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -index 235db276a07017bf89e6311a0b84291e8a0af06b..8e99128759e555cdef0efe9cea1b3b36f2c3fda9 100644 +index c78d76deb4b1c1a5bf3f2e7c4566f5cc6603dc52..106b2abc4f7070ec4d1c6790f78c05392df43eff 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -@@ -179,6 +179,7 @@ public class PurpurConfig { +@@ -178,6 +178,7 @@ public class PurpurConfig { public static boolean afkBroadcastUseDisplayName = false; public static String afkTabListPrefix = "[AFK] "; public static String afkTabListSuffix = ""; @@ -28,7 +28,7 @@ index 235db276a07017bf89e6311a0b84291e8a0af06b..8e99128759e555cdef0efe9cea1b3b36 public static String demoCommandOutput = "%s has been shown the demo screen"; public static String pingCommandOutput = "%s's ping is %sms"; private static void messages() { -@@ -188,6 +189,7 @@ public class PurpurConfig { +@@ -186,6 +187,7 @@ public class PurpurConfig { 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))); diff --git a/patches/todo/server/0067-Configurable-jockey-options.patch b/patches/server/0063-Configurable-jockey-options.patch similarity index 77% rename from patches/todo/server/0067-Configurable-jockey-options.patch rename to patches/server/0063-Configurable-jockey-options.patch index b76eb8fb4..e32d758fb 100644 --- a/patches/todo/server/0067-Configurable-jockey-options.patch +++ b/patches/server/0063-Configurable-jockey-options.patch @@ -5,14 +5,13 @@ Subject: [PATCH] Configurable jockey options diff --git a/src/main/java/net/minecraft/world/entity/monster/Drowned.java b/src/main/java/net/minecraft/world/entity/monster/Drowned.java -index 0139d890c22db09c4b67a1e1bcf179a6571c7cd6..863fd15039e53405aac66d769598a38ac2586115 100644 +index c379b5396de408724ccab41d2255a8ce8bcd892a..c5e3a361c5a31ae78156079f9e039ff8adb36151 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Drowned.java +++ b/src/main/java/net/minecraft/world/entity/monster/Drowned.java -@@ -93,6 +93,21 @@ public class Drowned extends Zombie implements RangedAttackMob { - protected void randomizeReinforcementsChance() { +@@ -78,6 +78,21 @@ public class Drowned extends Zombie implements RangedAttackMob { this.getAttribute(Attributes.SPAWN_REINFORCEMENTS_CHANCE).setBaseValue(this.random.nextDouble() * this.level.purpurConfig.drownedSpawnReinforcements); } -+ + + @Override + public boolean jockeyOnlyBaby() { + return level.purpurConfig.drownedJockeyOnlyBaby; @@ -27,18 +26,18 @@ index 0139d890c22db09c4b67a1e1bcf179a6571c7cd6..863fd15039e53405aac66d769598a38a + public boolean jockeyTryExistingChickens() { + return level.purpurConfig.drownedJockeyTryExistingChickens; + } - // Purpur end - ++ @Override + protected void addBehaviourGoals() { + this.goalSelector.addGoal(1, new Drowned.DrownedGoToWaterGoal(this, 1.0D)); diff --git a/src/main/java/net/minecraft/world/entity/monster/Husk.java b/src/main/java/net/minecraft/world/entity/monster/Husk.java -index 4dc604f2d36494bbe139b7ef4649089207dd092f..58006eab96f505215053203bff6853ca784468f5 100644 +index 9e84a90f42c4a526ef067b7aff457c9dcda571ef..d35c3630d7aba71271038cee04d97ca98038c847 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Husk.java +++ b/src/main/java/net/minecraft/world/entity/monster/Husk.java -@@ -47,6 +47,21 @@ public class Husk extends Zombie { - protected void randomizeReinforcementsChance() { +@@ -32,6 +32,21 @@ public class Husk extends Zombie { this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.SPAWN_REINFORCEMENTS_CHANCE).setBaseValue(this.random.nextDouble() * this.level.purpurConfig.huskSpawnReinforcements); } -+ + + @Override + public boolean jockeyOnlyBaby() { + return level.purpurConfig.huskJockeyOnlyBaby; @@ -53,18 +52,18 @@ index 4dc604f2d36494bbe139b7ef4649089207dd092f..58006eab96f505215053203bff6853ca + public boolean jockeyTryExistingChickens() { + return level.purpurConfig.huskJockeyTryExistingChickens; + } - // Purpur end - ++ public static boolean checkHuskSpawnRules(EntityType 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/Zombie.java b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -index 77712e0bb78bef24f05d9949c3ae4ee7ec2efb96..fb41431f25081c8ca0cf03dc5128f78f589e4e26 100644 +index 3263d467cbff5cd7382f9618c342314aafb2a004..6f20140adb276c0a08644cc3fb7d6b29982e8697 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zombie.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -@@ -126,6 +126,18 @@ public class Zombie extends Monster { - public void initAttributes() { +@@ -111,6 +111,18 @@ public class Zombie extends Monster { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.zombieMaxHealth); } -+ + + public boolean jockeyOnlyBaby() { + return level.purpurConfig.zombieJockeyOnlyBaby; + } @@ -76,10 +75,11 @@ index 77712e0bb78bef24f05d9949c3ae4ee7ec2efb96..fb41431f25081c8ca0cf03dc5128f78f + public boolean jockeyTryExistingChickens() { + return level.purpurConfig.zombieJockeyTryExistingChickens; + } - // Purpur end - ++ @Override -@@ -551,19 +563,20 @@ 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 +@@ -532,19 +544,20 @@ public class Zombie extends Monster { if (object instanceof Zombie.ZombieGroupData) { Zombie.ZombieGroupData entityzombie_groupdatazombie = (Zombie.ZombieGroupData) object; @@ -103,10 +103,10 @@ index 77712e0bb78bef24f05d9949c3ae4ee7ec2efb96..fb41431f25081c8ca0cf03dc5128f78f - } - } else if ((double) randomsource.nextFloat() < 0.05D) { + } else { // Purpur - Chicken entitychicken1 = (Chicken) EntityType.CHICKEN.create(this.level); + Chicken entitychicken1 = (Chicken) EntityType.CHICKEN.create(this.level()); if (entitychicken1 != null) { -@@ -573,6 +586,7 @@ public class Zombie extends Monster { +@@ -554,6 +567,7 @@ public class Zombie extends Monster { this.startRiding(entitychicken1); world.addFreshEntity(entitychicken1, CreatureSpawnEvent.SpawnReason.MOUNT); // CraftBukkit } @@ -115,14 +115,13 @@ index 77712e0bb78bef24f05d9949c3ae4ee7ec2efb96..fb41431f25081c8ca0cf03dc5128f78f } } 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 073a45cd24c92e63b349a93da91cedfa10103101..9754f1d53cc5b2ea982531e0240c4fb41e4f1d35 100644 +index 7ca69d4ae42f982eef7c4470d6a28a3eb334401c..1f0265ee248da4dc1bf57a1d3d58aee52184fe72 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java -@@ -104,6 +104,21 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { - protected void randomizeReinforcementsChance() { +@@ -89,6 +89,21 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.SPAWN_REINFORCEMENTS_CHANCE).setBaseValue(this.random.nextDouble() * this.level.purpurConfig.zombieVillagerSpawnReinforcements); } -+ + + @Override + public boolean jockeyOnlyBaby() { + return level.purpurConfig.zombieVillagerJockeyOnlyBaby; @@ -137,18 +136,18 @@ index 073a45cd24c92e63b349a93da91cedfa10103101..9754f1d53cc5b2ea982531e0240c4fb4 + public boolean jockeyTryExistingChickens() { + return level.purpurConfig.zombieVillagerJockeyTryExistingChickens; + } - // 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 2df1aa1af12b403e9cd87d61b2ff1516f754f589..f2c690c92dd2bf55f986f629ed79b76fbdfa32a4 100644 +index 5e97cec00a6ea97520f0e5acb6e30d5e7e5fab89..45c93c148cde236e01fe925c1a9b67e3e963bbb8 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java -@@ -83,6 +83,21 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { - public void initAttributes() { +@@ -68,6 +68,21 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.zombifiedPiglinMaxHealth); } -+ + + @Override + public boolean jockeyOnlyBaby() { + return level.purpurConfig.zombifiedPiglinJockeyOnlyBaby; @@ -163,24 +162,25 @@ index 2df1aa1af12b403e9cd87d61b2ff1516f754f589..f2c690c92dd2bf55f986f629ed79b76f + public boolean jockeyTryExistingChickens() { + return level.purpurConfig.zombifiedPiglinJockeyTryExistingChickens; + } - // Purpur end - ++ @Override + public void setPersistentAngerTarget(@Nullable UUID angryAt) { + this.persistentAngerTarget = angryAt; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 0ea436e503d76a7ee74c8ef30722dfd06ed7449f..d98383a21bb7fbc64525e701add25f8d32499e9a 100644 +index 31d259d0b914b344095dd0435891f55dd5ab4c56..1301d9498808d2edf98ca20de6886c8f50fbdb83 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -590,6 +590,9 @@ public class PurpurWorldConfig { - public boolean drownedControllable = true; +@@ -490,6 +490,9 @@ public class PurpurWorldConfig { + public double drownedMaxHealth = 20.0D; public double drownedSpawnReinforcements = 0.1D; + public boolean drownedJockeyOnlyBaby = true; + public double drownedJockeyChance = 0.05D; + public boolean drownedJockeyTryExistingChickens = true; private void drownedSettings() { - drownedRidable = getBoolean("mobs.drowned.ridable", drownedRidable); - drownedRidableInWater = getBoolean("mobs.drowned.ridable-in-water", drownedRidableInWater); -@@ -601,6 +604,9 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.drowned.attributes.max-health", drownedMaxHealth); +@@ -498,6 +501,9 @@ public class PurpurWorldConfig { } drownedMaxHealth = getDouble("mobs.drowned.attributes.max_health", drownedMaxHealth); drownedSpawnReinforcements = getDouble("mobs.drowned.attributes.spawn_reinforcements", drownedSpawnReinforcements); @@ -189,18 +189,18 @@ index 0ea436e503d76a7ee74c8ef30722dfd06ed7449f..d98383a21bb7fbc64525e701add25f8d + drownedJockeyTryExistingChickens = getBoolean("mobs.drowned.jockey.try-existing-chickens", drownedJockeyTryExistingChickens); } - public boolean elderGuardianRidable = false; -@@ -849,6 +855,9 @@ public class PurpurWorldConfig { - public boolean huskControllable = true; + public double elderGuardianMaxHealth = 80.0D; +@@ -660,6 +666,9 @@ public class PurpurWorldConfig { + public double huskMaxHealth = 20.0D; public double huskSpawnReinforcements = 0.1D; + public boolean huskJockeyOnlyBaby = true; + public double huskJockeyChance = 0.05D; + public boolean huskJockeyTryExistingChickens = true; private void huskSettings() { - huskRidable = getBoolean("mobs.husk.ridable", huskRidable); - huskRidableInWater = getBoolean("mobs.husk.ridable-in-water", huskRidableInWater); -@@ -860,6 +869,9 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.husk.attributes.max-health", huskMaxHealth); +@@ -668,6 +677,9 @@ public class PurpurWorldConfig { } huskMaxHealth = getDouble("mobs.husk.attributes.max_health", huskMaxHealth); huskSpawnReinforcements = getDouble("mobs.husk.attributes.spawn_reinforcements", huskSpawnReinforcements); @@ -209,18 +209,18 @@ index 0ea436e503d76a7ee74c8ef30722dfd06ed7449f..d98383a21bb7fbc64525e701add25f8d + huskJockeyTryExistingChickens = getBoolean("mobs.husk.jockey.try-existing-chickens", huskJockeyTryExistingChickens); } - public boolean illusionerRidable = false; -@@ -1676,6 +1688,9 @@ public class PurpurWorldConfig { - public boolean zombieControllable = true; + public double illusionerMovementSpeed = 0.5D; +@@ -1211,6 +1223,9 @@ public class PurpurWorldConfig { + public double zombieMaxHealth = 20.0D; public double zombieSpawnReinforcements = 0.1D; + public boolean zombieJockeyOnlyBaby = true; + public double zombieJockeyChance = 0.05D; + public boolean zombieJockeyTryExistingChickens = true; private void zombieSettings() { - zombieRidable = getBoolean("mobs.zombie.ridable", zombieRidable); - zombieRidableInWater = getBoolean("mobs.zombie.ridable-in-water", zombieRidableInWater); -@@ -1687,6 +1702,9 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.zombie.attributes.max-health", zombieMaxHealth); +@@ -1219,6 +1234,9 @@ public class PurpurWorldConfig { } zombieMaxHealth = getDouble("mobs.zombie.attributes.max_health", zombieMaxHealth); zombieSpawnReinforcements = getDouble("mobs.zombie.attributes.spawn_reinforcements", zombieSpawnReinforcements); @@ -229,18 +229,18 @@ index 0ea436e503d76a7ee74c8ef30722dfd06ed7449f..d98383a21bb7fbc64525e701add25f8d + zombieJockeyTryExistingChickens = getBoolean("mobs.zombie.jockey.try-existing-chickens", zombieJockeyTryExistingChickens); } - public boolean zombieHorseRidableInWater = false; -@@ -1721,6 +1739,9 @@ public class PurpurWorldConfig { - public boolean zombieVillagerControllable = true; + public double zombieHorseMaxHealthMin = 15.0D; +@@ -1246,6 +1264,9 @@ public class PurpurWorldConfig { + public double zombieVillagerMaxHealth = 20.0D; public double zombieVillagerSpawnReinforcements = 0.1D; + public boolean zombieVillagerJockeyOnlyBaby = true; + public double zombieVillagerJockeyChance = 0.05D; + public boolean zombieVillagerJockeyTryExistingChickens = true; private void zombieVillagerSettings() { - zombieVillagerRidable = getBoolean("mobs.zombie_villager.ridable", zombieVillagerRidable); - zombieVillagerRidableInWater = getBoolean("mobs.zombie_villager.ridable-in-water", zombieVillagerRidableInWater); -@@ -1732,6 +1753,9 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.zombie_villager.attributes.max-health", zombieVillagerMaxHealth); +@@ -1254,10 +1275,16 @@ public class PurpurWorldConfig { } zombieVillagerMaxHealth = getDouble("mobs.zombie_villager.attributes.max_health", zombieVillagerMaxHealth); zombieVillagerSpawnReinforcements = getDouble("mobs.zombie_villager.attributes.spawn_reinforcements", zombieVillagerSpawnReinforcements); @@ -249,18 +249,15 @@ index 0ea436e503d76a7ee74c8ef30722dfd06ed7449f..d98383a21bb7fbc64525e701add25f8d + zombieVillagerJockeyTryExistingChickens = getBoolean("mobs.zombie_villager.jockey.try-existing-chickens", zombieVillagerJockeyTryExistingChickens); } - public boolean zombifiedPiglinRidable = false; -@@ -1739,6 +1763,9 @@ public class PurpurWorldConfig { - public boolean zombifiedPiglinControllable = true; public double zombifiedPiglinMaxHealth = 20.0D; public double zombifiedPiglinSpawnReinforcements = 0.0D; + public boolean zombifiedPiglinJockeyOnlyBaby = true; + public double zombifiedPiglinJockeyChance = 0.05D; + public boolean zombifiedPiglinJockeyTryExistingChickens = true; private void zombifiedPiglinSettings() { - zombifiedPiglinRidable = getBoolean("mobs.zombified_piglin.ridable", zombifiedPiglinRidable); - zombifiedPiglinRidableInWater = getBoolean("mobs.zombified_piglin.ridable-in-water", zombifiedPiglinRidableInWater); -@@ -1750,5 +1777,8 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.zombified_piglin.attributes.max-health", zombifiedPiglinMaxHealth); +@@ -1266,6 +1293,9 @@ public class PurpurWorldConfig { } zombifiedPiglinMaxHealth = getDouble("mobs.zombified_piglin.attributes.max_health", zombifiedPiglinMaxHealth); zombifiedPiglinSpawnReinforcements = getDouble("mobs.zombified_piglin.attributes.spawn_reinforcements", zombifiedPiglinSpawnReinforcements); @@ -269,3 +266,4 @@ index 0ea436e503d76a7ee74c8ef30722dfd06ed7449f..d98383a21bb7fbc64525e701add25f8d + zombifiedPiglinJockeyTryExistingChickens = getBoolean("mobs.zombified_piglin.jockey.try-existing-chickens", zombifiedPiglinJockeyTryExistingChickens); } } + ||||||| expected diff --git a/patches/todo/server/0069-Add-phantom-spawning-options.patch b/patches/server/0064-Add-phantom-spawning-options.patch similarity index 73% rename from patches/todo/server/0069-Add-phantom-spawning-options.patch rename to patches/server/0064-Add-phantom-spawning-options.patch index a967b438f..a75000193 100644 --- a/patches/todo/server/0069-Add-phantom-spawning-options.patch +++ b/patches/server/0064-Add-phantom-spawning-options.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add phantom spawning options diff --git a/src/main/java/net/minecraft/world/level/levelgen/PhantomSpawner.java b/src/main/java/net/minecraft/world/level/levelgen/PhantomSpawner.java -index e8ae4449696d73c8c9b8b27d4d2e20db933a72cc..f55c50f6637a4f930b15565d6ac82bb4f27b9059 100644 +index bc7648dbc132551dc6591ab49a1919a623c30f60..5b880677c895d0e747a1ed6a380ae35613334e35 100644 --- a/src/main/java/net/minecraft/world/level/levelgen/PhantomSpawner.java +++ b/src/main/java/net/minecraft/world/level/levelgen/PhantomSpawner.java -@@ -51,7 +51,7 @@ public class PhantomSpawner implements CustomSpawner { +@@ -49,7 +49,7 @@ public class PhantomSpawner implements CustomSpawner { int spawnAttemptMaxSeconds = world.paperConfig().entities.behavior.phantomsSpawnAttemptMaxSeconds; this.nextTick += (spawnAttemptMinSeconds + randomsource.nextInt(spawnAttemptMaxSeconds - spawnAttemptMinSeconds + 1)) * 20; // Paper end @@ -17,9 +17,9 @@ index e8ae4449696d73c8c9b8b27d4d2e20db933a72cc..f55c50f6637a4f930b15565d6ac82bb4 return 0; } else { int i = 0; -@@ -63,10 +63,10 @@ public class PhantomSpawner implements CustomSpawner { - if (!entityhuman.isSpectator() && (!world.paperConfig().entities.behavior.phantomsDoNotSpawnOnCreativePlayers || !entityhuman.isCreative())) { // Paper - BlockPos blockposition = entityhuman.blockPosition(); +@@ -61,10 +61,10 @@ public class PhantomSpawner implements CustomSpawner { + if (!entityplayer.isSpectator() && (!world.paperConfig().entities.behavior.phantomsDoNotSpawnOnCreativePlayers || !entityplayer.isCreative())) { // Paper + BlockPos blockposition = entityplayer.blockPosition(); - if (!world.dimensionType().hasSkyLight() || blockposition.getY() >= world.getSeaLevel() && world.canSeeSky(blockposition)) { + if (!world.dimensionType().hasSkyLight() || (!world.purpurConfig.phantomSpawnOnlyAboveSeaLevel || blockposition.getY() >= world.getSeaLevel()) && (!world.purpurConfig.phantomSpawnOnlyWithVisibleSky || world.canSeeSky(blockposition))) { // Purpur @@ -27,10 +27,10 @@ index e8ae4449696d73c8c9b8b27d4d2e20db933a72cc..f55c50f6637a4f930b15565d6ac82bb4 - if (difficultydamagescaler.isHarderThan(randomsource.nextFloat() * 3.0F)) { + if (difficultydamagescaler.isHarderThan(randomsource.nextFloat() * (float) world.purpurConfig.phantomSpawnLocalDifficultyChance)) { // Purpur - ServerStatsCounter serverstatisticmanager = ((ServerPlayer) entityhuman).getStats(); + ServerStatsCounter serverstatisticmanager = entityplayer.getStats(); int j = Mth.clamp(serverstatisticmanager.getValue(Stats.CUSTOM.get(Stats.TIME_SINCE_REST)), 1, Integer.MAX_VALUE); boolean flag2 = true; -@@ -78,7 +78,7 @@ public class PhantomSpawner implements CustomSpawner { +@@ -76,7 +76,7 @@ public class PhantomSpawner implements CustomSpawner { if (NaturalSpawner.isValidEmptySpawnBlock(world, blockposition1, iblockdata, fluid, EntityType.PHANTOM)) { SpawnGroupData groupdataentity = null; @@ -40,13 +40,13 @@ index e8ae4449696d73c8c9b8b27d4d2e20db933a72cc..f55c50f6637a4f930b15565d6ac82bb4 for (int l = 0; l < k; ++l) { // Paper start diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 20573f2979277aa53f5377974ad910ec4428c435..f3502992e3c7eaa955c793acce3b8fc07e7c9a93 100644 +index 1301d9498808d2edf98ca20de6886c8f50fbdb83..cfafb02e2ab909539b026419919382fc9d393e28 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1070,6 +1070,12 @@ public class PurpurWorldConfig { - public double phantomAttackedByCrystalRadius = 0.0D; - public float phantomAttackedByCrystalDamage = 1.0F; - public double phantomOrbitCrystalRadius = 0.0D; +@@ -820,6 +820,12 @@ public class PurpurWorldConfig { + public String phantomAttackDamage = "6 + size"; + public Map phantomMaxHealthCache = new HashMap<>(); + public Map phantomAttackDamageCache = new HashMap<>(); + public int phantomSpawnMinSkyDarkness = 5; + public boolean phantomSpawnOnlyAboveSeaLevel = true; + public boolean phantomSpawnOnlyWithVisibleSky = true; @@ -54,12 +54,12 @@ index 20573f2979277aa53f5377974ad910ec4428c435..f3502992e3c7eaa955c793acce3b8fc0 + public int phantomSpawnMinPerAttempt = 1; + public int phantomSpawnMaxPerAttempt = -1; private void phantomSettings() { - phantomRidable = getBoolean("mobs.phantom.ridable", phantomRidable); - phantomRidableInWater = getBoolean("mobs.phantom.ridable-in-water", phantomRidableInWater); -@@ -1094,6 +1100,12 @@ public class PurpurWorldConfig { - phantomAttackedByCrystalRadius = getDouble("mobs.phantom.attacked-by-crystal-range", phantomAttackedByCrystalRadius); - phantomAttackedByCrystalDamage = (float) getDouble("mobs.phantom.attacked-by-crystal-damage", phantomAttackedByCrystalDamage); - phantomOrbitCrystalRadius = getDouble("mobs.phantom.orbit-crystal-radius", phantomOrbitCrystalRadius); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.phantom.attributes.max-health", Double.parseDouble(phantomMaxHealth)); +@@ -834,6 +840,12 @@ public class PurpurWorldConfig { + phantomAttackDamage = getString("mobs.phantom.attributes.attack_damage", phantomAttackDamage); + phantomMaxHealthCache.clear(); + phantomAttackDamageCache.clear(); + phantomSpawnMinSkyDarkness = getInt("mobs.phantom.spawn.min-sky-darkness", phantomSpawnMinSkyDarkness); + phantomSpawnOnlyAboveSeaLevel = getBoolean("mobs.phantom.spawn.only-above-sea-level", phantomSpawnOnlyAboveSeaLevel); + phantomSpawnOnlyWithVisibleSky = getBoolean("mobs.phantom.spawn.only-with-visible-sky", phantomSpawnOnlyWithVisibleSky); @@ -68,4 +68,4 @@ index 20573f2979277aa53f5377974ad910ec4428c435..f3502992e3c7eaa955c793acce3b8fc0 + phantomSpawnMaxPerAttempt = getInt("mobs.phantom.spawn.per-attempt.max", phantomSpawnMaxPerAttempt); } - public boolean pigRidable = false; + public double pigMaxHealth = 10.0D; diff --git a/patches/todo/server/0070-Implement-bed-explosion-options.patch b/patches/server/0065-Implement-bed-explosion-options.patch similarity index 92% rename from patches/todo/server/0070-Implement-bed-explosion-options.patch rename to patches/server/0065-Implement-bed-explosion-options.patch index 3be49dccc..a82cc16d1 100644 --- a/patches/todo/server/0070-Implement-bed-explosion-options.patch +++ b/patches/server/0065-Implement-bed-explosion-options.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Implement bed explosion options diff --git a/src/main/java/net/minecraft/world/level/block/BedBlock.java b/src/main/java/net/minecraft/world/level/block/BedBlock.java -index d1d5363ab1742add8ff45507a303106f4d65f52f..ea448ef3e072f4144e6f506f1f38399ecd571d76 100644 +index d40500f9a807cab0b2fb6fa9032f33f4fb74c895..e8405a57fb88e63b63baaf00645c417633bdc0f2 100644 --- a/src/main/java/net/minecraft/world/level/block/BedBlock.java +++ b/src/main/java/net/minecraft/world/level/block/BedBlock.java -@@ -97,7 +97,7 @@ public class BedBlock extends HorizontalDirectionalBlock implements EntityBlock +@@ -96,7 +96,7 @@ public class BedBlock extends HorizontalDirectionalBlock implements EntityBlock Vec3 vec3d = pos.getCenter(); @@ -17,7 +17,7 @@ index d1d5363ab1742add8ff45507a303106f4d65f52f..ea448ef3e072f4144e6f506f1f38399e return InteractionResult.SUCCESS; } else if ((Boolean) state.getValue(BedBlock.OCCUPIED)) { if (!BedBlock.canSetSpawn(world)) return this.explodeBed(state, world, pos); // Paper - check explode first -@@ -150,7 +150,7 @@ public class BedBlock extends HorizontalDirectionalBlock implements EntityBlock +@@ -149,7 +149,7 @@ public class BedBlock extends HorizontalDirectionalBlock implements EntityBlock Vec3 vec3d = blockposition.getCenter(); @@ -27,7 +27,7 @@ index d1d5363ab1742add8ff45507a303106f4d65f52f..ea448ef3e072f4144e6f506f1f38399e } } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index f3502992e3c7eaa955c793acce3b8fc07e7c9a93..b647527fe6214ca803fad96a8d739811dd2a3a06 100644 +index cfafb02e2ab909539b026419919382fc9d393e28..903c17260729b61ec0e4ad5d2fbe6aea7a18a64a 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -290,6 +290,27 @@ public class PurpurWorldConfig { diff --git a/patches/todo/server/0071-Implement-respawn-anchor-explosion-options.patch b/patches/server/0066-Implement-respawn-anchor-explosion-options.patch similarity index 92% rename from patches/todo/server/0071-Implement-respawn-anchor-explosion-options.patch rename to patches/server/0066-Implement-respawn-anchor-explosion-options.patch index 41476f2a1..77130b372 100644 --- a/patches/todo/server/0071-Implement-respawn-anchor-explosion-options.patch +++ b/patches/server/0066-Implement-respawn-anchor-explosion-options.patch @@ -18,7 +18,7 @@ index 2ed78cf83c0ae66a6ddba1ff307da89a24b0d0a8..ae17d6a54fad0bd2d71d306f418b5ced public static boolean canSetSpawn(Level world) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index b647527fe6214ca803fad96a8d739811dd2a3a06..482c145bb6d24de52c31bfa44d95f36428cabb7d 100644 +index 903c17260729b61ec0e4ad5d2fbe6aea7a18a64a..575c3375805a0f4995a097d1d316e9480f77110d 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -330,6 +330,27 @@ public class PurpurWorldConfig { @@ -46,6 +46,6 @@ index b647527fe6214ca803fad96a8d739811dd2a3a06..482c145bb6d24de52c31bfa44d95f364 + } + } + - public boolean signRightClickEdit = false; - private void signSettings() { - signRightClickEdit = getBoolean("blocks.sign.right-click-edit", signRightClickEdit); + public boolean turtleEggsBreakFromExpOrbs = true; + public boolean turtleEggsBreakFromItems = true; + public boolean turtleEggsBreakFromMinecarts = true; diff --git a/patches/todo/server/0072-Add-allow-water-in-end-world-option.patch b/patches/server/0067-Add-allow-water-in-end-world-option.patch similarity index 84% rename from patches/todo/server/0072-Add-allow-water-in-end-world-option.patch rename to patches/server/0067-Add-allow-water-in-end-world-option.patch index c7ca34259..3f15651ef 100644 --- a/patches/todo/server/0072-Add-allow-water-in-end-world-option.patch +++ b/patches/server/0067-Add-allow-water-in-end-world-option.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add allow water in end world option diff --git a/src/main/java/net/minecraft/world/item/BucketItem.java b/src/main/java/net/minecraft/world/item/BucketItem.java -index 5c6aa9c464784ad5ee366412d080c72d3d22a76f..c03abc9589bf5f37abc1b0d355ed9784bac31a93 100644 +index 578c3db52dda4c169b5ea615a4ce4a79f15a4cad..0bd98b802f246a3f6061f716d470a4797b28d59d 100644 --- a/src/main/java/net/minecraft/world/item/BucketItem.java +++ b/src/main/java/net/minecraft/world/item/BucketItem.java -@@ -166,7 +166,7 @@ public class BucketItem extends Item implements DispensibleContainerItem { +@@ -164,7 +164,7 @@ public class BucketItem extends Item implements DispensibleContainerItem { // CraftBukkit end if (!flag1) { return movingobjectpositionblock != null && this.emptyContents(entityhuman, world, movingobjectpositionblock.getBlockPos().relative(movingobjectpositionblock.getDirection()), (BlockHitResult) null, enumdirection, clicked, itemstack, enumhand); // CraftBukkit @@ -17,7 +17,7 @@ index 5c6aa9c464784ad5ee366412d080c72d3d22a76f..c03abc9589bf5f37abc1b0d355ed9784 int i = blockposition.getX(); int j = blockposition.getY(); int k = blockposition.getZ(); -@@ -174,7 +174,7 @@ public class BucketItem extends Item implements DispensibleContainerItem { +@@ -172,7 +172,7 @@ public class BucketItem extends Item implements DispensibleContainerItem { world.playSound(entityhuman, blockposition, SoundEvents.FIRE_EXTINGUISH, SoundSource.BLOCKS, 0.5F, 2.6F + (world.random.nextFloat() - world.random.nextFloat()) * 0.8F); for (int l = 0; l < 8; ++l) { @@ -27,10 +27,10 @@ index 5c6aa9c464784ad5ee366412d080c72d3d22a76f..c03abc9589bf5f37abc1b0d355ed9784 return true; diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index c38aff50c6f0bc37e539bb4d5206f7b6065fa680..d0e0ce953dd0cdd6b54bb00224e82dca62f793cd 100644 +index 9669206231d90d371b6d55e8e6360eb9dd89c485..8673d325bd866704ae90ac31eb54f78097eac952 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java -@@ -1650,4 +1650,14 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -1468,4 +1468,14 @@ public abstract class Level implements LevelAccessor, AutoCloseable { return null; } // Paper end @@ -46,10 +46,10 @@ index c38aff50c6f0bc37e539bb4d5206f7b6065fa680..d0e0ce953dd0cdd6b54bb00224e82dca + // Purpur end } diff --git a/src/main/java/net/minecraft/world/level/block/IceBlock.java b/src/main/java/net/minecraft/world/level/block/IceBlock.java -index 5ecf02ce83b7496c977adfeb203b8eadb05f9da5..bf7f1ac5c691c0c4c30c124970f4b08a8108ad34 100644 +index 5fbdc96f29e29dfc092b9e84a988032db0fa36ab..1352168db8f3062943cc05396cbd9b535508c461 100644 --- a/src/main/java/net/minecraft/world/level/block/IceBlock.java +++ b/src/main/java/net/minecraft/world/level/block/IceBlock.java -@@ -31,7 +31,7 @@ public class IceBlock extends HalfTransparentBlock { +@@ -33,7 +33,7 @@ public class IceBlock extends HalfTransparentBlock { public void afterDestroy(Level world, BlockPos pos, ItemStack tool) { // Paper end if (EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) == 0) { @@ -58,7 +58,7 @@ index 5ecf02ce83b7496c977adfeb203b8eadb05f9da5..bf7f1ac5c691c0c4c30c124970f4b08a world.removeBlock(pos, false); return; } -@@ -59,7 +59,7 @@ public class IceBlock extends HalfTransparentBlock { +@@ -61,7 +61,7 @@ public class IceBlock extends HalfTransparentBlock { return; } // CraftBukkit end @@ -66,12 +66,12 @@ index 5ecf02ce83b7496c977adfeb203b8eadb05f9da5..bf7f1ac5c691c0c4c30c124970f4b08a + if (world.isNether() || (world.isTheEnd() && !org.purpurmc.purpur.PurpurConfig.allowWaterPlacementInTheEnd)) { // Purpur world.removeBlock(pos, false); } else { - world.setBlockAndUpdate(pos, Blocks.WATER.defaultBlockState()); + world.setBlockAndUpdate(pos, IceBlock.meltsInto()); diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -index 8e99128759e555cdef0efe9cea1b3b36f2c3fda9..8575753af39d19e485f915e3e12e377c325b4751 100644 +index 106b2abc4f7070ec4d1c6790f78c05392df43eff..8a1fb43120da98c0c48d557125e59e43335bdb9e 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -@@ -244,6 +244,11 @@ public class PurpurConfig { +@@ -242,6 +242,11 @@ public class PurpurConfig { enderChestPermissionRows = getBoolean("settings.blocks.ender_chest.use-permissions-for-rows", enderChestPermissionRows); } diff --git a/patches/todo/server/0073-Allow-color-codes-in-books.patch b/patches/server/0068-Allow-color-codes-in-books.patch similarity index 91% rename from patches/todo/server/0073-Allow-color-codes-in-books.patch rename to patches/server/0068-Allow-color-codes-in-books.patch index f0fb0a953..5b0d6995a 100644 --- a/patches/todo/server/0073-Allow-color-codes-in-books.patch +++ b/patches/server/0068-Allow-color-codes-in-books.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Allow color codes in books diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index f7b3110cf30124fc4054bfcda6d5ad28a5c0a48c..556a9fcf0efd08cfc2b60acf79e74bfdb254903d 100644 +index 7d61ad24a1e8654ee0a0988b59c3f4b4598b306d..3e50675e6d531d4a80dc511e63afe2e04fe3065a 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -1342,13 +1342,16 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -1344,13 +1344,16 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic itemstack1.setTag(nbttagcompound.copy()); } @@ -28,7 +28,7 @@ index f7b3110cf30124fc4054bfcda6d5ad28a5c0a48c..556a9fcf0efd08cfc2b60acf79e74bfd this.updateBookPages(pages, (s) -> { return Component.Serializer.toJson(Component.literal(s)); -@@ -1360,10 +1363,13 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -1362,10 +1365,13 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic private void updateBookPages(List list, UnaryOperator unaryoperator, ItemStack itemstack, int slot, ItemStack handItem) { // CraftBukkit ListTag nbttaglist = new ListTag(); @@ -44,7 +44,7 @@ index f7b3110cf30124fc4054bfcda6d5ad28a5c0a48c..556a9fcf0efd08cfc2b60acf79e74bfd Objects.requireNonNull(nbttaglist); stream.forEach(nbttaglist::add); -@@ -1373,11 +1379,11 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -1375,11 +1381,11 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic for (int j = list.size(); i < j; ++i) { FilteredText filteredtext = (FilteredText) list.get(i); @@ -58,7 +58,7 @@ index f7b3110cf30124fc4054bfcda6d5ad28a5c0a48c..556a9fcf0efd08cfc2b60acf79e74bfd } } -@@ -1390,6 +1396,16 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -1392,6 +1398,16 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic this.player.getInventory().setItem(slot, CraftEventFactory.handleEditBookEvent(player, slot, handItem, itemstack)); // CraftBukkit // Paper - Don't ignore result (see other callsite for handleEditBookEvent) } @@ -74,4 +74,4 @@ index f7b3110cf30124fc4054bfcda6d5ad28a5c0a48c..556a9fcf0efd08cfc2b60acf79e74bfd + @Override public void handleEntityTagQuery(ServerboundEntityTagQuery packet) { - PacketUtils.ensureRunningOnSameThread(packet, this, this.player.getLevel()); + PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel()); diff --git a/patches/todo/server/0074-Entity-lifespan.patch b/patches/server/0069-Entity-lifespan.patch similarity index 81% rename from patches/todo/server/0074-Entity-lifespan.patch rename to patches/server/0069-Entity-lifespan.patch index dd504a7fc..cd105f843 100644 --- a/patches/todo/server/0074-Entity-lifespan.patch +++ b/patches/server/0069-Entity-lifespan.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Entity lifespan diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 556a9fcf0efd08cfc2b60acf79e74bfdb254903d..d4280dcd4b8a4e09ef1b6c6d89ea5c58468f7229 100644 +index 3e50675e6d531d4a80dc511e63afe2e04fe3065a..5ceb3a454fbd6993fd82cacb83b3ba9844463054 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -2861,6 +2861,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -2856,6 +2856,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic AABB axisalignedbb = entity.getBoundingBox(); if (axisalignedbb.distanceToSqr(this.player.getEyePosition()) < ServerGamePacketListenerImpl.MAX_INTERACTION_DISTANCE) { @@ -17,10 +17,10 @@ index 556a9fcf0efd08cfc2b60acf79e74bfdb254903d..d4280dcd4b8a4e09ef1b6c6d89ea5c58 private void performInteraction(InteractionHand enumhand, ServerGamePacketListenerImpl.EntityInteraction playerconnection_a, PlayerInteractEntityEvent event) { // CraftBukkit ItemStack itemstack = ServerGamePacketListenerImpl.this.player.getItemInHand(enumhand); diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java -index 89981efcb852fed1ca79f8b239aa1f044d713c6d..183261a031a2a0b6b95dbb983236cee3cd3a0398 100644 +index fdd0acaaf69f9325feaf8167e8122191a0c7e9d7..0509b57efe9a42bf44a8ff2c13a042bb2d3accf9 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java -@@ -134,6 +134,7 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -133,6 +133,7 @@ public abstract class Mob extends LivingEntity implements Targeting { private BlockPos restrictCenter; private float restrictRadius; @@ -28,7 +28,7 @@ index 89981efcb852fed1ca79f8b239aa1f044d713c6d..183261a031a2a0b6b95dbb983236cee3 public boolean aware = true; // CraftBukkit protected Mob(EntityType type, Level world) { -@@ -320,6 +321,7 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -321,6 +322,7 @@ public abstract class Mob extends LivingEntity implements Targeting { entityliving = null; } } @@ -36,12 +36,11 @@ index 89981efcb852fed1ca79f8b239aa1f044d713c6d..183261a031a2a0b6b95dbb983236cee3 this.target = entityliving; return true; // CraftBukkit end -@@ -366,9 +368,29 @@ public abstract class Mob extends LivingEntity implements Targeting { - this.playAmbientSound(); +@@ -368,8 +370,28 @@ public abstract class Mob extends LivingEntity implements Targeting { } + this.level().getProfiler().pop(); + incrementTicksSinceLastInteraction(); // Purpur - this.level.getProfiler().pop(); } + // Purpur start @@ -51,13 +50,13 @@ index 89981efcb852fed1ca79f8b239aa1f044d713c6d..183261a031a2a0b6b95dbb983236cee3 + this.ticksSinceLastInteraction = 0; + return; + } -+ if (this.level.purpurConfig.entityLifeSpan <= 0) { ++ if (this.level().purpurConfig.entityLifeSpan <= 0) { + return; // feature disabled + } + if (!this.removeWhenFarAway(0) || isPersistenceRequired() || requiresCustomPersistence() || hasCustomName()) { + return; // mob persistent + } -+ if (this.ticksSinceLastInteraction > this.level.purpurConfig.entityLifeSpan) { ++ if (this.ticksSinceLastInteraction > this.level().purpurConfig.entityLifeSpan) { + this.discard(); + } + } @@ -66,7 +65,7 @@ index 89981efcb852fed1ca79f8b239aa1f044d713c6d..183261a031a2a0b6b95dbb983236cee3 @Override protected void playHurtSound(DamageSource source) { this.resetAmbientSoundTime(); -@@ -558,6 +580,7 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -559,6 +581,7 @@ public abstract class Mob extends LivingEntity implements Targeting { } nbt.putBoolean("Bukkit.Aware", this.aware); // CraftBukkit @@ -74,7 +73,7 @@ index 89981efcb852fed1ca79f8b239aa1f044d713c6d..183261a031a2a0b6b95dbb983236cee3 } @Override -@@ -628,6 +651,11 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -629,6 +652,11 @@ public abstract class Mob extends LivingEntity implements Targeting { this.aware = nbt.getBoolean("Bukkit.Aware"); } // CraftBukkit end @@ -86,7 +85,7 @@ index 89981efcb852fed1ca79f8b239aa1f044d713c6d..183261a031a2a0b6b95dbb983236cee3 } @Override -@@ -1692,6 +1720,7 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -1688,6 +1716,7 @@ public abstract class Mob extends LivingEntity implements Targeting { this.setLastHurtMob(target); } @@ -95,7 +94,7 @@ index 89981efcb852fed1ca79f8b239aa1f044d713c6d..183261a031a2a0b6b95dbb983236cee3 } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 482c145bb6d24de52c31bfa44d95f36428cabb7d..a144a767cc7f7ba6c7e7d342ef9c9e3f84a9f20e 100644 +index 575c3375805a0f4995a097d1d316e9480f77110d..aeb6b723f59a391e9933ae4d1f01b845d2e709e7 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -127,6 +127,11 @@ public class PurpurWorldConfig { diff --git a/patches/todo/server/0075-Add-option-to-teleport-to-spawn-if-outside-world-bor.patch b/patches/server/0070-Add-option-to-teleport-to-spawn-if-outside-world-bor.patch similarity index 79% rename from patches/todo/server/0075-Add-option-to-teleport-to-spawn-if-outside-world-bor.patch rename to patches/server/0070-Add-option-to-teleport-to-spawn-if-outside-world-bor.patch index c6b85c5ac..378d6c555 100644 --- a/patches/todo/server/0075-Add-option-to-teleport-to-spawn-if-outside-world-bor.patch +++ b/patches/server/0070-Add-option-to-teleport-to-spawn-if-outside-world-bor.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add option to teleport to spawn if outside world border diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index c481110ae2d2c792856a4140d63747bb5afc65c6..7ccc2faa622082e2c06ce3906b22e3079a486711 100644 +index a6117d497bcf36e88d947e0aebb22ea9972b3fbb..5165f6d8189ec8e64cdb0902d61276571198f9a7 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java -@@ -2673,4 +2673,26 @@ public class ServerPlayer extends Player { +@@ -2749,4 +2749,26 @@ public class ServerPlayer extends Player { return (CraftPlayer) super.getBukkitEntity(); } // CraftBukkit end @@ -36,19 +36,19 @@ index c481110ae2d2c792856a4140d63747bb5afc65c6..7ccc2faa622082e2c06ce3906b22e307 + // Purpur end } diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index a8ace2c448ddae71e8e64f232c75d541aa531f3f..587a88a0c4954cba28fbdb31228ec81f2ba59b82 100644 +index 90ebbd8666a934fc3dce655a44cf4270a02d1bb1..098e5af37585488d667909fef4e06aff5ce578fc 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -410,6 +410,7 @@ public abstract class LivingEntity extends Entity implements Attackable { - double d1 = this.level.getWorldBorder().getDamagePerBlock(); +@@ -428,6 +428,7 @@ public abstract class LivingEntity extends Entity implements Attackable { + double d1 = this.level().getWorldBorder().getDamagePerBlock(); if (d1 > 0.0D) { -+ if (level.purpurConfig.teleportIfOutsideBorder && this instanceof ServerPlayer) { ((ServerPlayer) this).teleport(io.papermc.paper.util.MCUtil.toLocation(level, ((ServerLevel) level).getSharedSpawnPos())); return; } // Purpur - this.hurt(this.damageSources().inWall(), (float) Math.max(1, Mth.floor(-d0 * d1))); ++ if (level().purpurConfig.teleportIfOutsideBorder && this instanceof ServerPlayer serverPlayer) { serverPlayer.teleport(io.papermc.paper.util.MCUtil.toLocation(level(), ((ServerLevel) level()).getSharedSpawnPos())); return; } // Purpur + this.hurt(this.damageSources().outOfBorder(), (float) Math.max(1, Mth.floor(-d0 * d1))); } } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index a144a767cc7f7ba6c7e7d342ef9c9e3f84a9f20e..8a0d0406440a43683641dcd6e43f75da5db9c734 100644 +index aeb6b723f59a391e9933ae4d1f01b845d2e709e7..84185a51eb9a9f6deef193a37d2fcb3dde120093 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -246,6 +246,7 @@ public class PurpurWorldConfig { diff --git a/patches/todo/server/0076-Squid-EAR-immunity.patch b/patches/server/0071-Squid-EAR-immunity.patch similarity index 74% rename from patches/todo/server/0076-Squid-EAR-immunity.patch rename to patches/server/0071-Squid-EAR-immunity.patch index 4ce19dc0f..247b2a8b5 100644 --- a/patches/todo/server/0076-Squid-EAR-immunity.patch +++ b/patches/server/0071-Squid-EAR-immunity.patch @@ -5,27 +5,27 @@ Subject: [PATCH] Squid EAR immunity diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 8a0d0406440a43683641dcd6e43f75da5db9c734..b7e811c786db1a4749acdc9309f841e6f1d615e5 100644 +index 84185a51eb9a9f6deef193a37d2fcb3dde120093..d536cb1acaae014292577df098821bce2a3142b3 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1455,6 +1455,7 @@ public class PurpurWorldConfig { - public boolean squidRidable = false; - public boolean squidControllable = true; +@@ -1097,6 +1097,7 @@ public class PurpurWorldConfig { + } + public double squidMaxHealth = 10.0D; + public boolean squidImmuneToEAR = true; private void squidSettings() { - squidRidable = getBoolean("mobs.squid.ridable", squidRidable); - squidControllable = getBoolean("mobs.squid.controllable", squidControllable); -@@ -1464,6 +1465,7 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.squid.attributes.max-health", squidMaxHealth); +@@ -1104,6 +1105,7 @@ public class PurpurWorldConfig { set("mobs.squid.attributes.max_health", oldValue); } squidMaxHealth = getDouble("mobs.squid.attributes.max_health", squidMaxHealth); + squidImmuneToEAR = getBoolean("mobs.squid.immune-to-EAR", squidImmuneToEAR); } - public boolean spiderRidable = false; + public double spiderMaxHealth = 16.0D; diff --git a/src/main/java/org/spigotmc/ActivationRange.java b/src/main/java/org/spigotmc/ActivationRange.java -index 1f37695950e69fc9784a415a5ab9c6586ed32e61..d9448a222bbe2cbd09debfb93f339b175ed44c92 100644 +index ea978171f89ac467b235f66fd539b957ba73e371..532a57c612891420a9d51b425504e46ca751b760 100644 --- a/src/main/java/org/spigotmc/ActivationRange.java +++ b/src/main/java/org/spigotmc/ActivationRange.java @@ -15,6 +15,7 @@ import net.minecraft.world.entity.ambient.AmbientCreature; @@ -36,7 +36,7 @@ index 1f37695950e69fc9784a415a5ab9c6586ed32e61..d9448a222bbe2cbd09debfb93f339b17 import net.minecraft.world.entity.animal.WaterAnimal; import net.minecraft.world.entity.animal.horse.Llama; import net.minecraft.world.entity.boss.EnderDragonPart; -@@ -397,6 +398,7 @@ public class ActivationRange +@@ -374,6 +375,7 @@ public class ActivationRange */ public static boolean checkIfActive(Entity entity) { diff --git a/patches/todo/server/0077-Phantoms-burn-in-light.patch b/patches/server/0072-Phantoms-burn-in-light.patch similarity index 80% rename from patches/todo/server/0077-Phantoms-burn-in-light.patch rename to patches/server/0072-Phantoms-burn-in-light.patch index 6c76fd230..1dce7f9c4 100644 --- a/patches/todo/server/0077-Phantoms-burn-in-light.patch +++ b/patches/server/0072-Phantoms-burn-in-light.patch @@ -5,23 +5,22 @@ Subject: [PATCH] Phantoms burn in light 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 fd02dfb905c71fa10e0830cf0a02d4b63b81f23f..b601c542e28bc0a588e56aa37c243fe92145547e 100644 +index 07070846057b80eb24e6afa4ddcf39221df0c7b3..ca46d91d75de8aaf39a16141bba593be94cbc45f 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Phantom.java +++ b/src/main/java/net/minecraft/world/entity/monster/Phantom.java -@@ -50,6 +50,7 @@ public class Phantom extends FlyingMob implements Enemy { +@@ -49,6 +49,7 @@ public class Phantom extends FlyingMob implements Enemy { + Vec3 moveTargetPoint; public BlockPos anchorPoint; Phantom.AttackPhase attackPhase; - Vec3 crystalPosition; // Purpur + private static final net.minecraft.world.item.crafting.Ingredient TORCH = net.minecraft.world.item.crafting.Ingredient.of(net.minecraft.world.item.Items.TORCH, net.minecraft.world.item.Items.SOUL_TORCH); // Purpur public Phantom(EntityType type, Level world) { super(type, world); -@@ -247,8 +248,12 @@ public class Phantom extends FlyingMob implements Enemy { +@@ -162,7 +163,12 @@ public class Phantom extends FlyingMob implements Enemy { @Override public void aiStep() { - if (this.isAlive() && shouldBurnInDay && this.isSunBurnTick()) { // Paper - Configurable Burning -- if (getRider() == null || !this.isControllable()) // Purpur + // Purpur start + boolean burnFromDaylight = this.shouldBurnInDay && this.level.purpurConfig.phantomBurnInDaylight; + boolean burnFromLightSource = this.level.purpurConfig.phantomBurnInLight > 0 && this.level.getMaxLocalRawBrightness(blockPosition()) >= this.level.purpurConfig.phantomBurnInLight; @@ -31,7 +30,7 @@ index fd02dfb905c71fa10e0830cf0a02d4b63b81f23f..b601c542e28bc0a588e56aa37c243fe9 this.setSecondsOnFire(8); } -@@ -657,6 +662,12 @@ public class Phantom extends FlyingMob implements Enemy { +@@ -436,6 +442,12 @@ public class Phantom extends FlyingMob implements Enemy { return false; } else if (!entityliving.isAlive()) { return false; @@ -44,19 +43,19 @@ index fd02dfb905c71fa10e0830cf0a02d4b63b81f23f..b601c542e28bc0a588e56aa37c243fe9 } else { if (entityliving instanceof Player) { Player entityhuman = (Player) entityliving; -@@ -802,6 +813,7 @@ public class Phantom extends FlyingMob implements Enemy { +@@ -581,6 +593,7 @@ public class Phantom extends FlyingMob implements Enemy { this.nextScanTick = reducedTickDelay(60); - List list = Phantom.this.level.getNearbyPlayers(this.attackTargeting, Phantom.this, Phantom.this.getBoundingBox().inflate(16.0D, 64.0D, 16.0D)); + List list = Phantom.this.level().getNearbyPlayers(this.attackTargeting, Phantom.this, Phantom.this.getBoundingBox().inflate(16.0D, 64.0D, 16.0D)); + if (level.purpurConfig.phantomIgnorePlayersWithTorch) list.removeIf(human -> TORCH.test(human.getItemInHand(net.minecraft.world.InteractionHand.MAIN_HAND)) || TORCH.test(human.getItemInHand(net.minecraft.world.InteractionHand.OFF_HAND)));// Purpur if (!list.isEmpty()) { list.sort(Comparator.comparing((Entity e) -> { return e.getY(); }).reversed()); // CraftBukkit - decompile error Iterator iterator = list.iterator(); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index b7e811c786db1a4749acdc9309f841e6f1d615e5..a33efd04ed2f0dc61d889062221e8138fa9ae0b1 100644 +index d536cb1acaae014292577df098821bce2a3142b3..25fd73c046f62848cbe016f5f9dfce2d2b2a03c6 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1125,6 +1125,9 @@ public class PurpurWorldConfig { +@@ -875,6 +875,9 @@ public class PurpurWorldConfig { public double phantomSpawnLocalDifficultyChance = 3.0D; public int phantomSpawnMinPerAttempt = 1; public int phantomSpawnMaxPerAttempt = -1; @@ -64,9 +63,9 @@ index b7e811c786db1a4749acdc9309f841e6f1d615e5..a33efd04ed2f0dc61d889062221e8138 + public boolean phantomIgnorePlayersWithTorch = false; + public boolean phantomBurnInDaylight = true; private void phantomSettings() { - phantomRidable = getBoolean("mobs.phantom.ridable", phantomRidable); - phantomRidableInWater = getBoolean("mobs.phantom.ridable-in-water", phantomRidableInWater); -@@ -1155,6 +1158,9 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.phantom.attributes.max-health", Double.parseDouble(phantomMaxHealth)); +@@ -895,6 +898,9 @@ public class PurpurWorldConfig { phantomSpawnLocalDifficultyChance = getDouble("mobs.phantom.spawn.local-difficulty-chance", phantomSpawnLocalDifficultyChance); phantomSpawnMinPerAttempt = getInt("mobs.phantom.spawn.per-attempt.min", phantomSpawnMinPerAttempt); phantomSpawnMaxPerAttempt = getInt("mobs.phantom.spawn.per-attempt.max", phantomSpawnMaxPerAttempt); @@ -75,4 +74,4 @@ index b7e811c786db1a4749acdc9309f841e6f1d615e5..a33efd04ed2f0dc61d889062221e8138 + phantomIgnorePlayersWithTorch = getBoolean("mobs.phantom.ignore-players-with-torch", phantomIgnorePlayersWithTorch); } - public boolean pigRidable = false; + public double pigMaxHealth = 10.0D; diff --git a/patches/todo/server/0078-Configurable-villager-breeding.patch b/patches/server/0073-Configurable-villager-breeding.patch similarity index 74% rename from patches/todo/server/0078-Configurable-villager-breeding.patch rename to patches/server/0073-Configurable-villager-breeding.patch index 7db507aec..d172a7f2d 100644 --- a/patches/todo/server/0078-Configurable-villager-breeding.patch +++ b/patches/server/0073-Configurable-villager-breeding.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Configurable villager breeding diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java -index 979bbbf4229a9355b31913454cb565fc98049911..aa95cd7e04e25dec63c172d219f1f16cd6c9c4b5 100644 +index d2fcf2121ff9765fed268b2984a865329d27a17a..8144e3c60bc586bd48677a1d1af3b20f1a1fa337 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java -@@ -780,7 +780,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -755,7 +755,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler @Override public boolean canBreed() { @@ -18,22 +18,22 @@ index 979bbbf4229a9355b31913454cb565fc98049911..aa95cd7e04e25dec63c172d219f1f16c private boolean hungry() { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index a33efd04ed2f0dc61d889062221e8138fa9ae0b1..c50c47c88bdf1bf1c613172970e346f81e18d142 100644 +index 25fd73c046f62848cbe016f5f9dfce2d2b2a03c6..6c9a5b5696b042d5e9358fc5261b8965bdfaf01f 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1613,6 +1613,7 @@ public class PurpurWorldConfig { +@@ -1201,6 +1201,7 @@ public class PurpurWorldConfig { public double villagerMaxHealth = 20.0D; public boolean villagerFollowEmeraldBlock = false; public boolean villagerCanBeLeashed = false; + public boolean villagerCanBreed = true; private void villagerSettings() { - villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); - villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); -@@ -1625,6 +1626,7 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.villager.attributes.max-health", villagerMaxHealth); +@@ -1210,6 +1211,7 @@ public class PurpurWorldConfig { villagerMaxHealth = getDouble("mobs.villager.attributes.max_health", villagerMaxHealth); villagerFollowEmeraldBlock = getBoolean("mobs.villager.follow-emerald-blocks", villagerFollowEmeraldBlock); villagerCanBeLeashed = getBoolean("mobs.villager.can-be-leashed", villagerCanBeLeashed); + villagerCanBreed = getBoolean("mobs.villager.can-breed", villagerCanBreed); } - public boolean vindicatorRidable = false; + public double vindicatorMaxHealth = 24.0D; diff --git a/patches/todo/server/0079-Redstone-deactivates-spawners.patch b/patches/server/0074-Redstone-deactivates-spawners.patch similarity index 82% rename from patches/todo/server/0079-Redstone-deactivates-spawners.patch rename to patches/server/0074-Redstone-deactivates-spawners.patch index 3d727302e..84bf91722 100644 --- a/patches/todo/server/0079-Redstone-deactivates-spawners.patch +++ b/patches/server/0074-Redstone-deactivates-spawners.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Redstone deactivates spawners diff --git a/src/main/java/net/minecraft/world/level/BaseSpawner.java b/src/main/java/net/minecraft/world/level/BaseSpawner.java -index 31ac0e5ca26c7bdfa9b710d0bb78d846ddf6863e..feb65fc9ee04141fe6f77400660442ed207547a1 100644 +index 8fdbc603486ff8a902b6327bc2acfb86a806626e..cb9acec46677048bd8ffbb0e3f2f0378350bf8b7 100644 --- a/src/main/java/net/minecraft/world/level/BaseSpawner.java +++ b/src/main/java/net/minecraft/world/level/BaseSpawner.java @@ -55,6 +55,7 @@ public abstract class BaseSpawner { @@ -17,11 +17,11 @@ index 31ac0e5ca26c7bdfa9b710d0bb78d846ddf6863e..feb65fc9ee04141fe6f77400660442ed } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index c50c47c88bdf1bf1c613172970e346f81e18d142..4e2f77ca0587ea3328e958c5a0583d4abec6221c 100644 +index 6c9a5b5696b042d5e9358fc5261b8965bdfaf01f..2de35edebea612a2a0152fa7b9a504be27412d23 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -363,6 +363,11 @@ public class PurpurWorldConfig { - signRightClickEdit = getBoolean("blocks.sign.right-click-edit", signRightClickEdit); +@@ -358,6 +358,11 @@ public class PurpurWorldConfig { + } } + public boolean spawnerDeactivateByRedstone = false; diff --git a/patches/todo/server/0080-Totems-work-in-inventory.patch b/patches/server/0075-Totems-work-in-inventory.patch similarity index 91% rename from patches/todo/server/0080-Totems-work-in-inventory.patch rename to patches/server/0075-Totems-work-in-inventory.patch index e8503ac1e..a9e3f927e 100644 --- a/patches/todo/server/0080-Totems-work-in-inventory.patch +++ b/patches/server/0075-Totems-work-in-inventory.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Totems work in inventory diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 587a88a0c4954cba28fbdb31228ec81f2ba59b82..f7e95a73f60d06a102f79677bb0e31bf9532894d 100644 +index 098e5af37585488d667909fef4e06aff5ce578fc..f8ed307bcc19eb5e0f3b9709fda623b1b2af9ae9 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -1551,6 +1551,18 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -1591,6 +1591,18 @@ public abstract class LivingEntity extends Entity implements Attackable { } } @@ -28,7 +28,7 @@ index 587a88a0c4954cba28fbdb31228ec81f2ba59b82..f7e95a73f60d06a102f79677bb0e31bf EntityResurrectEvent event = new EntityResurrectEvent((org.bukkit.entity.LivingEntity) this.getBukkitEntity(), handSlot); event.setCancelled(itemstack == null); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 4e2f77ca0587ea3328e958c5a0583d4abec6221c..af181872d94ae506bb17589bc7b6d6f511dcefe2 100644 +index 2de35edebea612a2a0152fa7b9a504be27412d23..8467324a614a9181345fea7f125da6bb5ee61380 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -247,6 +247,7 @@ public class PurpurWorldConfig { diff --git a/patches/todo/server/0081-Add-vindicator-johnny-spawn-chance.patch b/patches/server/0076-Add-vindicator-johnny-spawn-chance.patch similarity index 71% rename from patches/todo/server/0081-Add-vindicator-johnny-spawn-chance.patch rename to patches/server/0076-Add-vindicator-johnny-spawn-chance.patch index fa0702f6b..8a8bb6394 100644 --- a/patches/todo/server/0081-Add-vindicator-johnny-spawn-chance.patch +++ b/patches/server/0076-Add-vindicator-johnny-spawn-chance.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add vindicator johnny spawn chance 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 0a4f7125c38d3138ec8eedec4ca72000f25ba6ac..29039b35c60c7c6370c6593a53b8aa2a3db0a368 100644 +index 3bf6463d356f3ba64c2d5279cbf79c289fc09a8f..886d42e847b400f166ccbdf7a0f61744080a8b54 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Vindicator.java +++ b/src/main/java/net/minecraft/world/entity/monster/Vindicator.java -@@ -154,6 +154,12 @@ public class Vindicator extends AbstractIllager { +@@ -135,6 +135,12 @@ public class Vindicator extends AbstractIllager { RandomSource randomSource = world.getRandom(); this.populateDefaultEquipmentSlots(randomSource, difficulty); this.populateDefaultEquipmentEnchantments(randomSource, difficulty); @@ -22,22 +22,22 @@ index 0a4f7125c38d3138ec8eedec4ca72000f25ba6ac..29039b35c60c7c6370c6593a53b8aa2a } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index af181872d94ae506bb17589bc7b6d6f511dcefe2..fc5c24f00639dd5d9bfd05c5ba768b4129598944 100644 +index 8467324a614a9181345fea7f125da6bb5ee61380..854cbab07bed9848ef3975d53e7c3632480b2c99 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1640,6 +1640,7 @@ public class PurpurWorldConfig { - public boolean vindicatorRidableInWater = true; - public boolean vindicatorControllable = true; +@@ -1222,6 +1222,7 @@ public class PurpurWorldConfig { + } + public double vindicatorMaxHealth = 24.0D; + public double vindicatorJohnnySpawnChance = 0D; private void vindicatorSettings() { - vindicatorRidable = getBoolean("mobs.vindicator.ridable", vindicatorRidable); - vindicatorRidableInWater = getBoolean("mobs.vindicator.ridable-in-water", vindicatorRidableInWater); -@@ -1650,6 +1651,7 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.vindicator.attributes.max-health", vindicatorMaxHealth); +@@ -1229,6 +1230,7 @@ public class PurpurWorldConfig { set("mobs.vindicator.attributes.max_health", oldValue); } vindicatorMaxHealth = getDouble("mobs.vindicator.attributes.max_health", vindicatorMaxHealth); + vindicatorJohnnySpawnChance = getDouble("mobs.vindicator.johnny.spawn-chance", vindicatorJohnnySpawnChance); } - public boolean wanderingTraderRidable = false; + public double wanderingTraderMaxHealth = 20.0D; diff --git a/patches/todo/server/0082-Add-option-to-disable-certain-block-updates.patch b/patches/server/0077-Add-option-to-disable-certain-block-updates.patch similarity index 95% rename from patches/todo/server/0082-Add-option-to-disable-certain-block-updates.patch rename to patches/server/0077-Add-option-to-disable-certain-block-updates.patch index a658f831e..b77822c26 100644 --- a/patches/todo/server/0082-Add-option-to-disable-certain-block-updates.patch +++ b/patches/server/0077-Add-option-to-disable-certain-block-updates.patch @@ -99,10 +99,10 @@ index 3c6d97b51c6fec130b80e5965afa2c49d48843c9..b456cb8efd8f0be8a6860c82462ce9bd @Override diff --git a/src/main/java/net/minecraft/world/level/block/NoteBlock.java b/src/main/java/net/minecraft/world/level/block/NoteBlock.java -index a9c2d254bda5686a35ad2393534b85030dd8b136..58deb2a688833151fa96941e81ae81046cf3c18a 100644 +index 910864cfeac085648e6c671b0f9480417324d36e..6bc29eeb5771a3dc9aa23c7d184c895717797b36 100644 --- a/src/main/java/net/minecraft/world/level/block/NoteBlock.java +++ b/src/main/java/net/minecraft/world/level/block/NoteBlock.java -@@ -62,11 +62,13 @@ public class NoteBlock extends Block { +@@ -58,11 +58,13 @@ public class NoteBlock extends Block { @Override public BlockState getStateForPlacement(BlockPlaceContext ctx) { @@ -113,10 +113,10 @@ index a9c2d254bda5686a35ad2393534b85030dd8b136..58deb2a688833151fa96941e81ae8104 @Override public BlockState updateShape(BlockState state, Direction direction, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { + if (org.purpurmc.purpur.PurpurConfig.disableNoteBlockUpdates) return state; // Purpur - boolean flag = NoteBlock.isFeatureFlagEnabled(world) ? direction.getAxis() == Direction.Axis.Y : direction == Direction.DOWN; + boolean flag = direction.getAxis() == Direction.Axis.Y; return flag ? this.setInstrument(world, pos, state) : super.updateShape(state, direction, neighborState, world, pos, neighborPos); -@@ -82,6 +84,7 @@ public class NoteBlock extends Block { +@@ -78,6 +80,7 @@ public class NoteBlock extends Block { state = world.getBlockState(pos); // CraftBukkit - SPIGOT-5617: update in case changed in event } @@ -125,10 +125,10 @@ index a9c2d254bda5686a35ad2393534b85030dd8b136..58deb2a688833151fa96941e81ae8104 } diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -index 8575753af39d19e485f915e3e12e377c325b4751..e829e215d1fe80cdaf9162268011912081f4c5ee 100644 +index 8a1fb43120da98c0c48d557125e59e43335bdb9e..118eae57b4a63bb50ffb34c632122234ce0d2d43 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -@@ -249,6 +249,15 @@ public class PurpurConfig { +@@ -247,6 +247,15 @@ public class PurpurConfig { allowWaterPlacementInTheEnd = getBoolean("settings.allow-water-placement-in-the-end", allowWaterPlacementInTheEnd); } diff --git a/patches/todo/server/0083-Dispensers-place-anvils-option.patch b/patches/server/0078-Dispensers-place-anvils-option.patch similarity index 91% rename from patches/todo/server/0083-Dispensers-place-anvils-option.patch rename to patches/server/0078-Dispensers-place-anvils-option.patch index f538a15ca..91c7fb21f 100644 --- a/patches/todo/server/0083-Dispensers-place-anvils-option.patch +++ b/patches/server/0078-Dispensers-place-anvils-option.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Dispensers place anvils option diff --git a/src/main/java/net/minecraft/core/dispenser/DispenseItemBehavior.java b/src/main/java/net/minecraft/core/dispenser/DispenseItemBehavior.java -index 88d18d18d69876c98e199acb647c6cca9448d55d..da9cc93f560269a00f0093ad76aba3a05eedb046 100644 +index b4f5dbe9022dd20437c15c4f6fbe2ac06dacbadb..b52a9f05ada86f2d3767dd0d5ba8705e22f105d6 100644 --- a/src/main/java/net/minecraft/core/dispenser/DispenseItemBehavior.java +++ b/src/main/java/net/minecraft/core/dispenser/DispenseItemBehavior.java @@ -52,6 +52,7 @@ import net.minecraft.world.item.SpawnEggItem; @@ -16,7 +16,7 @@ index 88d18d18d69876c98e199acb647c6cca9448d55d..da9cc93f560269a00f0093ad76aba3a0 import net.minecraft.world.level.block.BaseFireBlock; import net.minecraft.world.level.block.BeehiveBlock; import net.minecraft.world.level.block.Block; -@@ -1168,6 +1169,23 @@ public interface DispenseItemBehavior { +@@ -1166,6 +1167,23 @@ public interface DispenseItemBehavior { } } }); @@ -41,7 +41,7 @@ index 88d18d18d69876c98e199acb647c6cca9448d55d..da9cc93f560269a00f0093ad76aba3a0 static void setEntityPokingOutOfBlock(BlockSource pointer, Entity entity, Direction direction) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index fc5c24f00639dd5d9bfd05c5ba768b4129598944..9f40c3ec5c3d87f8090c25317148231a22064795 100644 +index 854cbab07bed9848ef3975d53e7c3632480b2c99..63245a2ea4b5b4a8a0f42be0e15dbf1fdba18a7d 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -321,8 +321,10 @@ public class PurpurWorldConfig { diff --git a/patches/todo/server/0084-Allow-anvil-colors.patch b/patches/server/0079-Allow-anvil-colors.patch similarity index 87% rename from patches/todo/server/0084-Allow-anvil-colors.patch rename to patches/server/0079-Allow-anvil-colors.patch index 10d36653c..821861605 100644 --- a/patches/todo/server/0084-Allow-anvil-colors.patch +++ b/patches/server/0079-Allow-anvil-colors.patch @@ -5,11 +5,11 @@ Subject: [PATCH] Allow anvil colors diff --git a/src/main/java/net/minecraft/world/inventory/AnvilMenu.java b/src/main/java/net/minecraft/world/inventory/AnvilMenu.java -index 8475a8514b39d543cc7cf0dbfef6d2aabb6127d0..2281dba58d32b6314a7abcdb103c03c7056c24e9 100644 +index b500a04b8135604f0159a741b3d228c9e87b2a46..6fc5699ad90127dc48fa9ff5cb6ba5367031ce83 100644 --- a/src/main/java/net/minecraft/world/inventory/AnvilMenu.java +++ b/src/main/java/net/minecraft/world/inventory/AnvilMenu.java -@@ -296,6 +296,54 @@ public class AnvilMenu extends ItemCombinerMenu { - } else if (!this.itemName.equals(itemstack.getHoverName().getString())) { +@@ -299,6 +299,54 @@ public class AnvilMenu extends ItemCombinerMenu { + } else if (itemstack.hasCustomHoverName()) { b1 = 1; i += b1; + // Purpur start @@ -29,7 +29,7 @@ index 8475a8514b39d543cc7cf0dbfef6d2aabb6127d0..2281dba58d32b6314a7abcdb103c03c7 + removeItalics = true; + } + } -+ if (this.player.level.purpurConfig.anvilAllowColors) { ++ if (this.player.level().purpurConfig.anvilAllowColors) { + if (player.hasPermission("purpur.anvil.color")) { + java.util.regex.Matcher matcher = java.util.regex.Pattern.compile("(?i)&([0-9a-fr])").matcher(name); + while (matcher.find()) { @@ -48,7 +48,7 @@ index 8475a8514b39d543cc7cf0dbfef6d2aabb6127d0..2281dba58d32b6314a7abcdb103c03c7 + } + } + net.kyori.adventure.text.Component component; -+ if (this.player.level.purpurConfig.anvilColorsUseMiniMessage && player.hasPermission("purpur.anvil.minimessage")) { ++ if (this.player.level().purpurConfig.anvilColorsUseMiniMessage && player.hasPermission("purpur.anvil.minimessage")) { + component = net.kyori.adventure.text.minimessage.MiniMessage.miniMessage().deserialize(org.bukkit.ChatColor.stripColor(name)); + } else { + component = net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(name); @@ -60,11 +60,11 @@ index 8475a8514b39d543cc7cf0dbfef6d2aabb6127d0..2281dba58d32b6314a7abcdb103c03c7 + } + else + // Purpur end - itemstack1.setHoverName(Component.literal(this.itemName)); + itemstack1.resetHoverName(); } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 9f40c3ec5c3d87f8090c25317148231a22064795..c5c975f4ebc04f12e40f2e1c9a8ca5aa37ec141a 100644 +index 63245a2ea4b5b4a8a0f42be0e15dbf1fdba18a7d..cc7809cbff311ccf28b85139d21d3ba9b7c5660d 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -299,6 +299,13 @@ public class PurpurWorldConfig { diff --git a/patches/todo/server/0085-Add-option-to-disable-dolphin-treasure-searching.patch b/patches/server/0080-Add-option-to-disable-dolphin-treasure-searching.patch similarity index 59% rename from patches/todo/server/0085-Add-option-to-disable-dolphin-treasure-searching.patch rename to patches/server/0080-Add-option-to-disable-dolphin-treasure-searching.patch index 877b6fcc2..8065f5b0b 100644 --- a/patches/todo/server/0085-Add-option-to-disable-dolphin-treasure-searching.patch +++ b/patches/server/0080-Add-option-to-disable-dolphin-treasure-searching.patch @@ -5,34 +5,34 @@ Subject: [PATCH] Add option to disable dolphin treasure searching 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 0accc5595461ce92259e3f819a9837aabd442d77..3b65375703732966d0fcbbb68ba0805edd26bfd8 100644 +index 376fe57c3518d42c887726338b15f59d072d8d87..1c8e81fd2561535a04d55238ad086a6cc6851d5d 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Dolphin.java +++ b/src/main/java/net/minecraft/world/entity/animal/Dolphin.java -@@ -481,6 +481,7 @@ public class Dolphin extends WaterAnimal { +@@ -406,6 +406,7 @@ public class Dolphin extends WaterAnimal { @Override public boolean canUse() { -+ if (this.dolphin.level.purpurConfig.dolphinDisableTreasureSearching) return false; // Purpur - return this.dolphin.gotFish() && this.dolphin.getAirSupply() >= 100 && this.dolphin.level.getWorld().canGenerateStructures(); // MC-151364, SPIGOT-5494: hangs if generate-structures=false ++ if (this.dolphin.level().purpurConfig.dolphinDisableTreasureSearching) return false; // Purpur + return this.dolphin.gotFish() && this.dolphin.getAirSupply() >= 100 && this.dolphin.level().getWorld().canGenerateStructures(); // MC-151364, SPIGOT-5494: hangs if generate-structures=false } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index c5c975f4ebc04f12e40f2e1c9a8ca5aa37ec141a..fa07216c52848c957871a8884e844d6534aa6c66 100644 +index cc7809cbff311ccf28b85139d21d3ba9b7c5660d..e4a04774f9951919f3f732aef3072da2037e1efc 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -612,6 +612,7 @@ public class PurpurWorldConfig { - public float dolphinSpitSpeed = 1.0F; - public float dolphinSpitDamage = 2.0F; +@@ -522,6 +522,7 @@ public class PurpurWorldConfig { + } + public double dolphinMaxHealth = 10.0D; + public boolean dolphinDisableTreasureSearching = false; private void dolphinSettings() { - dolphinRidable = getBoolean("mobs.dolphin.ridable", dolphinRidable); - dolphinControllable = getBoolean("mobs.dolphin.controllable", dolphinControllable); -@@ -624,6 +625,7 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.dolphin.attributes.max-health", dolphinMaxHealth); +@@ -529,6 +530,7 @@ public class PurpurWorldConfig { set("mobs.dolphin.attributes.max_health", oldValue); } dolphinMaxHealth = getDouble("mobs.dolphin.attributes.max_health", dolphinMaxHealth); + dolphinDisableTreasureSearching = getBoolean("mobs.dolphin.disable-treasure-searching", dolphinDisableTreasureSearching); } - public boolean donkeyRidableInWater = false; + public double donkeyMaxHealthMin = 15.0D; diff --git a/patches/todo/server/0086-Short-enderman-height.patch b/patches/server/0081-Short-enderman-height.patch similarity index 81% rename from patches/todo/server/0086-Short-enderman-height.patch rename to patches/server/0081-Short-enderman-height.patch index 9778c5f54..235af9dca 100644 --- a/patches/todo/server/0086-Short-enderman-height.patch +++ b/patches/server/0081-Short-enderman-height.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Short enderman height diff --git a/src/main/java/net/minecraft/world/entity/EntityType.java b/src/main/java/net/minecraft/world/entity/EntityType.java -index 944ccfacd740ea0cdd0b8ffbd75bd2e561ebad9b..314a2a31079fcb7619ff9ebef8e6cf161f5c7c9c 100644 +index b7e3efcca0b544440f8799a3be27e9288a55ca77..b144543131bb756294e02e05f83002fe9abc8d96 100644 --- a/src/main/java/net/minecraft/world/entity/EntityType.java +++ b/src/main/java/net/minecraft/world/entity/EntityType.java -@@ -308,7 +308,8 @@ public class EntityType implements FeatureElement, EntityTypeT +@@ -306,7 +306,8 @@ public class EntityType implements FeatureElement, EntityTypeT private Component description; @Nullable private ResourceLocation lootTable; @@ -19,22 +19,22 @@ index 944ccfacd740ea0cdd0b8ffbd75bd2e561ebad9b..314a2a31079fcb7619ff9ebef8e6cf16 private static EntityType register(String id, EntityType.Builder type) { // CraftBukkit - decompile error diff --git a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -index b24d890fb9a85434d612c57b4a8763652565d017..d8123aa5585cb4c0cc1210ced04fdf08f731fdb2 100644 +index d1602c71f96d817d212582737dc6ec5db1c4f79a..b74466455959c2355e40100004eed350205facdc 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -@@ -429,6 +429,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -403,6 +403,7 @@ public class EnderMan extends Monster implements NeutralMob { + public boolean hurt(DamageSource source, float amount) { if (this.isInvulnerableTo(source)) { return false; - } else if (getRider() != null && this.isControllable()) { return super.hurt(source, amount); // Purpur - no teleporting on damage + } else if (org.purpurmc.purpur.PurpurConfig.endermanShortHeight && source.is(net.minecraft.world.damagesource.DamageTypes.IN_WALL)) { return false; // Purpur - no suffocation damage if short height } else { boolean flag = source.getDirectEntity() instanceof ThrownPotion; boolean flag1; diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -index e829e215d1fe80cdaf9162268011912081f4c5ee..db4c85cae58805cfa2a460e33a13e85abc8e593d 100644 +index 118eae57b4a63bb50ffb34c632122234ce0d2d43..763b3753fd77766475114226db593b7ce941336a 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -@@ -244,6 +244,12 @@ public class PurpurConfig { +@@ -242,6 +242,12 @@ public class PurpurConfig { enderChestPermissionRows = getBoolean("settings.blocks.ender_chest.use-permissions-for-rows", enderChestPermissionRows); } diff --git a/patches/todo/server/0087-Stop-squids-floating-on-top-of-water.patch b/patches/server/0082-Stop-squids-floating-on-top-of-water.patch similarity index 75% rename from patches/todo/server/0087-Stop-squids-floating-on-top-of-water.patch rename to patches/server/0082-Stop-squids-floating-on-top-of-water.patch index 2b1eb24ed..83012cc56 100644 --- a/patches/todo/server/0087-Stop-squids-floating-on-top-of-water.patch +++ b/patches/server/0082-Stop-squids-floating-on-top-of-water.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Stop squids floating on top of water diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 7260fc2adc222a6fc5c64ba9ba01ee91051accb8..22656eea7e7d6b5e1f749db2f2209e5b8c362490 100644 +index b26e19f67767ef5d0da819be44f0ca0aabc2bdbb..4813c72c4f828ee205fa4b3abaac11b4a6a482df 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -4226,6 +4226,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -4277,6 +4277,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { this.yRotO = this.getYRot(); } @@ -19,25 +19,25 @@ index 7260fc2adc222a6fc5c64ba9ba01ee91051accb8..22656eea7e7d6b5e1f749db2f2209e5b + // Purpur end + public boolean updateFluidHeightAndDoFluidPushing(TagKey tag, double speed) { - if (false && this.touchingUnloadedChunk()) { // Pufferfish - cost of a lookup here is the same cost as below, so skip + if (this.touchingUnloadedChunk()) { return false; diff --git a/src/main/java/net/minecraft/world/entity/animal/Squid.java b/src/main/java/net/minecraft/world/entity/animal/Squid.java -index 0c2b930a0fc5e32afd12a4850acaaa7eb732fc01..de1bf4aea2661763948aba01d93e7685f3ef73cb 100644 +index 55ca4f5e136cd902b2df425c8e65b12bfb45b28e..7922c3288f631dda9272951203d2a69a0cf993f5 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Squid.java +++ b/src/main/java/net/minecraft/world/entity/animal/Squid.java -@@ -75,6 +75,12 @@ public class Squid extends WaterAnimal { - public void initAttributes() { +@@ -55,6 +55,12 @@ public class Squid extends WaterAnimal { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.squidMaxHealth); } -+ + + @Override + public net.minecraft.world.phys.AABB getAxisForFluidCheck() { + // Stops squids from floating just over the water + return super.getAxisForFluidCheck().offsetY(level.purpurConfig.squidOffsetWaterCheck); + } - // Purpur end - ++ @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new Squid.SquidRandomMovementGoal(this)); diff --git a/src/main/java/net/minecraft/world/phys/AABB.java b/src/main/java/net/minecraft/world/phys/AABB.java index ffc76354ead6937daf366c3d87bcb51d3e4c47f5..5b98d42b5d6bc07265fbb017e51a6281c148436a 100644 --- a/src/main/java/net/minecraft/world/phys/AABB.java @@ -54,22 +54,22 @@ index ffc76354ead6937daf366c3d87bcb51d3e4c47f5..5b98d42b5d6bc07265fbb017e51a6281 + // Purpur } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index fa07216c52848c957871a8884e844d6534aa6c66..1d53cf3ff8a7695e609e236e091f5e7259700678 100644 +index e4a04774f9951919f3f732aef3072da2037e1efc..a5cb13ac94d966d95c84aa3bb88fc7170e25c558 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1480,6 +1480,7 @@ public class PurpurWorldConfig { - public boolean squidControllable = true; +@@ -1122,6 +1122,7 @@ public class PurpurWorldConfig { + public double squidMaxHealth = 10.0D; public boolean squidImmuneToEAR = true; + public double squidOffsetWaterCheck = 0.0D; private void squidSettings() { - squidRidable = getBoolean("mobs.squid.ridable", squidRidable); - squidControllable = getBoolean("mobs.squid.controllable", squidControllable); -@@ -1490,6 +1491,7 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.squid.attributes.max-health", squidMaxHealth); +@@ -1130,6 +1131,7 @@ public class PurpurWorldConfig { } squidMaxHealth = getDouble("mobs.squid.attributes.max_health", squidMaxHealth); squidImmuneToEAR = getBoolean("mobs.squid.immune-to-EAR", squidImmuneToEAR); + squidOffsetWaterCheck = getDouble("mobs.squid.water-offset-check", squidOffsetWaterCheck); } - public boolean spiderRidable = false; + public double spiderMaxHealth = 16.0D; diff --git a/patches/todo/server/0088-Crying-obsidian-valid-for-portal-frames.patch b/patches/server/0083-Crying-obsidian-valid-for-portal-frames.patch similarity index 92% rename from patches/todo/server/0088-Crying-obsidian-valid-for-portal-frames.patch rename to patches/server/0083-Crying-obsidian-valid-for-portal-frames.patch index 68002cd70..75f005b5c 100644 --- a/patches/todo/server/0088-Crying-obsidian-valid-for-portal-frames.patch +++ b/patches/server/0083-Crying-obsidian-valid-for-portal-frames.patch @@ -18,10 +18,10 @@ index c461e0d04047db9c0c5ecc04063cebd38bf96ec2..e7554ec800f321e4e34c926c53f2375a private static final float SAFE_TRAVEL_MAX_ENTITY_XY = 4.0F; private static final double SAFE_TRAVEL_MAX_VERTICAL_DELTA = 1.0D; diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -index db4c85cae58805cfa2a460e33a13e85abc8e593d..ba4dc732327e7661d39929dfa330a5b29cce9269 100644 +index 763b3753fd77766475114226db593b7ce941336a..a5d8ed8cc7b28d3fb88d04ff7f7995483f60c0a2 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -@@ -212,6 +212,7 @@ public class PurpurConfig { +@@ -210,6 +210,7 @@ public class PurpurConfig { public static int barrelRows = 3; public static boolean enderChestSixRows = false; public static boolean enderChestPermissionRows = false; @@ -29,7 +29,7 @@ index db4c85cae58805cfa2a460e33a13e85abc8e593d..ba4dc732327e7661d39929dfa330a5b2 private static void blockSettings() { if (version < 3) { boolean oldValue = getBoolean("settings.barrel.packed-barrels", true); -@@ -242,6 +243,7 @@ public class PurpurConfig { +@@ -240,6 +241,7 @@ public class PurpurConfig { enderChestSixRows = getBoolean("settings.blocks.ender_chest.six-rows", enderChestSixRows); 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/0089-Entities-can-use-portals-configuration.patch b/patches/server/0084-Entities-can-use-portals-configuration.patch similarity index 87% rename from patches/todo/server/0089-Entities-can-use-portals-configuration.patch rename to patches/server/0084-Entities-can-use-portals-configuration.patch index c66b1aede..fbf818a57 100644 --- a/patches/todo/server/0089-Entities-can-use-portals-configuration.patch +++ b/patches/server/0084-Entities-can-use-portals-configuration.patch @@ -5,19 +5,19 @@ Subject: [PATCH] Entities can use portals configuration diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 22656eea7e7d6b5e1f749db2f2209e5b8c362490..d1d2c0ea830fc3e4b5ac1be59a70fd551ad8c9b3 100644 +index 4813c72c4f828ee205fa4b3abaac11b4a6a482df..091702e3946effa1177c1521f7c8c25f611e5c88 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -2942,7 +2942,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -2984,7 +2984,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { public void handleInsidePortal(BlockPos pos) { if (this.isOnPortalCooldown()) { this.setPortalCooldown(); - } else { + } else if (level.purpurConfig.entitiesCanUsePortals || this instanceof ServerPlayer) { // Purpur - if (!this.level.isClientSide && !pos.equals(this.portalEntrancePos)) { + if (!this.level().isClientSide && !pos.equals(this.portalEntrancePos)) { this.portalEntrancePos = pos.immutable(); } -@@ -3634,7 +3634,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -3680,7 +3680,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { } public boolean canChangeDimensions() { @@ -27,7 +27,7 @@ index 22656eea7e7d6b5e1f749db2f2209e5b8c362490..d1d2c0ea830fc3e4b5ac1be59a70fd55 public float getBlockExplosionResistance(Explosion explosion, BlockGetter world, BlockPos pos, BlockState blockState, FluidState fluidState, float max) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 1d53cf3ff8a7695e609e236e091f5e7259700678..8be52e5cd16bcfae3b714cd8ec865e5036a3e631 100644 +index a5cb13ac94d966d95c84aa3bb88fc7170e25c558..8883a6364f0245f2814fab1bdf8ce8da4b625ae0 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -100,6 +100,7 @@ public class PurpurWorldConfig { diff --git a/patches/todo/server/0090-LivingEntity-broadcastItemBreak.patch b/patches/server/0085-LivingEntity-broadcastItemBreak.patch similarity index 91% rename from patches/todo/server/0090-LivingEntity-broadcastItemBreak.patch rename to patches/server/0085-LivingEntity-broadcastItemBreak.patch index ec24f4afd..fbc2c4566 100644 --- a/patches/todo/server/0090-LivingEntity-broadcastItemBreak.patch +++ b/patches/server/0085-LivingEntity-broadcastItemBreak.patch @@ -5,7 +5,7 @@ Subject: [PATCH] LivingEntity#broadcastItemBreak diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java -index 6dfb577d1b6451d5a6c9231ad57e4aef7976edfc..6216b4590f40b6d5f904d57b50076fb8f64fd7a9 100644 +index a939bcdbcdef50379b473822655e1f6a8db44892..a6e30e77d335b74b47ae2dd5bd80a4bb0dc877e7 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java @@ -1082,5 +1082,11 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { diff --git a/patches/todo/server/0091-Customizable-wither-health-and-healing.patch b/patches/server/0086-Customizable-wither-health-and-healing.patch similarity index 77% rename from patches/todo/server/0091-Customizable-wither-health-and-healing.patch rename to patches/server/0086-Customizable-wither-health-and-healing.patch index 3544c0b8a..1beb6ed87 100644 --- a/patches/todo/server/0091-Customizable-wither-health-and-healing.patch +++ b/patches/server/0086-Customizable-wither-health-and-healing.patch @@ -6,10 +6,10 @@ Subject: [PATCH] Customizable wither health and healing Adds the ability to customize the health of the wither, as well as the amount that it heals, and how often. diff --git a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java -index 864ebffb6c903acb9de5594029838b927eea4318..b22d0af2267581467af9a4d0e8104146b3da9b71 100644 +index 87a0d264d9b54e1b0b29f49431212c977864a30a..87c5dd63bd4a0dd045b5ff30105217562af7967c 100644 --- a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java +++ b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java -@@ -529,8 +529,10 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob +@@ -399,8 +399,10 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob } } @@ -23,19 +23,19 @@ index 864ebffb6c903acb9de5594029838b927eea4318..b22d0af2267581467af9a4d0e8104146 this.bossEvent.setProgress(this.getHealth() / this.getMaxHealth()); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 8be52e5cd16bcfae3b714cd8ec865e5036a3e631..307f03cc8af263f851d7d6054337b4de84a9f7d4 100644 +index 8883a6364f0245f2814fab1bdf8ce8da4b625ae0..c4fbdb55b9f9b90a7fe6ed6ac84e7e775d163b65 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1719,6 +1719,8 @@ public class PurpurWorldConfig { - public boolean witherControllable = true; - public double witherMaxY = 320D; +@@ -1273,6 +1273,8 @@ public class PurpurWorldConfig { + } + public double witherMaxHealth = 300.0D; + public float witherHealthRegenAmount = 1.0f; + public int witherHealthRegenDelay = 20; private void witherSettings() { - witherRidable = getBoolean("mobs.wither.ridable", witherRidable); - witherRidableInWater = getBoolean("mobs.wither.ridable-in-water", witherRidableInWater); -@@ -1734,6 +1736,8 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 8) { + double oldValue = getDouble("mobs.wither.max-health", witherMaxHealth); +@@ -1284,6 +1286,8 @@ public class PurpurWorldConfig { set("mobs.wither.attributes.max_health", oldValue); } witherMaxHealth = getDouble("mobs.wither.attributes.max_health", witherMaxHealth); @@ -43,4 +43,4 @@ index 8be52e5cd16bcfae3b714cd8ec865e5036a3e631..307f03cc8af263f851d7d6054337b4de + witherHealthRegenDelay = getInt("mobs.wither.health-regen-delay", witherHealthRegenDelay); } - public boolean witherSkeletonRidable = false; + public double witherSkeletonMaxHealth = 20.0D; diff --git a/patches/todo/server/0092-Allow-toggling-special-MobSpawners-per-world.patch b/patches/server/0087-Allow-toggling-special-MobSpawners-per-world.patch similarity index 95% rename from patches/todo/server/0092-Allow-toggling-special-MobSpawners-per-world.patch rename to patches/server/0087-Allow-toggling-special-MobSpawners-per-world.patch index 4560a1ded..cb1782f31 100644 --- a/patches/todo/server/0092-Allow-toggling-special-MobSpawners-per-world.patch +++ b/patches/server/0087-Allow-toggling-special-MobSpawners-per-world.patch @@ -6,10 +6,10 @@ Subject: [PATCH] Allow toggling special MobSpawners per world In vanilla, these are all hardcoded on for world type 0 (overworld) and hardcoded off for every other world type. Default config behaviour matches this. diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index 575be84b580f7d7f4968bc4e2a69e0a067a3a617..9807f610aca29d6882bb5314a30161727dfe7c34 100644 +index ac9f7e786d2e2042b8694a4ddd2f806758f9ea50..51c896fdc802ca33e9b8c5dabb66ebb771d8abd5 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java -@@ -543,7 +543,24 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -581,7 +581,24 @@ public class ServerLevel extends Level implements WorldGenLevel { this.dragonParts = new Int2ObjectOpenHashMap(); this.tickTime = flag1; this.server = minecraftserver; @@ -59,7 +59,7 @@ index 5d199fe497bd852827d3d18fb7566a09e70331a3..6cd8a50289a6404441e9e5e08d82d2eb if (NaturalSpawner.isSpawnPositionOk(SpawnPlacements.Type.ON_GROUND, world, blockposition2, EntityType.WANDERING_TRADER)) { blockposition1 = blockposition2; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 307f03cc8af263f851d7d6054337b4de84a9f7d4..ead2c290915b247fa5a430bfff6d2adac9af6119 100644 +index c4fbdb55b9f9b90a7fe6ed6ac84e7e775d163b65..72e47882c87754ba3208f59c945c2347904af51a 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -71,6 +71,12 @@ public class PurpurWorldConfig { diff --git a/patches/todo/server/0093-Raid-cooldown-setting.patch b/patches/server/0088-Raid-cooldown-setting.patch similarity index 94% rename from patches/todo/server/0093-Raid-cooldown-setting.patch rename to patches/server/0088-Raid-cooldown-setting.patch index 270a6128a..c99615af2 100644 --- a/patches/todo/server/0093-Raid-cooldown-setting.patch +++ b/patches/server/0088-Raid-cooldown-setting.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Raid cooldown setting diff --git a/src/main/java/net/minecraft/world/entity/raid/Raids.java b/src/main/java/net/minecraft/world/entity/raid/Raids.java -index fabce3bc592b1b172b227395a07febdbb66ec3c9..df48bcc8f329e3855bb7426bdfe0e3c72af53bea 100644 +index 41457c9f27b18fa2734a6cca297ec5186470e82f..94356e0541f8f4da68211fa533347cc97d4f3518 100644 --- a/src/main/java/net/minecraft/world/entity/raid/Raids.java +++ b/src/main/java/net/minecraft/world/entity/raid/Raids.java @@ -28,6 +28,7 @@ import net.minecraft.world.phys.Vec3; @@ -49,7 +49,7 @@ index fabce3bc592b1b172b227395a07febdbb66ec3c9..df48bcc8f329e3855bb7426bdfe0e3c7 if (!this.raidMap.containsKey(raid.getId())) { this.raidMap.put(raid.getId(), raid); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index ead2c290915b247fa5a430bfff6d2adac9af6119..d62f275ab355b1ff559f7a770b4c5c428b46e008 100644 +index 72e47882c87754ba3208f59c945c2347904af51a..042fb9536cfa5b5cb243a4c4993f1f98bb792304 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -111,6 +111,7 @@ public class PurpurWorldConfig { diff --git a/patches/todo/server/0094-Despawn-rate-config-options-per-projectile-type.patch b/patches/server/0089-Despawn-rate-config-options-per-projectile-type.patch similarity index 96% rename from patches/todo/server/0094-Despawn-rate-config-options-per-projectile-type.patch rename to patches/server/0089-Despawn-rate-config-options-per-projectile-type.patch index 36a0f2137..d939525a4 100644 --- a/patches/todo/server/0094-Despawn-rate-config-options-per-projectile-type.patch +++ b/patches/server/0089-Despawn-rate-config-options-per-projectile-type.patch @@ -7,7 +7,7 @@ This patch's implementation has been removed in favor of Pufferfish's entity-tim The config remains for migration purposes. diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index d62f275ab355b1ff559f7a770b4c5c428b46e008..bc326cb023feae60e1341939550de549ca6365bd 100644 +index 042fb9536cfa5b5cb243a4c4993f1f98bb792304..628b11a39dd923c8faa5c7963eb369d1a953dfc2 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -292,6 +292,39 @@ public class PurpurWorldConfig { diff --git a/patches/todo/server/0095-Add-option-to-disable-zombie-aggressiveness-towards-.patch b/patches/server/0090-Add-option-to-disable-zombie-aggressiveness-towards-.patch similarity index 67% rename from patches/todo/server/0095-Add-option-to-disable-zombie-aggressiveness-towards-.patch rename to patches/server/0090-Add-option-to-disable-zombie-aggressiveness-towards-.patch index f83a0dcab..ee95695da 100644 --- a/patches/todo/server/0095-Add-option-to-disable-zombie-aggressiveness-towards-.patch +++ b/patches/server/0090-Add-option-to-disable-zombie-aggressiveness-towards-.patch @@ -21,24 +21,24 @@ index a08c00b8c0488d18be5e182f7892e5ab71d12247..338f693d098b6ab507c30f6411c9a952 ignored.add("goal_selector_1"); ignored.add("goal_selector_2"); diff --git a/src/main/java/net/minecraft/world/entity/monster/Drowned.java b/src/main/java/net/minecraft/world/entity/monster/Drowned.java -index 863fd15039e53405aac66d769598a38ac2586115..794c2fb3400e08c2dda24d29024dad7686a378fa 100644 +index c5e3a361c5a31ae78156079f9e039ff8adb36151..366f4d7e5e640d1b906dc532ea1e2d323c293a51 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Drowned.java +++ b/src/main/java/net/minecraft/world/entity/monster/Drowned.java -@@ -120,7 +120,19 @@ public class Drowned extends Zombie implements RangedAttackMob { +@@ -103,7 +103,19 @@ public class Drowned extends Zombie implements RangedAttackMob { this.goalSelector.addGoal(7, new RandomStrollGoal(this, 1.0D)); this.targetSelector.addGoal(1, (new HurtByTargetGoal(this, new Class[]{Drowned.class})).setAlertOthers(ZombifiedPiglin.class)); this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, 10, true, false, this::okTarget)); -- if (this.level.spigotConfig.zombieAggressiveTowardsVillager) this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractVillager.class, false)); // Paper +- if (this.level().spigotConfig.zombieAggressiveTowardsVillager) this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractVillager.class, false)); // Paper + // Purpur start -+ if ( level.spigotConfig.zombieAggressiveTowardsVillager ) this.targetSelector.addGoal(3, new NearestAttackableTargetGoal(this, AbstractVillager.class, false) { // Spigot ++ if (this.level().spigotConfig.zombieAggressiveTowardsVillager) this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractVillager.class, false) { // Spigot + @Override + public boolean canUse() { -+ return (level.purpurConfig.zombieAggressiveTowardsVillagerWhenLagging || !level.getServer().server.isLagging()) && super.canUse(); ++ return (level().purpurConfig.zombieAggressiveTowardsVillagerWhenLagging || !level().getServer().server.isLagging()) && super.canUse(); + } + + @Override + public boolean canContinueToUse() { -+ return (level.purpurConfig.zombieAggressiveTowardsVillagerWhenLagging || !level.getServer().server.isLagging()) && super.canContinueToUse(); ++ return (level().purpurConfig.zombieAggressiveTowardsVillagerWhenLagging || !level().getServer().server.isLagging()) && super.canContinueToUse(); + } + }); + // Purpur end @@ -46,24 +46,24 @@ index 863fd15039e53405aac66d769598a38ac2586115..794c2fb3400e08c2dda24d29024dad76 this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, Axolotl.class, true, false)); this.targetSelector.addGoal(5, new NearestAttackableTargetGoal<>(this, Turtle.class, 10, true, false, Turtle.BABY_ON_LAND_SELECTOR)); diff --git a/src/main/java/net/minecraft/world/entity/monster/Zombie.java b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -index fb41431f25081c8ca0cf03dc5128f78f589e4e26..ebeeb8c31d05a0ad2e291599a0b6ebe179b8cf82 100644 +index 6f20140adb276c0a08644cc3fb7d6b29982e8697..fddee85b60de8fe75f6a6bab43a0989509850b18 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zombie.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -@@ -156,7 +156,19 @@ public class Zombie extends Monster { +@@ -137,7 +137,19 @@ public class Zombie extends Monster { this.goalSelector.addGoal(7, new WaterAvoidingRandomStrollGoal(this, 1.0D)); this.targetSelector.addGoal(1, (new HurtByTargetGoal(this, new Class[0])).setAlertOthers(ZombifiedPiglin.class)); this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); -- if ( level.spigotConfig.zombieAggressiveTowardsVillager ) this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractVillager.class, false)); // Spigot +- if ( this.level().spigotConfig.zombieAggressiveTowardsVillager ) this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractVillager.class, false)); // Spigot + // Purpur start -+ if ( level.spigotConfig.zombieAggressiveTowardsVillager ) this.targetSelector.addGoal(3, new NearestAttackableTargetGoal(this, AbstractVillager.class, false) { // Spigot ++ if ( this.level().spigotConfig.zombieAggressiveTowardsVillager ) this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractVillager.class, false) { // Spigot + @Override + public boolean canUse() { -+ return (level.purpurConfig.zombieAggressiveTowardsVillagerWhenLagging || !level.getServer().server.isLagging()) && super.canUse(); ++ return (level().purpurConfig.zombieAggressiveTowardsVillagerWhenLagging || !level().getServer().server.isLagging()) && super.canUse(); + } + + @Override + public boolean canContinueToUse() { -+ return (level.purpurConfig.zombieAggressiveTowardsVillagerWhenLagging || !level.getServer().server.isLagging()) && super.canContinueToUse(); ++ return (level().purpurConfig.zombieAggressiveTowardsVillagerWhenLagging || !level().getServer().server.isLagging()) && super.canContinueToUse(); + } + }); + // Purpur end @@ -71,22 +71,22 @@ index fb41431f25081c8ca0cf03dc5128f78f589e4e26..ebeeb8c31d05a0ad2e291599a0b6ebe1 this.targetSelector.addGoal(5, new NearestAttackableTargetGoal<>(this, Turtle.class, 10, true, false, Turtle.BABY_ON_LAND_SELECTOR)); } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index bc326cb023feae60e1341939550de549ca6365bd..d5d83c8a79cca8d8216b24c7116c7c475924d104 100644 +index 628b11a39dd923c8faa5c7963eb369d1a953dfc2..aa2da3d779edc5f45aa2fad5ba0cc82dee2821b3 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1852,6 +1852,7 @@ public class PurpurWorldConfig { +@@ -1381,6 +1381,7 @@ public class PurpurWorldConfig { public boolean zombieJockeyOnlyBaby = true; public double zombieJockeyChance = 0.05D; public boolean zombieJockeyTryExistingChickens = true; + public boolean zombieAggressiveTowardsVillagerWhenLagging = true; private void zombieSettings() { - zombieRidable = getBoolean("mobs.zombie.ridable", zombieRidable); - zombieRidableInWater = getBoolean("mobs.zombie.ridable-in-water", zombieRidableInWater); -@@ -1866,6 +1867,7 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.zombie.attributes.max-health", zombieMaxHealth); +@@ -1392,6 +1393,7 @@ public class PurpurWorldConfig { zombieJockeyOnlyBaby = getBoolean("mobs.zombie.jockey.only-babies", zombieJockeyOnlyBaby); zombieJockeyChance = getDouble("mobs.zombie.jockey.chance", zombieJockeyChance); zombieJockeyTryExistingChickens = getBoolean("mobs.zombie.jockey.try-existing-chickens", zombieJockeyTryExistingChickens); + zombieAggressiveTowardsVillagerWhenLagging = getBoolean("mobs.zombie.aggressive-towards-villager-when-lagging", zombieAggressiveTowardsVillagerWhenLagging); } - public boolean zombieHorseRidableInWater = false; + public double zombieHorseMaxHealthMin = 15.0D; diff --git a/patches/todo/server/0096-Add-predicate-to-recipe-s-ExactChoice-ingredient.patch b/patches/server/0091-Add-predicate-to-recipe-s-ExactChoice-ingredient.patch similarity index 96% rename from patches/todo/server/0096-Add-predicate-to-recipe-s-ExactChoice-ingredient.patch rename to patches/server/0091-Add-predicate-to-recipe-s-ExactChoice-ingredient.patch index 406cc29da..4c9f6f850 100644 --- a/patches/todo/server/0096-Add-predicate-to-recipe-s-ExactChoice-ingredient.patch +++ b/patches/server/0091-Add-predicate-to-recipe-s-ExactChoice-ingredient.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add predicate to recipe's ExactChoice ingredient diff --git a/src/main/java/net/minecraft/world/item/crafting/Ingredient.java b/src/main/java/net/minecraft/world/item/crafting/Ingredient.java -index 8d4aca59bd7518179520f4d4fb7137778e232d90..dbc3040bc087a6016a491caf76019663c1cd1b4c 100644 +index cd7ea0c16f9ddcb84b5d7e8a2533e6e84f3879c7..3ca086418ad037c48775db73d2b9c410acf1e326 100644 --- a/src/main/java/net/minecraft/world/item/crafting/Ingredient.java +++ b/src/main/java/net/minecraft/world/item/crafting/Ingredient.java @@ -39,6 +39,7 @@ public final class Ingredient implements Predicate { diff --git a/patches/todo/server/0097-Flying-squids-Oh-my.patch b/patches/server/0092-Flying-squids-Oh-my.patch similarity index 71% rename from patches/todo/server/0097-Flying-squids-Oh-my.patch rename to patches/server/0092-Flying-squids-Oh-my.patch index 021840f2b..06a8bfe97 100644 --- a/patches/todo/server/0097-Flying-squids-Oh-my.patch +++ b/patches/server/0092-Flying-squids-Oh-my.patch @@ -5,30 +5,29 @@ Subject: [PATCH] Flying squids! Oh my! diff --git a/src/main/java/net/minecraft/world/entity/GlowSquid.java b/src/main/java/net/minecraft/world/entity/GlowSquid.java -index b86329a18dc83073462049da975dd71b9d637ab2..b0581379619a1ac510b1973512f70db0e961a1f3 100644 +index 213f89b22650f43daaec01e7c301e3e8a7e98684..8d2a915280f7a010483720295077f66684f49615 100644 --- a/src/main/java/net/minecraft/world/entity/GlowSquid.java +++ b/src/main/java/net/minecraft/world/entity/GlowSquid.java -@@ -39,6 +39,11 @@ public class GlowSquid extends Squid { - public void initAttributes() { +@@ -28,6 +28,11 @@ public class GlowSquid extends Squid { this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.glowSquidMaxHealth); } -+ + + @Override + public boolean canFly() { + return this.level.purpurConfig.glowSquidsCanFly; + } - // Purpur end - ++ @Override + protected ParticleOptions getInkParticle() { + return ParticleTypes.GLOW_SQUID_INK; 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 de1bf4aea2661763948aba01d93e7685f3ef73cb..c396874d24ae535b4c07649e303e60b7ab158811 100644 +index 7922c3288f631dda9272951203d2a69a0cf993f5..77ef1ae92dee5bf13590312466c778a249129d69 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Squid.java +++ b/src/main/java/net/minecraft/world/entity/animal/Squid.java -@@ -81,6 +81,15 @@ public class Squid extends WaterAnimal { - // Stops squids from floating just over the water +@@ -61,6 +61,15 @@ public class Squid extends WaterAnimal { return super.getAxisForFluidCheck().offsetY(level.purpurConfig.squidOffsetWaterCheck); } -+ + + public boolean canFly() { + return this.level.purpurConfig.squidsCanFly; + } @@ -37,10 +36,11 @@ index de1bf4aea2661763948aba01d93e7685f3ef73cb..c396874d24ae535b4c07649e303e60b7 + public boolean isInWater() { + return this.wasTouchingWater || canFly(); + } - // Purpur end - ++ @Override -@@ -155,6 +164,7 @@ public class Squid extends WaterAnimal { + protected void registerGoals() { + this.goalSelector.addGoal(0, new Squid.SquidRandomMovementGoal(this)); +@@ -132,6 +141,7 @@ public class Squid extends WaterAnimal { } if (this.isInWaterOrBubble()) { @@ -48,7 +48,7 @@ index de1bf4aea2661763948aba01d93e7685f3ef73cb..c396874d24ae535b4c07649e303e60b7 if (this.tentacleMovement < 3.1415927F) { float f = this.tentacleMovement / 3.1415927F; -@@ -314,7 +324,7 @@ public class Squid extends WaterAnimal { +@@ -259,7 +269,7 @@ public class Squid extends WaterAnimal { if (i > 100) { this.squid.setMovementVector(0.0F, 0.0F, 0.0F); @@ -58,35 +58,33 @@ index de1bf4aea2661763948aba01d93e7685f3ef73cb..c396874d24ae535b4c07649e303e60b7 float f1 = Mth.cos(f) * 0.2F; float f2 = -0.1F + this.squid.getRandom().nextFloat() * 0.2F; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index d5d83c8a79cca8d8216b24c7116c7c475924d104..18baed72b56398846a76229bbc46638125cb82f8 100644 +index aa2da3d779edc5f45aa2fad5ba0cc82dee2821b3..c86d23a5db586bda0272f2985d53cf5e209b6302 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -904,10 +904,12 @@ public class PurpurWorldConfig { - public boolean glowSquidRidable = false; - public boolean glowSquidControllable = true; +@@ -738,8 +738,10 @@ public class PurpurWorldConfig { + } + public double glowSquidMaxHealth = 10.0D; + public boolean glowSquidsCanFly = false; private void glowSquidSettings() { - glowSquidRidable = getBoolean("mobs.glow_squid.ridable", glowSquidRidable); - glowSquidControllable = getBoolean("mobs.glow_squid.controllable", glowSquidControllable); glowSquidMaxHealth = getDouble("mobs.glow_squid.attributes.max_health", glowSquidMaxHealth); + glowSquidsCanFly = getBoolean("mobs.glow_squid.can-fly", glowSquidsCanFly); } - public boolean goatRidable = false; -@@ -1539,6 +1541,7 @@ public class PurpurWorldConfig { + public double goatMaxHealth = 10.0D; +@@ -1181,6 +1183,7 @@ public class PurpurWorldConfig { public double squidMaxHealth = 10.0D; public boolean squidImmuneToEAR = true; public double squidOffsetWaterCheck = 0.0D; + public boolean squidsCanFly = false; private void squidSettings() { - squidRidable = getBoolean("mobs.squid.ridable", squidRidable); - squidControllable = getBoolean("mobs.squid.controllable", squidControllable); -@@ -1550,6 +1553,7 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.squid.attributes.max-health", squidMaxHealth); +@@ -1190,6 +1193,7 @@ public class PurpurWorldConfig { squidMaxHealth = getDouble("mobs.squid.attributes.max_health", squidMaxHealth); squidImmuneToEAR = getBoolean("mobs.squid.immune-to-EAR", squidImmuneToEAR); squidOffsetWaterCheck = getDouble("mobs.squid.water-offset-check", squidOffsetWaterCheck); + squidsCanFly = getBoolean("mobs.squid.can-fly", squidsCanFly); } - public boolean spiderRidable = false; + public double spiderMaxHealth = 16.0D; diff --git a/patches/todo/server/0098-Infinity-bow-settings.patch b/patches/server/0093-Infinity-bow-settings.patch similarity index 97% rename from patches/todo/server/0098-Infinity-bow-settings.patch rename to patches/server/0093-Infinity-bow-settings.patch index ffdae9e60..5445a93e8 100644 --- a/patches/todo/server/0098-Infinity-bow-settings.patch +++ b/patches/server/0093-Infinity-bow-settings.patch @@ -27,7 +27,7 @@ index 08d597db1a5345a343777a01427655e6bf2c926b..33df0ca406dc8321b76b393f317bbd1c } else { user.startUsingItem(hand); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 18baed72b56398846a76229bbc46638125cb82f8..7b212f784be68e737197a3a16b4cdee1c45e42a6 100644 +index c86d23a5db586bda0272f2985d53cf5e209b6302..a672ee05bd19950ce4078e15e44068c025ceb1fe 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -142,6 +142,17 @@ public class PurpurWorldConfig { diff --git a/patches/todo/server/0099-Configurable-daylight-cycle.patch b/patches/server/0094-Configurable-daylight-cycle.patch similarity index 85% rename from patches/todo/server/0099-Configurable-daylight-cycle.patch rename to patches/server/0094-Configurable-daylight-cycle.patch index 5580b51dc..1b2269c4e 100644 --- a/patches/todo/server/0099-Configurable-daylight-cycle.patch +++ b/patches/server/0094-Configurable-daylight-cycle.patch @@ -18,40 +18,40 @@ index 9ec6145fe04ec64bbee8ec6a837719caebdbc6f5..358d610ad020cada1bb83e393deeeaae public ClientboundSetTimePacket(long time, long timeOfDay, boolean doDaylightCycle) { this.gameTime = time; diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 65ba915d3644b638ce3b5314c0aed5b2018f67e0..52487bc86a28a2f2c1c677b07c9fec77685f2af0 100644 +index cd883e14611cdb5ab74861b669e64a6445d9de9c..5750934e3cfb1a9d7fc127a5033c504476900981 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1522,7 +1522,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop -Date: Fri, 24 May 2019 02:39:25 -0500 -Subject: [PATCH] Signs editable on right click - - -diff --git a/src/main/java/net/minecraft/world/level/block/SignBlock.java b/src/main/java/net/minecraft/world/level/block/SignBlock.java -index aface9a9697095a29edaf73c9cdabc2c1414b9d7..1a04d0a601b8e481dd6e2592b849b907a5b9f63f 100644 ---- a/src/main/java/net/minecraft/world/level/block/SignBlock.java -+++ b/src/main/java/net/minecraft/world/level/block/SignBlock.java -@@ -14,6 +14,7 @@ import net.minecraft.world.item.DyeItem; - import net.minecraft.world.item.Item; - import net.minecraft.world.item.ItemStack; - import net.minecraft.world.item.Items; -+import net.minecraft.world.item.SignItem; - import net.minecraft.world.level.BlockGetter; - import net.minecraft.world.level.Level; - import net.minecraft.world.level.LevelAccessor; -@@ -76,11 +77,11 @@ public abstract class SignBlock extends BaseEntityBlock implements SimpleWaterlo - if (world.isClientSide) { - return bl4 ? InteractionResult.SUCCESS : InteractionResult.CONSUME; - } else { -- BlockEntity bl5 = world.getBlockEntity(pos); -- if (!(bl5 instanceof SignBlockEntity)) { -+ BlockEntity blockEntity = world.getBlockEntity(pos); // Purpur - decompile fix -+ if (!(blockEntity instanceof SignBlockEntity)) { // Purpur - decompile fix - return InteractionResult.PASS; - } else { -- SignBlockEntity signBlockEntity = (SignBlockEntity)bl5; -+ SignBlockEntity signBlockEntity = (SignBlockEntity)blockEntity; // Purpur - decompile fix - boolean bl5 = signBlockEntity.hasGlowingText(); - if ((!bl2 || !bl5) && (!bl3 || bl5)) { - if (bl4) { -@@ -108,6 +109,17 @@ public abstract class SignBlock extends BaseEntityBlock implements SimpleWaterlo - } - } - -+ // Purpur start - right click to open sign editor -+ if (world.purpurConfig.signRightClickEdit && itemStack.getItem() instanceof SignItem && -+ !player.isCrouching() && player.getAbilities().mayBuild && -+ player.getBukkitEntity().hasPermission("purpur.sign.edit")) { -+ signBlockEntity.setEditable(true); -+ signBlockEntity.setAllowedPlayerEditor(player.getUUID()); -+ player.openTextEdit(signBlockEntity); -+ return InteractionResult.SUCCESS; -+ } -+ // Purpur end -+ - return signBlockEntity.executeClickCommands((ServerPlayer)player) ? InteractionResult.SUCCESS : InteractionResult.PASS; - } else { - return InteractionResult.PASS; -diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 61afa4ef024e6bb9b48029aeb42977d977a41620..485925e025c5b374b9bbd183a007380eed0c663e 100644 ---- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -151,6 +151,11 @@ public class PurpurWorldConfig { - }); - } - -+ public boolean signRightClickEdit = false; -+ private void signSettings() { -+ signRightClickEdit = getBoolean("blocks.sign.right-click-edit", signRightClickEdit); -+ } -+ - public boolean turtleEggsBreakFromExpOrbs = true; - public boolean turtleEggsBreakFromItems = true; - public boolean turtleEggsBreakFromMinecarts = true; diff --git a/patches/todo/server/0050-Add-enderman-and-creeper-griefing-controls.patch b/patches/todo/server/0050-Add-enderman-and-creeper-griefing-controls.patch deleted file mode 100644 index 8fa35294f..000000000 --- a/patches/todo/server/0050-Add-enderman-and-creeper-griefing-controls.patch +++ /dev/null @@ -1,75 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: William Blake Galbreath -Date: Sun, 26 Apr 2020 16:28:38 -0500 -Subject: [PATCH] Add enderman and creeper griefing controls - - -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 76d796600411144b73d1e7e67f70bb032055d02a..b25d3e25a6be150739aeed99b81e99e3c995dbae 100644 ---- a/src/main/java/net/minecraft/world/entity/monster/Creeper.java -+++ b/src/main/java/net/minecraft/world/entity/monster/Creeper.java -@@ -361,7 +361,7 @@ public class Creeper extends Monster implements PowerableMob { - this.level.getCraftServer().getPluginManager().callEvent(event); - if (!event.isCancelled()) { - this.dead = true; -- this.level.explode(this, this.getX(), this.getY(), this.getZ(), event.getRadius(), event.getFire(), Level.ExplosionInteraction.MOB); -+ this.level.explode(this, this.getX(), this.getY(), this.getZ(), event.getRadius(), event.getFire(), this.level.getGameRules().getBoolean(net.minecraft.world.level.GameRules.RULE_MOBGRIEFING) && level.purpurConfig.creeperAllowGriefing ? Level.ExplosionInteraction.MOB : Level.ExplosionInteraction.NONE); // Purpur - this.discard(); - this.spawnLingeringCloud(); - } else { -diff --git a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -index 79a5d800434b648c77f25e0d1be8e14b94c30f68..b24d890fb9a85434d612c57b4a8763652565d017 100644 ---- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -+++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -@@ -536,6 +536,7 @@ public class EnderMan extends Monster implements NeutralMob { - - @Override - public boolean canUse() { -+ if (!enderman.level.purpurConfig.endermanAllowGriefing) return false; // Purpur - return this.enderman.getCarriedBlock() == null ? false : (!this.enderman.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) ? false : this.enderman.getRandom().nextInt(reducedTickDelay(2000)) == 0); - } - -@@ -583,6 +584,7 @@ public class EnderMan extends Monster implements NeutralMob { - - @Override - public boolean canUse() { -+ if (!enderman.level.purpurConfig.endermanAllowGriefing) return false; // Purpur - return this.enderman.getCarriedBlock() != null ? false : (!this.enderman.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) ? false : this.enderman.getRandom().nextInt(reducedTickDelay(20)) == 0); - } - -diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index acc6334ecb3523fa9bf76c53b823a6d848ba88a7..39d293b0007e13a12bc20f6e958038b328285c03 100644 ---- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -439,6 +439,7 @@ public class PurpurWorldConfig { - public boolean creeperControllable = true; - public double creeperMaxHealth = 20.0D; - public double creeperChargedChance = 0.0D; -+ public boolean creeperAllowGriefing = true; - private void creeperSettings() { - creeperRidable = getBoolean("mobs.creeper.ridable", creeperRidable); - creeperRidableInWater = getBoolean("mobs.creeper.ridable-in-water", creeperRidableInWater); -@@ -450,6 +451,7 @@ public class PurpurWorldConfig { - } - creeperMaxHealth = getDouble("mobs.creeper.attributes.max_health", creeperMaxHealth); - creeperChargedChance = getDouble("mobs.creeper.naturally-charged-chance", creeperChargedChance); -+ creeperAllowGriefing = getBoolean("mobs.creeper.allow-griefing", creeperAllowGriefing); - } - - public boolean dolphinRidable = false; -@@ -556,6 +558,7 @@ public class PurpurWorldConfig { - public boolean endermanRidableInWater = true; - public boolean endermanControllable = true; - public double endermanMaxHealth = 40.0D; -+ public boolean endermanAllowGriefing = true; - private void endermanSettings() { - endermanRidable = getBoolean("mobs.enderman.ridable", endermanRidable); - endermanRidableInWater = getBoolean("mobs.enderman.ridable-in-water", endermanRidableInWater); -@@ -566,6 +569,7 @@ public class PurpurWorldConfig { - set("mobs.enderman.attributes.max_health", oldValue); - } - endermanMaxHealth = getDouble("mobs.enderman.attributes.max_health", endermanMaxHealth); -+ endermanAllowGriefing = getBoolean("mobs.enderman.allow-griefing", endermanAllowGriefing); - } - - public boolean endermiteRidable = false; diff --git a/patches/todo/server/0057-Add-canSaveToDisk-to-Entity.patch b/patches/todo/server/0057-Add-canSaveToDisk-to-Entity.patch deleted file mode 100644 index 6c89dc7c3..000000000 --- a/patches/todo/server/0057-Add-canSaveToDisk-to-Entity.patch +++ /dev/null @@ -1,80 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: William Blake Galbreath -Date: Tue, 18 Feb 2020 20:07:08 -0600 -Subject: [PATCH] Add canSaveToDisk to Entity - - -diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 7d6040eebf4789c136f10a28ee6a2fe687973986..7260fc2adc222a6fc5c64ba9ba01ee91051accb8 100644 ---- a/src/main/java/net/minecraft/world/entity/Entity.java -+++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -4794,5 +4794,9 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { - public boolean processClick(InteractionHand hand) { - return false; - } -+ -+ public boolean canSaveToDisk() { -+ return true; -+ } - // Purpur end - } -diff --git a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java -index a6a9628f0e467f2b38dd346d90862f19712b3016..864ebffb6c903acb9de5594029838b927eea4318 100644 ---- a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java -+++ b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java -@@ -220,6 +220,11 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob - // do not hit rider - return target != rider && super.canHitEntity(target); - } -+ -+ @Override -+ public boolean canSaveToDisk() { -+ return false; -+ } - }; - skull.setPosRaw(headX, headY, headZ); - level.addFreshEntity(skull); -diff --git a/src/main/java/net/minecraft/world/level/chunk/storage/EntityStorage.java b/src/main/java/net/minecraft/world/level/chunk/storage/EntityStorage.java -index 060e064625969610539dbf969ce773b877a7c579..32cd9df202704cdfb8fa06aaf0e738d483054feb 100644 ---- a/src/main/java/net/minecraft/world/level/chunk/storage/EntityStorage.java -+++ b/src/main/java/net/minecraft/world/level/chunk/storage/EntityStorage.java -@@ -112,6 +112,7 @@ public class EntityStorage implements EntityPersistentStorage { - ListTag listTag = new ListTag(); - final java.util.Map, Integer> savedEntityCounts = new java.util.HashMap<>(); // Paper - entities.forEach((entity) -> { // diff here: use entities parameter -+ if (!entity.canSaveToDisk()) return; // Purpur - // Paper start - final EntityType entityType = entity.getType(); - final int saveLimit = level.paperConfig().chunks.entityPerChunkSaveLimit.getOrDefault(entityType, -1); -diff --git a/src/main/java/org/purpurmc/purpur/entity/DolphinSpit.java b/src/main/java/org/purpurmc/purpur/entity/DolphinSpit.java -index 602df34e3ec0d05f58737a54a1e8585e8730095c..f0279d6cdc93f524f321c3c40967fdeeb8d2c46b 100644 ---- a/src/main/java/org/purpurmc/purpur/entity/DolphinSpit.java -+++ b/src/main/java/org/purpurmc/purpur/entity/DolphinSpit.java -@@ -35,6 +35,11 @@ public class DolphinSpit extends LlamaSpit { - dolphin.getZ() + (double) (dolphin.getBbWidth() + 1.0F) * 0.5D * (double) Mth.cos(dolphin.yBodyRot * 0.017453292F)); - } - -+ @Override -+ public boolean canSaveToDisk() { -+ return false; -+ } -+ - public void tick() { - super_tick(); - -diff --git a/src/main/java/org/purpurmc/purpur/entity/PhantomFlames.java b/src/main/java/org/purpurmc/purpur/entity/PhantomFlames.java -index 9ee7fc642d05fd61d91d09c754c6f0680bc39e56..1542f038621b97a298a0fb31ab3be912e2bcd0d6 100644 ---- a/src/main/java/org/purpurmc/purpur/entity/PhantomFlames.java -+++ b/src/main/java/org/purpurmc/purpur/entity/PhantomFlames.java -@@ -38,6 +38,11 @@ public class PhantomFlames extends LlamaSpit { - phantom.getZ() + (double) (phantom.getBbWidth() + 1.0F) * 0.5D * (double) Mth.cos(phantom.yBodyRot * 0.017453292F)); - } - -+ @Override -+ public boolean canSaveToDisk() { -+ return false; -+ } -+ - public void tick() { - super_tick(); -